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