blob: 76ab54a0a34673ac3fe906349a85c810bcd771a6 [file] [log] [blame]
Benjamin Fairf2f5b7a2022-09-09 19:45:02 +00001#include "topology.hpp"
2
3#include "gmock/gmock.h"
4#include "gtest/gtest.h"
5
6using ::testing::UnorderedElementsAre;
7
8const std::string subchassisPath =
9 "/xyz/openbmc_project/inventory/system/chassis/Subchassis";
10const std::string superchassisPath =
11 "/xyz/openbmc_project/inventory/system/chassis/Superchassis";
12
13const Association subchassisAssoc =
14 std::make_tuple("contained_by", "containing", superchassisPath);
15
16const nlohmann::json subchassisExposesItem = nlohmann::json::parse(R"(
17 {
18 "ConnectsToType": "BackplanePort",
19 "Name": "MyDownstreamPort",
20 "Type": "DownstreamPort"
21 }
22)");
23
24const nlohmann::json superchassisExposesItem = nlohmann::json::parse(R"(
25 {
26 "Name": "MyBackplanePort",
27 "Type": "BackplanePort"
28 }
29)");
30
31const nlohmann::json otherExposesItem = nlohmann::json::parse(R"(
32 {
33 "Name": "MyExposes",
34 "Type": "OtherType"
35 }
36)");
37
38TEST(Topology, Empty)
39{
40 Topology topo;
41
42 auto assocs = topo.getAssocs();
43
44 EXPECT_EQ(assocs.size(), 0);
45}
46
47TEST(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
59TEST(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
78TEST(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
90TEST(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
102TEST(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
114TEST(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
128TEST(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
145TEST(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
165TEST(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}