199e66a03SMatt Spinler #include "association_manager.hpp" 299e66a03SMatt Spinler 399e66a03SMatt Spinler #include <filesystem> 499e66a03SMatt Spinler #include <fstream> 599e66a03SMatt Spinler 699e66a03SMatt Spinler #include <gtest/gtest.h> 799e66a03SMatt Spinler 899e66a03SMatt Spinler using namespace phosphor::inventory::manager::associations; 999e66a03SMatt Spinler namespace fs = std::filesystem; 1099e66a03SMatt Spinler 1199e66a03SMatt Spinler static const auto goodJson = R"( 1299e66a03SMatt Spinler [ 1399e66a03SMatt Spinler { 1499e66a03SMatt Spinler "path": "system/PS0", 1599e66a03SMatt Spinler "endpoints": 1699e66a03SMatt Spinler [ 1799e66a03SMatt Spinler { 1899e66a03SMatt Spinler "types": 1999e66a03SMatt Spinler { 2099e66a03SMatt Spinler "rType": "inventory", 2199e66a03SMatt Spinler "fType": "sensors" 2299e66a03SMatt Spinler }, 2399e66a03SMatt Spinler "paths": 2499e66a03SMatt Spinler [ 2599e66a03SMatt Spinler "power/ps0_input_power", 2699e66a03SMatt Spinler "voltage/ps0_input_voltage", 2799e66a03SMatt Spinler "current/ps0_output_current", 2899e66a03SMatt Spinler "voltage/ps0_output_voltage" 2999e66a03SMatt Spinler ] 3099e66a03SMatt Spinler }, 3199e66a03SMatt Spinler { 3299e66a03SMatt Spinler "types": 3399e66a03SMatt Spinler { 3499e66a03SMatt Spinler "rType": "inventory", 3599e66a03SMatt Spinler "fType": "fans" 3699e66a03SMatt Spinler }, 3799e66a03SMatt Spinler "paths": 3899e66a03SMatt Spinler [ 3999e66a03SMatt Spinler "fan_tach/ps0_fan" 4099e66a03SMatt Spinler ] 4199e66a03SMatt Spinler } 4299e66a03SMatt Spinler ] 4399e66a03SMatt Spinler }, 4499e66a03SMatt Spinler { 4599e66a03SMatt Spinler "path": "system/fan42", 4699e66a03SMatt Spinler "endpoints": 4799e66a03SMatt Spinler [ 4899e66a03SMatt Spinler { 4999e66a03SMatt Spinler "types": 5099e66a03SMatt Spinler { 5199e66a03SMatt Spinler "rType": "inventory", 5299e66a03SMatt Spinler "fType": "sensors" 5399e66a03SMatt Spinler }, 5499e66a03SMatt Spinler "paths": 5599e66a03SMatt Spinler [ 5699e66a03SMatt Spinler "fan_tach/fan42" 5799e66a03SMatt Spinler ] 5899e66a03SMatt Spinler }, 5999e66a03SMatt Spinler { 6099e66a03SMatt Spinler "types": 6199e66a03SMatt Spinler { 6299e66a03SMatt Spinler "rType": "inventory", 6399e66a03SMatt Spinler "fType": "led" 6499e66a03SMatt Spinler }, 6599e66a03SMatt Spinler "paths": 6699e66a03SMatt Spinler [ 6799e66a03SMatt Spinler "led/fan42" 6899e66a03SMatt Spinler ] 6999e66a03SMatt Spinler } 7099e66a03SMatt Spinler ] 7199e66a03SMatt Spinler } 7299e66a03SMatt Spinler ])"; 7399e66a03SMatt Spinler 7499e66a03SMatt Spinler // Malformed JSON 7599e66a03SMatt Spinler static const auto badJson0 = R"( 7699e66a03SMatt Spinler "hello": world 7799e66a03SMatt Spinler })"; 7899e66a03SMatt Spinler 7999e66a03SMatt Spinler // Uses 'blah' instead of 'paths' 8099e66a03SMatt Spinler static const auto badJson1 = R"( 8199e66a03SMatt Spinler [ 8299e66a03SMatt Spinler { 8399e66a03SMatt Spinler "blah": "system/PS0", 8499e66a03SMatt Spinler "endpoints": 8599e66a03SMatt Spinler [ 8699e66a03SMatt Spinler { 8799e66a03SMatt Spinler "types": 8899e66a03SMatt Spinler { 8999e66a03SMatt Spinler "fType": "inventory", 9099e66a03SMatt Spinler "rType": "sensors" 9199e66a03SMatt Spinler }, 9299e66a03SMatt Spinler "paths": 9399e66a03SMatt Spinler [ 9499e66a03SMatt Spinler "ps0_input_power", 9599e66a03SMatt Spinler ] 9699e66a03SMatt Spinler } 9799e66a03SMatt Spinler ] 9899e66a03SMatt Spinler } 9999e66a03SMatt Spinler ])"; 10099e66a03SMatt Spinler 10199e66a03SMatt Spinler // Uses 'blah' instead of 'rType' 10299e66a03SMatt Spinler static const auto badJson2 = R"( 10399e66a03SMatt Spinler [ 10499e66a03SMatt Spinler { 10599e66a03SMatt Spinler "paths": "system/PS0", 10699e66a03SMatt Spinler "endpoints": 10799e66a03SMatt Spinler [ 10899e66a03SMatt Spinler { 10999e66a03SMatt Spinler "types": 11099e66a03SMatt Spinler { 11199e66a03SMatt Spinler "blah": "inventory", 11299e66a03SMatt Spinler "fType": "sensors" 11399e66a03SMatt Spinler }, 11499e66a03SMatt Spinler "paths": 11599e66a03SMatt Spinler [ 11699e66a03SMatt Spinler "ps0_input_power", 11799e66a03SMatt Spinler ] 11899e66a03SMatt Spinler } 11999e66a03SMatt Spinler ] 12099e66a03SMatt Spinler } 12199e66a03SMatt Spinler ])"; 12299e66a03SMatt Spinler 12399e66a03SMatt Spinler // Missing the endpoints/paths array 12499e66a03SMatt Spinler static const auto badJson3 = R"( 12599e66a03SMatt Spinler [ 12699e66a03SMatt Spinler { 12799e66a03SMatt Spinler "paths": "system/PS0", 12899e66a03SMatt Spinler "endpoints": 12999e66a03SMatt Spinler [ 13099e66a03SMatt Spinler { 13199e66a03SMatt Spinler "types": 13299e66a03SMatt Spinler { 13399e66a03SMatt Spinler "rType": "inventory", 13499e66a03SMatt Spinler "fType": "sensors" 13599e66a03SMatt Spinler } 13699e66a03SMatt Spinler } 13799e66a03SMatt Spinler ] 13899e66a03SMatt Spinler } 13999e66a03SMatt Spinler ])"; 14099e66a03SMatt Spinler 14199e66a03SMatt Spinler class AssocsTest : public ::testing::Test 14299e66a03SMatt Spinler { 14399e66a03SMatt Spinler protected: 14499e66a03SMatt Spinler AssocsTest() : ::testing::Test(), bus(sdbusplus::bus::new_default()) 145a83db30eSBrad Bishop {} 14699e66a03SMatt Spinler 14799e66a03SMatt Spinler fs::path jsonDir; 148*563306f6SPatrick Williams sdbusplus::bus_t bus; 14999e66a03SMatt Spinler 15099e66a03SMatt Spinler virtual void SetUp() 15199e66a03SMatt Spinler { 15299e66a03SMatt Spinler char dir[] = {"assocTestXXXXXX"}; 15399e66a03SMatt Spinler jsonDir = mkdtemp(dir); 15499e66a03SMatt Spinler } 15599e66a03SMatt Spinler 15699e66a03SMatt Spinler virtual void TearDown() 15799e66a03SMatt Spinler { 15899e66a03SMatt Spinler fs::remove_all(jsonDir); 15999e66a03SMatt Spinler } 16099e66a03SMatt Spinler 16199e66a03SMatt Spinler std::string writeFile(const char* data) 16299e66a03SMatt Spinler { 16399e66a03SMatt Spinler fs::path path = jsonDir / "associations.json"; 16499e66a03SMatt Spinler 16599e66a03SMatt Spinler std::ofstream f{path}; 16699e66a03SMatt Spinler f << data; 16799e66a03SMatt Spinler f.close(); 16899e66a03SMatt Spinler 16999e66a03SMatt Spinler return path; 17099e66a03SMatt Spinler } 17199e66a03SMatt Spinler }; 17299e66a03SMatt Spinler 17399e66a03SMatt Spinler TEST_F(AssocsTest, TEST_NO_JSON) 17499e66a03SMatt Spinler { 17599e66a03SMatt Spinler try 17699e66a03SMatt Spinler { 17799e66a03SMatt Spinler Manager m{bus}; 17899e66a03SMatt Spinler EXPECT_TRUE(false); 17999e66a03SMatt Spinler } 1803e2d9641SPatrick Williams catch (const std::exception& e) 181a83db30eSBrad Bishop {} 18299e66a03SMatt Spinler } 18399e66a03SMatt Spinler 18499e66a03SMatt Spinler TEST_F(AssocsTest, TEST_GOOD_JSON) 18599e66a03SMatt Spinler { 18699e66a03SMatt Spinler auto path = writeFile(goodJson); 18799e66a03SMatt Spinler Manager m(bus, path); 18899e66a03SMatt Spinler 18999e66a03SMatt Spinler const auto& a = m.getAssociationsConfig(); 19099e66a03SMatt Spinler EXPECT_EQ(a.size(), 2); 19199e66a03SMatt Spinler 19299e66a03SMatt Spinler { 19399e66a03SMatt Spinler auto x = a.find("/xyz/openbmc_project/inventory/system/PS0"); 19499e66a03SMatt Spinler EXPECT_NE(x, a.end()); 19599e66a03SMatt Spinler 19699e66a03SMatt Spinler auto& endpoints = x->second; 19799e66a03SMatt Spinler EXPECT_EQ(endpoints.size(), 2); 19899e66a03SMatt Spinler 19999e66a03SMatt Spinler { 20099e66a03SMatt Spinler auto& types = std::get<0>(endpoints[0]); 20199e66a03SMatt Spinler EXPECT_EQ(std::get<0>(types), "sensors"); 20299e66a03SMatt Spinler EXPECT_EQ(std::get<1>(types), "inventory"); 20399e66a03SMatt Spinler 20499e66a03SMatt Spinler auto& paths = std::get<1>(endpoints[0]); 20599e66a03SMatt Spinler EXPECT_EQ(paths.size(), 4); 20699e66a03SMatt Spinler } 20799e66a03SMatt Spinler { 20899e66a03SMatt Spinler auto& types = std::get<0>(endpoints[1]); 20999e66a03SMatt Spinler EXPECT_EQ(std::get<0>(types), "fans"); 21099e66a03SMatt Spinler EXPECT_EQ(std::get<1>(types), "inventory"); 21199e66a03SMatt Spinler 21299e66a03SMatt Spinler auto& paths = std::get<1>(endpoints[1]); 21399e66a03SMatt Spinler EXPECT_EQ(paths.size(), 1); 21499e66a03SMatt Spinler } 21599e66a03SMatt Spinler } 21699e66a03SMatt Spinler { 21799e66a03SMatt Spinler auto x = a.find("/xyz/openbmc_project/inventory/system/fan42"); 21899e66a03SMatt Spinler EXPECT_NE(x, a.end()); 21999e66a03SMatt Spinler 22099e66a03SMatt Spinler auto& endpoints = x->second; 22199e66a03SMatt Spinler EXPECT_EQ(endpoints.size(), 2); 22299e66a03SMatt Spinler 22399e66a03SMatt Spinler { 22499e66a03SMatt Spinler auto& types = std::get<0>(endpoints[0]); 22599e66a03SMatt Spinler EXPECT_EQ(std::get<0>(types), "sensors"); 22699e66a03SMatt Spinler EXPECT_EQ(std::get<1>(types), "inventory"); 22799e66a03SMatt Spinler 22899e66a03SMatt Spinler auto& paths = std::get<1>(endpoints[0]); 22999e66a03SMatt Spinler EXPECT_EQ(paths.size(), 1); 23099e66a03SMatt Spinler } 23199e66a03SMatt Spinler { 23299e66a03SMatt Spinler auto& types = std::get<0>(endpoints[1]); 23399e66a03SMatt Spinler EXPECT_EQ(std::get<0>(types), "led"); 23499e66a03SMatt Spinler EXPECT_EQ(std::get<1>(types), "inventory"); 23599e66a03SMatt Spinler 23699e66a03SMatt Spinler auto& paths = std::get<1>(endpoints[1]); 23799e66a03SMatt Spinler EXPECT_EQ(paths.size(), 1); 23899e66a03SMatt Spinler } 23999e66a03SMatt Spinler } 24099e66a03SMatt Spinler } 24199e66a03SMatt Spinler 24299e66a03SMatt Spinler TEST_F(AssocsTest, TEST_BAD_JSON0) 24399e66a03SMatt Spinler { 24499e66a03SMatt Spinler auto path = writeFile(badJson0); 24599e66a03SMatt Spinler 24699e66a03SMatt Spinler try 24799e66a03SMatt Spinler { 24899e66a03SMatt Spinler Manager m(bus, path); 24999e66a03SMatt Spinler 25099e66a03SMatt Spinler EXPECT_TRUE(false); 25199e66a03SMatt Spinler } 2523e2d9641SPatrick Williams catch (const std::exception& e) 253a83db30eSBrad Bishop {} 25499e66a03SMatt Spinler } 25599e66a03SMatt Spinler 25699e66a03SMatt Spinler TEST_F(AssocsTest, TEST_BAD_JSON1) 25799e66a03SMatt Spinler { 25899e66a03SMatt Spinler auto path = writeFile(badJson1); 25999e66a03SMatt Spinler 26099e66a03SMatt Spinler try 26199e66a03SMatt Spinler { 26299e66a03SMatt Spinler Manager m(bus, path); 26399e66a03SMatt Spinler 26499e66a03SMatt Spinler EXPECT_TRUE(false); 26599e66a03SMatt Spinler } 2663e2d9641SPatrick Williams catch (const std::exception& e) 267a83db30eSBrad Bishop {} 26899e66a03SMatt Spinler } 26999e66a03SMatt Spinler 27099e66a03SMatt Spinler TEST_F(AssocsTest, TEST_BAD_JSON2) 27199e66a03SMatt Spinler { 27299e66a03SMatt Spinler auto path = writeFile(badJson2); 27399e66a03SMatt Spinler 27499e66a03SMatt Spinler try 27599e66a03SMatt Spinler { 27699e66a03SMatt Spinler Manager m(bus, path); 27799e66a03SMatt Spinler 27899e66a03SMatt Spinler EXPECT_TRUE(false); 27999e66a03SMatt Spinler } 2803e2d9641SPatrick Williams catch (const std::exception& e) 281a83db30eSBrad Bishop {} 28299e66a03SMatt Spinler } 28399e66a03SMatt Spinler 28499e66a03SMatt Spinler TEST_F(AssocsTest, TEST_BAD_JSON3) 28599e66a03SMatt Spinler { 28699e66a03SMatt Spinler auto path = writeFile(badJson3); 28799e66a03SMatt Spinler 28899e66a03SMatt Spinler try 28999e66a03SMatt Spinler { 29099e66a03SMatt Spinler Manager m(bus, path); 29199e66a03SMatt Spinler 29299e66a03SMatt Spinler EXPECT_TRUE(false); 29399e66a03SMatt Spinler } 2943e2d9641SPatrick Williams catch (const std::exception& e) 295a83db30eSBrad Bishop {} 29699e66a03SMatt Spinler } 297