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