Skip to content

Commit

Permalink
test: Add more thorough test for dbwrapper iterators
Browse files Browse the repository at this point in the history
I made a silly mistake in a database wrapper where keys
were sorted by char instead of uint8_t. As x86 char is signed
the sorting for the block index database was messed up, resulting
in a segfault due to missing records.

Add a test to catch:
- Wrong sorting
- Seeking errors
- Iteration result not complete
  • Loading branch information
laanwj authored and str4d committed Apr 4, 2018
1 parent 7b1acda commit 54a9734
Showing 1 changed file with 35 additions and 1 deletion.
36 changes: 35 additions & 1 deletion src/test/dbwrapper_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,5 +116,39 @@ BOOST_AUTO_TEST_CASE(dbwrapper_iterator)
BOOST_CHECK_EQUAL(it->Valid(), false);
}
}


BOOST_AUTO_TEST_CASE(iterator_ordering)
{
path ph = temp_directory_path() / unique_path();
CDBWrapper dbw(ph, (1 << 20), true, false);
for (int x=0x00; x<256; ++x) {
uint8_t key = x;
uint32_t value = x*x;
BOOST_CHECK(dbw.Write(key, value));
}

boost::scoped_ptr<CDBIterator> it(const_cast<CDBWrapper*>(&dbw)->NewIterator());
for (int c=0; c<2; ++c) {
int seek_start;
if (c == 0)
seek_start = 0x00;
else
seek_start = 0x80;
it->Seek((uint8_t)seek_start);
for (int x=seek_start; x<256; ++x) {
uint8_t key;
uint32_t value;
BOOST_CHECK(it->Valid());
if (!it->Valid()) // Avoid spurious errors about invalid iterator's key and value in case of failure
break;
BOOST_CHECK(it->GetKey(key));
BOOST_CHECK(it->GetValue(value));
BOOST_CHECK_EQUAL(key, x);
BOOST_CHECK_EQUAL(value, x*x);
it->Next();
}
BOOST_CHECK(!it->Valid());
}
}

BOOST_AUTO_TEST_SUITE_END()

0 comments on commit 54a9734

Please sign in to comment.