summaryrefslogtreecommitdiffstats
path: root/storage/src/tests/distributor/bucketdatabasetest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/src/tests/distributor/bucketdatabasetest.cpp')
-rw-r--r--storage/src/tests/distributor/bucketdatabasetest.cpp219
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)));
}
}