1c893f43dSJason Ling #include "firmware_handlers_builder.hpp"
2ded66d0fSJason Ling #include "general_systemd.hpp"
3ded66d0fSJason Ling #include "skip_action.hpp"
4ded66d0fSJason Ling
5ded66d0fSJason Ling #include <nlohmann/json.hpp>
6ded66d0fSJason Ling
7*b487eb47SWilly Tu #include <filesystem>
8*b487eb47SWilly Tu
9ded66d0fSJason Ling #include <gmock/gmock.h>
10ded66d0fSJason Ling #include <gtest/gtest.h>
11ded66d0fSJason Ling
12ded66d0fSJason Ling namespace ipmi_flash
13ded66d0fSJason Ling {
14ded66d0fSJason Ling namespace
15ded66d0fSJason Ling {
16ded66d0fSJason Ling using ::testing::IsEmpty;
17ded66d0fSJason Ling
18*b487eb47SWilly Tu static constexpr auto TESTFNAME = "./test/test.json";
19ded66d0fSJason Ling using json = nlohmann::json;
TEST(FirmwareJsonTest,InvalidHandlerType)20ded66d0fSJason Ling TEST(FirmwareJsonTest, InvalidHandlerType)
21ded66d0fSJason Ling {
22ded66d0fSJason Ling auto j2 = R"(
23ded66d0fSJason Ling [{
24ded66d0fSJason Ling "blob" : "/flash/image",
25ded66d0fSJason Ling "handler" : {
26ded66d0fSJason Ling "type" : "unsupported",
27ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
28ded66d0fSJason Ling },
29ded66d0fSJason Ling "actions" : {
30ded66d0fSJason Ling "preparation" : {
31ded66d0fSJason Ling "type" : "systemd",
32ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
33ded66d0fSJason Ling },
34ded66d0fSJason Ling "verification" : {
35ded66d0fSJason Ling "type" : "fileSystemdVerify",
36ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
37ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
38ded66d0fSJason Ling },
39ded66d0fSJason Ling "update" : {
40ded66d0fSJason Ling "type" : "reboot"
41ded66d0fSJason Ling }
42ded66d0fSJason Ling }
43ded66d0fSJason Ling }]
44ded66d0fSJason Ling )"_json;
45c893f43dSJason Ling EXPECT_THAT(FirmwareHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
46ded66d0fSJason Ling }
47ded66d0fSJason Ling
TEST(FirmwareJsonTest,InvalidPreparationType)48ded66d0fSJason Ling TEST(FirmwareJsonTest, InvalidPreparationType)
49ded66d0fSJason Ling {
50ded66d0fSJason Ling auto j2 = R"(
51ded66d0fSJason Ling [{
52ded66d0fSJason Ling "blob" : "/flash/image",
53ded66d0fSJason Ling "handler" : {
54ded66d0fSJason Ling "type" : "file",
55ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
56ded66d0fSJason Ling },
57ded66d0fSJason Ling "actions" : {
58ded66d0fSJason Ling "preparation" : {
59ded66d0fSJason Ling "type" : "superfun",
60ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
61ded66d0fSJason Ling },
62ded66d0fSJason Ling "verification" : {
63ded66d0fSJason Ling "type" : "fileSystemdVerify",
64ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
65ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
66ded66d0fSJason Ling },
67ded66d0fSJason Ling "update" : {
68ded66d0fSJason Ling "type" : "reboot"
69ded66d0fSJason Ling }
70ded66d0fSJason Ling }
71ded66d0fSJason Ling }]
72ded66d0fSJason Ling )"_json;
73ded66d0fSJason Ling
74c893f43dSJason Ling EXPECT_THAT(FirmwareHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
75ded66d0fSJason Ling }
76ded66d0fSJason Ling
TEST(FirmwareJsonTest,InvalidVerificationType)77ded66d0fSJason Ling TEST(FirmwareJsonTest, InvalidVerificationType)
78ded66d0fSJason Ling {
79ded66d0fSJason Ling auto j2 = R"(
80ded66d0fSJason Ling [{
81ded66d0fSJason Ling "blob" : "/flash/image",
82ded66d0fSJason Ling "handler" : {
83ded66d0fSJason Ling "type" : "file",
84ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
85ded66d0fSJason Ling },
86ded66d0fSJason Ling "actions" : {
87ded66d0fSJason Ling "preparation" : {
88ded66d0fSJason Ling "type" : "systemd",
89ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
90ded66d0fSJason Ling },
91ded66d0fSJason Ling "verification" : {
92ded66d0fSJason Ling "type" : "funtimes",
93ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
94ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
95ded66d0fSJason Ling },
96ded66d0fSJason Ling "update" : {
97ded66d0fSJason Ling "type" : "reboot"
98ded66d0fSJason Ling }
99ded66d0fSJason Ling }
100ded66d0fSJason Ling }]
101ded66d0fSJason Ling )"_json;
102ded66d0fSJason Ling
103c893f43dSJason Ling EXPECT_THAT(FirmwareHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
104ded66d0fSJason Ling }
105ded66d0fSJason Ling
TEST(FirmwareJsonTest,InvalidUpdateType)106ded66d0fSJason Ling TEST(FirmwareJsonTest, InvalidUpdateType)
107ded66d0fSJason Ling {
108ded66d0fSJason Ling auto j2 = R"(
109ded66d0fSJason Ling [{
110ded66d0fSJason Ling "blob" : "/flash/image",
111ded66d0fSJason Ling "handler" : {
112ded66d0fSJason Ling "type" : "file",
113ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
114ded66d0fSJason Ling },
115ded66d0fSJason Ling "actions" : {
116ded66d0fSJason Ling "preparation" : {
117ded66d0fSJason Ling "type" : "systemd",
118ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
119ded66d0fSJason Ling },
120ded66d0fSJason Ling "verification" : {
121ded66d0fSJason Ling "type" : "fileSystemdVerify",
122ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
123ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
124ded66d0fSJason Ling },
125ded66d0fSJason Ling "update" : {
126ded66d0fSJason Ling "type" : "systemd"
127ded66d0fSJason Ling }
128ded66d0fSJason Ling }
129ded66d0fSJason Ling }]
130ded66d0fSJason Ling )"_json;
131ded66d0fSJason Ling
132c893f43dSJason Ling EXPECT_THAT(FirmwareHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
133ded66d0fSJason Ling }
134ded66d0fSJason Ling
TEST(FirmwareJsonTest,MissingHandler)135ded66d0fSJason Ling TEST(FirmwareJsonTest, MissingHandler)
136ded66d0fSJason Ling {
137ded66d0fSJason Ling auto j2 = R"(
138ded66d0fSJason Ling [{
139ded66d0fSJason Ling "blob" : "/flash/image",
140ded66d0fSJason Ling "actions" : {
141ded66d0fSJason Ling "preparation" : {
142ded66d0fSJason Ling "type" : "systemd",
143ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
144ded66d0fSJason Ling },
145ded66d0fSJason Ling "verification" : {
146ded66d0fSJason Ling "type" : "fileSystemdVerify",
147ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
148ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
149ded66d0fSJason Ling },
150ded66d0fSJason Ling "update" : {
151ded66d0fSJason Ling "type" : "reboot"
152ded66d0fSJason Ling }
153ded66d0fSJason Ling }
154ded66d0fSJason Ling }]
155ded66d0fSJason Ling )"_json;
156ded66d0fSJason Ling
157c893f43dSJason Ling EXPECT_THAT(FirmwareHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
158ded66d0fSJason Ling }
159ded66d0fSJason Ling
TEST(FirmwareJsonTest,MissingActions)160ded66d0fSJason Ling TEST(FirmwareJsonTest, MissingActions)
161ded66d0fSJason Ling {
162ded66d0fSJason Ling auto j2 = R"(
163ded66d0fSJason Ling [{
164ded66d0fSJason Ling "blob" : "/flash/image",
165ded66d0fSJason Ling "handler" : {
166ded66d0fSJason Ling "type" : "file",
167ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
168ded66d0fSJason Ling }
169ded66d0fSJason Ling }]
170ded66d0fSJason Ling )"_json;
171ded66d0fSJason Ling
172c893f43dSJason Ling EXPECT_THAT(FirmwareHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
173ded66d0fSJason Ling }
174ded66d0fSJason Ling
TEST(FirmwareJsonTest,MissingActionPreparation)175ded66d0fSJason Ling TEST(FirmwareJsonTest, MissingActionPreparation)
176ded66d0fSJason Ling {
177ded66d0fSJason Ling auto j2 = R"(
178ded66d0fSJason Ling [{
179ded66d0fSJason Ling "blob" : "/flash/image",
180ded66d0fSJason Ling "handler" : {
181ded66d0fSJason Ling "type" : "file",
182ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
183ded66d0fSJason Ling },
184ded66d0fSJason Ling "actions" : {
185ded66d0fSJason Ling "verification" : {
186ded66d0fSJason Ling "type" : "fileSystemdVerify",
187ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
188ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
189ded66d0fSJason Ling },
190ded66d0fSJason Ling "update" : {
191ded66d0fSJason Ling "type" : "reboot"
192ded66d0fSJason Ling }
193ded66d0fSJason Ling }
194ded66d0fSJason Ling }]
195ded66d0fSJason Ling )"_json;
196ded66d0fSJason Ling
197c893f43dSJason Ling EXPECT_THAT(FirmwareHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
198ded66d0fSJason Ling }
199ded66d0fSJason Ling
TEST(FirmwareJsonTest,MissingActionVerification)200ded66d0fSJason Ling TEST(FirmwareJsonTest, MissingActionVerification)
201ded66d0fSJason Ling {
202ded66d0fSJason Ling auto j2 = R"(
203ded66d0fSJason Ling [{
204ded66d0fSJason Ling "blob" : "/flash/image",
205ded66d0fSJason Ling "handler" : {
206ded66d0fSJason Ling "type" : "file",
207ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
208ded66d0fSJason Ling },
209ded66d0fSJason Ling "actions" : {
210ded66d0fSJason Ling "preparation" : {
211ded66d0fSJason Ling "type" : "systemd",
212ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
213ded66d0fSJason Ling },
214ded66d0fSJason Ling "update" : {
215ded66d0fSJason Ling "type" : "reboot"
216ded66d0fSJason Ling }
217ded66d0fSJason Ling }
218ded66d0fSJason Ling }]
219ded66d0fSJason Ling )"_json;
220ded66d0fSJason Ling
221c893f43dSJason Ling EXPECT_THAT(FirmwareHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
222ded66d0fSJason Ling }
223ded66d0fSJason Ling
TEST(FirmwareJsonTest,MissingActionUpdate)224ded66d0fSJason Ling TEST(FirmwareJsonTest, MissingActionUpdate)
225ded66d0fSJason Ling {
226ded66d0fSJason Ling auto j2 = R"(
227ded66d0fSJason Ling [{
228ded66d0fSJason Ling "blob" : "/flash/image",
229ded66d0fSJason Ling "handler" : {
230ded66d0fSJason Ling "type" : "file",
231ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
232ded66d0fSJason Ling },
233ded66d0fSJason Ling "actions" : {
234ded66d0fSJason Ling "preparation" : {
235ded66d0fSJason Ling "type" : "systemd",
236ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
237ded66d0fSJason Ling },
238ded66d0fSJason Ling "verification" : {
239ded66d0fSJason Ling "type" : "fileSystemdVerify",
240ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
241ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
242ded66d0fSJason Ling }
243ded66d0fSJason Ling }
244ded66d0fSJason Ling }]
245ded66d0fSJason Ling )"_json;
246ded66d0fSJason Ling
247c893f43dSJason Ling EXPECT_THAT(FirmwareHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
248ded66d0fSJason Ling }
249ded66d0fSJason Ling
TEST(FirmwareJsonTest,TwoConfigsOneInvalidReturnsValid)250ded66d0fSJason Ling TEST(FirmwareJsonTest, TwoConfigsOneInvalidReturnsValid)
251ded66d0fSJason Ling {
252ded66d0fSJason Ling auto j2 = R"(
253ded66d0fSJason Ling [{
254ded66d0fSJason Ling "blob" : "/flash/image",
255ded66d0fSJason Ling "actions" : {
256ded66d0fSJason Ling "preparation" : {
257ded66d0fSJason Ling "type" : "systemd",
258ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
259ded66d0fSJason Ling },
260ded66d0fSJason Ling "verification" : {
261ded66d0fSJason Ling "type" : "fileSystemdVerify",
262ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
263ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
264ded66d0fSJason Ling },
265ded66d0fSJason Ling "update" : {
266ded66d0fSJason Ling "type" : "reboot"
267ded66d0fSJason Ling }
268ded66d0fSJason Ling }
269ded66d0fSJason Ling },
270ded66d0fSJason Ling {
271ded66d0fSJason Ling "blob" : "/flash/image2",
272ded66d0fSJason Ling "handler" : {
273ded66d0fSJason Ling "type" : "file",
274ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
275ded66d0fSJason Ling },
276ded66d0fSJason Ling "actions" : {
277ded66d0fSJason Ling "preparation" : {
278ded66d0fSJason Ling "type" : "systemd",
279ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
280ded66d0fSJason Ling },
281ded66d0fSJason Ling "verification" : {
282ded66d0fSJason Ling "type" : "fileSystemdVerify",
283ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
284ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
285ded66d0fSJason Ling },
286ded66d0fSJason Ling "update" : {
287ded66d0fSJason Ling "type" : "reboot"
288ded66d0fSJason Ling }
289ded66d0fSJason Ling }
290ded66d0fSJason Ling }]
291ded66d0fSJason Ling )"_json;
292ded66d0fSJason Ling
293c893f43dSJason Ling auto h = FirmwareHandlersBuilder().buildHandlerFromJson(j2);
294ded66d0fSJason Ling EXPECT_EQ(h[0].blobId, "/flash/image2");
295ded66d0fSJason Ling EXPECT_EQ(h.size(), 1);
296ded66d0fSJason Ling }
297ded66d0fSJason Ling
298ded66d0fSJason Ling /*
299ded66d0fSJason Ling * TODO: It may be worth individually using builders per type, and testing
300ded66d0fSJason Ling * those.
301ded66d0fSJason Ling *
302ded66d0fSJason Ling * TODO: Only allow unique handler blob paths (tested at a higher level).
303ded66d0fSJason Ling */
304ded66d0fSJason Ling
TEST(FirmwareJsonTest,VerifyBlobNameMatches)305ded66d0fSJason Ling TEST(FirmwareJsonTest, VerifyBlobNameMatches)
306ded66d0fSJason Ling {
307ded66d0fSJason Ling /* A perfect configuration except the blob name doesn't start with "/flash/"
308ded66d0fSJason Ling */
309ded66d0fSJason Ling auto j2 = R"(
310ded66d0fSJason Ling [{
311ded66d0fSJason Ling "blob" : "bmc-image-flash",
312ded66d0fSJason Ling "handler" : {
313ded66d0fSJason Ling "type" : "file",
314ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
315ded66d0fSJason Ling },
316ded66d0fSJason Ling "actions" : {
317ded66d0fSJason Ling "preparation" : {
318ded66d0fSJason Ling "type" : "systemd",
319ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
320ded66d0fSJason Ling },
321ded66d0fSJason Ling "verification" : {
322ded66d0fSJason Ling "type" : "fileSystemdVerify",
323ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
324ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
325ded66d0fSJason Ling },
326ded66d0fSJason Ling "update" : {
327ded66d0fSJason Ling "type" : "reboot"
328ded66d0fSJason Ling }
329ded66d0fSJason Ling }
330ded66d0fSJason Ling }]
331ded66d0fSJason Ling )"_json;
332ded66d0fSJason Ling
333c893f43dSJason Ling EXPECT_THAT(FirmwareHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
334ded66d0fSJason Ling }
335ded66d0fSJason Ling
TEST(FirmwareJsonTest,VerifyMinimumBlobNameLength)336ded66d0fSJason Ling TEST(FirmwareJsonTest, VerifyMinimumBlobNameLength)
337ded66d0fSJason Ling {
338ded66d0fSJason Ling /* A perfect configuration except the blob name is effectively zero length.
339ded66d0fSJason Ling */
340ded66d0fSJason Ling auto j2 = R"(
341ded66d0fSJason Ling [{
342ded66d0fSJason Ling "blob" : "/flash/",
343ded66d0fSJason Ling "handler" : {
344ded66d0fSJason Ling "type" : "file",
345ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
346ded66d0fSJason Ling },
347ded66d0fSJason Ling "actions" : {
348ded66d0fSJason Ling "preparation" : {
349ded66d0fSJason Ling "type" : "systemd",
350ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
351ded66d0fSJason Ling },
352ded66d0fSJason Ling "verification" : {
353ded66d0fSJason Ling "type" : "fileSystemdVerify",
354ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
355ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
356ded66d0fSJason Ling },
357ded66d0fSJason Ling "update" : {
358ded66d0fSJason Ling "type" : "reboot"
359ded66d0fSJason Ling }
360ded66d0fSJason Ling }
361ded66d0fSJason Ling }]
362ded66d0fSJason Ling )"_json;
363ded66d0fSJason Ling
364c893f43dSJason Ling EXPECT_THAT(FirmwareHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
365ded66d0fSJason Ling }
366ded66d0fSJason Ling
TEST(FirmwareJsonTest,VerifySystemdWithReboot)367ded66d0fSJason Ling TEST(FirmwareJsonTest, VerifySystemdWithReboot)
368ded66d0fSJason Ling {
369ded66d0fSJason Ling auto j2 = R"(
370ded66d0fSJason Ling [{
371ded66d0fSJason Ling "blob" : "/flash/image",
372ded66d0fSJason Ling "handler" : {
373ded66d0fSJason Ling "type" : "file",
374ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
375ded66d0fSJason Ling },
376ded66d0fSJason Ling "actions" : {
377ded66d0fSJason Ling "preparation" : {
378ded66d0fSJason Ling "type" : "systemd",
379ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
380ded66d0fSJason Ling },
381ded66d0fSJason Ling "verification" : {
382ded66d0fSJason Ling "type" : "fileSystemdVerify",
383ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
384ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
385ded66d0fSJason Ling },
386ded66d0fSJason Ling "update" : {
387ded66d0fSJason Ling "type" : "reboot"
388ded66d0fSJason Ling }
389ded66d0fSJason Ling }
390ded66d0fSJason Ling }]
391ded66d0fSJason Ling )"_json;
392ded66d0fSJason Ling
393c893f43dSJason Ling auto h = FirmwareHandlersBuilder().buildHandlerFromJson(j2);
394ded66d0fSJason Ling EXPECT_EQ(h[0].blobId, "/flash/image");
395ded66d0fSJason Ling EXPECT_FALSE(h[0].handler == nullptr);
396ded66d0fSJason Ling EXPECT_FALSE(h[0].actions == nullptr);
397ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->preparation == nullptr);
398ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->verification == nullptr);
399ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->update == nullptr);
400ded66d0fSJason Ling }
401ded66d0fSJason Ling
TEST(FirmwareJsonTest,VerifyMultipleHandlersReturned)402ded66d0fSJason Ling TEST(FirmwareJsonTest, VerifyMultipleHandlersReturned)
403ded66d0fSJason Ling {
404ded66d0fSJason Ling auto j2 = R"(
405ded66d0fSJason Ling [{
406ded66d0fSJason Ling "blob" : "/flash/image",
407ded66d0fSJason Ling "handler" : {
408ded66d0fSJason Ling "type" : "file",
409ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
410ded66d0fSJason Ling },
411ded66d0fSJason Ling "actions" : {
412ded66d0fSJason Ling "preparation" : {
413ded66d0fSJason Ling "type" : "systemd",
414ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
415ded66d0fSJason Ling },
416ded66d0fSJason Ling "verification" : {
417ded66d0fSJason Ling "type" : "fileSystemdVerify",
418ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
419ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
420ded66d0fSJason Ling },
421ded66d0fSJason Ling "update" : {
422ded66d0fSJason Ling "type" : "systemd",
423ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-update.target"
424ded66d0fSJason Ling }
425ded66d0fSJason Ling }
426ded66d0fSJason Ling },
427ded66d0fSJason Ling {
428ded66d0fSJason Ling "blob" : "/flash/bios",
429ded66d0fSJason Ling "handler" : {
430ded66d0fSJason Ling "type" : "file",
431ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
432ded66d0fSJason Ling },
433ded66d0fSJason Ling "actions" : {
434ded66d0fSJason Ling "preparation" : {
435ded66d0fSJason Ling "type" : "systemd",
436ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
437ded66d0fSJason Ling },
438ded66d0fSJason Ling "verification" : {
439ded66d0fSJason Ling "type" : "fileSystemdVerify",
440ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
441ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
442ded66d0fSJason Ling },
443ded66d0fSJason Ling "update" : {
444ded66d0fSJason Ling "type" : "systemd",
445ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-update.target"
446ded66d0fSJason Ling }
447ded66d0fSJason Ling }
448ded66d0fSJason Ling }]
449ded66d0fSJason Ling )"_json;
450ded66d0fSJason Ling
451c893f43dSJason Ling auto h = FirmwareHandlersBuilder().buildHandlerFromJson(j2);
452ded66d0fSJason Ling EXPECT_EQ(h.size(), 2);
453ded66d0fSJason Ling EXPECT_EQ(h[0].blobId, "/flash/image");
454ded66d0fSJason Ling EXPECT_EQ(h[1].blobId, "/flash/bios");
455ded66d0fSJason Ling }
456ded66d0fSJason Ling
TEST(FirmwareJsonTest,VerifyValidSingleNonReboot)457ded66d0fSJason Ling TEST(FirmwareJsonTest, VerifyValidSingleNonReboot)
458ded66d0fSJason Ling {
459ded66d0fSJason Ling auto j2 = R"(
460ded66d0fSJason Ling [{
461ded66d0fSJason Ling "blob" : "/flash/image",
462ded66d0fSJason Ling "handler" : {
463ded66d0fSJason Ling "type" : "file",
464ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
465ded66d0fSJason Ling },
466ded66d0fSJason Ling "actions" : {
467ded66d0fSJason Ling "preparation" : {
468ded66d0fSJason Ling "type" : "systemd",
469ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
470ded66d0fSJason Ling },
471ded66d0fSJason Ling "verification" : {
472ded66d0fSJason Ling "type" : "fileSystemdVerify",
473ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
474ded66d0fSJason Ling "path" : "/tmp/bmc.verify"
475ded66d0fSJason Ling },
476ded66d0fSJason Ling "update" : {
477ded66d0fSJason Ling "type" : "systemd",
478ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-update.target"
479ded66d0fSJason Ling }
480ded66d0fSJason Ling }
481ded66d0fSJason Ling }]
482ded66d0fSJason Ling )"_json;
483ded66d0fSJason Ling
484c893f43dSJason Ling auto h = FirmwareHandlersBuilder().buildHandlerFromJson(j2);
485ded66d0fSJason Ling EXPECT_EQ(h[0].blobId, "/flash/image");
486ded66d0fSJason Ling EXPECT_FALSE(h[0].handler == nullptr);
487ded66d0fSJason Ling EXPECT_FALSE(h[0].actions == nullptr);
488ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->preparation == nullptr);
489ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->verification == nullptr);
490ded66d0fSJason Ling auto verifier = reinterpret_cast<SystemdWithStatusFile*>(
491ded66d0fSJason Ling h[0].actions->verification.get());
492ded66d0fSJason Ling EXPECT_THAT(verifier->getMode(), "replace");
493ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->update == nullptr);
494ded66d0fSJason Ling auto updater = reinterpret_cast<SystemdNoFile*>(h[0].actions->update.get());
495ded66d0fSJason Ling EXPECT_THAT(updater->getMode(), "replace");
496ded66d0fSJason Ling }
497ded66d0fSJason Ling
TEST(FirmwareJsonTest,VerifyValidWithModes)498ded66d0fSJason Ling TEST(FirmwareJsonTest, VerifyValidWithModes)
499ded66d0fSJason Ling {
500ded66d0fSJason Ling auto j2 = R"(
501ded66d0fSJason Ling [{
502ded66d0fSJason Ling "blob" : "/flash/image",
503ded66d0fSJason Ling "handler" : {
504ded66d0fSJason Ling "type" : "file",
505ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
506ded66d0fSJason Ling },
507ded66d0fSJason Ling "actions" : {
508ded66d0fSJason Ling "preparation" : {
509ded66d0fSJason Ling "type" : "systemd",
510ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
511ded66d0fSJason Ling },
512ded66d0fSJason Ling "verification" : {
513ded66d0fSJason Ling "type" : "fileSystemdVerify",
514ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
515ded66d0fSJason Ling "path" : "/tmp/bmc.verify",
516ded66d0fSJason Ling "mode" : "replace-nope"
517ded66d0fSJason Ling },
518ded66d0fSJason Ling "update" : {
519ded66d0fSJason Ling "type" : "systemd",
520ded66d0fSJason Ling "mode" : "replace-fake",
521ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-update.target"
522ded66d0fSJason Ling }
523ded66d0fSJason Ling }
524ded66d0fSJason Ling }]
525ded66d0fSJason Ling )"_json;
526ded66d0fSJason Ling
527c893f43dSJason Ling auto h = FirmwareHandlersBuilder().buildHandlerFromJson(j2);
528ded66d0fSJason Ling EXPECT_EQ(h[0].blobId, "/flash/image");
529ded66d0fSJason Ling EXPECT_FALSE(h[0].handler == nullptr);
530ded66d0fSJason Ling EXPECT_FALSE(h[0].actions == nullptr);
531ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->preparation == nullptr);
532ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->verification == nullptr);
533ded66d0fSJason Ling auto verifier = reinterpret_cast<SystemdWithStatusFile*>(
534ded66d0fSJason Ling h[0].actions->verification.get());
535ded66d0fSJason Ling EXPECT_THAT(verifier->getMode(), "replace-nope");
536ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->update == nullptr);
537ded66d0fSJason Ling auto updater = reinterpret_cast<SystemdNoFile*>(h[0].actions->update.get());
538ded66d0fSJason Ling EXPECT_THAT(updater->getMode(), "replace-fake");
539ded66d0fSJason Ling }
540ded66d0fSJason Ling
TEST(FirmwareJsonTest,VerifyValidUpdateWithFilePath)541ded66d0fSJason Ling TEST(FirmwareJsonTest, VerifyValidUpdateWithFilePath)
542ded66d0fSJason Ling {
543ded66d0fSJason Ling auto j2 = R"(
544ded66d0fSJason Ling [{
545ded66d0fSJason Ling "blob" : "/flash/image",
546ded66d0fSJason Ling "handler" : {
547ded66d0fSJason Ling "type" : "file",
548ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
549ded66d0fSJason Ling },
550ded66d0fSJason Ling "actions" : {
551ded66d0fSJason Ling "preparation" : {
552ded66d0fSJason Ling "type" : "systemd",
553ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-prepare.target"
554ded66d0fSJason Ling },
555ded66d0fSJason Ling "verification" : {
556ded66d0fSJason Ling "type" : "fileSystemdVerify",
557ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-verify.target",
558ded66d0fSJason Ling "path" : "/tmp/bmc.verify",
559ded66d0fSJason Ling "mode" : "replace-nope"
560ded66d0fSJason Ling },
561ded66d0fSJason Ling "update" : {
562ded66d0fSJason Ling "type" : "fileSystemdUpdate",
563ded66d0fSJason Ling "mode" : "replace-fake",
564ded66d0fSJason Ling "unit" : "phosphor-ipmi-flash-bmc-update.target",
565ded66d0fSJason Ling "path" : "/tmp/update.verify"
566ded66d0fSJason Ling }
567ded66d0fSJason Ling }
568ded66d0fSJason Ling }]
569ded66d0fSJason Ling )"_json;
570ded66d0fSJason Ling
571c893f43dSJason Ling auto h = FirmwareHandlersBuilder().buildHandlerFromJson(j2);
572ded66d0fSJason Ling EXPECT_EQ(h[0].blobId, "/flash/image");
573ded66d0fSJason Ling EXPECT_FALSE(h[0].handler == nullptr);
574ded66d0fSJason Ling EXPECT_FALSE(h[0].actions == nullptr);
575ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->preparation == nullptr);
576ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->verification == nullptr);
577ded66d0fSJason Ling auto verifier = reinterpret_cast<SystemdWithStatusFile*>(
578ded66d0fSJason Ling h[0].actions->verification.get());
579ded66d0fSJason Ling EXPECT_THAT(verifier->getMode(), "replace-nope");
580ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->update == nullptr);
581ded66d0fSJason Ling auto updater =
582ded66d0fSJason Ling reinterpret_cast<SystemdWithStatusFile*>(h[0].actions->update.get());
583ded66d0fSJason Ling EXPECT_THAT(updater->getMode(), "replace-fake");
584ded66d0fSJason Ling }
585ded66d0fSJason Ling
TEST(FirmwareJsonTest,VerifySkipFields)586ded66d0fSJason Ling TEST(FirmwareJsonTest, VerifySkipFields)
587ded66d0fSJason Ling {
588ded66d0fSJason Ling // In this configuration, nothing happens because all actions are set to
589ded66d0fSJason Ling // skip.
590ded66d0fSJason Ling auto j2 = R"(
591ded66d0fSJason Ling [{
592ded66d0fSJason Ling "blob" : "/flash/image",
593ded66d0fSJason Ling "handler" : {
594ded66d0fSJason Ling "type" : "file",
595ded66d0fSJason Ling "path" : "/run/initramfs/bmc-image"
596ded66d0fSJason Ling },
597ded66d0fSJason Ling "actions" : {
598ded66d0fSJason Ling "preparation" : {
599ded66d0fSJason Ling "type" : "skip"
600ded66d0fSJason Ling },
601ded66d0fSJason Ling "verification" : {
602ded66d0fSJason Ling "type" : "skip"
603ded66d0fSJason Ling },
604ded66d0fSJason Ling "update" : {
605ded66d0fSJason Ling "type" : "skip"
606ded66d0fSJason Ling }
607ded66d0fSJason Ling }
608ded66d0fSJason Ling }]
609ded66d0fSJason Ling )"_json;
610ded66d0fSJason Ling
611c893f43dSJason Ling auto h = FirmwareHandlersBuilder().buildHandlerFromJson(j2);
612ded66d0fSJason Ling EXPECT_EQ(h[0].blobId, "/flash/image");
613ded66d0fSJason Ling EXPECT_FALSE(h[0].handler == nullptr);
614ded66d0fSJason Ling EXPECT_FALSE(h[0].actions == nullptr);
615ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->preparation == nullptr);
616ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->verification == nullptr);
617ded66d0fSJason Ling EXPECT_FALSE(h[0].actions->update == nullptr);
618ded66d0fSJason Ling }
619ded66d0fSJason Ling
TEST(FirmwareJsonTest,BuildFromFile)620e82d7395SJason Ling TEST(FirmwareJsonTest, BuildFromFile)
621e82d7395SJason Ling {
622*b487eb47SWilly Tu std::filesystem::create_directories("./test/");
623e82d7395SJason Ling std::ofstream testfile;
624e82d7395SJason Ling testfile.open(TESTFNAME, std::ios::out);
625e82d7395SJason Ling auto good = R"(
626e82d7395SJason Ling [{
627e82d7395SJason Ling "blob" : "/flash/image",
628e82d7395SJason Ling "handler" : {
629e82d7395SJason Ling "type" : "file",
630e82d7395SJason Ling "path" : "/run/initramfs/bmc-image"
631e82d7395SJason Ling },
632e82d7395SJason Ling "actions" : {
633e82d7395SJason Ling "preparation" : {
634e82d7395SJason Ling "type" : "skip"
635e82d7395SJason Ling },
636e82d7395SJason Ling "verification" : {
637e82d7395SJason Ling "type" : "skip"
638e82d7395SJason Ling },
639e82d7395SJason Ling "update" : {
640e82d7395SJason Ling "type" : "skip"
641e82d7395SJason Ling }
642e82d7395SJason Ling }
643e82d7395SJason Ling }]
644e82d7395SJason Ling )"_json;
645e82d7395SJason Ling testfile << good.dump(4);
646e82d7395SJason Ling testfile.flush();
647e82d7395SJason Ling FirmwareHandlersBuilder b;
648*b487eb47SWilly Tu auto h = b.buildHandlerConfigs("./test/");
649e82d7395SJason Ling EXPECT_EQ(h.size(), 1);
650e82d7395SJason Ling EXPECT_EQ(h[0].blobId, "/flash/image");
651e82d7395SJason Ling EXPECT_FALSE(h[0].handler == nullptr);
652e82d7395SJason Ling EXPECT_FALSE(h[0].actions == nullptr);
653e82d7395SJason Ling EXPECT_FALSE(h[0].actions->preparation == nullptr);
654e82d7395SJason Ling EXPECT_FALSE(h[0].actions->verification == nullptr);
655e82d7395SJason Ling EXPECT_FALSE(h[0].actions->update == nullptr);
656e82d7395SJason Ling if (std::remove(TESTFNAME) != 0)
657e82d7395SJason Ling {
658e82d7395SJason Ling fprintf(stderr, "warning: filecleanup of %s failed\n", TESTFNAME);
659e82d7395SJason Ling }
660e82d7395SJason Ling }
661e82d7395SJason Ling
TEST(FirmwareJsonTest,BuildFromBadFile)662e82d7395SJason Ling TEST(FirmwareJsonTest, BuildFromBadFile)
663e82d7395SJason Ling {
664*b487eb47SWilly Tu std::filesystem::create_directories("./test/");
665e82d7395SJason Ling std::ofstream testfile;
666e82d7395SJason Ling testfile.open(TESTFNAME, std::ios::out);
667e82d7395SJason Ling testfile << "{] a malformed json {{";
668e82d7395SJason Ling testfile.flush();
669e82d7395SJason Ling FirmwareHandlersBuilder b;
670*b487eb47SWilly Tu auto h = b.buildHandlerConfigs("./test/");
671e82d7395SJason Ling EXPECT_THAT(h, IsEmpty());
672e82d7395SJason Ling if (std::remove(TESTFNAME) != 0)
673e82d7395SJason Ling {
674e82d7395SJason Ling fprintf(stderr, "warning: filecleanup of %s failed\n", TESTFNAME);
675e82d7395SJason Ling }
676e82d7395SJason Ling }
677e82d7395SJason Ling
TEST(FirmwareJsonTest,BuildFromMissingDirectory)678bfcf1326SWilliam A. Kennington III TEST(FirmwareJsonTest, BuildFromMissingDirectory)
679bfcf1326SWilliam A. Kennington III {
680bfcf1326SWilliam A. Kennington III EXPECT_THAT(
681bfcf1326SWilliam A. Kennington III FirmwareHandlersBuilder().buildHandlerConfigs("./no-such-directory"),
682bfcf1326SWilliam A. Kennington III IsEmpty());
683bfcf1326SWilliam A. Kennington III }
684bfcf1326SWilliam A. Kennington III
685ded66d0fSJason Ling } // namespace
686ded66d0fSJason Ling } // namespace ipmi_flash
687