Auto merge of #3146 - str4d:bc-7956-dbwrapper-tests, r=str4d
Additional dbwrapper tests Cherry-picked from the following upstream PRs: - bitcoin/bitcoin#7992 - bitcoin/bitcoin#9867 - Only the commit affecting dbwrapper tests - bitcoin/bitcoin#9610 - Only the change affecting dbwrapper tests - bitcoin/bitcoin#10844
This commit is contained in:
commit
dc57d6a7bc
|
@ -90,6 +90,7 @@ CBlockIndex* CBlockIndex::GetAncestor(int height)
|
||||||
pindexWalk = pindexWalk->pskip;
|
pindexWalk = pindexWalk->pskip;
|
||||||
heightWalk = heightSkip;
|
heightWalk = heightSkip;
|
||||||
} else {
|
} else {
|
||||||
|
assert(pindexWalk->pprev);
|
||||||
pindexWalk = pindexWalk->pprev;
|
pindexWalk = pindexWalk->pprev;
|
||||||
heightWalk--;
|
heightWalk--;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
// Copyright (c) 2012-2013 The Bitcoin Core developers
|
// Copyright (c) 2018 The Zcash developers
|
||||||
|
// Copyright (c) 2012-2017 The Bitcoin Core developers
|
||||||
// Distributed under the MIT software license, see the accompanying
|
// Distributed under the MIT software license, see the accompanying
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
@ -73,7 +74,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper_batch)
|
||||||
BOOST_CHECK(dbw.Read(key2, res));
|
BOOST_CHECK(dbw.Read(key2, res));
|
||||||
BOOST_CHECK_EQUAL(res.ToString(), in2.ToString());
|
BOOST_CHECK_EQUAL(res.ToString(), in2.ToString());
|
||||||
|
|
||||||
// key3 never should've been written
|
// key3 should've never been written
|
||||||
BOOST_CHECK(dbw.Read(key3, res) == false);
|
BOOST_CHECK(dbw.Read(key3, res) == false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -117,4 +118,117 @@ BOOST_AUTO_TEST_CASE(dbwrapper_iterator)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 seek_start : {0x00, 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct StringContentsSerializer {
|
||||||
|
// Used to make two serialized objects the same while letting them have different lengths
|
||||||
|
// This is a terrible idea
|
||||||
|
string str;
|
||||||
|
StringContentsSerializer() {}
|
||||||
|
StringContentsSerializer(const string& inp) : str(inp) {}
|
||||||
|
|
||||||
|
StringContentsSerializer& operator+=(const string& s) {
|
||||||
|
str += s;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
StringContentsSerializer& operator+=(const StringContentsSerializer& s) { return *this += s.str; }
|
||||||
|
|
||||||
|
ADD_SERIALIZE_METHODS;
|
||||||
|
|
||||||
|
template <typename Stream, typename Operation>
|
||||||
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
||||||
|
if (ser_action.ForRead()) {
|
||||||
|
str.clear();
|
||||||
|
char c = 0;
|
||||||
|
while (true) {
|
||||||
|
try {
|
||||||
|
READWRITE(c);
|
||||||
|
str.push_back(c);
|
||||||
|
} catch (const std::ios_base::failure& e) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (size_t i = 0; i < str.size(); i++)
|
||||||
|
READWRITE(str[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(iterator_string_ordering)
|
||||||
|
{
|
||||||
|
char buf[10];
|
||||||
|
|
||||||
|
path ph = temp_directory_path() / unique_path();
|
||||||
|
CDBWrapper dbw(ph, (1 << 20), true, false);
|
||||||
|
for (int x=0x00; x<10; ++x) {
|
||||||
|
for (int y = 0; y < 10; y++) {
|
||||||
|
int n = snprintf(buf, sizeof(buf), "%d", x);
|
||||||
|
assert(n > 0 && n < sizeof(buf));
|
||||||
|
StringContentsSerializer key(buf);
|
||||||
|
for (int z = 0; z < y; z++)
|
||||||
|
key += key;
|
||||||
|
uint32_t value = x*x;
|
||||||
|
BOOST_CHECK(dbw.Write(key, value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boost::scoped_ptr<CDBIterator> it(const_cast<CDBWrapper*>(&dbw)->NewIterator());
|
||||||
|
for (int seek_start : {0, 5}) {
|
||||||
|
int n = snprintf(buf, sizeof(buf), "%d", seek_start);
|
||||||
|
assert(n > 0 && n < sizeof(buf));
|
||||||
|
StringContentsSerializer seek_key(buf);
|
||||||
|
it->Seek(seek_key);
|
||||||
|
for (int x=seek_start; x<10; ++x) {
|
||||||
|
for (int y = 0; y < 10; y++) {
|
||||||
|
int n = snprintf(buf, sizeof(buf), "%d", x);
|
||||||
|
assert(n > 0 && n < sizeof(buf));
|
||||||
|
string exp_key(buf);
|
||||||
|
for (int z = 0; z < y; z++)
|
||||||
|
exp_key += exp_key;
|
||||||
|
StringContentsSerializer 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.str, exp_key);
|
||||||
|
BOOST_CHECK_EQUAL(value, x*x);
|
||||||
|
it->Next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BOOST_CHECK(!it->Valid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
Loading…
Reference in New Issue