1 #include "topology.hpp"
2 
3 #include "gmock/gmock.h"
4 #include "gtest/gtest.h"
5 
6 using ::testing::UnorderedElementsAre;
7 
8 const std::string subchassisPath =
9     "/xyz/openbmc_project/inventory/system/chassis/Subchassis";
10 const std::string superchassisPath =
11     "/xyz/openbmc_project/inventory/system/chassis/Superchassis";
12 
13 const Association subchassisAssoc =
14     std::make_tuple("contained_by", "containing", superchassisPath);
15 
16 const nlohmann::json subchassisExposesItem = nlohmann::json::parse(R"(
17     {
18         "ConnectsToType": "BackplanePort",
19         "Name": "MyDownstreamPort",
20         "Type": "DownstreamPort"
21     }
22 )");
23 
24 const nlohmann::json superchassisExposesItem = nlohmann::json::parse(R"(
25     {
26         "Name": "MyBackplanePort",
27         "Type": "BackplanePort"
28     }
29 )");
30 
31 const nlohmann::json otherExposesItem = nlohmann::json::parse(R"(
32     {
33         "Name": "MyExposes",
34         "Type": "OtherType"
35     }
36 )");
37 
38 TEST(Topology, Empty)
39 {
40     Topology topo;
41 
42     auto assocs = topo.getAssocs();
43 
44     EXPECT_EQ(assocs.size(), 0);
45 }
46 
47 TEST(Topology, EmptyExposes)
48 {
49     Topology topo;
50 
51     topo.addBoard(subchassisPath, "Chassis", nlohmann::json());
52     topo.addBoard(superchassisPath, "Chassis", nlohmann::json());
53 
54     auto assocs = topo.getAssocs();
55 
56     EXPECT_EQ(assocs.size(), 0);
57 }
58 
59 TEST(Topology, MissingConnectsTo)
60 {
61     const nlohmann::json subchassisMissingConnectsTo = nlohmann::json::parse(R"(
62         {
63             "Name": "MyDownstreamPort",
64             "Type": "DownstreamPort"
65         }
66     )");
67 
68     Topology topo;
69 
70     topo.addBoard(subchassisPath, "Chassis", subchassisMissingConnectsTo);
71     topo.addBoard(superchassisPath, "Chassis", superchassisExposesItem);
72 
73     auto assocs = topo.getAssocs();
74 
75     EXPECT_EQ(assocs.size(), 0);
76 }
77 
78 TEST(Topology, OtherExposes)
79 {
80     Topology topo;
81 
82     topo.addBoard(subchassisPath, "Chassis", otherExposesItem);
83     topo.addBoard(superchassisPath, "Chassis", otherExposesItem);
84 
85     auto assocs = topo.getAssocs();
86 
87     EXPECT_EQ(assocs.size(), 0);
88 }
89 
90 TEST(Topology, NoMatchSubchassis)
91 {
92     Topology topo;
93 
94     topo.addBoard(subchassisPath, "Chassis", otherExposesItem);
95     topo.addBoard(superchassisPath, "Chassis", superchassisExposesItem);
96 
97     auto assocs = topo.getAssocs();
98 
99     EXPECT_EQ(assocs.size(), 0);
100 }
101 
102 TEST(Topology, NoMatchSuperchassis)
103 {
104     Topology topo;
105 
106     topo.addBoard(subchassisPath, "Chassis", subchassisExposesItem);
107     topo.addBoard(superchassisPath, "Chassis", otherExposesItem);
108 
109     auto assocs = topo.getAssocs();
110 
111     EXPECT_EQ(assocs.size(), 0);
112 }
113 
114 TEST(Topology, Basic)
115 {
116     Topology topo;
117 
118     topo.addBoard(subchassisPath, "Chassis", subchassisExposesItem);
119     topo.addBoard(superchassisPath, "Chassis", superchassisExposesItem);
120 
121     auto assocs = topo.getAssocs();
122 
123     EXPECT_EQ(assocs.size(), 1);
124     EXPECT_EQ(assocs[subchassisPath].size(), 1);
125     EXPECT_EQ(assocs[subchassisPath][0], subchassisAssoc);
126 }
127 
128 TEST(Topology, 2Subchassis)
129 {
130     Topology topo;
131 
132     topo.addBoard(subchassisPath, "Chassis", subchassisExposesItem);
133     topo.addBoard(subchassisPath + "2", "Chassis", subchassisExposesItem);
134     topo.addBoard(superchassisPath, "Chassis", superchassisExposesItem);
135 
136     auto assocs = topo.getAssocs();
137 
138     EXPECT_EQ(assocs.size(), 2);
139     EXPECT_EQ(assocs[subchassisPath].size(), 1);
140     EXPECT_EQ(assocs[subchassisPath][0], subchassisAssoc);
141     EXPECT_EQ(assocs[subchassisPath + "2"].size(), 1);
142     EXPECT_EQ(assocs[subchassisPath + "2"][0], subchassisAssoc);
143 }
144 
145 TEST(Topology, 2Superchassis)
146 {
147     const Association subchassisAssoc2 =
148         std::make_tuple("contained_by", "containing", superchassisPath + "2");
149 
150     Topology topo;
151 
152     topo.addBoard(subchassisPath, "Chassis", subchassisExposesItem);
153     topo.addBoard(superchassisPath, "Chassis", superchassisExposesItem);
154     topo.addBoard(superchassisPath + "2", "Chassis", superchassisExposesItem);
155 
156     auto assocs = topo.getAssocs();
157 
158     EXPECT_EQ(assocs.size(), 1);
159     EXPECT_EQ(assocs[subchassisPath].size(), 2);
160 
161     EXPECT_THAT(assocs[subchassisPath],
162                 UnorderedElementsAre(subchassisAssoc, subchassisAssoc2));
163 }
164 
165 TEST(Topology, 2SuperchassisAnd2Subchassis)
166 {
167     const Association subchassisAssoc2 =
168         std::make_tuple("contained_by", "containing", superchassisPath + "2");
169 
170     Topology topo;
171 
172     topo.addBoard(subchassisPath, "Chassis", subchassisExposesItem);
173     topo.addBoard(subchassisPath + "2", "Chassis", subchassisExposesItem);
174     topo.addBoard(superchassisPath, "Chassis", superchassisExposesItem);
175     topo.addBoard(superchassisPath + "2", "Chassis", superchassisExposesItem);
176 
177     auto assocs = topo.getAssocs();
178 
179     EXPECT_EQ(assocs.size(), 2);
180     EXPECT_EQ(assocs[subchassisPath].size(), 2);
181     EXPECT_EQ(assocs[subchassisPath + "2"].size(), 2);
182 
183     EXPECT_THAT(assocs[subchassisPath],
184                 UnorderedElementsAre(subchassisAssoc, subchassisAssoc2));
185     EXPECT_THAT(assocs[subchassisPath + "2"],
186                 UnorderedElementsAre(subchassisAssoc, subchassisAssoc2));
187 }
188