Files
opendht/tests/test_pht.cpp

77 lines
2.5 KiB
C++

// Copyright (c) 2014-2026 Savoir-faire Linux Inc.
// SPDX-License-Identifier: MIT
#include "test_pht.h"
// opendht
#include "opendht/indexation/pht.h"
namespace test {
CPPUNIT_TEST_SUITE_REGISTRATION(PhtTester);
using dht::indexation::Prefix;
void
PhtTester::testCommonBits()
{
// Prefix::size_ counts bits, so two prefixes that agree everywhere have
// as many bits in common as they are long, and no more.
const Prefix same {dht::Blob(20, 0xAB)};
CPPUNIT_ASSERT_EQUAL((unsigned) 160, Prefix::commonBits(same, Prefix {dht::Blob(20, 0xAB)}));
// A difference in the very last bit leaves every other bit in common.
dht::Blob other(20, 0xAB);
other[19] = 0xAA;
CPPUNIT_ASSERT_EQUAL((unsigned) 159, Prefix::commonBits(same, Prefix {other}));
// A difference in the very first bit leaves nothing in common.
dht::Blob first(20, 0xAB);
first[0] = 0x2B;
CPPUNIT_ASSERT_EQUAL((unsigned) 0, Prefix::commonBits(same, Prefix {first}));
// Bits beyond the shorter prefix are not compared, whatever the content
// they are cut from holds.
const Prefix shorter = same.getPrefix(3);
CPPUNIT_ASSERT_EQUAL((size_t) 3, shorter.size_);
CPPUNIT_ASSERT_EQUAL((unsigned) 3, Prefix::commonBits(shorter, same));
CPPUNIT_ASSERT_EQUAL((unsigned) 3, Prefix::commonBits(same, shorter));
}
void
PhtTester::testSibling()
{
// The sibling of a node in the trie is the prefix that differs from it in
// its last bit, and in that bit only.
for (size_t length : {1, 7, 8, 9, 15, 16, 159}) {
const Prefix prefix = Prefix {dht::Blob(20, 0xAB)}.getPrefix(length);
const Prefix sibling = prefix.getSibling();
CPPUNIT_ASSERT_EQUAL(prefix.size_, sibling.size_);
CPPUNIT_ASSERT_EQUAL((unsigned) (length - 1), Prefix::commonBits(prefix, sibling));
CPPUNIT_ASSERT(prefix.isContentBitActive(length - 1) != sibling.isContentBitActive(length - 1));
// Being siblings is symmetric.
CPPUNIT_ASSERT(sibling.getSibling().content_ == prefix.content_);
}
}
void
PhtTester::testPadding()
{
for (size_t keySize : {0, 1, 2, 20}) {
for (size_t paddingSize : {1, 4}) {
dht::Blob expected(keySize, 0xAB);
Prefix prefix {expected};
expected.resize(keySize + paddingSize, 0);
expected[keySize] = 0x80;
prefix.addPaddingContent(expected.size());
CPPUNIT_ASSERT(prefix.content_ == expected);
CPPUNIT_ASSERT_EQUAL(keySize * 8, prefix.size_);
}
}
}
} // namespace test