1 //
2 // Copyright (C) 2017 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #include "trie_builder.h"
18 
19 #include <gtest/gtest.h>
20 
21 namespace android {
22 namespace properties {
23 
TEST(propertyinfoserializer,BuildTrie_Simple)24 TEST(propertyinfoserializer, BuildTrie_Simple) {
25   auto trie_builder = TrieBuilder("default", "default_type");
26 
27   // Add test data to tree
28   auto error = std::string();
29   EXPECT_TRUE(trie_builder.AddToTrie("test.", "1st", "1st_type", false, &error));
30   EXPECT_TRUE(trie_builder.AddToTrie("test.test", "2nd", "2nd_type", false, &error));
31   EXPECT_TRUE(trie_builder.AddToTrie("test.test1", "3rd", "3rd_type", true, &error));
32   EXPECT_TRUE(trie_builder.AddToTrie("test.test2", "3rd", "3rd_type", true, &error));
33   EXPECT_TRUE(trie_builder.AddToTrie("test.test3", "3rd", "3rd_type", true, &error));
34   EXPECT_TRUE(trie_builder.AddToTrie("this.is.a.long.string", "4th", "4th_type", true, &error));
35 
36   ASSERT_EQ(5U, trie_builder.contexts().size());
37   ASSERT_EQ(5U, trie_builder.types().size());
38 
39   auto& builder_root = trie_builder.builder_root();
40 
41   // Check the root node
42   EXPECT_EQ("root", builder_root.name());
43   ASSERT_NE(nullptr, builder_root.context());
44   EXPECT_EQ("default", *builder_root.context());
45   ASSERT_NE(nullptr, builder_root.type());
46   EXPECT_EQ("default_type", *builder_root.type());
47 
48   EXPECT_EQ(0U, builder_root.prefixes().size());
49   EXPECT_EQ(0U, builder_root.exact_matches().size());
50 
51   ASSERT_EQ(2U, builder_root.children().size());
52 
53   // Check the 'test.' node
54   auto* test_node = builder_root.FindChild("test");
55   EXPECT_EQ("test", test_node->name());
56   ASSERT_NE(nullptr, test_node->context());
57   EXPECT_EQ("1st", *test_node->context());
58   ASSERT_NE(nullptr, test_node->type());
59   EXPECT_EQ("1st_type", *test_node->type());
60 
61   EXPECT_EQ(0U, test_node->children().size());
62   EXPECT_EQ(1U, test_node->prefixes().size());
63   {
64     auto& property_entry = test_node->prefixes()[0];
65     EXPECT_EQ("test", property_entry.name);
66     ASSERT_NE(nullptr, property_entry.context);
67     EXPECT_EQ("2nd", *property_entry.context);
68     ASSERT_NE(nullptr, property_entry.type);
69     EXPECT_EQ("2nd_type", *property_entry.type);
70   }
71   EXPECT_EQ(3U, test_node->exact_matches().size());
72   EXPECT_EQ("test1", test_node->exact_matches()[0].name);
73   EXPECT_EQ("test2", test_node->exact_matches()[1].name);
74   EXPECT_EQ("test3", test_node->exact_matches()[2].name);
75 
76   ASSERT_NE(nullptr, test_node->exact_matches()[0].context);
77   ASSERT_NE(nullptr, test_node->exact_matches()[1].context);
78   ASSERT_NE(nullptr, test_node->exact_matches()[2].context);
79   EXPECT_EQ("3rd", *test_node->exact_matches()[0].context);
80   EXPECT_EQ("3rd", *test_node->exact_matches()[1].context);
81   EXPECT_EQ("3rd", *test_node->exact_matches()[2].context);
82 
83   ASSERT_NE(nullptr, test_node->exact_matches()[0].type);
84   ASSERT_NE(nullptr, test_node->exact_matches()[1].type);
85   ASSERT_NE(nullptr, test_node->exact_matches()[2].type);
86   EXPECT_EQ("3rd_type", *test_node->exact_matches()[0].type);
87   EXPECT_EQ("3rd_type", *test_node->exact_matches()[1].type);
88   EXPECT_EQ("3rd_type", *test_node->exact_matches()[2].type);
89 
90   // Check the long string node
91   auto expect_empty_one_child = [](auto* node) {
92     ASSERT_NE(nullptr, node);
93     EXPECT_EQ(nullptr, node->context());
94     EXPECT_EQ(nullptr, node->type());
95     EXPECT_EQ(0U, node->prefixes().size());
96     EXPECT_EQ(0U, node->exact_matches().size());
97     EXPECT_EQ(1U, node->children().size());
98   };
99 
100   // Start with 'this'
101   auto* long_string_node = builder_root.FindChild("this");
102   expect_empty_one_child(long_string_node);
103 
104   // Move to 'is'
105   long_string_node = long_string_node->FindChild("is");
106   expect_empty_one_child(long_string_node);
107 
108   // Move to 'a'
109   long_string_node = long_string_node->FindChild("a");
110   expect_empty_one_child(long_string_node);
111 
112   // Move to 'long'
113   long_string_node = long_string_node->FindChild("long");
114   EXPECT_EQ(0U, long_string_node->prefixes().size());
115   EXPECT_EQ(1U, long_string_node->exact_matches().size());
116   EXPECT_EQ(0U, long_string_node->children().size());
117 
118   {
119     auto& property_entry = long_string_node->exact_matches()[0];
120     EXPECT_EQ("string", property_entry.name);
121     ASSERT_NE(nullptr, property_entry.context);
122     EXPECT_EQ("4th", *property_entry.context);
123     ASSERT_NE(nullptr, property_entry.type);
124     EXPECT_EQ("4th_type", *property_entry.type);
125   }
126 }
127 
128 }  // namespace properties
129 }  // namespace android
130