diff options
author | CJentzsch <jentzsch.software@gmail.com> | 2015-03-02 21:34:45 +0800 |
---|---|---|
committer | Gav Wood <i@gavwood.com> | 2015-03-06 19:49:39 +0800 |
commit | 873d365ce535501cd1a59976b69a261bcdf9b889 (patch) | |
tree | c58ecea9c589f3b189cfc160c43988a1165f1055 | |
parent | c10f41d0c9fa527f2192515b02de70381c894452 (diff) | |
download | dexon-solidity-873d365ce535501cd1a59976b69a261bcdf9b889.tar.gz dexon-solidity-873d365ce535501cd1a59976b69a261bcdf9b889.tar.zst dexon-solidity-873d365ce535501cd1a59976b69a261bcdf9b889.zip |
add secure trie tests
-rw-r--r-- | trie.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
@@ -198,6 +198,48 @@ BOOST_AUTO_TEST_CASE(trie_test_anyorder) } } +BOOST_AUTO_TEST_CASE(trie_test_anyorder_secureTrie) +{ + string testPath = test::getTestPath(); + + testPath += "/TrieTests"; + + cnote << "Testing Trie..."; + js::mValue v; + string s = asString(contents(testPath + "/trieanyorder_secureTrie.json")); + BOOST_REQUIRE_MESSAGE(s.length() > 0, "Contents of 'trieanyorder.json' is empty. Have you cloned the 'tests' repo branch develop?"); + js::read_string(s, v); + for (auto& i: v.get_obj()) + { + cnote << i.first; + js::mObject& o = i.second.get_obj(); + vector<pair<string, string>> ss; + for (auto i: o["in"].get_obj()) + { + ss.push_back(make_pair(i.first, i.second.get_str())); + if (!ss.back().first.find("0x")) + ss.back().first = asString(fromHex(ss.back().first.substr(2))); + if (!ss.back().second.find("0x")) + ss.back().second = asString(fromHex(ss.back().second.substr(2))); + } + for (unsigned j = 0; j < min(1000u, dev::test::fac((unsigned)ss.size())); ++j) + { + next_permutation(ss.begin(), ss.end()); + MemoryDB m; + SecureGenericTrieDB<MemoryDB> t(&m); + t.init(); + BOOST_REQUIRE(t.check(true)); + for (auto const& k: ss) + { + t.insert(k.first, k.second); + BOOST_REQUIRE(t.check(true)); + } + BOOST_REQUIRE(!o["root"].is_null()); + BOOST_CHECK_EQUAL(o["root"].get_str(), "0x" + toHex(t.root().asArray())); + } + } +} + BOOST_AUTO_TEST_CASE(trie_tests_ordered) { string testPath = test::getTestPath(); @@ -279,6 +321,69 @@ BOOST_AUTO_TEST_CASE(trie_tests_ordered) } } +BOOST_AUTO_TEST_CASE(trie_tests_ordered_secureTrie) +{ + string testPath = test::getTestPath(); + + testPath += "/TrieTests"; + + cnote << "Testing Trie..."; + js::mValue v; + string s = asString(contents(testPath + "/trietest_secureTrie.json")); + BOOST_REQUIRE_MESSAGE(s.length() > 0, "Contents of 'trietest.json' is empty. Have you cloned the 'tests' repo branch develop?"); + js::read_string(s, v); + + for (auto& i: v.get_obj()) + { + cnote << i.first; + js::mObject& o = i.second.get_obj(); + vector<pair<string, string>> ss; + vector<string> keysToBeDeleted; + for (auto& i: o["in"].get_array()) + { + vector<string> values; + for (auto& s: i.get_array()) + { + if (s.type() == json_spirit::str_type) + values.push_back(s.get_str()); + else if (s.type() == json_spirit::null_type) + { + // mark entry for deletion + values.push_back(""); + if (!values[0].find("0x")) + values[0] = asString(fromHex(values[0].substr(2))); + keysToBeDeleted.push_back(values[0]); + } + else + BOOST_FAIL("Bad type (expected string)"); + } + + BOOST_REQUIRE(values.size() == 2); + ss.push_back(make_pair(values[0], values[1])); + if (!ss.back().first.find("0x")) + ss.back().first = asString(fromHex(ss.back().first.substr(2))); + if (!ss.back().second.find("0x")) + ss.back().second = asString(fromHex(ss.back().second.substr(2))); + } + + MemoryDB m; + SecureGenericTrieDB<MemoryDB> t(&m); + t.init(); + BOOST_REQUIRE(t.check(true)); + for (auto const& k: ss) + { + if (find(keysToBeDeleted.begin(), keysToBeDeleted.end(), k.first) != keysToBeDeleted.end() && k.second.empty()) + t.remove(k.first); + else + t.insert(k.first, k.second); + BOOST_REQUIRE(t.check(true)); + } + + BOOST_REQUIRE(!o["root"].is_null()); + BOOST_CHECK_EQUAL(o["root"].get_str(), "0x" + toHex(t.root().asArray())); + } +} + inline h256 stringMapHash256(StringMap const& _s) { return hash256(_s); |