1 #include <ipmid/entity_map_json.hpp> 2 #include <ipmid/types.hpp> 3 #include <nlohmann/json.hpp> 4 5 #include <utility> 6 7 #include <gmock/gmock.h> 8 #include <gtest/gtest.h> 9 10 namespace ipmi 11 { 12 namespace sensor 13 { 14 15 namespace 16 { 17 using ::testing::IsEmpty; 18 19 TEST(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 41 TEST(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 66 TEST(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 105 TEST(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 130 TEST(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 166 TEST(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 224