|  | #include "association_manager.hpp" | 
|  |  | 
|  | #include <filesystem> | 
|  | #include <fstream> | 
|  |  | 
|  | #include <gtest/gtest.h> | 
|  |  | 
|  | using namespace phosphor::inventory::manager::associations; | 
|  | namespace fs = std::filesystem; | 
|  |  | 
|  | static const auto goodJson = R"( | 
|  | [ | 
|  | { | 
|  | "path": "system/PS0", | 
|  | "endpoints": | 
|  | [ | 
|  | { | 
|  | "types": | 
|  | { | 
|  | "rType": "inventory", | 
|  | "fType": "sensors" | 
|  | }, | 
|  | "paths": | 
|  | [ | 
|  | "power/ps0_input_power", | 
|  | "voltage/ps0_input_voltage", | 
|  | "current/ps0_output_current", | 
|  | "voltage/ps0_output_voltage" | 
|  | ] | 
|  | }, | 
|  | { | 
|  | "types": | 
|  | { | 
|  | "rType": "inventory", | 
|  | "fType": "fans" | 
|  | }, | 
|  | "paths": | 
|  | [ | 
|  | "fan_tach/ps0_fan" | 
|  | ] | 
|  | } | 
|  | ] | 
|  | }, | 
|  | { | 
|  | "path": "system/fan42", | 
|  | "endpoints": | 
|  | [ | 
|  | { | 
|  | "types": | 
|  | { | 
|  | "rType": "inventory", | 
|  | "fType": "sensors" | 
|  | }, | 
|  | "paths": | 
|  | [ | 
|  | "fan_tach/fan42" | 
|  | ] | 
|  | }, | 
|  | { | 
|  | "types": | 
|  | { | 
|  | "rType": "inventory", | 
|  | "fType": "led" | 
|  | }, | 
|  | "paths": | 
|  | [ | 
|  | "led/fan42" | 
|  | ] | 
|  | } | 
|  | ] | 
|  | } | 
|  | ])"; | 
|  |  | 
|  | // Malformed JSON | 
|  | static const auto badJson0 = R"( | 
|  | "hello": world | 
|  | })"; | 
|  |  | 
|  | // Uses 'blah' instead of 'paths' | 
|  | static const auto badJson1 = R"( | 
|  | [ | 
|  | { | 
|  | "blah": "system/PS0", | 
|  | "endpoints": | 
|  | [ | 
|  | { | 
|  | "types": | 
|  | { | 
|  | "fType": "inventory", | 
|  | "rType": "sensors" | 
|  | }, | 
|  | "paths": | 
|  | [ | 
|  | "ps0_input_power", | 
|  | ] | 
|  | } | 
|  | ] | 
|  | } | 
|  | ])"; | 
|  |  | 
|  | // Uses 'blah' instead of 'rType' | 
|  | static const auto badJson2 = R"( | 
|  | [ | 
|  | { | 
|  | "paths": "system/PS0", | 
|  | "endpoints": | 
|  | [ | 
|  | { | 
|  | "types": | 
|  | { | 
|  | "blah": "inventory", | 
|  | "fType": "sensors" | 
|  | }, | 
|  | "paths": | 
|  | [ | 
|  | "ps0_input_power", | 
|  | ] | 
|  | } | 
|  | ] | 
|  | } | 
|  | ])"; | 
|  |  | 
|  | // Missing the endpoints/paths array | 
|  | static const auto badJson3 = R"( | 
|  | [ | 
|  | { | 
|  | "paths": "system/PS0", | 
|  | "endpoints": | 
|  | [ | 
|  | { | 
|  | "types": | 
|  | { | 
|  | "rType": "inventory", | 
|  | "fType": "sensors" | 
|  | } | 
|  | } | 
|  | ] | 
|  | } | 
|  | ])"; | 
|  |  | 
|  | class AssocsTest : public ::testing::Test | 
|  | { | 
|  | protected: | 
|  | AssocsTest() : ::testing::Test(), bus(sdbusplus::bus::new_default()) | 
|  | { | 
|  | } | 
|  |  | 
|  | fs::path jsonDir; | 
|  | sdbusplus::bus::bus bus; | 
|  |  | 
|  | virtual void SetUp() | 
|  | { | 
|  | char dir[] = {"assocTestXXXXXX"}; | 
|  | jsonDir = mkdtemp(dir); | 
|  | } | 
|  |  | 
|  | virtual void TearDown() | 
|  | { | 
|  | fs::remove_all(jsonDir); | 
|  | } | 
|  |  | 
|  | std::string writeFile(const char* data) | 
|  | { | 
|  | fs::path path = jsonDir / "associations.json"; | 
|  |  | 
|  | std::ofstream f{path}; | 
|  | f << data; | 
|  | f.close(); | 
|  |  | 
|  | return path; | 
|  | } | 
|  | }; | 
|  |  | 
|  | TEST_F(AssocsTest, TEST_NO_JSON) | 
|  | { | 
|  | try | 
|  | { | 
|  | Manager m{bus}; | 
|  | EXPECT_TRUE(false); | 
|  | } | 
|  | catch (std::exception& e) | 
|  | { | 
|  | } | 
|  | } | 
|  |  | 
|  | TEST_F(AssocsTest, TEST_GOOD_JSON) | 
|  | { | 
|  | auto path = writeFile(goodJson); | 
|  | Manager m(bus, path); | 
|  |  | 
|  | const auto& a = m.getAssociationsConfig(); | 
|  | EXPECT_EQ(a.size(), 2); | 
|  |  | 
|  | { | 
|  | auto x = a.find("/xyz/openbmc_project/inventory/system/PS0"); | 
|  | EXPECT_NE(x, a.end()); | 
|  |  | 
|  | auto& endpoints = x->second; | 
|  | EXPECT_EQ(endpoints.size(), 2); | 
|  |  | 
|  | { | 
|  | auto& types = std::get<0>(endpoints[0]); | 
|  | EXPECT_EQ(std::get<0>(types), "sensors"); | 
|  | EXPECT_EQ(std::get<1>(types), "inventory"); | 
|  |  | 
|  | auto& paths = std::get<1>(endpoints[0]); | 
|  | EXPECT_EQ(paths.size(), 4); | 
|  | } | 
|  | { | 
|  | auto& types = std::get<0>(endpoints[1]); | 
|  | EXPECT_EQ(std::get<0>(types), "fans"); | 
|  | EXPECT_EQ(std::get<1>(types), "inventory"); | 
|  |  | 
|  | auto& paths = std::get<1>(endpoints[1]); | 
|  | EXPECT_EQ(paths.size(), 1); | 
|  | } | 
|  | } | 
|  | { | 
|  | auto x = a.find("/xyz/openbmc_project/inventory/system/fan42"); | 
|  | EXPECT_NE(x, a.end()); | 
|  |  | 
|  | auto& endpoints = x->second; | 
|  | EXPECT_EQ(endpoints.size(), 2); | 
|  |  | 
|  | { | 
|  | auto& types = std::get<0>(endpoints[0]); | 
|  | EXPECT_EQ(std::get<0>(types), "sensors"); | 
|  | EXPECT_EQ(std::get<1>(types), "inventory"); | 
|  |  | 
|  | auto& paths = std::get<1>(endpoints[0]); | 
|  | EXPECT_EQ(paths.size(), 1); | 
|  | } | 
|  | { | 
|  | auto& types = std::get<0>(endpoints[1]); | 
|  | EXPECT_EQ(std::get<0>(types), "led"); | 
|  | EXPECT_EQ(std::get<1>(types), "inventory"); | 
|  |  | 
|  | auto& paths = std::get<1>(endpoints[1]); | 
|  | EXPECT_EQ(paths.size(), 1); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | TEST_F(AssocsTest, TEST_BAD_JSON0) | 
|  | { | 
|  | auto path = writeFile(badJson0); | 
|  |  | 
|  | try | 
|  | { | 
|  | Manager m(bus, path); | 
|  |  | 
|  | EXPECT_TRUE(false); | 
|  | } | 
|  | catch (std::exception& e) | 
|  | { | 
|  | } | 
|  | } | 
|  |  | 
|  | TEST_F(AssocsTest, TEST_BAD_JSON1) | 
|  | { | 
|  | auto path = writeFile(badJson1); | 
|  |  | 
|  | try | 
|  | { | 
|  | Manager m(bus, path); | 
|  |  | 
|  | EXPECT_TRUE(false); | 
|  | } | 
|  | catch (std::exception& e) | 
|  | { | 
|  | } | 
|  | } | 
|  |  | 
|  | TEST_F(AssocsTest, TEST_BAD_JSON2) | 
|  | { | 
|  | auto path = writeFile(badJson2); | 
|  |  | 
|  | try | 
|  | { | 
|  | Manager m(bus, path); | 
|  |  | 
|  | EXPECT_TRUE(false); | 
|  | } | 
|  | catch (std::exception& e) | 
|  | { | 
|  | } | 
|  | } | 
|  |  | 
|  | TEST_F(AssocsTest, TEST_BAD_JSON3) | 
|  | { | 
|  | auto path = writeFile(badJson3); | 
|  |  | 
|  | try | 
|  | { | 
|  | Manager m(bus, path); | 
|  |  | 
|  | EXPECT_TRUE(false); | 
|  | } | 
|  | catch (std::exception& e) | 
|  | { | 
|  | } | 
|  | } |