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