xref: /openbmc/ibm-logging/test/test_policy.cpp (revision c57aa4b9310eed09a0ad3abd1232386c15d71064)
1b96fa321SMatt Spinler /**
2b96fa321SMatt Spinler  * Copyright © 2018 IBM Corporation
3b96fa321SMatt Spinler  *
4b96fa321SMatt Spinler  * Licensed under the Apache License, Version 2.0 (the "License");
5b96fa321SMatt Spinler  * you may not use this file except in compliance with the License.
6b96fa321SMatt Spinler  * You may obtain a copy of the License at
7b96fa321SMatt Spinler  *
8b96fa321SMatt Spinler  *     http://www.apache.org/licenses/LICENSE-2.0
9b96fa321SMatt Spinler  *
10b96fa321SMatt Spinler  * Unless required by applicable law or agreed to in writing, software
11b96fa321SMatt Spinler  * distributed under the License is distributed on an "AS IS" BASIS,
12b96fa321SMatt Spinler  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b96fa321SMatt Spinler  * See the License for the specific language governing permissions and
14b96fa321SMatt Spinler  * limitations under the License.
15b96fa321SMatt Spinler  */
1662011e26SMatt Spinler #include "policy_find.hpp"
1766e07073SMatt Spinler #include "policy_table.hpp"
1866e07073SMatt Spinler 
1966e07073SMatt Spinler #include <experimental/filesystem>
2066e07073SMatt Spinler #include <fstream>
2166e07073SMatt Spinler 
2266e07073SMatt Spinler #include <gtest/gtest.h>
23b96fa321SMatt Spinler 
24b96fa321SMatt Spinler using namespace ibm::logging;
25b96fa321SMatt Spinler namespace fs = std::experimental::filesystem;
26b96fa321SMatt Spinler 
27*c57aa4b9SMatt Spinler static constexpr auto HOST_EVENT = "org.open_power.Host.Error.Event";
28*c57aa4b9SMatt Spinler 
29*c57aa4b9SMatt Spinler // ESEL contents all of the way up to right before the severity
30*c57aa4b9SMatt Spinler // byte in the UH section
31*c57aa4b9SMatt Spinler static const std::string eSELBase =
32*c57aa4b9SMatt Spinler     "ESEL="
33*c57aa4b9SMatt Spinler     "00 00 df 00 00 00 00 20 00 04 07 5a 04 aa 00 00 50 48 00 30 01 00 e5 00 "
34*c57aa4b9SMatt Spinler     "00 00 f6 ca c9 da 5b b7 00 00 f6 ca d1 8a 2d e6 42 00 00 08 00 00 00 00 "
35*c57aa4b9SMatt Spinler     "00 00 00 00 00 00 00 00 89 00 03 44 89 00 03 44 55 48 00 18 01 00 e5 00 "
36*c57aa4b9SMatt Spinler     "13 03 ";
37*c57aa4b9SMatt Spinler 
38*c57aa4b9SMatt Spinler static const std::string noUHeSEL =
39*c57aa4b9SMatt Spinler     "ESEL="
40*c57aa4b9SMatt Spinler     "00 00 df 00 00 00 00 20 00 04 07 5a 04 aa 00 00 50 48 00 30 01 00 e5 00 "
41*c57aa4b9SMatt Spinler     "00 00 f6 ca c9 da 5b b7 00 00 f6 ca d1 8a 2d e6 42 00 00 08 00 00 00 00 "
42*c57aa4b9SMatt Spinler     "00 00 00 00 00 00 00 00 89 00 03 44 89 00 03 44 00 00 00 18 01 00 e5 00 "
43*c57aa4b9SMatt Spinler     "13 03 10";
44*c57aa4b9SMatt Spinler 
45*c57aa4b9SMatt Spinler // ESEL Severity bytes
46*c57aa4b9SMatt Spinler static const std::string SEV_RECOVERED = "10";
47*c57aa4b9SMatt Spinler static const std::string SEV_PREDICTIVE = "20";
48*c57aa4b9SMatt Spinler static const std::string SEV_UNRECOV = "40";
49*c57aa4b9SMatt Spinler static const std::string SEV_CRITICAL = "50";
50*c57aa4b9SMatt Spinler static const std::string SEV_DIAG = "60";
51*c57aa4b9SMatt Spinler 
52b96fa321SMatt Spinler static constexpr auto json = R"(
53b96fa321SMatt Spinler [
54b96fa321SMatt Spinler     {
55b96fa321SMatt Spinler     "dtls":[
56b96fa321SMatt Spinler       {
57b96fa321SMatt Spinler         "CEID":"ABCD1234",
58b96fa321SMatt Spinler         "mod":"",
59b96fa321SMatt Spinler         "msg":"Error ABCD1234"
60b96fa321SMatt Spinler       }
61b96fa321SMatt Spinler     ],
62b96fa321SMatt Spinler     "err":"xyz.openbmc_project.Error.Test1"
63b96fa321SMatt Spinler     },
64b96fa321SMatt Spinler 
65b96fa321SMatt Spinler     {
66b96fa321SMatt Spinler     "dtls":[
67b96fa321SMatt Spinler       {
68b96fa321SMatt Spinler         "CEID":"XYZ222",
69b96fa321SMatt Spinler         "mod":"",
70b96fa321SMatt Spinler         "msg":"Error XYZ222"
71b96fa321SMatt Spinler       }
72b96fa321SMatt Spinler     ],
73b96fa321SMatt Spinler     "err":"xyz.openbmc_project.Error.Test2"
74b96fa321SMatt Spinler     },
75b96fa321SMatt Spinler 
76b96fa321SMatt Spinler     {
77b96fa321SMatt Spinler     "dtls":[
78b96fa321SMatt Spinler       {
79b96fa321SMatt Spinler         "CEID":"AAAAAA",
80b96fa321SMatt Spinler         "mod":"mod1",
81b96fa321SMatt Spinler         "msg":"Error AAAAAA"
82b96fa321SMatt Spinler       },
83b96fa321SMatt Spinler       {
84b96fa321SMatt Spinler         "CEID":"BBBBBB",
85b96fa321SMatt Spinler         "mod":"mod2",
86b96fa321SMatt Spinler         "msg":"Error BBBBBB"
87b96fa321SMatt Spinler       },
88b96fa321SMatt Spinler       {
89b96fa321SMatt Spinler         "CEID":"CCCCCC",
90b96fa321SMatt Spinler         "mod":"mod3",
91b96fa321SMatt Spinler         "msg":"Error CCCCCC"
92b96fa321SMatt Spinler       }
93b96fa321SMatt Spinler     ],
94b96fa321SMatt Spinler     "err":"xyz.openbmc_project.Error.Test3"
95b96fa321SMatt Spinler     },
96b96fa321SMatt Spinler 
97b96fa321SMatt Spinler     {
98b96fa321SMatt Spinler     "dtls":[
99b96fa321SMatt Spinler       {
100b96fa321SMatt Spinler         "CEID":"DDDDDDDD",
101b96fa321SMatt Spinler         "mod":"I2C",
102b96fa321SMatt Spinler         "msg":"Error DDDDDDDD"
103b96fa321SMatt Spinler       },
104b96fa321SMatt Spinler       {
105b96fa321SMatt Spinler         "CEID":"EEEEEEEE",
106b96fa321SMatt Spinler         "mod":"FSI",
107b96fa321SMatt Spinler         "msg":"Error EEEEEEEE"
108b96fa321SMatt Spinler       }
109b96fa321SMatt Spinler     ],
110b96fa321SMatt Spinler     "err":"xyz.openbmc_project.Error.Test4"
111b96fa321SMatt Spinler     },
112b96fa321SMatt Spinler 
113b96fa321SMatt Spinler     {
114b96fa321SMatt Spinler     "dtls":[
115b96fa321SMatt Spinler       {
116b96fa321SMatt Spinler         "CEID":"FFFFFFFF",
117b96fa321SMatt Spinler         "mod":"6D",
118b96fa321SMatt Spinler         "msg":"Error FFFFFFFF"
119b96fa321SMatt Spinler       }
120b96fa321SMatt Spinler     ],
121b96fa321SMatt Spinler     "err":"xyz.openbmc_project.Error.Test5"
122b96fa321SMatt Spinler     },
123*c57aa4b9SMatt Spinler 
124b96fa321SMatt Spinler     {
125b96fa321SMatt Spinler     "dtls":[
126b96fa321SMatt Spinler       {
127b96fa321SMatt Spinler         "CEID":"GGGGGGGG",
128b96fa321SMatt Spinler         "mod":"RAIL_5",
129b96fa321SMatt Spinler         "msg":"Error GGGGGGGG"
130b96fa321SMatt Spinler       }
131b96fa321SMatt Spinler     ],
132b96fa321SMatt Spinler     "err":"xyz.openbmc_project.Error.Test6"
133b96fa321SMatt Spinler     },
134*c57aa4b9SMatt Spinler 
135b96fa321SMatt Spinler     {
136b96fa321SMatt Spinler     "dtls":[
137b96fa321SMatt Spinler       {
138b96fa321SMatt Spinler         "CEID":"HHHHHHHH",
139b96fa321SMatt Spinler         "mod":"INPUT_42",
140b96fa321SMatt Spinler         "msg":"Error HHHHHHHH"
141b96fa321SMatt Spinler       }
142b96fa321SMatt Spinler     ],
143b96fa321SMatt Spinler     "err":"xyz.openbmc_project.Error.Test7"
144*c57aa4b9SMatt Spinler     },
145*c57aa4b9SMatt Spinler 
146*c57aa4b9SMatt Spinler     {
147*c57aa4b9SMatt Spinler     "dtls":[
148*c57aa4b9SMatt Spinler       {
149*c57aa4b9SMatt Spinler         "CEID":"IIIIIII",
150*c57aa4b9SMatt Spinler         "mod":"/match/this/path",
151*c57aa4b9SMatt Spinler         "msg":"Error IIIIIII"
152*c57aa4b9SMatt Spinler       }
153*c57aa4b9SMatt Spinler     ],
154*c57aa4b9SMatt Spinler     "err":"xyz.openbmc_project.Error.Test8"
155*c57aa4b9SMatt Spinler     },
156*c57aa4b9SMatt Spinler 
157*c57aa4b9SMatt Spinler     {
158*c57aa4b9SMatt Spinler     "dtls":[
159*c57aa4b9SMatt Spinler       {
160*c57aa4b9SMatt Spinler         "CEID":"JJJJJJJJ",
161*c57aa4b9SMatt Spinler         "mod":"/inventory/core0||Warning",
162*c57aa4b9SMatt Spinler         "msg":"Error JJJJJJJJ"
163*c57aa4b9SMatt Spinler       },
164*c57aa4b9SMatt Spinler       {
165*c57aa4b9SMatt Spinler         "CEID":"KKKKKKKK",
166*c57aa4b9SMatt Spinler         "mod":"/inventory/core1||Informational",
167*c57aa4b9SMatt Spinler         "msg":"Error KKKKKKKK"
168*c57aa4b9SMatt Spinler       },
169*c57aa4b9SMatt Spinler       {
170*c57aa4b9SMatt Spinler         "CEID":"LLLLLLLL",
171*c57aa4b9SMatt Spinler         "mod":"/inventory/core2||Critical",
172*c57aa4b9SMatt Spinler         "msg":"Error LLLLLLLL"
173*c57aa4b9SMatt Spinler       },
174*c57aa4b9SMatt Spinler       {
175*c57aa4b9SMatt Spinler         "CEID":"MMMMMMMM",
176*c57aa4b9SMatt Spinler         "mod":"/inventory/core3||Critical",
177*c57aa4b9SMatt Spinler         "msg":"Error MMMMMMMM"
178*c57aa4b9SMatt Spinler       },
179*c57aa4b9SMatt Spinler       {
180*c57aa4b9SMatt Spinler         "CEID":"NNNNNNNN",
181*c57aa4b9SMatt Spinler         "mod":"/inventory/core4||Critical",
182*c57aa4b9SMatt Spinler         "msg":"Error NNNNNNNN"
183*c57aa4b9SMatt Spinler       },
184*c57aa4b9SMatt Spinler       {
185*c57aa4b9SMatt Spinler         "CEID":"OOOOOOOO",
186*c57aa4b9SMatt Spinler         "mod":"/inventory/core5",
187*c57aa4b9SMatt Spinler         "msg":"Error OOOOOOOO"
188*c57aa4b9SMatt Spinler       },
189*c57aa4b9SMatt Spinler       {
190*c57aa4b9SMatt Spinler         "CEID":"PPPPPPPP",
191*c57aa4b9SMatt Spinler         "mod":"/inventory/core5||Critical",
192*c57aa4b9SMatt Spinler         "msg":"Error PPPPPPPP"
193*c57aa4b9SMatt Spinler       }
194*c57aa4b9SMatt Spinler     ],
195*c57aa4b9SMatt Spinler     "err":"org.open_power.Host.Error.Event"
196b96fa321SMatt Spinler     }
197b96fa321SMatt Spinler ])";
198b96fa321SMatt Spinler 
199b96fa321SMatt Spinler /**
200b96fa321SMatt Spinler  * Helper class to write the above json to a file and then
201b96fa321SMatt Spinler  * remove it when the tests are over.
202b96fa321SMatt Spinler  */
203b96fa321SMatt Spinler class PolicyTableTest : public ::testing::Test
204b96fa321SMatt Spinler {
205b96fa321SMatt Spinler   protected:
SetUp()206b96fa321SMatt Spinler     virtual void SetUp()
207b96fa321SMatt Spinler     {
208b96fa321SMatt Spinler         char dir[] = {"./jsonTestXXXXXX"};
209b96fa321SMatt Spinler 
210b96fa321SMatt Spinler         jsonDir = mkdtemp(dir);
211b96fa321SMatt Spinler         jsonFile = jsonDir / "policy.json";
212b96fa321SMatt Spinler 
213b96fa321SMatt Spinler         std::ofstream f{jsonFile};
214b96fa321SMatt Spinler         f << json;
215b96fa321SMatt Spinler     }
216b96fa321SMatt Spinler 
TearDown()217b96fa321SMatt Spinler     virtual void TearDown()
218b96fa321SMatt Spinler     {
219b96fa321SMatt Spinler         fs::remove_all(jsonDir);
220b96fa321SMatt Spinler     }
221b96fa321SMatt Spinler 
222b96fa321SMatt Spinler     fs::path jsonDir;
223b96fa321SMatt Spinler     fs::path jsonFile;
224b96fa321SMatt Spinler };
225b96fa321SMatt Spinler 
226b96fa321SMatt Spinler /**
227b96fa321SMatt Spinler  * Test finding entries in the policy table
228b96fa321SMatt Spinler  */
TEST_F(PolicyTableTest,TestTable)229b96fa321SMatt Spinler TEST_F(PolicyTableTest, TestTable)
230b96fa321SMatt Spinler {
231b96fa321SMatt Spinler     policy::Table policy{jsonFile};
232b96fa321SMatt Spinler     ASSERT_EQ(policy.isLoaded(), true);
233b96fa321SMatt Spinler 
234b96fa321SMatt Spinler     ////////////////////////////////////
235b96fa321SMatt Spinler     // Basic search, no modifier
236b96fa321SMatt Spinler     std::string err{"xyz.openbmc_project.Error.Test2"};
237b96fa321SMatt Spinler     std::string mod;
238b96fa321SMatt Spinler 
239b96fa321SMatt Spinler     auto details = policy.find(err, mod);
240b96fa321SMatt Spinler     ASSERT_EQ(static_cast<bool>(details), true);
241b96fa321SMatt Spinler     if (details)
242b96fa321SMatt Spinler     {
243b96fa321SMatt Spinler         ASSERT_EQ((*details).get().ceid, "XYZ222");
244b96fa321SMatt Spinler         ASSERT_EQ((*details).get().msg, "Error XYZ222");
245b96fa321SMatt Spinler     }
246b96fa321SMatt Spinler 
247b96fa321SMatt Spinler     /////////////////////////////////////
248b96fa321SMatt Spinler     // Not found
249b96fa321SMatt Spinler     err = "foo";
250b96fa321SMatt Spinler     details = policy.find(err, mod);
251b96fa321SMatt Spinler     ASSERT_EQ(static_cast<bool>(details), false);
252b96fa321SMatt Spinler 
253b96fa321SMatt Spinler     /////////////////////////////////////
254b96fa321SMatt Spinler     // Test with a modifier
255b96fa321SMatt Spinler     err = "xyz.openbmc_project.Error.Test3";
256b96fa321SMatt Spinler     mod = "mod3";
257b96fa321SMatt Spinler 
258b96fa321SMatt Spinler     details = policy.find(err, mod);
259b96fa321SMatt Spinler     ASSERT_EQ(static_cast<bool>(details), true);
260b96fa321SMatt Spinler     if (details)
261b96fa321SMatt Spinler     {
262b96fa321SMatt Spinler         ASSERT_EQ((*details).get().ceid, "CCCCCC");
263b96fa321SMatt Spinler         ASSERT_EQ((*details).get().msg, "Error CCCCCC");
264b96fa321SMatt Spinler     }
265b96fa321SMatt Spinler }
26662011e26SMatt Spinler 
26762011e26SMatt Spinler /**
26862011e26SMatt Spinler  * Test policy::find() that uses the data from a property
26962011e26SMatt Spinler  * map to find entries in the policy table.
27062011e26SMatt Spinler  */
TEST_F(PolicyTableTest,TestFinder)27162011e26SMatt Spinler TEST_F(PolicyTableTest, TestFinder)
27262011e26SMatt Spinler {
27362011e26SMatt Spinler     using namespace std::literals::string_literals;
27462011e26SMatt Spinler 
27562011e26SMatt Spinler     policy::Table policy{jsonFile};
27662011e26SMatt Spinler     ASSERT_EQ(policy.isLoaded(), true);
27762011e26SMatt Spinler 
27862011e26SMatt Spinler     // A basic search with no modifier
27962011e26SMatt Spinler     {
280259e7277SMatt Spinler         DbusPropertyMap testProperties{
281259e7277SMatt Spinler             {"Message"s, Value{"xyz.openbmc_project.Error.Test1"s}}};
28262011e26SMatt Spinler 
28362011e26SMatt Spinler         auto values = policy::find(policy, testProperties);
28462011e26SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "ABCD1234");
28562011e26SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error ABCD1234");
28662011e26SMatt Spinler     }
28762011e26SMatt Spinler 
28862011e26SMatt Spinler     // Use CALLOUT_INVENTORY_PATH from the AdditionalData property
28962011e26SMatt Spinler     {
290259e7277SMatt Spinler         std::vector<std::string> ad{"FOO=BAR"s, "CALLOUT_INVENTORY_PATH=mod2"s};
291259e7277SMatt Spinler         DbusPropertyMap testProperties{
29262011e26SMatt Spinler             {"Message"s, Value{"xyz.openbmc_project.Error.Test3"s}},
293259e7277SMatt Spinler             {"AdditionalData"s, ad}};
29462011e26SMatt Spinler 
29562011e26SMatt Spinler         auto values = policy::find(policy, testProperties);
29662011e26SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "BBBBBB");
29762011e26SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error BBBBBB");
29862011e26SMatt Spinler     }
29962011e26SMatt Spinler 
30062011e26SMatt Spinler     // Use an I2C DEVICE_PATH from the AdditionalData property
30162011e26SMatt Spinler     {
302259e7277SMatt Spinler         std::vector<std::string> ad{"FOO=BAR"s,
30362011e26SMatt Spinler                                     "CALLOUT_DEVICE_PATH=/some/i2c/path"s};
304259e7277SMatt Spinler         DbusPropertyMap testProperties{
30562011e26SMatt Spinler             {"Message"s, Value{"xyz.openbmc_project.Error.Test4"s}},
306259e7277SMatt Spinler             {"AdditionalData"s, ad}};
30762011e26SMatt Spinler 
30862011e26SMatt Spinler         auto values = policy::find(policy, testProperties);
30962011e26SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "DDDDDDDD");
31062011e26SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error DDDDDDDD");
31162011e26SMatt Spinler     }
31262011e26SMatt Spinler 
31362011e26SMatt Spinler     // Use an FSI DEVICE_PATH from the AdditionalData property
31462011e26SMatt Spinler     {
315259e7277SMatt Spinler         std::vector<std::string> ad{"FOO=BAR"s,
31662011e26SMatt Spinler                                     "CALLOUT_DEVICE_PATH=/some/fsi/path"s};
317259e7277SMatt Spinler         DbusPropertyMap testProperties{
31862011e26SMatt Spinler             {"Message"s, Value{"xyz.openbmc_project.Error.Test4"s}},
319259e7277SMatt Spinler             {"AdditionalData"s, ad}};
32062011e26SMatt Spinler 
32162011e26SMatt Spinler         auto values = policy::find(policy, testProperties);
32262011e26SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "EEEEEEEE");
32362011e26SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error EEEEEEEE");
32462011e26SMatt Spinler     }
32562011e26SMatt Spinler 
32662011e26SMatt Spinler     // Use PROCEDURE from the AdditionalData property
32762011e26SMatt Spinler     {
328259e7277SMatt Spinler         std::vector<std::string> ad{"FOO=BAR"s, "PROCEDURE=109"s};
329259e7277SMatt Spinler         DbusPropertyMap testProperties{
33062011e26SMatt Spinler             {"Message"s, Value{"xyz.openbmc_project.Error.Test5"s}},
331259e7277SMatt Spinler             {"AdditionalData"s, ad}};
33262011e26SMatt Spinler 
33362011e26SMatt Spinler         auto values = policy::find(policy, testProperties);
33462011e26SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "FFFFFFFF");
33562011e26SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error FFFFFFFF");
33662011e26SMatt Spinler     }
33762011e26SMatt Spinler 
33862011e26SMatt Spinler     // Use RAIL_NAME from the AdditionalData property
33962011e26SMatt Spinler     {
340259e7277SMatt Spinler         std::vector<std::string> ad{"FOO=BAR"s, "RAIL_NAME=RAIL_5"s};
341259e7277SMatt Spinler         DbusPropertyMap testProperties{
34262011e26SMatt Spinler             {"Message"s, Value{"xyz.openbmc_project.Error.Test6"s}},
343259e7277SMatt Spinler             {"AdditionalData"s, ad}};
34462011e26SMatt Spinler 
34562011e26SMatt Spinler         auto values = policy::find(policy, testProperties);
34662011e26SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "GGGGGGGG");
34762011e26SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error GGGGGGGG");
34862011e26SMatt Spinler     }
34962011e26SMatt Spinler 
35062011e26SMatt Spinler     // Use INPUT_NAME from the AdditionalData property
35162011e26SMatt Spinler     {
352259e7277SMatt Spinler         std::vector<std::string> ad{"FOO=BAR"s, "INPUT_NAME=INPUT_42"s};
353259e7277SMatt Spinler         DbusPropertyMap testProperties{
35462011e26SMatt Spinler             {"Message"s, Value{"xyz.openbmc_project.Error.Test7"s}},
355259e7277SMatt Spinler             {"AdditionalData"s, ad}};
35662011e26SMatt Spinler 
35762011e26SMatt Spinler         auto values = policy::find(policy, testProperties);
35862011e26SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "HHHHHHHH");
35962011e26SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error HHHHHHHH");
36062011e26SMatt Spinler     }
36162011e26SMatt Spinler 
36262011e26SMatt Spinler     // Test not finding an entry.
36362011e26SMatt Spinler     {
364259e7277SMatt Spinler         DbusPropertyMap testProperties{{"Message"s, Value{"hello world"s}}};
36562011e26SMatt Spinler 
36662011e26SMatt Spinler         auto values = policy::find(policy, testProperties);
36762011e26SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), policy.defaultEID());
36862011e26SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), policy.defaultMsg());
36962011e26SMatt Spinler     }
37062011e26SMatt Spinler 
37162011e26SMatt Spinler     // Test that strange AdditionalData values don't break anything
37262011e26SMatt Spinler     {
373259e7277SMatt Spinler         std::vector<std::string> ad{"FOO"s, "INPUT_NAME="s};
374259e7277SMatt Spinler         DbusPropertyMap testProperties{
37562011e26SMatt Spinler             {"Message"s, Value{"xyz.openbmc_project.Error.Test7"s}},
376259e7277SMatt Spinler             {"AdditionalData"s, ad}};
37762011e26SMatt Spinler 
37862011e26SMatt Spinler         auto values = policy::find(policy, testProperties);
37962011e26SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), policy.defaultEID());
38062011e26SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), policy.defaultMsg());
38162011e26SMatt Spinler     }
382*c57aa4b9SMatt Spinler 
383*c57aa4b9SMatt Spinler     // Test a device path modifier match
384*c57aa4b9SMatt Spinler     {
385*c57aa4b9SMatt Spinler         std::vector<std::string> ad{"CALLOUT_DEVICE_PATH=/match/this/path"s};
386*c57aa4b9SMatt Spinler         DbusPropertyMap testProperties{
387*c57aa4b9SMatt Spinler             {"Message"s, Value{"xyz.openbmc_project.Error.Test8"s}},
388*c57aa4b9SMatt Spinler             {"AdditionalData"s, ad}};
389*c57aa4b9SMatt Spinler 
390*c57aa4b9SMatt Spinler         auto values = policy::find(policy, testProperties);
391*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "IIIIIII");
392*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error IIIIIII");
393*c57aa4b9SMatt Spinler     }
394*c57aa4b9SMatt Spinler 
395*c57aa4b9SMatt Spinler     // Test a predictive SEL matches on 'callout||Warning'
396*c57aa4b9SMatt Spinler     {
397*c57aa4b9SMatt Spinler         std::vector<std::string> ad{eSELBase + SEV_PREDICTIVE,
398*c57aa4b9SMatt Spinler                                     "CALLOUT_INVENTORY_PATH=/inventory/core0"s};
399*c57aa4b9SMatt Spinler         DbusPropertyMap testProperties{
400*c57aa4b9SMatt Spinler             {"Message"s, Value{"org.open_power.Host.Error.Event"s}},
401*c57aa4b9SMatt Spinler             {"AdditionalData"s, ad}};
402*c57aa4b9SMatt Spinler 
403*c57aa4b9SMatt Spinler         auto values = policy::find(policy, testProperties);
404*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "JJJJJJJJ");
405*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error JJJJJJJJ");
406*c57aa4b9SMatt Spinler     }
407*c57aa4b9SMatt Spinler 
408*c57aa4b9SMatt Spinler     // Test a recovered SEL matches on 'callout||Informational'
409*c57aa4b9SMatt Spinler     {
410*c57aa4b9SMatt Spinler         std::vector<std::string> ad{eSELBase + SEV_RECOVERED,
411*c57aa4b9SMatt Spinler                                     "CALLOUT_INVENTORY_PATH=/inventory/core1"s};
412*c57aa4b9SMatt Spinler         DbusPropertyMap testProperties{
413*c57aa4b9SMatt Spinler             {"Message"s, Value{"org.open_power.Host.Error.Event"s}},
414*c57aa4b9SMatt Spinler             {"AdditionalData"s, ad}};
415*c57aa4b9SMatt Spinler 
416*c57aa4b9SMatt Spinler         auto values = policy::find(policy, testProperties);
417*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "KKKKKKKK");
418*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error KKKKKKKK");
419*c57aa4b9SMatt Spinler     }
420*c57aa4b9SMatt Spinler 
421*c57aa4b9SMatt Spinler     // Test a critical severity matches on 'callout||Critical'
422*c57aa4b9SMatt Spinler     {
423*c57aa4b9SMatt Spinler         std::vector<std::string> ad{eSELBase + SEV_CRITICAL,
424*c57aa4b9SMatt Spinler                                     "CALLOUT_INVENTORY_PATH=/inventory/core2"s};
425*c57aa4b9SMatt Spinler         DbusPropertyMap testProperties{
426*c57aa4b9SMatt Spinler             {"Message"s, Value{"org.open_power.Host.Error.Event"s}},
427*c57aa4b9SMatt Spinler             {"AdditionalData"s, ad}};
428*c57aa4b9SMatt Spinler 
429*c57aa4b9SMatt Spinler         auto values = policy::find(policy, testProperties);
430*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "LLLLLLLL");
431*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error LLLLLLLL");
432*c57aa4b9SMatt Spinler     }
433*c57aa4b9SMatt Spinler 
434*c57aa4b9SMatt Spinler     // Test an unrecoverable SEL matches on 'callout||Critical'
435*c57aa4b9SMatt Spinler     {
436*c57aa4b9SMatt Spinler         std::vector<std::string> ad{eSELBase + SEV_UNRECOV,
437*c57aa4b9SMatt Spinler                                     "CALLOUT_INVENTORY_PATH=/inventory/core3"s};
438*c57aa4b9SMatt Spinler         DbusPropertyMap testProperties{
439*c57aa4b9SMatt Spinler             {"Message"s, Value{"org.open_power.Host.Error.Event"s}},
440*c57aa4b9SMatt Spinler             {"AdditionalData"s, ad}};
441*c57aa4b9SMatt Spinler 
442*c57aa4b9SMatt Spinler         auto values = policy::find(policy, testProperties);
443*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "MMMMMMMM");
444*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error MMMMMMMM");
445*c57aa4b9SMatt Spinler     }
446*c57aa4b9SMatt Spinler 
447*c57aa4b9SMatt Spinler     // Test a Diagnostic SEL matches on 'callout||Critical'
448*c57aa4b9SMatt Spinler     {
449*c57aa4b9SMatt Spinler         std::vector<std::string> ad{eSELBase + SEV_DIAG,
450*c57aa4b9SMatt Spinler                                     "CALLOUT_INVENTORY_PATH=/inventory/core4"s};
451*c57aa4b9SMatt Spinler         DbusPropertyMap testProperties{
452*c57aa4b9SMatt Spinler             {"Message"s, Value{"org.open_power.Host.Error.Event"s}},
453*c57aa4b9SMatt Spinler             {"AdditionalData"s, ad}};
454*c57aa4b9SMatt Spinler 
455*c57aa4b9SMatt Spinler         auto values = policy::find(policy, testProperties);
456*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "NNNNNNNN");
457*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error NNNNNNNN");
458*c57aa4b9SMatt Spinler     }
459*c57aa4b9SMatt Spinler 
460*c57aa4b9SMatt Spinler     // Test a short eSEL still matches the normal callout
461*c57aa4b9SMatt Spinler     {
462*c57aa4b9SMatt Spinler         std::vector<std::string> ad{eSELBase,
463*c57aa4b9SMatt Spinler                                     "CALLOUT_INVENTORY_PATH=/inventory/core5"s};
464*c57aa4b9SMatt Spinler         DbusPropertyMap testProperties{
465*c57aa4b9SMatt Spinler             {"Message"s, Value{"org.open_power.Host.Error.Event"s}},
466*c57aa4b9SMatt Spinler             {"AdditionalData"s, ad}};
467*c57aa4b9SMatt Spinler 
468*c57aa4b9SMatt Spinler         auto values = policy::find(policy, testProperties);
469*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "OOOOOOOO");
470*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error OOOOOOOO");
471*c57aa4b9SMatt Spinler     }
472*c57aa4b9SMatt Spinler 
473*c57aa4b9SMatt Spinler     // Test an eSEL with no UH section still matches a normal callout
474*c57aa4b9SMatt Spinler     {
475*c57aa4b9SMatt Spinler         std::vector<std::string> ad{noUHeSEL,
476*c57aa4b9SMatt Spinler                                     "CALLOUT_INVENTORY_PATH=/inventory/core5"s};
477*c57aa4b9SMatt Spinler         DbusPropertyMap testProperties{
478*c57aa4b9SMatt Spinler             {"Message"s, Value{"org.open_power.Host.Error.Event"s}},
479*c57aa4b9SMatt Spinler             {"AdditionalData"s, ad}};
480*c57aa4b9SMatt Spinler 
481*c57aa4b9SMatt Spinler         auto values = policy::find(policy, testProperties);
482*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "OOOOOOOO");
483*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error OOOOOOOO");
484*c57aa4b9SMatt Spinler     }
485*c57aa4b9SMatt Spinler 
486*c57aa4b9SMatt Spinler     // Test a bad severity is still considered critical (by design)
487*c57aa4b9SMatt Spinler     {
488*c57aa4b9SMatt Spinler         std::vector<std::string> ad{eSELBase + "ZZ",
489*c57aa4b9SMatt Spinler                                     "CALLOUT_INVENTORY_PATH=/inventory/core5"s};
490*c57aa4b9SMatt Spinler         DbusPropertyMap testProperties{
491*c57aa4b9SMatt Spinler             {"Message"s, Value{"org.open_power.Host.Error.Event"s}},
492*c57aa4b9SMatt Spinler             {"AdditionalData"s, ad}};
493*c57aa4b9SMatt Spinler 
494*c57aa4b9SMatt Spinler         auto values = policy::find(policy, testProperties);
495*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::EIDField>(values), "PPPPPPPP");
496*c57aa4b9SMatt Spinler         ASSERT_EQ(std::get<policy::MsgField>(values), "Error PPPPPPPP");
497*c57aa4b9SMatt Spinler     }
49862011e26SMatt Spinler }
499