blob: 5f31e1bba24c342340f93179b33cf1eb8f7b2cca [file] [log] [blame]
Vernon Mauery9cf08382023-04-28 14:00:11 -07001#include <ipmid/entity_map_json.hpp>
Patrick Venture02e32372019-08-16 10:50:18 -07002#include <ipmid/types.hpp>
3#include <nlohmann/json.hpp>
Patrick Williamsfbc6c9d2023-05-10 07:50:16 -05004
Patrick Venture02e32372019-08-16 10:50:18 -07005#include <utility>
6
7#include <gmock/gmock.h>
8#include <gtest/gtest.h>
9
10namespace ipmi
11{
12namespace sensor
13{
14
15namespace
16{
17using ::testing::IsEmpty;
18
19TEST(ValidateJson, FailWithNonArrayReturnsEmpty)
20{
21 /* The entity map input json is expected to be an array of objects. */
22 auto j = R"(
23 {
24 "id" : 1,
25 "containerEntityId" : 2,
26 "containerEntityInstance" : 3,
27 "isList" : false,
28 "isLinked" : false,
29 "entities" : [
30 {"id" : 1, "instance" : 2},
31 {"id" : 1, "instance" : 3},
32 {"id" : 1, "instance" : 4},
33 {"id" : 1, "instance" : 5}
34 ]
35 }
36 )"_json;
37
38 EXPECT_THAT(buildJsonEntityMap(j), IsEmpty());
39}
40
41TEST(ValidateJson, FailWithMissingFieldReturnsEmpty)
42{
43 /* There are many required fields, let's just validate that if one is
44 * missing, it returns the empty map.
45 */
46 auto j = R"(
47 [
48 {
49 "id" : 1,
50 "containerEntityId" : 2,
51 "containerEntityInstance" : 3,
52 "isList" : false,
53 "entities" : [
54 {"id" : 1, "instance" : 2},
55 {"id" : 1, "instance" : 3},
56 {"id" : 1, "instance" : 4},
57 {"id" : 1, "instance" : 5}
58 ]
59 }
60 ]
61 )"_json;
62
63 EXPECT_THAT(buildJsonEntityMap(j), IsEmpty());
64}
65
66TEST(ValidateJson, AllValidEntryReturnsExpectedMap)
67{
68 /* Boring test where we provide completely valid information and expect the
69 * resulting map contains that information.
70 */
71 auto j = R"(
72 [
73 {
74 "id" : 1,
75 "containerEntityId" : 2,
76 "containerEntityInstance" : 3,
77 "isList" : false,
78 "isLinked" : false,
79 "entities" : [
80 {"id" : 1, "instance" : 2},
81 {"id" : 1, "instance" : 3},
82 {"id" : 1, "instance" : 4},
83 {"id" : 1, "instance" : 5}
84 ]
85 }
86 ]
87 )"_json;
88
89 auto map = buildJsonEntityMap(j);
90 EXPECT_FALSE(map.find(1) == map.end());
91 auto entry = map.find(1);
92 EXPECT_EQ(entry->first, 1);
93
94 /* TODO: someone could write an equality operator for this object. */
95 EXPECT_EQ(entry->second.containerEntityId, 2);
96 EXPECT_EQ(entry->second.containerEntityInstance, 3);
97 EXPECT_FALSE(entry->second.isList);
98 EXPECT_FALSE(entry->second.isLinked);
99 ContainedEntitiesArray expected = {
100 std::make_pair(1, 2), std::make_pair(1, 3), std::make_pair(1, 4),
101 std::make_pair(1, 5)};
102 EXPECT_EQ(entry->second.containedEntities, expected);
103}
104
105TEST(ValidateJson, EntryHasInsufficientContainerEntryCountReturnsEmpty)
106{
107 /* The container must have four pairs. (I don't know why, and maybe this
108 * restriction will change).
109 */
110 auto j = R"(
111 [
112 {
113 "id" : 1,
114 "containerEntityId" : 2,
115 "containerEntityInstance" : 3,
116 "isList" : false,
117 "isLinked" : false,
118 "entities" : [
119 {"id" : 1, "instance" : 2},
120 {"id" : 1, "instance" : 3},
121 {"id" : 1, "instance" : 4}
122 ]
123 }
124 ]
125 )"_json;
126
127 EXPECT_THAT(buildJsonEntityMap(j), IsEmpty());
128}
129
130TEST(ValidateJson, ThereAreTwoEntriesOneInvalidReturnsEmpty)
131{
132 /* If any entry in the file is corrupt, the file is disregarded. */
133 auto j = R"(
134 [
135 {
136 "id" : 1,
137 "containerEntityId" : 2,
138 "containerEntityInstance" : 3,
139 "isList" : false,
140 "isLinked" : false,
141 "entities" : [
142 {"id" : 1, "instance" : 2},
143 {"id" : 1, "instance" : 3},
144 {"id" : 1, "instance" : 4},
145 {"id" : 1, "instance" : 5}
146 ]
147 },
148 {
149 "id" : 2,
150 "containerEntityId" : 2,
151 "containerEntityInstance" : 3,
152 "isList" : false,
153 "isLinked" : false,
154 "entities" : [
155 {"id" : 1, "instance" : 2},
156 {"id" : 1, "instance" : 3},
157 {"id" : 1, "instance" : 4}
158 ]
159 }
160 ]
161 )"_json;
162
163 EXPECT_THAT(buildJsonEntityMap(j), IsEmpty());
164}
165
166TEST(ValidateJson, ThereAreTwoEntriesBothValidReturnsBoth)
167{
168 /* The map supports more than one entry, just validate this. */
169 auto j = R"(
170 [
171 {
172 "id" : 1,
173 "containerEntityId" : 2,
174 "containerEntityInstance" : 3,
175 "isList" : false,
176 "isLinked" : false,
177 "entities" : [
178 {"id" : 1, "instance" : 2},
179 {"id" : 1, "instance" : 3},
180 {"id" : 1, "instance" : 4},
181 {"id" : 1, "instance" : 5}
182 ]
183 },
184 {
185 "id" : 2,
186 "containerEntityId" : 2,
187 "containerEntityInstance" : 3,
188 "isList" : false,
189 "isLinked" : false,
190 "entities" : [
191 {"id" : 1, "instance" : 6},
192 {"id" : 1, "instance" : 7},
193 {"id" : 1, "instance" : 8},
194 {"id" : 1, "instance" : 9}
195 ]
196 }
197 ]
198 )"_json;
199
200 auto map = buildJsonEntityMap(j);
201 EXPECT_FALSE(map.find(1) == map.end());
202 EXPECT_FALSE(map.find(2) == map.end());
203
204 auto entry = map.find(1);
205 EXPECT_EQ(entry->first, 1);
206 EXPECT_EQ(entry->second.containerEntityId, 2);
207 EXPECT_EQ(entry->second.containerEntityInstance, 3);
208 EXPECT_FALSE(entry->second.isList);
209 EXPECT_FALSE(entry->second.isLinked);
210 ContainedEntitiesArray expected = {
211 std::make_pair(1, 2), std::make_pair(1, 3), std::make_pair(1, 4),
212 std::make_pair(1, 5)};
213 EXPECT_EQ(entry->second.containedEntities, expected);
214
215 entry = map.find(2);
216 expected = {std::make_pair(1, 6), std::make_pair(1, 7),
217 std::make_pair(1, 8), std::make_pair(1, 9)};
218 EXPECT_EQ(entry->second.containedEntities, expected);
219}
220
221} // namespace
222} // namespace sensor
223} // namespace ipmi