OLD | NEW |
---|---|
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/devtools/serialize_host_descriptions.h" | 5 #include "chrome/browser/devtools/serialize_host_descriptions.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/values.h" | 10 #include "base/values.h" |
11 #include "testing/gmock/include/gmock/gmock.h" | 11 #include "testing/gmock/include/gmock/gmock.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
13 | 13 |
14 using ::testing::UnorderedElementsAre; | |
15 | |
14 namespace { | 16 namespace { |
15 | 17 |
16 HostDescriptionNode GetDummyNode() { | 18 HostDescriptionNode GetNodeWithLabel(const char* name, int label) { |
17 return {std::string(), std::string(), base::DictionaryValue()}; | 19 HostDescriptionNode node = {name, std::string(), base::DictionaryValue()}; |
20 node.representation.SetInteger("label", label); | |
21 return node; | |
18 } | 22 } |
19 | 23 |
20 HostDescriptionNode GetNodeWithLabel(int id) { | 24 // Returns the list of children of |arg|. |
21 base::DictionaryValue dict; | 25 const base::Value* GetChildren(const base::Value& arg) { |
22 dict.SetInteger("label", id); | 26 const base::DictionaryValue* dict = nullptr; |
23 return {std::string(), std::string(), std::move(dict)}; | 27 EXPECT_TRUE(arg.GetAsDictionary(&dict)); |
28 | |
29 const base::Value* children = nullptr; | |
vabr (Chromium)
2017/04/23 11:47:32
I keep children a Value as opposed to ListValue, b
| |
30 if (!dict->Get("children", &children)) | |
31 return nullptr; | |
32 EXPECT_EQ(base::Value::Type::LIST, children->type()); | |
33 return children; | |
24 } | 34 } |
25 | 35 |
26 int GetLabel(const base::DictionaryValue* dict) { | 36 // Checks that |arg| is a description of a node with label |l|. |
37 bool CheckLabel(const base::Value& arg, int l) { | |
38 const base::DictionaryValue* dict = nullptr; | |
39 EXPECT_TRUE(arg.GetAsDictionary(&dict)); | |
27 int result = 0; | 40 int result = 0; |
28 EXPECT_TRUE(dict->GetInteger("label", &result)); | 41 if (!dict->GetInteger("label", &result)) |
29 return result; | 42 return false; |
43 return l == result; | |
44 } | |
45 | |
46 // Matches every |arg| with label |label| and checks that it has no children. | |
vabr (Chromium)
2017/04/23 11:47:32
One can argue that the GMock matchers are a bit he
| |
47 MATCHER_P(EmptyNode, label, "") { | |
48 if (!CheckLabel(arg, label)) | |
49 return false; | |
50 EXPECT_FALSE(GetChildren(arg)); | |
51 return true; | |
30 } | 52 } |
31 | 53 |
32 } // namespace | 54 } // namespace |
33 | 55 |
34 TEST(SerializeDictionaryForestTest, Empty) { | 56 TEST(SerializeHostDescriptionTest, Empty) { |
35 base::ListValue result = | 57 base::ListValue result = |
36 SerializeHostDescriptions(std::vector<HostDescriptionNode>(), "123"); | 58 SerializeHostDescriptions(std::vector<HostDescriptionNode>(), "123"); |
37 EXPECT_TRUE(result.empty()); | 59 EXPECT_THAT(result.base::Value::GetList(), ::testing::IsEmpty()); |
vabr (Chromium)
2017/04/23 11:47:32
Also, I am using GetList() to get a vector instead
vabr (Chromium)
2017/04/23 11:47:32
Here I use EXPECT_THAT and IsEmpty instead of EXPE
| |
38 } | 60 } |
39 | 61 |
40 // Test serializing a forest of stubs (no edges). | 62 // Test serializing a forest of stubs (no edges). |
41 TEST(SerializeDictionaryForestTest, Stubs) { | 63 TEST(SerializeHostDescriptionTest, Stubs) { |
42 base::ListValue result = SerializeHostDescriptions( | 64 base::ListValue result = SerializeHostDescriptions( |
43 {GetDummyNode(), GetDummyNode(), GetDummyNode()}, "123"); | 65 {GetNodeWithLabel("1", 1), GetNodeWithLabel("2", 2), |
44 EXPECT_EQ(3u, result.GetSize()); | 66 GetNodeWithLabel("3", 3)}, |
45 for (const base::Value& value : result) { | 67 "children"); |
46 const base::DictionaryValue* dict = nullptr; | 68 EXPECT_THAT(result.base::Value::GetList(), |
47 ASSERT_TRUE(value.GetAsDictionary(&dict)); | 69 UnorderedElementsAre(EmptyNode(1), EmptyNode(2), EmptyNode(3))); |
48 EXPECT_FALSE(dict->HasKey("123")); | 70 } |
49 } | 71 |
72 // Test handling multiple nodes sharing the same name. | |
73 TEST(SerializeHostDescriptionTest, SameNames) { | |
74 std::vector<HostDescriptionNode> nodes = { | |
75 GetNodeWithLabel("A", 1), GetNodeWithLabel("A", 2), | |
76 GetNodeWithLabel("A", 3), GetNodeWithLabel("B", 4), | |
77 GetNodeWithLabel("C", 5)}; | |
78 | |
79 base::ListValue result = | |
80 SerializeHostDescriptions(std::move(nodes), "children"); | |
81 | |
82 // Only the first node called "A", and both nodes "B" and "C" should be | |
83 // returned. | |
84 EXPECT_THAT(result.base::Value::GetList(), | |
85 UnorderedElementsAre(EmptyNode(1), EmptyNode(4), EmptyNode(5))); | |
50 } | 86 } |
51 | 87 |
52 // Test serializing a small forest, of this structure: | 88 // Test serializing a small forest, of this structure: |
53 // 5 -- 2 -- 4 | 89 // 5 -- 2 -- 4 |
54 // 0 -- 6 | 90 // 0 -- 6 |
55 // \ 1 | 91 // \ 1 |
56 // \ 3 | 92 // \ 3 |
57 TEST(SerializeDictionaryForestTest, Forest) { | 93 |
94 namespace { | |
95 | |
96 // Matchers for non-empty nodes specifically in this test: | |
97 MATCHER(Node2, "") { | |
98 if (!CheckLabel(arg, 2)) | |
99 return false; | |
100 EXPECT_THAT(GetChildren(arg)->GetList(), UnorderedElementsAre(EmptyNode(4))); | |
101 return true; | |
102 } | |
103 | |
104 MATCHER(Node5, "") { | |
105 if (!CheckLabel(arg, 5)) | |
106 return false; | |
107 EXPECT_THAT(GetChildren(arg)->GetList(), UnorderedElementsAre(Node2())); | |
108 return true; | |
109 } | |
110 | |
111 MATCHER(Node0, "") { | |
112 if (!CheckLabel(arg, 0)) | |
113 return false; | |
114 EXPECT_THAT(GetChildren(arg)->GetList(), | |
115 UnorderedElementsAre(EmptyNode(1), EmptyNode(3), EmptyNode(6))); | |
116 return true; | |
117 } | |
118 | |
119 } // namespace | |
120 | |
121 TEST(SerializeHostDescriptionTest, Forest) { | |
58 std::vector<HostDescriptionNode> nodes(7); | 122 std::vector<HostDescriptionNode> nodes(7); |
59 const char* kNames[] = {"0", "1", "2", "3", "4", "5", "6"}; | 123 const char* kNames[] = {"0", "1", "2", "3", "4", "5", "6"}; |
60 for (size_t i = 0; i < 7; ++i) { | 124 for (size_t i = 0; i < 7; ++i) { |
61 nodes[i] = GetNodeWithLabel(i); | 125 nodes[i] = GetNodeWithLabel(kNames[i], i); |
62 nodes[i].name = kNames[i]; | |
63 } | 126 } |
64 nodes[2].parent_name = "5"; | 127 nodes[2].parent_name = "5"; |
65 nodes[4].parent_name = "2"; | 128 nodes[4].parent_name = "2"; |
66 nodes[6].parent_name = "0"; | 129 nodes[6].parent_name = "0"; |
67 nodes[1].parent_name = "0"; | 130 nodes[1].parent_name = "0"; |
68 nodes[3].parent_name = "0"; | 131 nodes[3].parent_name = "0"; |
69 | 132 |
70 base::ListValue result = | 133 base::ListValue result = |
71 SerializeHostDescriptions(std::move(nodes), "children"); | 134 SerializeHostDescriptions(std::move(nodes), "children"); |
72 | 135 |
73 EXPECT_EQ(2u, result.GetSize()); | 136 EXPECT_THAT(result.base::Value::GetList(), |
74 const base::Value* value = nullptr; | 137 UnorderedElementsAre(Node0(), Node5())); |
75 const base::DictionaryValue* dict = nullptr; | |
76 const base::ListValue* list = nullptr; | |
77 | |
78 // Check the result. Note that sibling nodes are in the same order in which | |
79 // they appear in |nodes|. | |
80 | |
81 // Node 0 | |
82 ASSERT_TRUE(result.Get(0, &value)); | |
83 ASSERT_TRUE(value->GetAsDictionary(&dict)); | |
84 EXPECT_EQ(0, GetLabel(dict)); | |
85 ASSERT_TRUE(dict->GetList("children", &list)); | |
86 EXPECT_EQ(3u, list->GetSize()); | |
87 | |
88 // Nodes 1, 3, 6 | |
89 constexpr int kLabels[] = {1, 3, 6}; | |
90 for (int i = 0; i < 3; ++i) { | |
91 ASSERT_TRUE(list->Get(i, &value)); | |
92 ASSERT_TRUE(value->GetAsDictionary(&dict)); | |
93 EXPECT_EQ(kLabels[i], GetLabel(dict)); | |
94 EXPECT_FALSE(dict->HasKey("children")); | |
95 } | |
96 | |
97 // Node 5 | |
98 ASSERT_TRUE(result.Get(1, &value)); | |
99 ASSERT_TRUE(value->GetAsDictionary(&dict)); | |
100 EXPECT_EQ(5, GetLabel(dict)); | |
101 ASSERT_TRUE(dict->GetList("children", &list)); | |
102 EXPECT_EQ(1u, list->GetSize()); | |
103 | |
104 // Node 2 | |
105 ASSERT_TRUE(list->Get(0, &value)); | |
106 ASSERT_TRUE(value->GetAsDictionary(&dict)); | |
107 EXPECT_EQ(2, GetLabel(dict)); | |
108 ASSERT_TRUE(dict->GetList("children", &list)); | |
109 EXPECT_EQ(1u, list->GetSize()); | |
110 | |
111 // Node 4 | |
112 ASSERT_TRUE(list->Get(0, &value)); | |
113 ASSERT_TRUE(value->GetAsDictionary(&dict)); | |
114 EXPECT_EQ(4, GetLabel(dict)); | |
115 EXPECT_FALSE(dict->HasKey("children")); | |
116 } | 138 } |
OLD | NEW |