diff options
Diffstat (limited to 'storage/src/tests/distributor/bucketdatabasetest.cpp')
-rw-r--r-- | storage/src/tests/distributor/bucketdatabasetest.cpp | 219 |
1 files changed, 114 insertions, 105 deletions
diff --git a/storage/src/tests/distributor/bucketdatabasetest.cpp b/storage/src/tests/distributor/bucketdatabasetest.cpp index 55106ce5c28..92e0c534e31 100644 --- a/storage/src/tests/distributor/bucketdatabasetest.cpp +++ b/storage/src/tests/distributor/bucketdatabasetest.cpp @@ -1,6 +1,5 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "bucketdatabasetest.h" -#include <vespa/storageframework/defaultimplementation/clock/realclock.h> #include <iomanip> #include <algorithm> @@ -8,9 +7,7 @@ namespace storage::distributor { using document::BucketId; -void -BucketDatabaseTest::setUp() -{ +void BucketDatabaseTest::SetUp() { db().clear(); } @@ -26,44 +23,42 @@ namespace { } } -void -BucketDatabaseTest::testClear() { +TEST_P(BucketDatabaseTest, testClear) { db().update(BucketDatabase::Entry(document::BucketId(16, 16), BI(1))); db().update(BucketDatabase::Entry(document::BucketId(16, 11), BI(2))); db().clear(); - CPPUNIT_ASSERT_EQUAL(uint64_t(0), db().size()); + EXPECT_EQ(uint64_t(0), db().size()); } -void -BucketDatabaseTest::testUpdateGetAndRemove() { +TEST_P(BucketDatabaseTest, testUpdateGetAndRemove) { // Do some insertions - CPPUNIT_ASSERT_EQUAL(0, (int)db().size()); + EXPECT_EQ(0, db().size()); db().update(BucketDatabase::Entry(document::BucketId(16, 16), BI(1))); db().update(BucketDatabase::Entry(document::BucketId(16, 11), BI(2))); db().update(BucketDatabase::Entry(document::BucketId(16, 42), BI(3))); - CPPUNIT_ASSERT_EQUAL(3, (int)db().size()); + EXPECT_EQ(3, db().size()); db().update(BucketDatabase::Entry(document::BucketId(16, 11), BI(4))); - CPPUNIT_ASSERT_EQUAL(3, (int)db().size()); + EXPECT_EQ(3, db().size()); // Access some elements - CPPUNIT_ASSERT_EQUAL(BI(4), db().get(document::BucketId(16, 11)).getBucketInfo()); - CPPUNIT_ASSERT_EQUAL(BI(1), db().get(document::BucketId(16, 16)).getBucketInfo()); - CPPUNIT_ASSERT_EQUAL(BI(3), db().get(document::BucketId(16, 42)).getBucketInfo()); + EXPECT_EQ(BI(4), db().get(document::BucketId(16, 11)).getBucketInfo()); + EXPECT_EQ(BI(1), db().get(document::BucketId(16, 16)).getBucketInfo()); + EXPECT_EQ(BI(3), db().get(document::BucketId(16, 42)).getBucketInfo()); // Do removes db().remove(document::BucketId(16, 12)); - CPPUNIT_ASSERT_EQUAL(3, (int)db().size()); + EXPECT_EQ(3, db().size()); db().remove(document::BucketId(16, 11)); - CPPUNIT_ASSERT_EQUAL(2, (int)db().size()); + EXPECT_EQ(2, db().size()); db().remove(document::BucketId(16, 16)); db().remove(document::BucketId(16, 42)); - CPPUNIT_ASSERT_EQUAL(0, (int)db().size()); + EXPECT_EQ(0, db().size()); } namespace { @@ -83,8 +78,7 @@ struct ModifyProcessor : public BucketDatabase::MutableEntryProcessor } }; -struct ListAllProcessor : public BucketDatabase::EntryProcessor -{ +struct ListAllProcessor : public BucketDatabase::EntryProcessor { std::ostringstream ost; bool process(const BucketDatabase::Entry& e) override { @@ -93,8 +87,7 @@ struct ListAllProcessor : public BucketDatabase::EntryProcessor } }; -struct DummyProcessor : public BucketDatabase::EntryProcessor -{ +struct DummyProcessor : public BucketDatabase::EntryProcessor { std::ostringstream ost; bool process(const BucketDatabase::Entry&) override { @@ -103,8 +96,7 @@ struct DummyProcessor : public BucketDatabase::EntryProcessor }; -struct StoppingProcessor : public BucketDatabase::EntryProcessor -{ +struct StoppingProcessor : public BucketDatabase::EntryProcessor { std::ostringstream ost; bool process(const BucketDatabase::Entry& e) override { @@ -120,8 +112,7 @@ struct StoppingProcessor : public BucketDatabase::EntryProcessor } -void -BucketDatabaseTest::testIterating() { +TEST_P(BucketDatabaseTest, testIterating) { // Do some insertions db().update(BucketDatabase::Entry(document::BucketId(16, 0x10), BI(1))); db().update(BucketDatabase::Entry(document::BucketId(16, 0x0b), BI(2))); @@ -131,7 +122,7 @@ BucketDatabaseTest::testIterating() { ListAllProcessor proc; db().forEach(proc, document::BucketId()); - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( std::string( "BucketId(0x4000000000000010) : " "node(idx=1,crc=0x0,docs=0/0,bytes=1/1,trusted=false,active=false,ready=false)\n" @@ -146,7 +137,7 @@ BucketDatabaseTest::testIterating() { ListAllProcessor proc; db().forEach(proc, document::BucketId(16, 0x2a)); - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( std::string( "BucketId(0x400000000000000b) : " "node(idx=2,crc=0x0,docs=0/0,bytes=1/1,trusted=false,active=false,ready=false)\n"), @@ -157,7 +148,7 @@ BucketDatabaseTest::testIterating() { StoppingProcessor proc; db().forEach(proc, document::BucketId()); - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( std::string( "BucketId(0x4000000000000010) : " "node(idx=1,crc=0x0,docs=0/0,bytes=1/1,trusted=false,active=false,ready=false)\n" @@ -173,7 +164,7 @@ BucketDatabaseTest::testIterating() { ListAllProcessor proc; db().forEach(proc); - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( std::string( "BucketId(0x4000000000000010) : " "node(idx=1,crc=0x0,docs=0/0,bytes=1/1,trusted=false,active=false,ready=false)\n" @@ -213,18 +204,33 @@ BucketDatabaseTest::doFindParents(const std::vector<document::BucketId>& ids, return ost.str(); } -void -BucketDatabaseTest::testFindParents() { +TEST_P(BucketDatabaseTest, testFindParents) { // test what parents in the DB (specified in vector) are parents of the // specified bucket. Result is a list of indexes into the vector. - CPPUNIT_ASSERT_EQUAL( + + // The way the legacy API works is that a bucket is considered as being in + // the set of its parents... This is rather weird, but at least explicitly + // test that it is so for now to avoid breaking the world. + EXPECT_EQ( + std::string("0"), + doFindParents(toVector(document::BucketId(17, 0xcafe)), + document::BucketId(17, 0xcafe))); + + EXPECT_EQ( + std::string("1,2"), + doFindParents(toVector(document::BucketId(1, 0x0), + document::BucketId(1, 0x1), + document::BucketId(2, 0x1)), + document::BucketId(16, 0x1))); + + EXPECT_EQ( std::string("2"), doFindParents(toVector(document::BucketId(17, 0x0ffff), document::BucketId(18, 0x1ffff), document::BucketId(18, 0x3ffff)), document::BucketId(22, 0xfffff))); - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( std::string("0,2,3"), doFindParents(toVector(document::BucketId(16, 0x0ffff), document::BucketId(17, 0x0ffff), @@ -232,7 +238,15 @@ BucketDatabaseTest::testFindParents() { document::BucketId(19, 0xfffff)), document::BucketId(22, 0xfffff))); - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( + std::string("0,1,2,3"), + doFindParents(toVector(document::BucketId(16, 0x0ffff), + document::BucketId(17, 0x0ffff), + document::BucketId(18, 0x0ffff), + document::BucketId(19, 0x0ffff)), + document::BucketId(20, 0x0ffff))); + + EXPECT_EQ( std::string("0,2,3"), doFindParents(toVector(document::BucketId(16, 0x0ffff), document::BucketId(17, 0x0ffff), @@ -240,20 +254,20 @@ BucketDatabaseTest::testFindParents() { document::BucketId(18, 0x1ffff)), document::BucketId(22, 0x1ffff))); - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( std::string("0"), doFindParents(toVector(document::BucketId(16, 0x0ffff), document::BucketId(17, 0x0ffff)), document::BucketId(22, 0x1ffff))); - CPPUNIT_ASSERT_EQUAL( // ticket 3121525 + EXPECT_EQ( // ticket 3121525 std::string("0"), doFindParents(toVector(document::BucketId(16, 0x0ffff), document::BucketId(17, 0x0ffff), document::BucketId(19, 0x1ffff)), document::BucketId(18, 0x1ffff))); - CPPUNIT_ASSERT_EQUAL( // ticket 3121525 + EXPECT_EQ( // ticket 3121525 std::string("0"), doFindParents(toVector(document::BucketId(16, 0x0ffff), document::BucketId(17, 0x0ffff), @@ -276,8 +290,11 @@ BucketDatabaseTest::doFindAll(const std::vector<document::BucketId>& ids, std::ostringstream ost; for (uint32_t i = 0; i < ids.size(); ++i) { - if (std::find(entries.begin(), entries.end(), - BucketDatabase::Entry(ids[i], BI(i))) != entries.end()) { + auto wanted = BucketDatabase::Entry(ids[i], BI(i)); + for (const auto& e : entries) { + if (!(e == wanted)) { + continue; + } if (!ost.str().empty()) { ost << ","; } @@ -288,11 +305,9 @@ BucketDatabaseTest::doFindAll(const std::vector<document::BucketId>& ids, return ost.str(); } -void -BucketDatabaseTest::testFindAll() -{ +TEST_P(BucketDatabaseTest, testFindAll) { std::vector<document::BucketId> buckets; - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( std::string(""), doFindAll(buckets, document::BucketId(18, 0x1ffff))); @@ -306,15 +321,20 @@ BucketDatabaseTest::testFindAll() buckets.push_back(document::BucketId(20, 0xceaaa)); buckets.push_back(document::BucketId(17, 0x1ffff)); - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( + std::string("0"), + doFindAll(toVector(document::BucketId(16, 1234)), + document::BucketId(16, 1234))); + + EXPECT_EQ( std::string("0,4,5,6"), doFindAll(buckets, document::BucketId(17, 0x1aaaa))); - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( std::string("8"), doFindAll(buckets, document::BucketId(16, 0xffff))); - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( std::string("0,1"), doFindAll(toVector(document::BucketId(17, 0x00001), document::BucketId(17, 0x10001)), @@ -322,7 +342,7 @@ BucketDatabaseTest::testFindAll() document::BucketId id(33, 0x1053c7089); // Bit 32 is set, but unused. id.setUsedBits(32); - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( std::string("1,2"), doFindAll(toVector(document::BucketId(24, 0x000dc7089), document::BucketId(33, 0x0053c7089), @@ -330,7 +350,7 @@ BucketDatabaseTest::testFindAll() document::BucketId(24, 0x000bc7089)), id)); - CPPUNIT_ASSERT_EQUAL( // Inconsistent split + EXPECT_EQ( // Inconsistent split std::string("0,1,2"), doFindAll(toVector( document::BucketId(16, 0x00001), // contains 2-3 @@ -338,7 +358,7 @@ BucketDatabaseTest::testFindAll() document::BucketId(17, 0x10001)), document::BucketId(16, 0x00001))); - CPPUNIT_ASSERT_EQUAL( // Inconsistent split + EXPECT_EQ( // Inconsistent split std::string("1,2"), doFindAll(toVector( document::BucketId(17, 0x10000), @@ -347,14 +367,14 @@ BucketDatabaseTest::testFindAll() document::BucketId(17, 0x1ffff)), document::BucketId(32, 0x027228034))); - CPPUNIT_ASSERT_EQUAL( // Inconsistent split + EXPECT_EQ( // Inconsistent split std::string("0"), doFindAll(toVector( document::BucketId(16, 0x0ffff), document::BucketId(17, 0x0ffff)), document::BucketId(22, 0x1ffff))); - CPPUNIT_ASSERT_EQUAL( // Inconsistent split + EXPECT_EQ( // Inconsistent split std::string("0,2"), doFindAll(toVector( document::BucketId(16, 0x0ffff), @@ -362,7 +382,7 @@ BucketDatabaseTest::testFindAll() document::BucketId(19, 0x1ffff)), document::BucketId(18, 0x1ffff))); - CPPUNIT_ASSERT_EQUAL( // Inconsistent split, ticket 3121525 + EXPECT_EQ( // Inconsistent split, ticket 3121525 std::string("0,2"), doFindAll(toVector( document::BucketId(16, 0x0ffff), @@ -386,36 +406,36 @@ BucketDatabaseTest::doCreate(const std::vector<document::BucketId>& ids, return entry.getBucketId(); } -void -BucketDatabaseTest::testCreateAppropriateBucket() { +// TODO rewrite in terms of bucket getter, not creator +TEST_P(BucketDatabaseTest, testCreateAppropriateBucket) { // Use min split bits when no relevant bucket exist. - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( document::BucketId(36,0x0000004d2), doCreate(toVector(document::BucketId(58, 0x43d6c878000004d2ull)), 36, document::BucketId(58, 0x423bf1e0000004d2ull))); - // New bucket has bits in common with existing bucket. - // Create bucket with min amount of bits while not being overlapping - CPPUNIT_ASSERT_EQUAL( + // New bucket has bits in common with existing bucket. + // Create bucket with min amount of bits while not being overlapping + EXPECT_EQ( document::BucketId(34,0x0000004d2), doCreate(toVector(document::BucketId(58, 0xeaf77782000004d2)), 16, document::BucketId(58, 0x00000000000004d2))); - // Create sibling of existing bucket with most LSB bits in common. - CPPUNIT_ASSERT_EQUAL( + // Create sibling of existing bucket with most LSB bits in common. + EXPECT_EQ( document::BucketId(40, 0x0000004d2), doCreate(toVector(document::BucketId(58, 0xeaf77780000004d2), document::BucketId(58, 0xeaf77782000004d2)), 16, document::BucketId(58, 0x00000000000004d2))); - // Create sibling of existing bucket with most LSB bits in common. - CPPUNIT_ASSERT_EQUAL( + // Create sibling of existing bucket with most LSB bits in common. + EXPECT_EQ( document::BucketId(25, 0x0010004d2), doCreate(toVector(document::BucketId(16, 0x00000000000004d1), document::BucketId(40, 0x00000000000004d2)), 16, document::BucketId(58, 0x00000000010004d2))); - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( document::BucketId(36, 0x10000004000004d2), doCreate(toVector(document::BucketId(0x8c000000000004d2), document::BucketId(0xeb54b3ac000004d2), @@ -423,42 +443,38 @@ BucketDatabaseTest::testCreateAppropriateBucket() { document::BucketId(0x84000001000004d2)), 16, document::BucketId(58, 0x1944a44000004d2))); - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( document::BucketId(25, 0x0010004d2), doCreate(toVector(document::BucketId(58, 0xeaf77780000004d2), document::BucketId(40, 0x00000000000004d1)), 16, document::BucketId(58,0x00000000010004d2))); - // Test empty bucket database case. (Use min split bits) + // Test empty bucket database case. (Use min split bits) std::vector<document::BucketId> buckets; - CPPUNIT_ASSERT_EQUAL( + EXPECT_EQ( document::BucketId(16, 0x0000004d2ull), doCreate(buckets, 16, document::BucketId(58, 0x00000000010004d2))); } -void -BucketDatabaseTest::testGetNext() -{ - db().clear(); +TEST_P(BucketDatabaseTest, testGetNext) { db().update(BucketDatabase::Entry(document::BucketId(16, 16), BI(1))); db().update(BucketDatabase::Entry(document::BucketId(16, 11), BI(2))); db().update(BucketDatabase::Entry(document::BucketId(16, 42), BI(3))); - CPPUNIT_ASSERT_EQUAL(document::BucketId(16, 16), - db().getNext(document::BucketId()).getBucketId()); + EXPECT_EQ(document::BucketId(16, 16), + db().getNext(document::BucketId()).getBucketId()); - CPPUNIT_ASSERT_EQUAL(document::BucketId(16, 42), - db().getNext(document::BucketId(16, 16)).getBucketId()); + EXPECT_EQ(document::BucketId(16, 42), + db().getNext(document::BucketId(16, 16)).getBucketId()); - CPPUNIT_ASSERT_EQUAL(document::BucketId(16, 11), - db().getNext(document::BucketId(16, 42)).getBucketId()); + EXPECT_EQ(document::BucketId(16, 11), + db().getNext(document::BucketId(16, 42)).getBucketId()); } void BucketDatabaseTest::doTestUpperBound(const UBoundFunc& f) { - db().clear(); // Tree is rooted at the LSB bit, so the following buckets are in iteration // order based on the reverse of their "normal" bitstring: // 0010:3 @@ -473,30 +489,28 @@ BucketDatabaseTest::doTestUpperBound(const UBoundFunc& f) db().update(BucketDatabase::Entry(document::BucketId(3, 3), BI(3))); // 0000:0 (default constructed) has ubound of 0010:3 - CPPUNIT_ASSERT_EQUAL(BucketId(3, 4), f(db(), BucketId())); + EXPECT_EQ(BucketId(3, 4), f(db(), BucketId())); // 0011:4 has ubound of 1000:3 - CPPUNIT_ASSERT_EQUAL(document::BucketId(3, 1), f(db(), BucketId(4, 12))); + EXPECT_EQ(document::BucketId(3, 1), f(db(), BucketId(4, 12))); // 1000:1 has ubound of 1000:3 - CPPUNIT_ASSERT_EQUAL(BucketId(3, 4), f(db(), BucketId(1, 0))); - CPPUNIT_ASSERT_EQUAL(BucketId(3, 1), f(db(), BucketId(3, 4))); - CPPUNIT_ASSERT_EQUAL(BucketId(4, 9), f(db(), BucketId(3, 1))); - CPPUNIT_ASSERT_EQUAL(BucketId(5, 9), f(db(), BucketId(4, 9))); - CPPUNIT_ASSERT_EQUAL(BucketId(3, 3), f(db(), BucketId(5, 9))); + EXPECT_EQ(BucketId(3, 4), f(db(), BucketId(1, 0))); + EXPECT_EQ(BucketId(3, 1), f(db(), BucketId(3, 4))); + EXPECT_EQ(BucketId(4, 9), f(db(), BucketId(3, 1))); + EXPECT_EQ(BucketId(5, 9), f(db(), BucketId(4, 9))); + EXPECT_EQ(BucketId(3, 3), f(db(), BucketId(5, 9))); // 100101:6 does not exist, should also return 1100:3 - CPPUNIT_ASSERT_EQUAL(BucketId(3, 3), f(db(), BucketId(6, 41))); + EXPECT_EQ(BucketId(3, 3), f(db(), BucketId(6, 41))); // Test extremes. db().clear(); db().update(BucketDatabase::Entry(document::BucketId(8, 0), BI(2))); db().update(BucketDatabase::Entry(document::BucketId(8, 0xff), BI(2))); - CPPUNIT_ASSERT_EQUAL(BucketId(8, 0), f(db(), BucketId())); - CPPUNIT_ASSERT_EQUAL(BucketId(8, 0xff), f(db(), BucketId(8, 0))); + EXPECT_EQ(BucketId(8, 0), f(db(), BucketId())); + EXPECT_EQ(BucketId(8, 0xff), f(db(), BucketId(8, 0))); } -void -BucketDatabaseTest::testUpperBoundReturnsNextInOrderGreaterBucket() -{ +TEST_P(BucketDatabaseTest, testUpperBoundReturnsNextInOrderGreaterBucket) { doTestUpperBound([](const BucketDatabase& bucketDb, const document::BucketId& id) { @@ -504,9 +518,7 @@ BucketDatabaseTest::testUpperBoundReturnsNextInOrderGreaterBucket() }); } -void -BucketDatabaseTest::testGetNextReturnsUpperBoundBucket() -{ +TEST_P(BucketDatabaseTest, testGetNextReturnsUpperBoundBucket) { // getNext() would generally be implemented in terms of upperBound(), but // make sure it conforms to the same contract in case this changes. doTestUpperBound([](const BucketDatabase& bucketDb, @@ -516,31 +528,28 @@ BucketDatabaseTest::testGetNextReturnsUpperBoundBucket() }); } -void -BucketDatabaseTest::testChildCount() -{ - db().clear(); +TEST_P(BucketDatabaseTest, testChildCount) { // Empty tree; inserts cannot create inconsistencies. - CPPUNIT_ASSERT_EQUAL(0u, db().childCount(BucketId(3, 1))); + EXPECT_EQ(0u, db().childCount(BucketId(3, 1))); // Same bucket; cannot be inconsistent with itself. db().update(BucketDatabase::Entry(document::BucketId(3, 1), BI(1))); - CPPUNIT_ASSERT_EQUAL(0u, db().childCount(BucketId(3, 1))); + EXPECT_EQ(0u, db().childCount(BucketId(3, 1))); // (2, 1) has one subtree. - CPPUNIT_ASSERT_EQUAL(1u, db().childCount(BucketId(2, 1))); + EXPECT_EQ(1u, db().childCount(BucketId(2, 1))); // Bucket exists in another subtree from (1, 1); inconsistency would // result if we tried inserting it. db().update(BucketDatabase::Entry(document::BucketId(3, 3), BI(2))); - CPPUNIT_ASSERT_EQUAL(2u, db().childCount(BucketId(1, 1))); + EXPECT_EQ(2u, db().childCount(BucketId(1, 1))); // Inner node with 1 subtree. - CPPUNIT_ASSERT_EQUAL(1u, db().childCount(BucketId(2, 3))); + EXPECT_EQ(1u, db().childCount(BucketId(2, 3))); // Leaves have no subtrees. - CPPUNIT_ASSERT_EQUAL(0u, db().childCount(BucketId(3, 1))); - CPPUNIT_ASSERT_EQUAL(0u, db().childCount(BucketId(3, 5))); + EXPECT_EQ(0u, db().childCount(BucketId(3, 1))); + EXPECT_EQ(0u, db().childCount(BucketId(3, 5))); } } |