xref: /openbmc/phosphor-ipmi-flash/bmc/version-handler/test/version_json_unittest.cpp (revision 85e54f1bf6867cb53723be1196da28225b6525d3)
1*85e54f1bSJason Ling #include "general_systemd.hpp"
2*85e54f1bSJason Ling #include "skip_action.hpp"
3*85e54f1bSJason Ling #include "version_handlers_builder.hpp"
4*85e54f1bSJason Ling 
5*85e54f1bSJason Ling #include <nlohmann/json.hpp>
6*85e54f1bSJason Ling 
7*85e54f1bSJason Ling #include <gmock/gmock.h>
8*85e54f1bSJason Ling #include <gtest/gtest.h>
9*85e54f1bSJason Ling 
10*85e54f1bSJason Ling namespace ipmi_flash
11*85e54f1bSJason Ling {
12*85e54f1bSJason Ling namespace
13*85e54f1bSJason Ling {
14*85e54f1bSJason Ling using ::testing::IsEmpty;
15*85e54f1bSJason Ling 
16*85e54f1bSJason Ling using json = nlohmann::json;
17*85e54f1bSJason Ling 
TEST(VersionJsonTest,ValidConfigurationNoVersionHandler)18*85e54f1bSJason Ling TEST(VersionJsonTest, ValidConfigurationNoVersionHandler)
19*85e54f1bSJason Ling {
20*85e54f1bSJason Ling     auto j2 = R"(
21*85e54f1bSJason Ling         [{
22*85e54f1bSJason Ling             "blob" : "/flash/sink_seq",
23*85e54f1bSJason Ling             "version":{
24*85e54f1bSJason Ling                 "handler": {
25*85e54f1bSJason Ling                    "type" : "file",
26*85e54f1bSJason Ling                    "path" : "/tmp/version_info"
27*85e54f1bSJason Ling                  },
28*85e54f1bSJason Ling                 "actions":{
29*85e54f1bSJason Ling                     "open" :{
30*85e54f1bSJason Ling                     "type" : "systemd",
31*85e54f1bSJason Ling                     "unit" : "absolute"
32*85e54f1bSJason Ling                     }
33*85e54f1bSJason Ling                  }
34*85e54f1bSJason Ling             }
35*85e54f1bSJason Ling          }]
36*85e54f1bSJason Ling     )"_json;
37*85e54f1bSJason Ling     auto h = VersionHandlersBuilder().buildHandlerFromJson(j2);
38*85e54f1bSJason Ling     ASSERT_THAT(h, ::testing::SizeIs(1));
39*85e54f1bSJason Ling     EXPECT_THAT(h[0].blobId, "/version/sink_seq");
40*85e54f1bSJason Ling     EXPECT_FALSE(h[0].actions == nullptr);
41*85e54f1bSJason Ling     EXPECT_FALSE(h[0].handler == nullptr);
42*85e54f1bSJason Ling }
43*85e54f1bSJason Ling 
TEST(VersionJsonTest,ValidConfigurationVersionBlobName)44*85e54f1bSJason Ling TEST(VersionJsonTest, ValidConfigurationVersionBlobName)
45*85e54f1bSJason Ling {
46*85e54f1bSJason Ling     auto j2 = R"(
47*85e54f1bSJason Ling         [{
48*85e54f1bSJason Ling             "blob" : "/version/sink_seq",
49*85e54f1bSJason Ling             "version":{
50*85e54f1bSJason Ling                 "handler": {
51*85e54f1bSJason Ling                    "type" : "file",
52*85e54f1bSJason Ling                    "path" : "/tmp/version_info"
53*85e54f1bSJason Ling                  },
54*85e54f1bSJason Ling                 "actions": {
55*85e54f1bSJason Ling                     "open" : {
56*85e54f1bSJason Ling                     "type" : "systemd",
57*85e54f1bSJason Ling                     "unit" : "phosphor-ipmi-flash-version-sink-sequencer.target"
58*85e54f1bSJason Ling                     }
59*85e54f1bSJason Ling                  }
60*85e54f1bSJason Ling             }
61*85e54f1bSJason Ling          }]
62*85e54f1bSJason Ling     )"_json;
63*85e54f1bSJason Ling     auto h = VersionHandlersBuilder().buildHandlerFromJson(j2);
64*85e54f1bSJason Ling     ASSERT_THAT(h, ::testing::SizeIs(1));
65*85e54f1bSJason Ling     EXPECT_THAT(h[0].blobId, "/version/sink_seq");
66*85e54f1bSJason Ling     EXPECT_FALSE(h[0].actions == nullptr);
67*85e54f1bSJason Ling     EXPECT_FALSE(h[0].handler == nullptr);
68*85e54f1bSJason Ling }
69*85e54f1bSJason Ling 
TEST(VersionJsonTest,MissingHandlerType)70*85e54f1bSJason Ling TEST(VersionJsonTest, MissingHandlerType)
71*85e54f1bSJason Ling {
72*85e54f1bSJason Ling     auto j2 = R"(
73*85e54f1bSJason Ling         [{
74*85e54f1bSJason Ling             "blob" : "/flash/image",
75*85e54f1bSJason Ling             "version":{
76*85e54f1bSJason Ling                 "handler": {
77*85e54f1bSJason Ling                    "path" : "/tmp/version_info"
78*85e54f1bSJason Ling                  },
79*85e54f1bSJason Ling                 "actions": {
80*85e54f1bSJason Ling                   "open" : {
81*85e54f1bSJason Ling                   "type" : "systemd",
82*85e54f1bSJason Ling                   "unit" : "absolute"}
83*85e54f1bSJason Ling                  }
84*85e54f1bSJason Ling             }
85*85e54f1bSJason Ling          }]
86*85e54f1bSJason Ling     )"_json;
87*85e54f1bSJason Ling     EXPECT_THAT(VersionHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
88*85e54f1bSJason Ling }
89*85e54f1bSJason Ling 
TEST(VersionJsonTest,BadBlobName)90*85e54f1bSJason Ling TEST(VersionJsonTest, BadBlobName)
91*85e54f1bSJason Ling {
92*85e54f1bSJason Ling     auto j2 = R"(
93*85e54f1bSJason Ling         [{
94*85e54f1bSJason Ling             "blob" : "/bad/image",
95*85e54f1bSJason Ling             "version":{
96*85e54f1bSJason Ling                 "handler": {
97*85e54f1bSJason Ling                    "type" : "file",
98*85e54f1bSJason Ling                    "path" : "/tmp/version_info"
99*85e54f1bSJason Ling                  },
100*85e54f1bSJason Ling                 "actions": {
101*85e54f1bSJason Ling                   "open" : {
102*85e54f1bSJason Ling                   "type" : "systemd",
103*85e54f1bSJason Ling                   "unit" : "absolute"}
104*85e54f1bSJason Ling                  }
105*85e54f1bSJason Ling             }
106*85e54f1bSJason Ling          }]
107*85e54f1bSJason Ling     )"_json;
108*85e54f1bSJason Ling     EXPECT_THAT(VersionHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
109*85e54f1bSJason Ling }
110*85e54f1bSJason Ling 
TEST(VersionJsonTest,MissingActions)111*85e54f1bSJason Ling TEST(VersionJsonTest, MissingActions)
112*85e54f1bSJason Ling {
113*85e54f1bSJason Ling     auto j2 = R"(
114*85e54f1bSJason Ling         [{
115*85e54f1bSJason Ling             "blob" : "/flash/image",
116*85e54f1bSJason Ling             "version":{
117*85e54f1bSJason Ling                 "handler": {
118*85e54f1bSJason Ling                    "type" : "file",
119*85e54f1bSJason Ling                    "path" : "/tmp/version_info"
120*85e54f1bSJason Ling                  }
121*85e54f1bSJason Ling             }
122*85e54f1bSJason Ling          }]
123*85e54f1bSJason Ling     )"_json;
124*85e54f1bSJason Ling     EXPECT_THAT(VersionHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
125*85e54f1bSJason Ling }
126*85e54f1bSJason Ling 
TEST(VersionJsonTest,MissingOpenAction)127*85e54f1bSJason Ling TEST(VersionJsonTest, MissingOpenAction)
128*85e54f1bSJason Ling {
129*85e54f1bSJason Ling     auto j2 = R"(
130*85e54f1bSJason Ling         [{
131*85e54f1bSJason Ling             "blob" : "/flash/image",
132*85e54f1bSJason Ling             "version":{
133*85e54f1bSJason Ling                 "handler": {
134*85e54f1bSJason Ling                    "type" : "file",
135*85e54f1bSJason Ling                    "path" : "/tmp/version_info"
136*85e54f1bSJason Ling                  },
137*85e54f1bSJason Ling                 "actions": {}
138*85e54f1bSJason Ling             }
139*85e54f1bSJason Ling          }]
140*85e54f1bSJason Ling     )"_json;
141*85e54f1bSJason Ling     EXPECT_THAT(VersionHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
142*85e54f1bSJason Ling }
143*85e54f1bSJason Ling 
TEST(VersionJsonTest,OneInvalidTwoValidSucceeds)144*85e54f1bSJason Ling TEST(VersionJsonTest, OneInvalidTwoValidSucceeds)
145*85e54f1bSJason Ling {
146*85e54f1bSJason Ling     auto j2 = R"(
147*85e54f1bSJason Ling         [{
148*85e54f1bSJason Ling             "blob" : "/flash/sink_seq0",
149*85e54f1bSJason Ling             "version":{
150*85e54f1bSJason Ling                 "handler": {
151*85e54f1bSJason Ling                    "type" : "file",
152*85e54f1bSJason Ling                    "path" : "/tmp/version_info"
153*85e54f1bSJason Ling                  },
154*85e54f1bSJason Ling                 "actions":{
155*85e54f1bSJason Ling                     "open" :{
156*85e54f1bSJason Ling                     "type" : "systemd",
157*85e54f1bSJason Ling                     "unit" : "absolute"
158*85e54f1bSJason Ling                     }
159*85e54f1bSJason Ling                  }
160*85e54f1bSJason Ling             }
161*85e54f1bSJason Ling          },
162*85e54f1bSJason Ling          {
163*85e54f1bSJason Ling             "blob" : "/version/sink_seq1",
164*85e54f1bSJason Ling             "version":{
165*85e54f1bSJason Ling                 "handler": {
166*85e54f1bSJason Ling                    "type" : "file",
167*85e54f1bSJason Ling                    "path" : "/tmp/version_info"
168*85e54f1bSJason Ling                  },
169*85e54f1bSJason Ling                 "actions":{
170*85e54f1bSJason Ling                     "open" :{
171*85e54f1bSJason Ling                     "type" : "systemd",
172*85e54f1bSJason Ling                     "unit" : "absolute"
173*85e54f1bSJason Ling                     }
174*85e54f1bSJason Ling                  }
175*85e54f1bSJason Ling             }
176*85e54f1bSJason Ling          },
177*85e54f1bSJason Ling          {
178*85e54f1bSJason Ling             "blob" : "/bad/sink_seq",
179*85e54f1bSJason Ling             "version":{
180*85e54f1bSJason Ling                 "handler": {
181*85e54f1bSJason Ling                    "type" : "file",
182*85e54f1bSJason Ling                    "path" : "/tmp/version_info"
183*85e54f1bSJason Ling                  },
184*85e54f1bSJason Ling                 "actions":{
185*85e54f1bSJason Ling                     "open" :{
186*85e54f1bSJason Ling                     "type" : "systemd",
187*85e54f1bSJason Ling                     "unit" : "absolute"
188*85e54f1bSJason Ling                     }
189*85e54f1bSJason Ling                  }
190*85e54f1bSJason Ling             }
191*85e54f1bSJason Ling          }
192*85e54f1bSJason Ling          ]
193*85e54f1bSJason Ling     )"_json;
194*85e54f1bSJason Ling     auto h = VersionHandlersBuilder().buildHandlerFromJson(j2);
195*85e54f1bSJason Ling     ASSERT_THAT(h, ::testing::SizeIs(2));
196*85e54f1bSJason Ling     EXPECT_THAT(h[0].blobId, "/version/sink_seq0");
197*85e54f1bSJason Ling     EXPECT_THAT(h[1].blobId, "/version/sink_seq1");
198*85e54f1bSJason Ling }
199*85e54f1bSJason Ling 
TEST(VersionJsonTest,BlobNameIsTooShort)200*85e54f1bSJason Ling TEST(VersionJsonTest, BlobNameIsTooShort)
201*85e54f1bSJason Ling {
202*85e54f1bSJason Ling     auto j2 = R"(
203*85e54f1bSJason Ling         [{
204*85e54f1bSJason Ling             "blob" : "/flash/",
205*85e54f1bSJason Ling             "version":{
206*85e54f1bSJason Ling                 "handler": {
207*85e54f1bSJason Ling                    "type" : "file",
208*85e54f1bSJason Ling                    "path" : "/tmp/version_info"
209*85e54f1bSJason Ling                  },
210*85e54f1bSJason Ling                 "actions":{
211*85e54f1bSJason Ling                     "open" :{
212*85e54f1bSJason Ling                     "type" : "systemd",
213*85e54f1bSJason Ling                     "unit" : "absolute"
214*85e54f1bSJason Ling                     }
215*85e54f1bSJason Ling                  }
216*85e54f1bSJason Ling             }
217*85e54f1bSJason Ling          }]
218*85e54f1bSJason Ling     )"_json;
219*85e54f1bSJason Ling     EXPECT_THAT(VersionHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
220*85e54f1bSJason Ling }
221*85e54f1bSJason Ling 
TEST(VersionJsonTest,OpenSkipAction)222*85e54f1bSJason Ling TEST(VersionJsonTest, OpenSkipAction)
223*85e54f1bSJason Ling {
224*85e54f1bSJason Ling     auto j2 = R"(
225*85e54f1bSJason Ling         [{
226*85e54f1bSJason Ling             "blob" : "/flash/sink_seqs",
227*85e54f1bSJason Ling             "version":{
228*85e54f1bSJason Ling                 "handler": {
229*85e54f1bSJason Ling                    "type" : "file",
230*85e54f1bSJason Ling                    "path" : "/tmp/version_info"
231*85e54f1bSJason Ling                  },
232*85e54f1bSJason Ling                 "actions":{
233*85e54f1bSJason Ling                     "open" :{
234*85e54f1bSJason Ling                     "type" : "skip"
235*85e54f1bSJason Ling                     }
236*85e54f1bSJason Ling                  }
237*85e54f1bSJason Ling             }
238*85e54f1bSJason Ling          }]
239*85e54f1bSJason Ling     )"_json;
240*85e54f1bSJason Ling     auto h = VersionHandlersBuilder().buildHandlerFromJson(j2);
241*85e54f1bSJason Ling     EXPECT_THAT(h, ::testing::SizeIs(1));
242*85e54f1bSJason Ling     EXPECT_TRUE(h[0].blobId == "/version/sink_seqs");
243*85e54f1bSJason Ling     ASSERT_FALSE(h[0].actions == nullptr);
244*85e54f1bSJason Ling     EXPECT_FALSE(h[0].actions->onOpen == nullptr);
245*85e54f1bSJason Ling }
246*85e54f1bSJason Ling 
TEST(VersionJsonTest,OpenActionsWithDifferentModes)247*85e54f1bSJason Ling TEST(VersionJsonTest, OpenActionsWithDifferentModes)
248*85e54f1bSJason Ling {
249*85e54f1bSJason Ling     auto j2 = R"(
250*85e54f1bSJason Ling         [{
251*85e54f1bSJason Ling             "blob" : "/flash/blob1",
252*85e54f1bSJason Ling             "version":{
253*85e54f1bSJason Ling                 "handler": {
254*85e54f1bSJason Ling                    "type" : "file",
255*85e54f1bSJason Ling                    "path" : "/tmp/version_info"
256*85e54f1bSJason Ling                  },
257*85e54f1bSJason Ling                 "actions":{
258*85e54f1bSJason Ling                     "open" :{
259*85e54f1bSJason Ling                     "type" : "systemd",
260*85e54f1bSJason Ling                     "unit" : "absolute",
261*85e54f1bSJason Ling                     "mode" : "replace-nope"
262*85e54f1bSJason Ling                     }
263*85e54f1bSJason Ling                  }
264*85e54f1bSJason Ling             }
265*85e54f1bSJason Ling          },
266*85e54f1bSJason Ling          {
267*85e54f1bSJason Ling             "blob" : "/flash/blob2",
268*85e54f1bSJason Ling             "version":{
269*85e54f1bSJason Ling                 "handler": {
270*85e54f1bSJason Ling                    "type" : "file",
271*85e54f1bSJason Ling                    "path" : "/tmp/version_info"
272*85e54f1bSJason Ling                  },
273*85e54f1bSJason Ling                 "actions":{
274*85e54f1bSJason Ling                     "open" :{
275*85e54f1bSJason Ling                     "type" : "systemd",
276*85e54f1bSJason Ling                     "unit" : "absolute",
277*85e54f1bSJason Ling                     "mode" : "replace-fake"
278*85e54f1bSJason Ling                     }
279*85e54f1bSJason Ling                  }
280*85e54f1bSJason Ling             }
281*85e54f1bSJason Ling          }
282*85e54f1bSJason Ling          ]
283*85e54f1bSJason Ling     )"_json;
284*85e54f1bSJason Ling     auto h = VersionHandlersBuilder().buildHandlerFromJson(j2);
285*85e54f1bSJason Ling     ASSERT_THAT(h, ::testing::SizeIs(2));
286*85e54f1bSJason Ling 
287*85e54f1bSJason Ling     EXPECT_FALSE(h[0].handler == nullptr);
288*85e54f1bSJason Ling     EXPECT_FALSE(h[0].actions == nullptr);
289*85e54f1bSJason Ling     EXPECT_THAT(h[0].blobId, "/version/blob1");
290*85e54f1bSJason Ling     auto onOpen0 = reinterpret_cast<SystemdNoFile*>(h[0].actions->onOpen.get());
291*85e54f1bSJason Ling     EXPECT_THAT(onOpen0->getMode(), "replace-nope");
292*85e54f1bSJason Ling 
293*85e54f1bSJason Ling     EXPECT_FALSE(h[1].handler == nullptr);
294*85e54f1bSJason Ling     EXPECT_FALSE(h[1].actions == nullptr);
295*85e54f1bSJason Ling     EXPECT_THAT(h[1].blobId, "/version/blob2");
296*85e54f1bSJason Ling     auto onOpen1 = reinterpret_cast<SystemdNoFile*>(h[1].actions->onOpen.get());
297*85e54f1bSJason Ling     EXPECT_THAT(onOpen1->getMode(), "replace-fake");
298*85e54f1bSJason Ling }
299*85e54f1bSJason Ling } // namespace
300*85e54f1bSJason Ling } // namespace ipmi_flash
301