| #include <ipmid/entity_map_json.hpp> |
| #include <ipmid/types.hpp> |
| #include <nlohmann/json.hpp> |
| |
| #include <utility> |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| namespace ipmi |
| { |
| namespace sensor |
| { |
| |
| namespace |
| { |
| using ::testing::IsEmpty; |
| |
| TEST(ValidateJson, FailWithNonArrayReturnsEmpty) |
| { |
| /* The entity map input json is expected to be an array of objects. */ |
| auto j = R"( |
| { |
| "id" : 1, |
| "containerEntityId" : 2, |
| "containerEntityInstance" : 3, |
| "isList" : false, |
| "isLinked" : false, |
| "entities" : [ |
| {"id" : 1, "instance" : 2}, |
| {"id" : 1, "instance" : 3}, |
| {"id" : 1, "instance" : 4}, |
| {"id" : 1, "instance" : 5} |
| ] |
| } |
| )"_json; |
| |
| EXPECT_THAT(buildJsonEntityMap(j), IsEmpty()); |
| } |
| |
| TEST(ValidateJson, FailWithMissingFieldReturnsEmpty) |
| { |
| /* There are many required fields, let's just validate that if one is |
| * missing, it returns the empty map. |
| */ |
| auto j = R"( |
| [ |
| { |
| "id" : 1, |
| "containerEntityId" : 2, |
| "containerEntityInstance" : 3, |
| "isList" : false, |
| "entities" : [ |
| {"id" : 1, "instance" : 2}, |
| {"id" : 1, "instance" : 3}, |
| {"id" : 1, "instance" : 4}, |
| {"id" : 1, "instance" : 5} |
| ] |
| } |
| ] |
| )"_json; |
| |
| EXPECT_THAT(buildJsonEntityMap(j), IsEmpty()); |
| } |
| |
| TEST(ValidateJson, AllValidEntryReturnsExpectedMap) |
| { |
| /* Boring test where we provide completely valid information and expect the |
| * resulting map contains that information. |
| */ |
| auto j = R"( |
| [ |
| { |
| "id" : 1, |
| "containerEntityId" : 2, |
| "containerEntityInstance" : 3, |
| "isList" : false, |
| "isLinked" : false, |
| "entities" : [ |
| {"id" : 1, "instance" : 2}, |
| {"id" : 1, "instance" : 3}, |
| {"id" : 1, "instance" : 4}, |
| {"id" : 1, "instance" : 5} |
| ] |
| } |
| ] |
| )"_json; |
| |
| auto map = buildJsonEntityMap(j); |
| EXPECT_FALSE(map.find(1) == map.end()); |
| auto entry = map.find(1); |
| EXPECT_EQ(entry->first, 1); |
| |
| /* TODO: someone could write an equality operator for this object. */ |
| EXPECT_EQ(entry->second.containerEntityId, 2); |
| EXPECT_EQ(entry->second.containerEntityInstance, 3); |
| EXPECT_FALSE(entry->second.isList); |
| EXPECT_FALSE(entry->second.isLinked); |
| ContainedEntitiesArray expected = { |
| std::make_pair(1, 2), std::make_pair(1, 3), std::make_pair(1, 4), |
| std::make_pair(1, 5)}; |
| EXPECT_EQ(entry->second.containedEntities, expected); |
| } |
| |
| TEST(ValidateJson, EntryHasInsufficientContainerEntryCountReturnsEmpty) |
| { |
| /* The container must have four pairs. (I don't know why, and maybe this |
| * restriction will change). |
| */ |
| auto j = R"( |
| [ |
| { |
| "id" : 1, |
| "containerEntityId" : 2, |
| "containerEntityInstance" : 3, |
| "isList" : false, |
| "isLinked" : false, |
| "entities" : [ |
| {"id" : 1, "instance" : 2}, |
| {"id" : 1, "instance" : 3}, |
| {"id" : 1, "instance" : 4} |
| ] |
| } |
| ] |
| )"_json; |
| |
| EXPECT_THAT(buildJsonEntityMap(j), IsEmpty()); |
| } |
| |
| TEST(ValidateJson, ThereAreTwoEntriesOneInvalidReturnsEmpty) |
| { |
| /* If any entry in the file is corrupt, the file is disregarded. */ |
| auto j = R"( |
| [ |
| { |
| "id" : 1, |
| "containerEntityId" : 2, |
| "containerEntityInstance" : 3, |
| "isList" : false, |
| "isLinked" : false, |
| "entities" : [ |
| {"id" : 1, "instance" : 2}, |
| {"id" : 1, "instance" : 3}, |
| {"id" : 1, "instance" : 4}, |
| {"id" : 1, "instance" : 5} |
| ] |
| }, |
| { |
| "id" : 2, |
| "containerEntityId" : 2, |
| "containerEntityInstance" : 3, |
| "isList" : false, |
| "isLinked" : false, |
| "entities" : [ |
| {"id" : 1, "instance" : 2}, |
| {"id" : 1, "instance" : 3}, |
| {"id" : 1, "instance" : 4} |
| ] |
| } |
| ] |
| )"_json; |
| |
| EXPECT_THAT(buildJsonEntityMap(j), IsEmpty()); |
| } |
| |
| TEST(ValidateJson, ThereAreTwoEntriesBothValidReturnsBoth) |
| { |
| /* The map supports more than one entry, just validate this. */ |
| auto j = R"( |
| [ |
| { |
| "id" : 1, |
| "containerEntityId" : 2, |
| "containerEntityInstance" : 3, |
| "isList" : false, |
| "isLinked" : false, |
| "entities" : [ |
| {"id" : 1, "instance" : 2}, |
| {"id" : 1, "instance" : 3}, |
| {"id" : 1, "instance" : 4}, |
| {"id" : 1, "instance" : 5} |
| ] |
| }, |
| { |
| "id" : 2, |
| "containerEntityId" : 2, |
| "containerEntityInstance" : 3, |
| "isList" : false, |
| "isLinked" : false, |
| "entities" : [ |
| {"id" : 1, "instance" : 6}, |
| {"id" : 1, "instance" : 7}, |
| {"id" : 1, "instance" : 8}, |
| {"id" : 1, "instance" : 9} |
| ] |
| } |
| ] |
| )"_json; |
| |
| auto map = buildJsonEntityMap(j); |
| EXPECT_FALSE(map.find(1) == map.end()); |
| EXPECT_FALSE(map.find(2) == map.end()); |
| |
| auto entry = map.find(1); |
| EXPECT_EQ(entry->first, 1); |
| EXPECT_EQ(entry->second.containerEntityId, 2); |
| EXPECT_EQ(entry->second.containerEntityInstance, 3); |
| EXPECT_FALSE(entry->second.isList); |
| EXPECT_FALSE(entry->second.isLinked); |
| ContainedEntitiesArray expected = { |
| std::make_pair(1, 2), std::make_pair(1, 3), std::make_pair(1, 4), |
| std::make_pair(1, 5)}; |
| EXPECT_EQ(entry->second.containedEntities, expected); |
| |
| entry = map.find(2); |
| expected = {std::make_pair(1, 6), std::make_pair(1, 7), |
| std::make_pair(1, 8), std::make_pair(1, 9)}; |
| EXPECT_EQ(entry->second.containedEntities, expected); |
| } |
| |
| } // namespace |
| } // namespace sensor |
| } // namespace ipmi |