xref: /openbmc/phosphor-ipmi-flash/bmc/log-handler/test/log_json_unittest.cpp (revision a49a3f79e4bea32929d7be8201645c7d83b0f2ae)
1*a49a3f79SGaurav Gandhi // Copyright 2021 Google Inc.
2*a49a3f79SGaurav Gandhi //
3*a49a3f79SGaurav Gandhi // Licensed under the Apache License, Version 2.0 (the "License");
4*a49a3f79SGaurav Gandhi // you may not use this file except in compliance with the License.
5*a49a3f79SGaurav Gandhi // You may obtain a copy of the License at
6*a49a3f79SGaurav Gandhi //
7*a49a3f79SGaurav Gandhi //      http://www.apache.org/licenses/LICENSE-2.0
8*a49a3f79SGaurav Gandhi //
9*a49a3f79SGaurav Gandhi // Unless required by applicable law or agreed to in writing, software
10*a49a3f79SGaurav Gandhi // distributed under the License is distributed on an "AS IS" BASIS,
11*a49a3f79SGaurav Gandhi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*a49a3f79SGaurav Gandhi // See the License for the specific language governing permissions and
13*a49a3f79SGaurav Gandhi // limitations under the License.
14*a49a3f79SGaurav Gandhi 
15*a49a3f79SGaurav Gandhi #include "general_systemd.hpp"
16*a49a3f79SGaurav Gandhi #include "log_handlers_builder.hpp"
17*a49a3f79SGaurav Gandhi #include "skip_action.hpp"
18*a49a3f79SGaurav Gandhi 
19*a49a3f79SGaurav Gandhi #include <nlohmann/json.hpp>
20*a49a3f79SGaurav Gandhi 
21*a49a3f79SGaurav Gandhi #include <gmock/gmock.h>
22*a49a3f79SGaurav Gandhi #include <gtest/gtest.h>
23*a49a3f79SGaurav Gandhi 
24*a49a3f79SGaurav Gandhi namespace ipmi_flash
25*a49a3f79SGaurav Gandhi {
26*a49a3f79SGaurav Gandhi namespace
27*a49a3f79SGaurav Gandhi {
28*a49a3f79SGaurav Gandhi using ::testing::IsEmpty;
29*a49a3f79SGaurav Gandhi 
30*a49a3f79SGaurav Gandhi using json = nlohmann::json;
31*a49a3f79SGaurav Gandhi 
TEST(LogJsonTest,ValidConfigurationNoLogHandler)32*a49a3f79SGaurav Gandhi TEST(LogJsonTest, ValidConfigurationNoLogHandler)
33*a49a3f79SGaurav Gandhi {
34*a49a3f79SGaurav Gandhi     auto j2 = R"(
35*a49a3f79SGaurav Gandhi         [{
36*a49a3f79SGaurav Gandhi             "blob" : "/flash/sink_seq",
37*a49a3f79SGaurav Gandhi             "log":{
38*a49a3f79SGaurav Gandhi                 "handler": {
39*a49a3f79SGaurav Gandhi                    "type" : "file",
40*a49a3f79SGaurav Gandhi                    "path" : "/tmp/log_info"
41*a49a3f79SGaurav Gandhi                  },
42*a49a3f79SGaurav Gandhi                 "actions":{
43*a49a3f79SGaurav Gandhi                     "open" :{
44*a49a3f79SGaurav Gandhi                     "type" : "systemd",
45*a49a3f79SGaurav Gandhi                     "unit" : "absolute"
46*a49a3f79SGaurav Gandhi                     }
47*a49a3f79SGaurav Gandhi                  }
48*a49a3f79SGaurav Gandhi             }
49*a49a3f79SGaurav Gandhi          }]
50*a49a3f79SGaurav Gandhi     )"_json;
51*a49a3f79SGaurav Gandhi     auto h = LogHandlersBuilder().buildHandlerFromJson(j2);
52*a49a3f79SGaurav Gandhi     ASSERT_THAT(h, ::testing::SizeIs(1));
53*a49a3f79SGaurav Gandhi     EXPECT_THAT(h[0].blobId, "/log/sink_seq");
54*a49a3f79SGaurav Gandhi     EXPECT_FALSE(h[0].actions == nullptr);
55*a49a3f79SGaurav Gandhi     EXPECT_FALSE(h[0].handler == nullptr);
56*a49a3f79SGaurav Gandhi }
57*a49a3f79SGaurav Gandhi 
TEST(LogJsonTest,ValidConfigurationLogBlobName)58*a49a3f79SGaurav Gandhi TEST(LogJsonTest, ValidConfigurationLogBlobName)
59*a49a3f79SGaurav Gandhi {
60*a49a3f79SGaurav Gandhi     auto j2 = R"(
61*a49a3f79SGaurav Gandhi         [{
62*a49a3f79SGaurav Gandhi             "blob" : "/log/sink_seq",
63*a49a3f79SGaurav Gandhi             "log":{
64*a49a3f79SGaurav Gandhi                 "handler": {
65*a49a3f79SGaurav Gandhi                    "type" : "file",
66*a49a3f79SGaurav Gandhi                    "path" : "/tmp/log_info"
67*a49a3f79SGaurav Gandhi                  },
68*a49a3f79SGaurav Gandhi                 "actions": {
69*a49a3f79SGaurav Gandhi                     "open" : {
70*a49a3f79SGaurav Gandhi                     "type" : "systemd",
71*a49a3f79SGaurav Gandhi                     "unit" : "phosphor-ipmi-flash-log-sink-sequencer.target"
72*a49a3f79SGaurav Gandhi                     }
73*a49a3f79SGaurav Gandhi                  }
74*a49a3f79SGaurav Gandhi             }
75*a49a3f79SGaurav Gandhi          }]
76*a49a3f79SGaurav Gandhi     )"_json;
77*a49a3f79SGaurav Gandhi     auto h = LogHandlersBuilder().buildHandlerFromJson(j2);
78*a49a3f79SGaurav Gandhi     ASSERT_THAT(h, ::testing::SizeIs(1));
79*a49a3f79SGaurav Gandhi     EXPECT_THAT(h[0].blobId, "/log/sink_seq");
80*a49a3f79SGaurav Gandhi     EXPECT_FALSE(h[0].actions == nullptr);
81*a49a3f79SGaurav Gandhi     EXPECT_FALSE(h[0].handler == nullptr);
82*a49a3f79SGaurav Gandhi }
83*a49a3f79SGaurav Gandhi 
TEST(LogJsonTest,MissingHandlerType)84*a49a3f79SGaurav Gandhi TEST(LogJsonTest, MissingHandlerType)
85*a49a3f79SGaurav Gandhi {
86*a49a3f79SGaurav Gandhi     auto j2 = R"(
87*a49a3f79SGaurav Gandhi         [{
88*a49a3f79SGaurav Gandhi             "blob" : "/flash/image",
89*a49a3f79SGaurav Gandhi             "log":{
90*a49a3f79SGaurav Gandhi                 "handler": {
91*a49a3f79SGaurav Gandhi                    "path" : "/tmp/log_info"
92*a49a3f79SGaurav Gandhi                  },
93*a49a3f79SGaurav Gandhi                 "actions": {
94*a49a3f79SGaurav Gandhi                   "open" : {
95*a49a3f79SGaurav Gandhi                   "type" : "systemd",
96*a49a3f79SGaurav Gandhi                   "unit" : "absolute"}
97*a49a3f79SGaurav Gandhi                  }
98*a49a3f79SGaurav Gandhi             }
99*a49a3f79SGaurav Gandhi          }]
100*a49a3f79SGaurav Gandhi     )"_json;
101*a49a3f79SGaurav Gandhi     EXPECT_THAT(LogHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
102*a49a3f79SGaurav Gandhi }
103*a49a3f79SGaurav Gandhi 
TEST(LogJsonTest,BadBlobName)104*a49a3f79SGaurav Gandhi TEST(LogJsonTest, BadBlobName)
105*a49a3f79SGaurav Gandhi {
106*a49a3f79SGaurav Gandhi     auto j2 = R"(
107*a49a3f79SGaurav Gandhi         [{
108*a49a3f79SGaurav Gandhi             "blob" : "/bad/image",
109*a49a3f79SGaurav Gandhi             "log":{
110*a49a3f79SGaurav Gandhi                 "handler": {
111*a49a3f79SGaurav Gandhi                    "type" : "file",
112*a49a3f79SGaurav Gandhi                    "path" : "/tmp/log_info"
113*a49a3f79SGaurav Gandhi                  },
114*a49a3f79SGaurav Gandhi                 "actions": {
115*a49a3f79SGaurav Gandhi                   "open" : {
116*a49a3f79SGaurav Gandhi                   "type" : "systemd",
117*a49a3f79SGaurav Gandhi                   "unit" : "absolute"}
118*a49a3f79SGaurav Gandhi                  }
119*a49a3f79SGaurav Gandhi             }
120*a49a3f79SGaurav Gandhi          }]
121*a49a3f79SGaurav Gandhi     )"_json;
122*a49a3f79SGaurav Gandhi     EXPECT_THAT(LogHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
123*a49a3f79SGaurav Gandhi }
124*a49a3f79SGaurav Gandhi 
TEST(LogJsonTest,MissingActions)125*a49a3f79SGaurav Gandhi TEST(LogJsonTest, MissingActions)
126*a49a3f79SGaurav Gandhi {
127*a49a3f79SGaurav Gandhi     auto j2 = R"(
128*a49a3f79SGaurav Gandhi         [{
129*a49a3f79SGaurav Gandhi             "blob" : "/flash/image",
130*a49a3f79SGaurav Gandhi             "log":{
131*a49a3f79SGaurav Gandhi                 "handler": {
132*a49a3f79SGaurav Gandhi                    "type" : "file",
133*a49a3f79SGaurav Gandhi                    "path" : "/tmp/log_info"
134*a49a3f79SGaurav Gandhi                  }
135*a49a3f79SGaurav Gandhi             }
136*a49a3f79SGaurav Gandhi          }]
137*a49a3f79SGaurav Gandhi     )"_json;
138*a49a3f79SGaurav Gandhi     EXPECT_THAT(LogHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
139*a49a3f79SGaurav Gandhi }
140*a49a3f79SGaurav Gandhi 
TEST(LogJsonTest,MissingOpenAction)141*a49a3f79SGaurav Gandhi TEST(LogJsonTest, MissingOpenAction)
142*a49a3f79SGaurav Gandhi {
143*a49a3f79SGaurav Gandhi     auto j2 = R"(
144*a49a3f79SGaurav Gandhi         [{
145*a49a3f79SGaurav Gandhi             "blob" : "/flash/image",
146*a49a3f79SGaurav Gandhi             "log":{
147*a49a3f79SGaurav Gandhi                 "handler": {
148*a49a3f79SGaurav Gandhi                    "type" : "file",
149*a49a3f79SGaurav Gandhi                    "path" : "/tmp/log_info"
150*a49a3f79SGaurav Gandhi                  },
151*a49a3f79SGaurav Gandhi                 "actions": {}
152*a49a3f79SGaurav Gandhi             }
153*a49a3f79SGaurav Gandhi          }]
154*a49a3f79SGaurav Gandhi     )"_json;
155*a49a3f79SGaurav Gandhi     EXPECT_THAT(LogHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
156*a49a3f79SGaurav Gandhi }
157*a49a3f79SGaurav Gandhi 
TEST(LogJsonTest,OneInvalidTwoValidSucceeds)158*a49a3f79SGaurav Gandhi TEST(LogJsonTest, OneInvalidTwoValidSucceeds)
159*a49a3f79SGaurav Gandhi {
160*a49a3f79SGaurav Gandhi     auto j2 = R"(
161*a49a3f79SGaurav Gandhi         [{
162*a49a3f79SGaurav Gandhi             "blob" : "/flash/sink_seq0",
163*a49a3f79SGaurav Gandhi             "log":{
164*a49a3f79SGaurav Gandhi                 "handler": {
165*a49a3f79SGaurav Gandhi                    "type" : "file",
166*a49a3f79SGaurav Gandhi                    "path" : "/tmp/log_info"
167*a49a3f79SGaurav Gandhi                  },
168*a49a3f79SGaurav Gandhi                 "actions":{
169*a49a3f79SGaurav Gandhi                     "open" :{
170*a49a3f79SGaurav Gandhi                     "type" : "systemd",
171*a49a3f79SGaurav Gandhi                     "unit" : "absolute"
172*a49a3f79SGaurav Gandhi                     }
173*a49a3f79SGaurav Gandhi                  }
174*a49a3f79SGaurav Gandhi             }
175*a49a3f79SGaurav Gandhi          },
176*a49a3f79SGaurav Gandhi          {
177*a49a3f79SGaurav Gandhi             "blob" : "/log/sink_seq1",
178*a49a3f79SGaurav Gandhi             "log":{
179*a49a3f79SGaurav Gandhi                 "handler": {
180*a49a3f79SGaurav Gandhi                    "type" : "file",
181*a49a3f79SGaurav Gandhi                    "path" : "/tmp/log_info"
182*a49a3f79SGaurav Gandhi                  },
183*a49a3f79SGaurav Gandhi                 "actions":{
184*a49a3f79SGaurav Gandhi                     "open" :{
185*a49a3f79SGaurav Gandhi                     "type" : "systemd",
186*a49a3f79SGaurav Gandhi                     "unit" : "absolute"
187*a49a3f79SGaurav Gandhi                     }
188*a49a3f79SGaurav Gandhi                  }
189*a49a3f79SGaurav Gandhi             }
190*a49a3f79SGaurav Gandhi          },
191*a49a3f79SGaurav Gandhi          {
192*a49a3f79SGaurav Gandhi             "blob" : "/bad/sink_seq",
193*a49a3f79SGaurav Gandhi             "log":{
194*a49a3f79SGaurav Gandhi                 "handler": {
195*a49a3f79SGaurav Gandhi                    "type" : "file",
196*a49a3f79SGaurav Gandhi                    "path" : "/tmp/log_info"
197*a49a3f79SGaurav Gandhi                  },
198*a49a3f79SGaurav Gandhi                 "actions":{
199*a49a3f79SGaurav Gandhi                     "open" :{
200*a49a3f79SGaurav Gandhi                     "type" : "systemd",
201*a49a3f79SGaurav Gandhi                     "unit" : "absolute"
202*a49a3f79SGaurav Gandhi                     }
203*a49a3f79SGaurav Gandhi                  }
204*a49a3f79SGaurav Gandhi             }
205*a49a3f79SGaurav Gandhi          }
206*a49a3f79SGaurav Gandhi          ]
207*a49a3f79SGaurav Gandhi     )"_json;
208*a49a3f79SGaurav Gandhi     auto h = LogHandlersBuilder().buildHandlerFromJson(j2);
209*a49a3f79SGaurav Gandhi     ASSERT_THAT(h, ::testing::SizeIs(2));
210*a49a3f79SGaurav Gandhi     EXPECT_THAT(h[0].blobId, "/log/sink_seq0");
211*a49a3f79SGaurav Gandhi     EXPECT_THAT(h[1].blobId, "/log/sink_seq1");
212*a49a3f79SGaurav Gandhi }
213*a49a3f79SGaurav Gandhi 
TEST(LogJsonTest,BlobNameIsTooShort)214*a49a3f79SGaurav Gandhi TEST(LogJsonTest, BlobNameIsTooShort)
215*a49a3f79SGaurav Gandhi {
216*a49a3f79SGaurav Gandhi     auto j2 = R"(
217*a49a3f79SGaurav Gandhi         [{
218*a49a3f79SGaurav Gandhi             "blob" : "/flash/",
219*a49a3f79SGaurav Gandhi             "log":{
220*a49a3f79SGaurav Gandhi                 "handler": {
221*a49a3f79SGaurav Gandhi                    "type" : "file",
222*a49a3f79SGaurav Gandhi                    "path" : "/tmp/log_info"
223*a49a3f79SGaurav Gandhi                  },
224*a49a3f79SGaurav Gandhi                 "actions":{
225*a49a3f79SGaurav Gandhi                     "open" :{
226*a49a3f79SGaurav Gandhi                     "type" : "systemd",
227*a49a3f79SGaurav Gandhi                     "unit" : "absolute"
228*a49a3f79SGaurav Gandhi                     }
229*a49a3f79SGaurav Gandhi                  }
230*a49a3f79SGaurav Gandhi             }
231*a49a3f79SGaurav Gandhi          }]
232*a49a3f79SGaurav Gandhi     )"_json;
233*a49a3f79SGaurav Gandhi     EXPECT_THAT(LogHandlersBuilder().buildHandlerFromJson(j2), IsEmpty());
234*a49a3f79SGaurav Gandhi }
235*a49a3f79SGaurav Gandhi 
TEST(LogJsonTest,OpenSkipAction)236*a49a3f79SGaurav Gandhi TEST(LogJsonTest, OpenSkipAction)
237*a49a3f79SGaurav Gandhi {
238*a49a3f79SGaurav Gandhi     auto j2 = R"(
239*a49a3f79SGaurav Gandhi         [{
240*a49a3f79SGaurav Gandhi             "blob" : "/flash/sink_seqs",
241*a49a3f79SGaurav Gandhi             "log":{
242*a49a3f79SGaurav Gandhi                 "handler": {
243*a49a3f79SGaurav Gandhi                    "type" : "file",
244*a49a3f79SGaurav Gandhi                    "path" : "/tmp/log_info"
245*a49a3f79SGaurav Gandhi                  },
246*a49a3f79SGaurav Gandhi                 "actions":{
247*a49a3f79SGaurav Gandhi                     "open" :{
248*a49a3f79SGaurav Gandhi                     "type" : "skip"
249*a49a3f79SGaurav Gandhi                     }
250*a49a3f79SGaurav Gandhi                  }
251*a49a3f79SGaurav Gandhi             }
252*a49a3f79SGaurav Gandhi          }]
253*a49a3f79SGaurav Gandhi     )"_json;
254*a49a3f79SGaurav Gandhi     auto h = LogHandlersBuilder().buildHandlerFromJson(j2);
255*a49a3f79SGaurav Gandhi     EXPECT_THAT(h, ::testing::SizeIs(1));
256*a49a3f79SGaurav Gandhi     EXPECT_TRUE(h[0].blobId == "/log/sink_seqs");
257*a49a3f79SGaurav Gandhi     ASSERT_FALSE(h[0].actions == nullptr);
258*a49a3f79SGaurav Gandhi     EXPECT_FALSE(h[0].actions->onOpen == nullptr);
259*a49a3f79SGaurav Gandhi }
260*a49a3f79SGaurav Gandhi 
TEST(LogJsonTest,OpenActionsWithDifferentModes)261*a49a3f79SGaurav Gandhi TEST(LogJsonTest, OpenActionsWithDifferentModes)
262*a49a3f79SGaurav Gandhi {
263*a49a3f79SGaurav Gandhi     auto j2 = R"(
264*a49a3f79SGaurav Gandhi         [{
265*a49a3f79SGaurav Gandhi             "blob" : "/flash/blob1",
266*a49a3f79SGaurav Gandhi             "log":{
267*a49a3f79SGaurav Gandhi                 "handler": {
268*a49a3f79SGaurav Gandhi                    "type" : "file",
269*a49a3f79SGaurav Gandhi                    "path" : "/tmp/log_info"
270*a49a3f79SGaurav Gandhi                  },
271*a49a3f79SGaurav Gandhi                 "actions":{
272*a49a3f79SGaurav Gandhi                     "open" :{
273*a49a3f79SGaurav Gandhi                     "type" : "systemd",
274*a49a3f79SGaurav Gandhi                     "unit" : "absolute",
275*a49a3f79SGaurav Gandhi                     "mode" : "replace-nope"
276*a49a3f79SGaurav Gandhi                     }
277*a49a3f79SGaurav Gandhi                  }
278*a49a3f79SGaurav Gandhi             }
279*a49a3f79SGaurav Gandhi          },
280*a49a3f79SGaurav Gandhi          {
281*a49a3f79SGaurav Gandhi             "blob" : "/flash/blob2",
282*a49a3f79SGaurav Gandhi             "log":{
283*a49a3f79SGaurav Gandhi                 "handler": {
284*a49a3f79SGaurav Gandhi                    "type" : "file",
285*a49a3f79SGaurav Gandhi                    "path" : "/tmp/log_info"
286*a49a3f79SGaurav Gandhi                  },
287*a49a3f79SGaurav Gandhi                 "actions":{
288*a49a3f79SGaurav Gandhi                     "open" :{
289*a49a3f79SGaurav Gandhi                     "type" : "systemd",
290*a49a3f79SGaurav Gandhi                     "unit" : "absolute",
291*a49a3f79SGaurav Gandhi                     "mode" : "replace-fake"
292*a49a3f79SGaurav Gandhi                     }
293*a49a3f79SGaurav Gandhi                  }
294*a49a3f79SGaurav Gandhi             }
295*a49a3f79SGaurav Gandhi          }
296*a49a3f79SGaurav Gandhi          ]
297*a49a3f79SGaurav Gandhi     )"_json;
298*a49a3f79SGaurav Gandhi     auto h = LogHandlersBuilder().buildHandlerFromJson(j2);
299*a49a3f79SGaurav Gandhi     ASSERT_THAT(h, ::testing::SizeIs(2));
300*a49a3f79SGaurav Gandhi 
301*a49a3f79SGaurav Gandhi     EXPECT_FALSE(h[0].handler == nullptr);
302*a49a3f79SGaurav Gandhi     EXPECT_FALSE(h[0].actions == nullptr);
303*a49a3f79SGaurav Gandhi     EXPECT_THAT(h[0].blobId, "/log/blob1");
304*a49a3f79SGaurav Gandhi     auto onOpen0 = reinterpret_cast<SystemdNoFile*>(h[0].actions->onOpen.get());
305*a49a3f79SGaurav Gandhi     EXPECT_THAT(onOpen0->getMode(), "replace-nope");
306*a49a3f79SGaurav Gandhi 
307*a49a3f79SGaurav Gandhi     EXPECT_FALSE(h[1].handler == nullptr);
308*a49a3f79SGaurav Gandhi     EXPECT_FALSE(h[1].actions == nullptr);
309*a49a3f79SGaurav Gandhi     EXPECT_THAT(h[1].blobId, "/log/blob2");
310*a49a3f79SGaurav Gandhi     auto onOpen1 = reinterpret_cast<SystemdNoFile*>(h[1].actions->onOpen.get());
311*a49a3f79SGaurav Gandhi     EXPECT_THAT(onOpen1->getMode(), "replace-fake");
312*a49a3f79SGaurav Gandhi }
313*a49a3f79SGaurav Gandhi } // namespace
314*a49a3f79SGaurav Gandhi } // namespace ipmi_flash
315