diff options
Diffstat (limited to 'icing/legacy/index/icing-dynamic-trie_test.cc')
-rw-r--r-- | icing/legacy/index/icing-dynamic-trie_test.cc | 199 |
1 files changed, 5 insertions, 194 deletions
diff --git a/icing/legacy/index/icing-dynamic-trie_test.cc b/icing/legacy/index/icing-dynamic-trie_test.cc index d2cf48d..193765b 100644 --- a/icing/legacy/index/icing-dynamic-trie_test.cc +++ b/icing/legacy/index/icing-dynamic-trie_test.cc @@ -27,21 +27,15 @@ #include "gtest/gtest.h" #include "icing/legacy/core/icing-string-util.h" #include "icing/legacy/index/icing-filesystem.h" -#include "icing/proto/debug.pb.h" #include "icing/testing/tmp-directory.h" +using testing::ElementsAre; + namespace icing { namespace lib { namespace { -using ::testing::Each; -using ::testing::ElementsAre; -using ::testing::ElementsAreArray; -using ::testing::Gt; -using ::testing::IsEmpty; -using ::testing::UnorderedElementsAre; - constexpr std::string_view kKeys[] = { "", "ab", "ac", "abd", "bac", "bb", "bacd", "abbb", "abcdefg", }; @@ -62,8 +56,9 @@ class IcingDynamicTrieTest : public ::testing::Test { // Output trie stats to stderr. static void StatsDump(const IcingDynamicTrie& trie) { - DLOG(INFO) << "Stats:\n" - << trie.GetDebugInfo(/*verbosity=*/1).DebugString(); + IcingDynamicTrie::Stats stats; + trie.CollectStats(&stats); + DLOG(INFO) << "Stats:\n" << stats.DumpStats(true); } static void AddToTrie(IcingDynamicTrie* trie, uint32_t num_keys) { @@ -1138,189 +1133,5 @@ TEST_F(IcingDynamicTrieTest, BitmapsClosedWhenInitFails) { ASSERT_EQ(0, trie.property_bitmaps_.size()); } -TEST_F(IcingDynamicTrieTest, GetDebugInfo) { - IcingFilesystem filesystem; - IcingDynamicTrie trie(trie_files_prefix_, IcingDynamicTrie::RuntimeOptions(), - &filesystem); - IcingDynamicTrie::Options option; - ASSERT_TRUE(trie.CreateIfNotExist(option)); - ASSERT_TRUE(trie.Init()); - - uint32_t unused = 0; - ASSERT_TRUE(trie.Insert("", &unused)); - uint32_t val_idx; - ASSERT_TRUE(trie.Insert("ab", &unused, &val_idx, false)); - trie.SetProperty(val_idx, 0); - ASSERT_TRUE(trie.Insert("ac", &unused)); - ASSERT_TRUE(trie.Insert("abd", &unused)); - ASSERT_TRUE(trie.Insert("bac", &unused)); - ASSERT_TRUE(trie.Insert("bb", &unused)); - ASSERT_TRUE(trie.Insert("bacd", &unused)); - ASSERT_TRUE(trie.Insert("abbb", &unused)); - ASSERT_TRUE(trie.Insert("abcdefg", &unused)); - StatsDump(trie); - - LexiconDebugInfoProto info0 = trie.GetDebugInfo(/*verbosity=*/1); - EXPECT_EQ(info0.num_keys(), 9); - EXPECT_EQ(info0.node_info().num_nodes(), 15); - EXPECT_EQ(info0.node_info().max_nodes(), option.max_nodes); - EXPECT_EQ(info0.node_info().num_intermediates(), 6); - EXPECT_EQ(info0.node_info().sum_children(), 14); - EXPECT_EQ(info0.node_info().max_children(), 4); - EXPECT_EQ(info0.node_info().avg_children(), (float)14 / 6); - EXPECT_EQ(info0.node_info().num_leaves(), 9); - EXPECT_EQ(info0.node_info().sum_depth(), 25); - EXPECT_EQ(info0.node_info().max_depth(), 4); - EXPECT_EQ(info0.node_info().avg_depth(), (float)25 / 9); - - EXPECT_EQ(info0.next_info().num_nexts(), 17); - EXPECT_EQ(info0.next_info().max_nexts(), option.max_nexts); - uint32_t exp_child_counts[IcingDynamicTrie::kMaxNextArraySize] = {1, 3, 1, 1}; - EXPECT_THAT(info0.next_info().child_counts(), - ElementsAreArray(exp_child_counts)); - EXPECT_THAT(info0.next_info().wasted(), - ElementsAre(0, 0, 1, 0, 0, 0, 0, 0, 0)); - EXPECT_EQ(info0.next_info().total_wasted(), 1); - EXPECT_THAT(info0.next_info().num_free(), - ElementsAre(0, 1, 0, 0, 0, 0, 0, 0, 0)); - EXPECT_EQ(info0.next_info().total_free(), 2); - EXPECT_EQ(info0.next_info().total_frag(), (float)(2 + 1) / 17); - - EXPECT_THAT(info0.suffix_info().suffixes_capacity(), Gt(0)); - EXPECT_EQ(info0.suffix_info().max_suffixes_capacity(), - option.max_suffixes_size); - EXPECT_THAT(info0.suffix_info().suffixes_used(), Gt(0)); - EXPECT_EQ(info0.suffix_info().num_null_suffixes(), 7); - - EXPECT_EQ(info0.node_info().dirty_pages(), 1); - EXPECT_EQ(info0.next_info().dirty_pages(), 1); - EXPECT_EQ(info0.suffix_info().dirty_pages(), 1); - - std::vector<uint32_t> property_ids; - for (int i = 0; i < info0.property_bitmaps_info_size(); i++) { - property_ids.push_back(info0.property_bitmaps_info(i).property_id()); - } - EXPECT_THAT(property_ids, UnorderedElementsAre(-1, 0)); - - LexiconDebugInfoProto info1 = trie.GetDebugInfo(/*verbosity=*/0); - EXPECT_THAT(info1.next_info().child_counts(), IsEmpty()); - EXPECT_THAT(info1.property_bitmaps_info(), IsEmpty()); -} - -TEST_F(IcingDynamicTrieTest, GetDebugInfoForEmptyTrie) { - IcingFilesystem filesystem; - IcingDynamicTrie trie(trie_files_prefix_, IcingDynamicTrie::RuntimeOptions(), - &filesystem); - IcingDynamicTrie::Options option; - ASSERT_TRUE(trie.CreateIfNotExist(option)); - ASSERT_TRUE(trie.Init()); - - LexiconDebugInfoProto info = trie.GetDebugInfo(/*verbosity=*/1); - EXPECT_EQ(info.num_keys(), 0); - EXPECT_EQ(info.node_info().num_nodes(), 0); - EXPECT_EQ(info.node_info().max_nodes(), option.max_nodes); - EXPECT_EQ(info.node_info().num_intermediates(), 0); - EXPECT_EQ(info.node_info().sum_children(), 0); - EXPECT_EQ(info.node_info().max_children(), 0); - EXPECT_EQ(info.node_info().num_leaves(), 0); - EXPECT_EQ(info.node_info().sum_depth(), 0); - EXPECT_EQ(info.node_info().max_depth(), 0); - - EXPECT_EQ(info.next_info().num_nexts(), 0); - EXPECT_EQ(info.next_info().max_nexts(), option.max_nexts); - EXPECT_THAT(info.next_info().child_counts(), Each(0)); - EXPECT_THAT(info.next_info().wasted(), Each(0)); - EXPECT_EQ(info.next_info().total_wasted(), 0); - EXPECT_THAT(info.next_info().num_free(), Each(0)); - EXPECT_EQ(info.next_info().total_free(), 0); - - EXPECT_EQ(info.suffix_info().suffixes_capacity(), 0); - EXPECT_EQ(info.suffix_info().max_suffixes_capacity(), - option.max_suffixes_size); - EXPECT_EQ(info.suffix_info().suffixes_used(), 0); - EXPECT_EQ(info.suffix_info().num_null_suffixes(), 0); - - EXPECT_EQ(info.node_info().dirty_pages(), 0); - EXPECT_EQ(info.next_info().dirty_pages(), 0); - EXPECT_EQ(info.suffix_info().dirty_pages(), 0); -} - -TEST_F(IcingDynamicTrieTest, GetDebugInfoCorrectForWastedAndChildCounts) { - IcingFilesystem filesystem; - IcingDynamicTrie trie(trie_files_prefix_, IcingDynamicTrie::RuntimeOptions(), - &filesystem); - ASSERT_TRUE(trie.CreateIfNotExist(IcingDynamicTrie::Options())); - ASSERT_TRUE(trie.Init()); - - uint32_t unused = 0; - ASSERT_TRUE(trie.Insert("", &unused)); - ASSERT_TRUE(trie.Insert("ab", &unused)); - PrintTrie(trie); - LexiconDebugInfoProto::NextInfo info = - trie.GetDebugInfo(/*verbosity=*/1).next_info(); - // Root has 2 children "" and "ab", which are leaves. No wasted. - EXPECT_THAT(info.wasted(), Each(0)); - uint32_t exp_child_counts1[IcingDynamicTrie::kMaxNextArraySize] = {0, 1}; - EXPECT_THAT(info.child_counts(), ElementsAreArray(exp_child_counts1)); - - ASSERT_TRUE(trie.Insert("ac", &unused)); - PrintTrie(trie); - info = trie.GetDebugInfo(/*verbosity=*/1).next_info(); - // Root has 2 children "" and "a". - // "a" has 2 children "b" and "c". - // No wasted. - EXPECT_THAT(info.wasted(), Each(0)); - uint32_t exp_child_counts2[IcingDynamicTrie::kMaxNextArraySize] = {0, 2}; - EXPECT_THAT(info.child_counts(), ElementsAreArray(exp_child_counts2)); - - ASSERT_TRUE(trie.Insert("ad", &unused)); - PrintTrie(trie); - info = trie.GetDebugInfo(/*verbosity=*/1).next_info(); - // Root has 2 children "" and "a". - // "a" has 3 children "b", "c", and "d". - // 1 next wasted for "a", since 2^2 - 3 = 1 - EXPECT_THAT(info.wasted(), ElementsAre(0, 0, 1, 0, 0, 0, 0, 0, 0)); - uint32_t exp_child_counts3[IcingDynamicTrie::kMaxNextArraySize] = {0, 1, 1}; - EXPECT_THAT(info.child_counts(), ElementsAreArray(exp_child_counts3)); -} - -TEST_F(IcingDynamicTrieTest, GetDebugInfoCorrectForFreeList) { - IcingFilesystem filesystem; - IcingDynamicTrie trie(trie_files_prefix_, IcingDynamicTrie::RuntimeOptions(), - &filesystem); - ASSERT_TRUE(trie.CreateIfNotExist(IcingDynamicTrie::Options())); - ASSERT_TRUE(trie.Init()); - - uint32_t unused = 0; - ASSERT_TRUE(trie.Insert("", &unused)); - ASSERT_TRUE(trie.Insert("ab", &unused)); - ASSERT_TRUE(trie.Insert("ac", &unused)); - // No next arrays are freed yet. - LexiconDebugInfoProto::NextInfo info = - trie.GetDebugInfo(/*verbosity=*/0).next_info(); - EXPECT_THAT(info.num_free(), Each(0)); - EXPECT_EQ(info.total_free(), 0); - - ASSERT_TRUE(trie.Insert("ad", &unused)); - info = trie.GetDebugInfo(/*verbosity=*/0).next_info(); - // The next array of "a" with size 2 has been freed in order to expand to - // size 4. - EXPECT_THAT(info.num_free(), ElementsAre(0, 1, 0, 0, 0, 0, 0, 0, 0)); - EXPECT_EQ(info.total_free(), 2); - - ASSERT_TRUE(trie.Insert("ae", &unused)); - info = trie.GetDebugInfo(/*verbosity=*/0).next_info(); - // No change - EXPECT_THAT(info.num_free(), ElementsAre(0, 1, 0, 0, 0, 0, 0, 0, 0)); - EXPECT_EQ(info.total_free(), 2); - - ASSERT_TRUE(trie.Insert("af", &unused)); - info = trie.GetDebugInfo(/*verbosity=*/0).next_info(); - // The next array of "a" with size 4 has been freed in order to expand to - // size 8. - EXPECT_THAT(info.num_free(), ElementsAre(0, 1, 1, 0, 0, 0, 0, 0, 0)); - EXPECT_EQ(info.total_free(), 2 + 4); -} - } // namespace lib } // namespace icing |