xref: /openbmc/phosphor-logging/test/openpower-pels/registry_test.cpp (revision e594063471e730f374abc53235e43a2ef3a1b407)
197f7abcfSMatt Spinler /**
297f7abcfSMatt Spinler  * Copyright © 2019 IBM Corporation
397f7abcfSMatt Spinler  *
497f7abcfSMatt Spinler  * Licensed under the Apache License, Version 2.0 (the "License");
597f7abcfSMatt Spinler  * you may not use this file except in compliance with the License.
697f7abcfSMatt Spinler  * You may obtain a copy of the License at
797f7abcfSMatt Spinler  *
897f7abcfSMatt Spinler  *     http://www.apache.org/licenses/LICENSE-2.0
997f7abcfSMatt Spinler  *
1097f7abcfSMatt Spinler  * Unless required by applicable law or agreed to in writing, software
1197f7abcfSMatt Spinler  * distributed under the License is distributed on an "AS IS" BASIS,
1297f7abcfSMatt Spinler  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1397f7abcfSMatt Spinler  * See the License for the specific language governing permissions and
1497f7abcfSMatt Spinler  * limitations under the License.
1597f7abcfSMatt Spinler  */
16367144cfSMatt Spinler #include "extensions/openpower-pels/registry.hpp"
17367144cfSMatt Spinler 
182544b419SPatrick Williams #include <nlohmann/json.hpp>
192544b419SPatrick Williams 
20367144cfSMatt Spinler #include <filesystem>
21367144cfSMatt Spinler #include <fstream>
22367144cfSMatt Spinler 
23367144cfSMatt Spinler #include <gtest/gtest.h>
24367144cfSMatt Spinler 
25367144cfSMatt Spinler using namespace openpower::pels::message;
266b427cc8SMatt Spinler using namespace openpower::pels;
27367144cfSMatt Spinler namespace fs = std::filesystem;
28367144cfSMatt Spinler 
29367144cfSMatt Spinler const auto registryData = R"(
30367144cfSMatt Spinler {
31367144cfSMatt Spinler     "PELs":
32367144cfSMatt Spinler     [
33367144cfSMatt Spinler         {
34367144cfSMatt Spinler             "Name": "xyz.openbmc_project.Power.Fault",
35367144cfSMatt Spinler             "Subsystem": "power_supply",
36367144cfSMatt Spinler 
37367144cfSMatt Spinler             "SRC":
38367144cfSMatt Spinler             {
39367144cfSMatt Spinler                 "ReasonCode": "0x2030"
400f717e10SHarisuddin Mohamed Isa             },
410f717e10SHarisuddin Mohamed Isa 
420f717e10SHarisuddin Mohamed Isa             "Documentation":
430f717e10SHarisuddin Mohamed Isa             {
440f717e10SHarisuddin Mohamed Isa                 "Description": "A PGOOD Fault",
450f717e10SHarisuddin Mohamed Isa                 "Message": "PS had a PGOOD Fault"
46367144cfSMatt Spinler             }
47367144cfSMatt Spinler         },
48367144cfSMatt Spinler 
49367144cfSMatt Spinler         {
50367144cfSMatt Spinler             "Name": "xyz.openbmc_project.Power.OverVoltage",
51367144cfSMatt Spinler             "Subsystem": "power_control_hw",
52aadccc85SMatt Spinler             "Severity":
53aadccc85SMatt Spinler             [
54aadccc85SMatt Spinler                 {
55aadccc85SMatt Spinler                     "System": "systemA",
56aadccc85SMatt Spinler                     "SevValue": "unrecoverable"
57aadccc85SMatt Spinler                 },
58aadccc85SMatt Spinler                 {
59aadccc85SMatt Spinler                     "System": "systemB",
60aadccc85SMatt Spinler                     "SevValue": "recovered"
61aadccc85SMatt Spinler                 },
62aadccc85SMatt Spinler                 {
63aadccc85SMatt Spinler                     "SevValue": "predictive"
64aadccc85SMatt Spinler                 }
65aadccc85SMatt Spinler             ],
66367144cfSMatt Spinler             "MfgSeverity": "non_error",
67367144cfSMatt Spinler             "ActionFlags": ["service_action", "report", "call_home"],
68367144cfSMatt Spinler             "MfgActionFlags": ["hidden"],
69367144cfSMatt Spinler 
70367144cfSMatt Spinler             "SRC":
71367144cfSMatt Spinler             {
72367144cfSMatt Spinler                 "ReasonCode": "0x2333",
73367144cfSMatt Spinler                 "Type": "BD",
74367144cfSMatt Spinler                 "SymptomIDFields": ["SRCWord5", "SRCWord6", "SRCWord7"],
75367144cfSMatt Spinler                 "Words6To9":
76367144cfSMatt Spinler                 {
77367144cfSMatt Spinler                     "6":
78367144cfSMatt Spinler                     {
791a1b0dfbSHarisuddin Mohamed Isa                         "Description": "Failing unit number",
80367144cfSMatt Spinler                         "AdditionalDataPropSource": "PS_NUM"
81367144cfSMatt Spinler                     },
82367144cfSMatt Spinler 
83367144cfSMatt Spinler                     "7":
84367144cfSMatt Spinler                     {
851a1b0dfbSHarisuddin Mohamed Isa                         "Description": "bad voltage",
86367144cfSMatt Spinler                         "AdditionalDataPropSource": "VOLTAGE"
87367144cfSMatt Spinler                     }
883fe93e96SMatt Spinler                 },
89da5b76b2SMatt Spinler                 "DeconfigFlag": true,
90da5b76b2SMatt Spinler                 "CheckstopFlag": true
910f717e10SHarisuddin Mohamed Isa             },
920f717e10SHarisuddin Mohamed Isa 
930f717e10SHarisuddin Mohamed Isa             "Documentation":
940f717e10SHarisuddin Mohamed Isa             {
950f717e10SHarisuddin Mohamed Isa                 "Description": "A PGOOD Fault",
960f717e10SHarisuddin Mohamed Isa                 "Message": "PS %1 had a PGOOD Fault",
970f717e10SHarisuddin Mohamed Isa                 "MessageArgSources":
980f717e10SHarisuddin Mohamed Isa                 [
990f717e10SHarisuddin Mohamed Isa                     "SRCWord6"
1000f717e10SHarisuddin Mohamed Isa                 ],
1010f717e10SHarisuddin Mohamed Isa                 "Notes": [
1020f717e10SHarisuddin Mohamed Isa                     "In the UserData section there is a JSON",
1030f717e10SHarisuddin Mohamed Isa                     "dump that provides debug information."
1040f717e10SHarisuddin Mohamed Isa                 ]
105711f1129SMatt Spinler             },
106711f1129SMatt Spinler 
107711f1129SMatt Spinler             "JournalCapture":
108711f1129SMatt Spinler             {
109711f1129SMatt Spinler                 "NumLines": 7
110367144cfSMatt Spinler             }
11123970b0dSMatt Spinler         },
11223970b0dSMatt Spinler 
11323970b0dSMatt Spinler         {
11423970b0dSMatt Spinler             "Name": "xyz.openbmc_project.Common.Error.Timeout",
11523970b0dSMatt Spinler             "PossibleSubsystems": ["processor", "memory"],
11623970b0dSMatt Spinler 
11723970b0dSMatt Spinler             "SRC":
11823970b0dSMatt Spinler             {
11923970b0dSMatt Spinler                 "ReasonCode": "0x2030"
12023970b0dSMatt Spinler             },
12123970b0dSMatt Spinler             "Documentation":
12223970b0dSMatt Spinler             {
12323970b0dSMatt Spinler                 "Description": "A PGOOD Fault",
12423970b0dSMatt Spinler                 "Message": "PS had a PGOOD Fault"
12523970b0dSMatt Spinler             }
126711f1129SMatt Spinler         },
127711f1129SMatt Spinler 
128711f1129SMatt Spinler         {
129711f1129SMatt Spinler             "Name": "xyz.openbmc_project.Journal.Capture",
130711f1129SMatt Spinler             "Subsystem": "power_supply",
131711f1129SMatt Spinler 
132711f1129SMatt Spinler             "SRC":
133711f1129SMatt Spinler             {
134711f1129SMatt Spinler                 "ReasonCode": "0x2030"
135711f1129SMatt Spinler             },
136711f1129SMatt Spinler 
137711f1129SMatt Spinler             "Documentation":
138711f1129SMatt Spinler             {
139711f1129SMatt Spinler                 "Description": "journal capture test",
140711f1129SMatt Spinler                 "Message": "journal capture test"
141711f1129SMatt Spinler             },
142711f1129SMatt Spinler 
143711f1129SMatt Spinler             "JournalCapture":
144711f1129SMatt Spinler             {
145711f1129SMatt Spinler                 "Sections": [
146711f1129SMatt Spinler                     {
147711f1129SMatt Spinler                         "NumLines": 5,
148711f1129SMatt Spinler                         "SyslogID": "test1"
149711f1129SMatt Spinler                     },
150711f1129SMatt Spinler                     {
151711f1129SMatt Spinler                         "NumLines": 6,
152711f1129SMatt Spinler                         "SyslogID": "test2"
153711f1129SMatt Spinler                     }
154711f1129SMatt Spinler                 ]
155711f1129SMatt Spinler             }
1569972716fSharsh-agarwal1         },
1579972716fSharsh-agarwal1 
1589972716fSharsh-agarwal1         {
1599972716fSharsh-agarwal1             "Name": "org.open_power.PHAL.Info.ClockDailyLog",
1609972716fSharsh-agarwal1             "Subsystem": "cec_clocks",
1619972716fSharsh-agarwal1             "ComponentID": "0x3000",
1629972716fSharsh-agarwal1             "Severity": "non_error",
1639972716fSharsh-agarwal1             "ActionFlags": ["report", "call_home", "heartbeat_call_home"],
1649972716fSharsh-agarwal1 
1659972716fSharsh-agarwal1             "SRC":
1669972716fSharsh-agarwal1             {
1679972716fSharsh-agarwal1                 "ReasonCode": "0x300A",
1689972716fSharsh-agarwal1                 "Words6To9": {}
1699972716fSharsh-agarwal1             },
1709972716fSharsh-agarwal1 
1719972716fSharsh-agarwal1             "Documentation":
1729972716fSharsh-agarwal1             {
1739972716fSharsh-agarwal1                 "Description": "Informational error to house clock debug info",
1749972716fSharsh-agarwal1                 "Message": "Informational error to house clock debug info",
1759972716fSharsh-agarwal1                 "Notes": [
1769972716fSharsh-agarwal1                     "User data includes processor and clock register state information."
1779972716fSharsh-agarwal1                 ]
1789972716fSharsh-agarwal1             }
179367144cfSMatt Spinler         }
180367144cfSMatt Spinler     ]
181367144cfSMatt Spinler }
182367144cfSMatt Spinler )";
183367144cfSMatt Spinler 
184367144cfSMatt Spinler class RegistryTest : public ::testing::Test
185367144cfSMatt Spinler {
186367144cfSMatt Spinler   protected:
SetUpTestCase()187367144cfSMatt Spinler     static void SetUpTestCase()
188367144cfSMatt Spinler     {
189367144cfSMatt Spinler         char path[] = "/tmp/regtestXXXXXX";
190367144cfSMatt Spinler         regDir = mkdtemp(path);
191367144cfSMatt Spinler     }
192367144cfSMatt Spinler 
TearDownTestCase()193367144cfSMatt Spinler     static void TearDownTestCase()
194367144cfSMatt Spinler     {
195367144cfSMatt Spinler         fs::remove_all(regDir);
196367144cfSMatt Spinler     }
197367144cfSMatt Spinler 
writeData(const char * data)198367144cfSMatt Spinler     static std::string writeData(const char* data)
199367144cfSMatt Spinler     {
200367144cfSMatt Spinler         fs::path path = regDir / "registry.json";
201367144cfSMatt Spinler         std::ofstream stream{path};
202367144cfSMatt Spinler         stream << data;
203367144cfSMatt Spinler         return path;
204367144cfSMatt Spinler     }
205367144cfSMatt Spinler 
206367144cfSMatt Spinler     static fs::path regDir;
207367144cfSMatt Spinler };
208367144cfSMatt Spinler 
209367144cfSMatt Spinler fs::path RegistryTest::regDir{};
210367144cfSMatt Spinler 
TEST_F(RegistryTest,TestNoEntry)211367144cfSMatt Spinler TEST_F(RegistryTest, TestNoEntry)
212367144cfSMatt Spinler {
213367144cfSMatt Spinler     auto path = RegistryTest::writeData(registryData);
214367144cfSMatt Spinler     Registry registry{path};
215367144cfSMatt Spinler 
2160f717e10SHarisuddin Mohamed Isa     auto entry = registry.lookup("foo", LookupType::name);
217367144cfSMatt Spinler     EXPECT_FALSE(entry);
218367144cfSMatt Spinler }
219367144cfSMatt Spinler 
TEST_F(RegistryTest,TestFindEntry)220367144cfSMatt Spinler TEST_F(RegistryTest, TestFindEntry)
221367144cfSMatt Spinler {
222367144cfSMatt Spinler     auto path = RegistryTest::writeData(registryData);
223367144cfSMatt Spinler     Registry registry{path};
224367144cfSMatt Spinler 
2250f717e10SHarisuddin Mohamed Isa     auto entry = registry.lookup("xyz.openbmc_project.Power.OverVoltage",
2260f717e10SHarisuddin Mohamed Isa                                  LookupType::name);
227367144cfSMatt Spinler     ASSERT_TRUE(entry);
228367144cfSMatt Spinler     EXPECT_EQ(entry->name, "xyz.openbmc_project.Power.OverVoltage");
229367144cfSMatt Spinler     EXPECT_EQ(entry->subsystem, 0x62);
230aadccc85SMatt Spinler 
231aadccc85SMatt Spinler     ASSERT_EQ(entry->severity->size(), 3);
232aadccc85SMatt Spinler     EXPECT_EQ((*entry->severity)[0].severity, 0x40);
233aadccc85SMatt Spinler     EXPECT_EQ((*entry->severity)[0].system, "systemA");
234aadccc85SMatt Spinler     EXPECT_EQ((*entry->severity)[1].severity, 0x10);
235aadccc85SMatt Spinler     EXPECT_EQ((*entry->severity)[1].system, "systemB");
236aadccc85SMatt Spinler     EXPECT_EQ((*entry->severity)[2].severity, 0x20);
237aadccc85SMatt Spinler     EXPECT_EQ((*entry->severity)[2].system, "");
238aadccc85SMatt Spinler 
239aadccc85SMatt Spinler     EXPECT_EQ(entry->mfgSeverity->size(), 1);
240aadccc85SMatt Spinler     EXPECT_EQ((*entry->mfgSeverity)[0].severity, 0x00);
241aadccc85SMatt Spinler 
242e07f915bSMatt Spinler     EXPECT_EQ(*(entry->actionFlags), 0xA800);
243367144cfSMatt Spinler     EXPECT_EQ(*(entry->mfgActionFlags), 0x4000);
24493e2932fSMatt Spinler     EXPECT_EQ(entry->componentID, 0x2300);
245367144cfSMatt Spinler     EXPECT_FALSE(entry->eventType);
246367144cfSMatt Spinler     EXPECT_FALSE(entry->eventScope);
247367144cfSMatt Spinler 
24893e2932fSMatt Spinler     EXPECT_EQ(entry->src.type, 0xBD);
24993e2932fSMatt Spinler     EXPECT_EQ(entry->src.reasonCode, 0x2333);
2503fe93e96SMatt Spinler     EXPECT_TRUE(entry->src.deconfigFlag);
251da5b76b2SMatt Spinler     EXPECT_TRUE(entry->src.checkstopFlag);
25293e2932fSMatt Spinler 
25393e2932fSMatt Spinler     auto& hexwords = entry->src.hexwordADFields;
25493e2932fSMatt Spinler     EXPECT_TRUE(hexwords);
25593e2932fSMatt Spinler     EXPECT_EQ((*hexwords).size(), 2);
25693e2932fSMatt Spinler 
25793e2932fSMatt Spinler     auto word = (*hexwords).find(6);
25893e2932fSMatt Spinler     EXPECT_NE(word, (*hexwords).end());
2591a1b0dfbSHarisuddin Mohamed Isa     EXPECT_EQ(std::get<0>(word->second), "PS_NUM");
26093e2932fSMatt Spinler 
26193e2932fSMatt Spinler     word = (*hexwords).find(7);
26293e2932fSMatt Spinler     EXPECT_NE(word, (*hexwords).end());
2631a1b0dfbSHarisuddin Mohamed Isa     EXPECT_EQ(std::get<0>(word->second), "VOLTAGE");
26493e2932fSMatt Spinler 
26593e2932fSMatt Spinler     auto& sid = entry->src.symptomID;
26693e2932fSMatt Spinler     EXPECT_TRUE(sid);
26793e2932fSMatt Spinler     EXPECT_EQ((*sid).size(), 3);
26893e2932fSMatt Spinler     EXPECT_NE(std::find((*sid).begin(), (*sid).end(), 5), (*sid).end());
26993e2932fSMatt Spinler     EXPECT_NE(std::find((*sid).begin(), (*sid).end(), 6), (*sid).end());
27093e2932fSMatt Spinler     EXPECT_NE(std::find((*sid).begin(), (*sid).end(), 7), (*sid).end());
2710f717e10SHarisuddin Mohamed Isa 
2720f717e10SHarisuddin Mohamed Isa     EXPECT_EQ(entry->doc.description, "A PGOOD Fault");
2730f717e10SHarisuddin Mohamed Isa     EXPECT_EQ(entry->doc.message, "PS %1 had a PGOOD Fault");
2740f717e10SHarisuddin Mohamed Isa     auto& hexwordSource = entry->doc.messageArgSources;
2750f717e10SHarisuddin Mohamed Isa     EXPECT_TRUE(hexwordSource);
2760f717e10SHarisuddin Mohamed Isa     EXPECT_EQ((*hexwordSource).size(), 1);
2770f717e10SHarisuddin Mohamed Isa     EXPECT_EQ((*hexwordSource).front(), "SRCWord6");
2780f717e10SHarisuddin Mohamed Isa 
279711f1129SMatt Spinler     const auto& jc = entry->journalCapture;
280711f1129SMatt Spinler     ASSERT_TRUE(jc);
281711f1129SMatt Spinler     ASSERT_TRUE(std::holds_alternative<size_t>(*jc));
282711f1129SMatt Spinler     EXPECT_EQ(std::get<size_t>(*jc), 7);
283711f1129SMatt Spinler 
2840f717e10SHarisuddin Mohamed Isa     entry = registry.lookup("0x2333", LookupType::reasonCode);
2850f717e10SHarisuddin Mohamed Isa     ASSERT_TRUE(entry);
2860f717e10SHarisuddin Mohamed Isa     EXPECT_EQ(entry->name, "xyz.openbmc_project.Power.OverVoltage");
2879972716fSharsh-agarwal1 
2889972716fSharsh-agarwal1     entry = registry.lookup("org.open_power.PHAL.Info.ClockDailyLog",
2899972716fSharsh-agarwal1                             LookupType::name);
2909972716fSharsh-agarwal1     ASSERT_TRUE(entry);
2919972716fSharsh-agarwal1     EXPECT_EQ(entry->name, "org.open_power.PHAL.Info.ClockDailyLog");
2929972716fSharsh-agarwal1     EXPECT_EQ(*(entry->actionFlags), 0x2820);
293367144cfSMatt Spinler }
294367144cfSMatt Spinler 
295367144cfSMatt Spinler // Check the entry that mostly uses defaults
TEST_F(RegistryTest,TestFindEntryMinimal)296367144cfSMatt Spinler TEST_F(RegistryTest, TestFindEntryMinimal)
297367144cfSMatt Spinler {
298367144cfSMatt Spinler     auto path = RegistryTest::writeData(registryData);
299367144cfSMatt Spinler     Registry registry{path};
300367144cfSMatt Spinler 
301075c7923SPatrick Williams     auto entry =
302075c7923SPatrick Williams         registry.lookup("xyz.openbmc_project.Power.Fault", LookupType::name);
303367144cfSMatt Spinler     ASSERT_TRUE(entry);
304367144cfSMatt Spinler     EXPECT_EQ(entry->name, "xyz.openbmc_project.Power.Fault");
305367144cfSMatt Spinler     EXPECT_EQ(entry->subsystem, 0x61);
306367144cfSMatt Spinler     EXPECT_FALSE(entry->severity);
307367144cfSMatt Spinler     EXPECT_FALSE(entry->mfgSeverity);
308367144cfSMatt Spinler     EXPECT_FALSE(entry->mfgActionFlags);
309e07f915bSMatt Spinler     EXPECT_FALSE(entry->actionFlags);
31093e2932fSMatt Spinler     EXPECT_EQ(entry->componentID, 0x2000);
311367144cfSMatt Spinler     EXPECT_FALSE(entry->eventType);
312367144cfSMatt Spinler     EXPECT_FALSE(entry->eventScope);
31393e2932fSMatt Spinler 
31493e2932fSMatt Spinler     EXPECT_EQ(entry->src.reasonCode, 0x2030);
31593e2932fSMatt Spinler     EXPECT_EQ(entry->src.type, 0xBD);
31693e2932fSMatt Spinler     EXPECT_FALSE(entry->src.hexwordADFields);
31793e2932fSMatt Spinler     EXPECT_FALSE(entry->src.symptomID);
3183fe93e96SMatt Spinler     EXPECT_FALSE(entry->src.deconfigFlag);
319da5b76b2SMatt Spinler     EXPECT_FALSE(entry->src.checkstopFlag);
320367144cfSMatt Spinler }
321367144cfSMatt Spinler 
TEST_F(RegistryTest,TestBadJSON)322367144cfSMatt Spinler TEST_F(RegistryTest, TestBadJSON)
323367144cfSMatt Spinler {
324367144cfSMatt Spinler     auto path = RegistryTest::writeData("bad {} json");
325367144cfSMatt Spinler 
326367144cfSMatt Spinler     Registry registry{path};
327367144cfSMatt Spinler 
3280f717e10SHarisuddin Mohamed Isa     EXPECT_FALSE(registry.lookup("foo", LookupType::name));
329367144cfSMatt Spinler }
330367144cfSMatt Spinler 
331367144cfSMatt Spinler // Test the helper functions the use the pel_values data.
TEST_F(RegistryTest,TestHelperFunctions)332367144cfSMatt Spinler TEST_F(RegistryTest, TestHelperFunctions)
333367144cfSMatt Spinler {
334367144cfSMatt Spinler     using namespace openpower::pels::message::helper;
335367144cfSMatt Spinler     EXPECT_EQ(getSubsystem("input_power_source"), 0xA1);
336367144cfSMatt Spinler     EXPECT_THROW(getSubsystem("foo"), std::runtime_error);
337367144cfSMatt Spinler 
338367144cfSMatt Spinler     EXPECT_EQ(getSeverity("symptom_recovered"), 0x71);
339367144cfSMatt Spinler     EXPECT_THROW(getSeverity("foo"), std::runtime_error);
340367144cfSMatt Spinler 
341367144cfSMatt Spinler     EXPECT_EQ(getEventType("dump_notification"), 0x08);
342367144cfSMatt Spinler     EXPECT_THROW(getEventType("foo"), std::runtime_error);
343367144cfSMatt Spinler 
344367144cfSMatt Spinler     EXPECT_EQ(getEventScope("possibly_multiple_platforms"), 0x04);
345367144cfSMatt Spinler     EXPECT_THROW(getEventScope("foo"), std::runtime_error);
346367144cfSMatt Spinler 
347367144cfSMatt Spinler     std::vector<std::string> flags{"service_action", "dont_report",
348367144cfSMatt Spinler                                    "termination"};
349367144cfSMatt Spinler     EXPECT_EQ(getActionFlags(flags), 0x9100);
350367144cfSMatt Spinler 
3519972716fSharsh-agarwal1     flags.push_back("heartbeat_call_home");
3529972716fSharsh-agarwal1     EXPECT_EQ(getActionFlags(flags), 0x9120);
3539972716fSharsh-agarwal1     flags.clear();
3549972716fSharsh-agarwal1     flags.push_back("heartbeat_call_home");
3559972716fSharsh-agarwal1     EXPECT_EQ(getActionFlags(flags), 0x0020);
3569972716fSharsh-agarwal1 
357367144cfSMatt Spinler     flags.clear();
358367144cfSMatt Spinler     flags.push_back("foo");
359367144cfSMatt Spinler     EXPECT_THROW(getActionFlags(flags), std::runtime_error);
360367144cfSMatt Spinler }
36193e2932fSMatt Spinler 
TEST_F(RegistryTest,TestGetSRCReasonCode)36293e2932fSMatt Spinler TEST_F(RegistryTest, TestGetSRCReasonCode)
36393e2932fSMatt Spinler {
36493e2932fSMatt Spinler     using namespace openpower::pels::message::helper;
36593e2932fSMatt Spinler     EXPECT_EQ(getSRCReasonCode(R"({"ReasonCode": "0x5555"})"_json, "foo"),
36693e2932fSMatt Spinler               0x5555);
36793e2932fSMatt Spinler 
36893e2932fSMatt Spinler     EXPECT_THROW(getSRCReasonCode(R"({"ReasonCode": "ZZZZ"})"_json, "foo"),
36993e2932fSMatt Spinler                  std::runtime_error);
37093e2932fSMatt Spinler }
37193e2932fSMatt Spinler 
TEST_F(RegistryTest,TestGetSRCType)37293e2932fSMatt Spinler TEST_F(RegistryTest, TestGetSRCType)
37393e2932fSMatt Spinler {
37493e2932fSMatt Spinler     using namespace openpower::pels::message::helper;
37593e2932fSMatt Spinler     EXPECT_EQ(getSRCType(R"({"Type": "11"})"_json, "foo"), 0x11);
37693e2932fSMatt Spinler     EXPECT_EQ(getSRCType(R"({"Type": "BF"})"_json, "foo"), 0xBF);
37793e2932fSMatt Spinler 
37893e2932fSMatt Spinler     EXPECT_THROW(getSRCType(R"({"Type": "1"})"_json, "foo"),
37993e2932fSMatt Spinler                  std::runtime_error);
38093e2932fSMatt Spinler 
38193e2932fSMatt Spinler     EXPECT_THROW(getSRCType(R"({"Type": "111"})"_json, "foo"),
38293e2932fSMatt Spinler                  std::runtime_error);
38393e2932fSMatt Spinler }
38493e2932fSMatt Spinler 
TEST_F(RegistryTest,TestGetSRCHexwordFields)38593e2932fSMatt Spinler TEST_F(RegistryTest, TestGetSRCHexwordFields)
38693e2932fSMatt Spinler {
38793e2932fSMatt Spinler     using namespace openpower::pels::message::helper;
38893e2932fSMatt Spinler     const auto hexwords = R"(
38993e2932fSMatt Spinler     {"Words6To9":
39093e2932fSMatt Spinler       {
39193e2932fSMatt Spinler         "8":
39293e2932fSMatt Spinler         {
3931a1b0dfbSHarisuddin Mohamed Isa             "Description": "TEST",
39493e2932fSMatt Spinler             "AdditionalDataPropSource": "TEST"
39593e2932fSMatt Spinler         }
39693e2932fSMatt Spinler       }
39793e2932fSMatt Spinler     })"_json;
39893e2932fSMatt Spinler 
39993e2932fSMatt Spinler     auto fields = getSRCHexwordFields(hexwords, "foo");
40093e2932fSMatt Spinler     EXPECT_TRUE(fields);
40193e2932fSMatt Spinler     auto word = fields->find(8);
40293e2932fSMatt Spinler     EXPECT_NE(word, fields->end());
40393e2932fSMatt Spinler 
40493e2932fSMatt Spinler     const auto theInvalidRWord = R"(
40593e2932fSMatt Spinler     {"Words6To9":
40693e2932fSMatt Spinler       {
40793e2932fSMatt Spinler         "R":
40893e2932fSMatt Spinler         {
4091a1b0dfbSHarisuddin Mohamed Isa             "Description": "TEST",
41093e2932fSMatt Spinler             "AdditionalDataPropSource": "TEST"
41193e2932fSMatt Spinler         }
41293e2932fSMatt Spinler       }
41393e2932fSMatt Spinler     })"_json;
41493e2932fSMatt Spinler 
41593e2932fSMatt Spinler     EXPECT_THROW(getSRCHexwordFields(theInvalidRWord, "foo"),
41693e2932fSMatt Spinler                  std::runtime_error);
41793e2932fSMatt Spinler }
41893e2932fSMatt Spinler 
TEST_F(RegistryTest,TestGetSRCSymptomIDFields)41993e2932fSMatt Spinler TEST_F(RegistryTest, TestGetSRCSymptomIDFields)
42093e2932fSMatt Spinler {
42193e2932fSMatt Spinler     using namespace openpower::pels::message::helper;
42293e2932fSMatt Spinler     const auto sID = R"(
42393e2932fSMatt Spinler     {
42493e2932fSMatt Spinler         "SymptomIDFields": ["SRCWord3", "SRCWord4", "SRCWord5"]
42593e2932fSMatt Spinler     })"_json;
42693e2932fSMatt Spinler 
42793e2932fSMatt Spinler     auto fields = getSRCSymptomIDFields(sID, "foo");
42893e2932fSMatt Spinler     EXPECT_NE(std::find(fields->begin(), fields->end(), 3), fields->end());
42993e2932fSMatt Spinler     EXPECT_NE(std::find(fields->begin(), fields->end(), 4), fields->end());
43093e2932fSMatt Spinler     EXPECT_NE(std::find(fields->begin(), fields->end(), 5), fields->end());
43193e2932fSMatt Spinler 
43293e2932fSMatt Spinler     const auto badField = R"(
43393e2932fSMatt Spinler     {
43493e2932fSMatt Spinler         "SymptomIDFields": ["SRCWord3", "SRCWord4", "SRCWord"]
43593e2932fSMatt Spinler     })"_json;
43693e2932fSMatt Spinler 
43793e2932fSMatt Spinler     EXPECT_THROW(getSRCSymptomIDFields(badField, "foo"), std::runtime_error);
43893e2932fSMatt Spinler }
43993e2932fSMatt Spinler 
TEST_F(RegistryTest,TestGetComponentID)44093e2932fSMatt Spinler TEST_F(RegistryTest, TestGetComponentID)
44193e2932fSMatt Spinler {
44293e2932fSMatt Spinler     using namespace openpower::pels::message::helper;
44393e2932fSMatt Spinler 
44493e2932fSMatt Spinler     // Get it from the JSON
445075c7923SPatrick Williams     auto id =
446075c7923SPatrick Williams         getComponentID(0xBD, 0x4200, R"({"ComponentID":"0x4200"})"_json, "foo");
44793e2932fSMatt Spinler     EXPECT_EQ(id, 0x4200);
44893e2932fSMatt Spinler 
44993e2932fSMatt Spinler     // Get it from the reason code on a 0xBD SRC
45093e2932fSMatt Spinler     id = getComponentID(0xBD, 0x6700, R"({})"_json, "foo");
45193e2932fSMatt Spinler     EXPECT_EQ(id, 0x6700);
45293e2932fSMatt Spinler 
45393e2932fSMatt Spinler     // Not present on a 0x11 SRC
45493e2932fSMatt Spinler     EXPECT_THROW(getComponentID(0x11, 0x8800, R"({})"_json, "foo"),
45593e2932fSMatt Spinler                  std::runtime_error);
45693e2932fSMatt Spinler }
4576b427cc8SMatt Spinler 
4586b427cc8SMatt Spinler // Test when callouts are in the JSON.
TEST_F(RegistryTest,TestGetCallouts)4596b427cc8SMatt Spinler TEST_F(RegistryTest, TestGetCallouts)
4606b427cc8SMatt Spinler {
46115370292SArya K Padman     std::vector<std::string> systemNames;
4626ea4d5f7SMatt Spinler 
4636b427cc8SMatt Spinler     {
4646b427cc8SMatt Spinler         // Callouts without AD, that depend on system type,
4656b427cc8SMatt Spinler         // where there is a default entry without a system type.
4666b427cc8SMatt Spinler         auto json = R"(
4676b427cc8SMatt Spinler         [
4686b427cc8SMatt Spinler         {
4696b427cc8SMatt Spinler             "System": "system1",
4706b427cc8SMatt Spinler             "CalloutList":
4716b427cc8SMatt Spinler             [
4726b427cc8SMatt Spinler                 {
4736b427cc8SMatt Spinler                     "Priority": "high",
4746b427cc8SMatt Spinler                     "LocCode": "P1-C1"
4756b427cc8SMatt Spinler                 },
4766b427cc8SMatt Spinler                 {
4776b427cc8SMatt Spinler                     "Priority": "low",
4786b427cc8SMatt Spinler                     "LocCode": "P1"
4796b427cc8SMatt Spinler                 },
4806b427cc8SMatt Spinler                 {
4816b427cc8SMatt Spinler                     "Priority": "low",
4826b427cc8SMatt Spinler                     "SymbolicFRU": "service_docs"
483f00f9d0fSMatt Spinler                 },
484f00f9d0fSMatt Spinler                 {
485f00f9d0fSMatt Spinler                     "Priority": "low",
486f00f9d0fSMatt Spinler                     "SymbolicFRUTrusted": "air_mover",
487f00f9d0fSMatt Spinler                     "UseInventoryLocCode": true
4886b427cc8SMatt Spinler                 }
4896b427cc8SMatt Spinler             ]
4906b427cc8SMatt Spinler         },
4916b427cc8SMatt Spinler         {
4926b427cc8SMatt Spinler             "CalloutList":
4936b427cc8SMatt Spinler             [
4946b427cc8SMatt Spinler                 {
4956b427cc8SMatt Spinler                     "Priority": "medium",
4962edce4e2SMatt Spinler                     "Procedure": "BMC0001"
4976b427cc8SMatt Spinler                 },
4986b427cc8SMatt Spinler                 {
4996b427cc8SMatt Spinler                     "Priority": "low",
5006b427cc8SMatt Spinler                     "LocCode": "P3-C8",
5016b427cc8SMatt Spinler                     "SymbolicFRUTrusted": "service_docs"
5026b427cc8SMatt Spinler                 }
5036b427cc8SMatt Spinler             ]
5046b427cc8SMatt Spinler 
5056b427cc8SMatt Spinler         }
5066b427cc8SMatt Spinler         ])"_json;
5076b427cc8SMatt Spinler 
5086b427cc8SMatt Spinler         AdditionalData ad;
50915370292SArya K Padman         systemNames.push_back("system1");
5106b427cc8SMatt Spinler 
51115370292SArya K Padman         auto callouts = Registry::getCallouts(json, systemNames, ad);
512f00f9d0fSMatt Spinler         EXPECT_EQ(callouts.size(), 4);
5136b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].priority, "high");
5146b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].locCode, "P1-C1");
5156b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].procedure, "");
5166b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].symbolicFRU, "");
5176b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].symbolicFRUTrusted, "");
5186b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].priority, "low");
5196b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].locCode, "P1");
5206b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].procedure, "");
5216b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].symbolicFRU, "");
5226b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].symbolicFRUTrusted, "");
5236b427cc8SMatt Spinler         EXPECT_EQ(callouts[2].priority, "low");
5246b427cc8SMatt Spinler         EXPECT_EQ(callouts[2].locCode, "");
5256b427cc8SMatt Spinler         EXPECT_EQ(callouts[2].procedure, "");
5266b427cc8SMatt Spinler         EXPECT_EQ(callouts[2].symbolicFRU, "service_docs");
5276b427cc8SMatt Spinler         EXPECT_EQ(callouts[2].symbolicFRUTrusted, "");
528f00f9d0fSMatt Spinler         EXPECT_EQ(callouts[3].priority, "low");
529f00f9d0fSMatt Spinler         EXPECT_EQ(callouts[3].locCode, "");
530f00f9d0fSMatt Spinler         EXPECT_EQ(callouts[3].procedure, "");
531f00f9d0fSMatt Spinler         EXPECT_EQ(callouts[3].symbolicFRU, "");
532f00f9d0fSMatt Spinler         EXPECT_EQ(callouts[3].symbolicFRUTrusted, "air_mover");
533f00f9d0fSMatt Spinler         EXPECT_EQ(callouts[3].useInventoryLocCode, true);
5346b427cc8SMatt Spinler 
5356b427cc8SMatt Spinler         // system2 isn't in the JSON, so it will pick the default one
53615370292SArya K Padman         systemNames[0] = "system2";
53715370292SArya K Padman         callouts = Registry::getCallouts(json, systemNames, ad);
5386b427cc8SMatt Spinler         EXPECT_EQ(callouts.size(), 2);
5396b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].priority, "medium");
5406b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].locCode, "");
5412edce4e2SMatt Spinler         EXPECT_EQ(callouts[0].procedure, "BMC0001");
5426b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].symbolicFRU, "");
5436b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].priority, "low");
5446b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].locCode, "P3-C8");
5456b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].procedure, "");
5466b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].symbolicFRU, "");
5476b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].symbolicFRUTrusted, "service_docs");
548f00f9d0fSMatt Spinler         EXPECT_EQ(callouts[1].useInventoryLocCode, false);
5496b427cc8SMatt Spinler     }
5506b427cc8SMatt Spinler 
5516b427cc8SMatt Spinler     // Empty JSON array (treated as an error)
5526b427cc8SMatt Spinler     {
5536b427cc8SMatt Spinler         auto json = R"([])"_json;
5546b427cc8SMatt Spinler         AdditionalData ad;
55515370292SArya K Padman         systemNames[0] = "system1";
55615370292SArya K Padman         EXPECT_THROW(Registry::getCallouts(json, systemNames, ad),
5576b427cc8SMatt Spinler                      std::runtime_error);
5586b427cc8SMatt Spinler     }
5596b427cc8SMatt Spinler 
5606b427cc8SMatt Spinler     {
5616b427cc8SMatt Spinler         // Callouts without AD, that depend on system type,
5626b427cc8SMatt Spinler         // where there isn't a default entry without a system type.
5636b427cc8SMatt Spinler         auto json = R"(
5646b427cc8SMatt Spinler         [
5656b427cc8SMatt Spinler         {
5666b427cc8SMatt Spinler             "System": "system1",
5676b427cc8SMatt Spinler             "CalloutList":
5686b427cc8SMatt Spinler             [
5696b427cc8SMatt Spinler                 {
5706b427cc8SMatt Spinler                     "Priority": "high",
5716b427cc8SMatt Spinler                     "LocCode": "P1-C1"
5726b427cc8SMatt Spinler                 },
5736b427cc8SMatt Spinler                 {
5746b427cc8SMatt Spinler                     "Priority": "low",
5756b427cc8SMatt Spinler                     "LocCode": "P1",
5766b427cc8SMatt Spinler                     "SymbolicFRU": "1234567"
5776b427cc8SMatt Spinler                 }
5786b427cc8SMatt Spinler             ]
5796b427cc8SMatt Spinler         },
5806b427cc8SMatt Spinler         {
5816b427cc8SMatt Spinler             "System": "system2",
5826b427cc8SMatt Spinler             "CalloutList":
5836b427cc8SMatt Spinler             [
5846b427cc8SMatt Spinler                 {
5856b427cc8SMatt Spinler                     "Priority": "medium",
5866b427cc8SMatt Spinler                     "LocCode": "P7",
5876b427cc8SMatt Spinler                     "CalloutType": "tool_fru"
5886b427cc8SMatt Spinler                 }
5896b427cc8SMatt Spinler             ]
5906b427cc8SMatt Spinler 
5916b427cc8SMatt Spinler         }
5926b427cc8SMatt Spinler         ])"_json;
5936b427cc8SMatt Spinler 
5946b427cc8SMatt Spinler         AdditionalData ad;
59515370292SArya K Padman         systemNames[0] = "system1";
5966b427cc8SMatt Spinler 
59715370292SArya K Padman         auto callouts = Registry::getCallouts(json, systemNames, ad);
5986b427cc8SMatt Spinler         EXPECT_EQ(callouts.size(), 2);
5996b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].priority, "high");
6006b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].locCode, "P1-C1");
6016b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].procedure, "");
6026b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].symbolicFRU, "");
6036b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].symbolicFRUTrusted, "");
6046b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].priority, "low");
6056b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].locCode, "P1");
6066b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].procedure, "");
6076b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].symbolicFRU, "1234567");
6086b427cc8SMatt Spinler         EXPECT_EQ(callouts[1].symbolicFRUTrusted, "");
6096b427cc8SMatt Spinler 
61015370292SArya K Padman         systemNames[0] = "system2";
61115370292SArya K Padman         callouts = Registry::getCallouts(json, systemNames, ad);
6126b427cc8SMatt Spinler         EXPECT_EQ(callouts.size(), 1);
6136b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].priority, "medium");
6146b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].locCode, "P7");
6156b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].procedure, "");
6166b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].symbolicFRU, "");
6176b427cc8SMatt Spinler         EXPECT_EQ(callouts[0].symbolicFRUTrusted, "");
6186b427cc8SMatt Spinler 
6196b427cc8SMatt Spinler         // There is no entry for system3 or a default system,
6206b427cc8SMatt Spinler         // so this should fail.
62115370292SArya K Padman         systemNames[0] = "system3";
62215370292SArya K Padman         EXPECT_THROW(Registry::getCallouts(json, systemNames, ad),
6236b427cc8SMatt Spinler                      std::runtime_error);
6246b427cc8SMatt Spinler     }
6256b427cc8SMatt Spinler 
6266b427cc8SMatt Spinler     {
6276b427cc8SMatt Spinler         // Callouts that use the AdditionalData key PROC_NUM
6286b427cc8SMatt Spinler         // as an index into them, along with a system type.
6296b427cc8SMatt Spinler         // It supports PROC_NUMs 0 and 1.
6306b427cc8SMatt Spinler         auto json = R"(
6316b427cc8SMatt Spinler         {
6326b427cc8SMatt Spinler             "ADName": "PROC_NUM",
6336b427cc8SMatt Spinler             "CalloutsWithTheirADValues":
6346b427cc8SMatt Spinler             [
6356b427cc8SMatt Spinler                 {
6366b427cc8SMatt Spinler                     "ADValue": "0",
6376b427cc8SMatt Spinler                     "Callouts":
6386b427cc8SMatt Spinler                     [
6396b427cc8SMatt Spinler                         {
6406b427cc8SMatt Spinler                             "System": "system3",
6416b427cc8SMatt Spinler                             "CalloutList":
6426b427cc8SMatt Spinler                             [
6436b427cc8SMatt Spinler                                 {
6446b427cc8SMatt Spinler                                     "Priority": "high",
6456b427cc8SMatt Spinler                                     "LocCode": "P1-C5"
6466b427cc8SMatt Spinler                                 },
6476b427cc8SMatt Spinler                                 {
6486b427cc8SMatt Spinler                                     "Priority": "medium",
6496b427cc8SMatt Spinler                                     "LocCode": "P1-C6",
6506b427cc8SMatt Spinler                                     "SymbolicFRU": "1234567"
6516b427cc8SMatt Spinler                                 },
6526b427cc8SMatt Spinler                                 {
6536b427cc8SMatt Spinler                                     "Priority": "low",
6542edce4e2SMatt Spinler                                     "Procedure": "BMC0001",
6556b427cc8SMatt Spinler                                     "CalloutType": "config_procedure"
6566b427cc8SMatt Spinler                                 }
6576b427cc8SMatt Spinler                             ]
6586b427cc8SMatt Spinler                         },
6596b427cc8SMatt Spinler                         {
6606b427cc8SMatt Spinler                             "CalloutList":
6616b427cc8SMatt Spinler                             [
6626b427cc8SMatt Spinler                                 {
6636b427cc8SMatt Spinler                                     "Priority": "low",
6646b427cc8SMatt Spinler                                     "LocCode": "P55"
6656b427cc8SMatt Spinler                                 }
6666b427cc8SMatt Spinler                             ]
6676b427cc8SMatt Spinler                         }
6686b427cc8SMatt Spinler                     ]
6696b427cc8SMatt Spinler                 },
6706b427cc8SMatt Spinler                 {
6716b427cc8SMatt Spinler                     "ADValue": "1",
6726b427cc8SMatt Spinler                     "Callouts":
6736b427cc8SMatt Spinler                     [
6746b427cc8SMatt Spinler                         {
6756b427cc8SMatt Spinler                             "CalloutList":
6766b427cc8SMatt Spinler                             [
6776b427cc8SMatt Spinler                                 {
6786b427cc8SMatt Spinler                                     "Priority": "high",
6796b427cc8SMatt Spinler                                     "LocCode": "P1-C6",
6806b427cc8SMatt Spinler                                     "CalloutType": "external_fru"
6816b427cc8SMatt Spinler                                 }
6826b427cc8SMatt Spinler                             ]
6836b427cc8SMatt Spinler                         }
6846b427cc8SMatt Spinler                     ]
6856b427cc8SMatt Spinler                 }
6866b427cc8SMatt Spinler             ]
6876b427cc8SMatt Spinler         })"_json;
6886b427cc8SMatt Spinler 
6896b427cc8SMatt Spinler         {
6906b427cc8SMatt Spinler             // Find callouts for PROC_NUM 0 on system3
691*e5940634SPatrick Williams             std::map<std::string, std::string> adData{{"PROC_NUM", "0"}};
6926b427cc8SMatt Spinler             AdditionalData ad{adData};
69315370292SArya K Padman             systemNames[0] = "system3";
6946b427cc8SMatt Spinler 
69515370292SArya K Padman             auto callouts = Registry::getCallouts(json, systemNames, ad);
6966b427cc8SMatt Spinler             EXPECT_EQ(callouts.size(), 3);
6976b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].priority, "high");
6986b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].locCode, "P1-C5");
6996b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].procedure, "");
7006b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].symbolicFRU, "");
7016b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].symbolicFRUTrusted, "");
7026b427cc8SMatt Spinler             EXPECT_EQ(callouts[1].priority, "medium");
7036b427cc8SMatt Spinler             EXPECT_EQ(callouts[1].locCode, "P1-C6");
7046b427cc8SMatt Spinler             EXPECT_EQ(callouts[1].procedure, "");
7056b427cc8SMatt Spinler             EXPECT_EQ(callouts[1].symbolicFRU, "1234567");
7066b427cc8SMatt Spinler             EXPECT_EQ(callouts[1].symbolicFRUTrusted, "");
7076b427cc8SMatt Spinler             EXPECT_EQ(callouts[2].priority, "low");
7086b427cc8SMatt Spinler             EXPECT_EQ(callouts[2].locCode, "");
7092edce4e2SMatt Spinler             EXPECT_EQ(callouts[2].procedure, "BMC0001");
7106b427cc8SMatt Spinler             EXPECT_EQ(callouts[2].symbolicFRU, "");
7116b427cc8SMatt Spinler             EXPECT_EQ(callouts[2].symbolicFRUTrusted, "");
7126b427cc8SMatt Spinler 
7136b427cc8SMatt Spinler             // Find callouts for PROC_NUM 0 that uses the default system entry.
71415370292SArya K Padman             systemNames[0] = "system99";
7156ea4d5f7SMatt Spinler 
71615370292SArya K Padman             callouts = Registry::getCallouts(json, systemNames, ad);
7176b427cc8SMatt Spinler             EXPECT_EQ(callouts.size(), 1);
7186b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].priority, "low");
7196b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].locCode, "P55");
7206b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].procedure, "");
7216b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].symbolicFRU, "");
7226b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].symbolicFRUTrusted, "");
7236b427cc8SMatt Spinler         }
7246b427cc8SMatt Spinler         {
7256b427cc8SMatt Spinler             // Find callouts for PROC_NUM 1 that uses a default system entry.
726*e5940634SPatrick Williams             std::map<std::string, std::string> adData{{"PROC_NUM", "1"}};
7276b427cc8SMatt Spinler             AdditionalData ad{adData};
72815370292SArya K Padman             systemNames[0] = "system1";
7296b427cc8SMatt Spinler 
73015370292SArya K Padman             auto callouts = Registry::getCallouts(json, systemNames, ad);
7316b427cc8SMatt Spinler             EXPECT_EQ(callouts.size(), 1);
7326b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].priority, "high");
7336b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].locCode, "P1-C6");
7346b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].procedure, "");
7356b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].symbolicFRU, "");
7366b427cc8SMatt Spinler             EXPECT_EQ(callouts[0].symbolicFRUTrusted, "");
7376b427cc8SMatt Spinler         }
7386b427cc8SMatt Spinler         {
739f397afccSMatt Spinler             // There is no entry for PROC_NUM 2, so no callouts
740*e5940634SPatrick Williams             std::map<std::string, std::string> adData{{"PROC_NUM", "2"}};
7416b427cc8SMatt Spinler             AdditionalData ad{adData};
7426b427cc8SMatt Spinler 
74315370292SArya K Padman             auto callouts = Registry::getCallouts(json, systemNames, ad);
744f397afccSMatt Spinler             EXPECT_TRUE(callouts.empty());
7456b427cc8SMatt Spinler         }
7466b427cc8SMatt Spinler     }
7473d923311SMatt Spinler 
7483d923311SMatt Spinler     {
7493d923311SMatt Spinler         // Callouts with a 'CalloutsWhenNoADMatch' section that will
7503d923311SMatt Spinler         // be used when the AdditionalData value doesn't match.
7513d923311SMatt Spinler         auto json = R"(
7523d923311SMatt Spinler         {
7533d923311SMatt Spinler             "ADName": "PROC_NUM",
7543d923311SMatt Spinler             "CalloutsWithTheirADValues":
7553d923311SMatt Spinler             [
7563d923311SMatt Spinler                 {
7573d923311SMatt Spinler                     "ADValue": "0",
7583d923311SMatt Spinler                     "Callouts":
7593d923311SMatt Spinler                     [
7603d923311SMatt Spinler                         {
7613d923311SMatt Spinler                             "CalloutList":
7623d923311SMatt Spinler                             [
7633d923311SMatt Spinler                                 {
7643d923311SMatt Spinler                                     "Priority": "high",
7653d923311SMatt Spinler                                     "LocCode": "P0-C0"
7663d923311SMatt Spinler                                 }
7673d923311SMatt Spinler                             ]
7683d923311SMatt Spinler                         }
7693d923311SMatt Spinler                     ]
7703d923311SMatt Spinler                 }
7713d923311SMatt Spinler             ],
7723d923311SMatt Spinler             "CalloutsWhenNoADMatch": [
7733d923311SMatt Spinler                 {
7743d923311SMatt Spinler                     "CalloutList": [
7753d923311SMatt Spinler                         {
7763d923311SMatt Spinler                             "Priority": "medium",
7773d923311SMatt Spinler                             "LocCode": "P1-C1"
7783d923311SMatt Spinler                         }
7793d923311SMatt Spinler                     ]
7803d923311SMatt Spinler                 }
7813d923311SMatt Spinler             ]
7823d923311SMatt Spinler         })"_json;
7833d923311SMatt Spinler 
7843d923311SMatt Spinler         // There isn't an entry in the JSON for a PROC_NUM of 8
7853d923311SMatt Spinler         // so it should choose the P1-C1 callout.
786*e5940634SPatrick Williams         std::map<std::string, std::string> adData{{"PROC_NUM", "8"}};
7873d923311SMatt Spinler         AdditionalData ad{adData};
78815370292SArya K Padman         systemNames.clear();
7893d923311SMatt Spinler 
79015370292SArya K Padman         auto callouts = Registry::getCallouts(json, systemNames, ad);
7913d923311SMatt Spinler         EXPECT_EQ(callouts.size(), 1);
7923d923311SMatt Spinler         EXPECT_EQ(callouts[0].priority, "medium");
7933d923311SMatt Spinler         EXPECT_EQ(callouts[0].locCode, "P1-C1");
7943d923311SMatt Spinler     }
7956b427cc8SMatt Spinler }
79623970b0dSMatt Spinler 
TEST_F(RegistryTest,TestGetCalloutsWithSystems)79715370292SArya K Padman TEST_F(RegistryTest, TestGetCalloutsWithSystems)
79815370292SArya K Padman {
79915370292SArya K Padman     std::vector<std::string> systemNames;
80015370292SArya K Padman 
80115370292SArya K Padman     auto json = R"(
80215370292SArya K Padman         [
80315370292SArya K Padman         {
80415370292SArya K Padman             "Systems": ["system1", "system2"],
80515370292SArya K Padman             "CalloutList":
80615370292SArya K Padman             [
80715370292SArya K Padman                 {
80815370292SArya K Padman                     "Priority": "high",
80915370292SArya K Padman                     "LocCode": "P1-C1"
81015370292SArya K Padman                 },
81115370292SArya K Padman                 {
81215370292SArya K Padman                     "Priority": "low",
81315370292SArya K Padman                     "LocCode": "P1"
81415370292SArya K Padman                 },
81515370292SArya K Padman                 {
81615370292SArya K Padman                     "Priority": "low",
81715370292SArya K Padman                     "SymbolicFRU": "service_docs"
81815370292SArya K Padman                 },
81915370292SArya K Padman                 {
82015370292SArya K Padman                     "Priority": "low",
82115370292SArya K Padman                     "SymbolicFRUTrusted": "air_mover",
82215370292SArya K Padman                     "UseInventoryLocCode": true
82315370292SArya K Padman                 }
82415370292SArya K Padman             ]
82515370292SArya K Padman         },
82615370292SArya K Padman         {
82715370292SArya K Padman             "CalloutList":
82815370292SArya K Padman             [
82915370292SArya K Padman                 {
83015370292SArya K Padman                     "Priority": "medium",
83115370292SArya K Padman                     "Procedure": "BMC0001"
83215370292SArya K Padman                 },
83315370292SArya K Padman                 {
83415370292SArya K Padman                     "Priority": "low",
83515370292SArya K Padman                     "LocCode": "P3-C8",
83615370292SArya K Padman                     "SymbolicFRUTrusted": "service_docs"
83715370292SArya K Padman                 }
83815370292SArya K Padman             ]
83915370292SArya K Padman 
84015370292SArya K Padman         }
84115370292SArya K Padman         ])"_json;
84215370292SArya K Padman 
84315370292SArya K Padman     AdditionalData ad;
84415370292SArya K Padman     systemNames.push_back("system1");
84515370292SArya K Padman 
84615370292SArya K Padman     auto callouts = Registry::getCallouts(json, systemNames, ad);
84715370292SArya K Padman     EXPECT_EQ(callouts.size(), 4);
84815370292SArya K Padman     EXPECT_EQ(callouts[0].priority, "high");
84915370292SArya K Padman     EXPECT_EQ(callouts[0].locCode, "P1-C1");
85015370292SArya K Padman     EXPECT_EQ(callouts[0].procedure, "");
85115370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRU, "");
85215370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRUTrusted, "");
85315370292SArya K Padman     EXPECT_EQ(callouts[1].priority, "low");
85415370292SArya K Padman     EXPECT_EQ(callouts[1].locCode, "P1");
85515370292SArya K Padman     EXPECT_EQ(callouts[1].procedure, "");
85615370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRU, "");
85715370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRUTrusted, "");
85815370292SArya K Padman     EXPECT_EQ(callouts[2].priority, "low");
85915370292SArya K Padman     EXPECT_EQ(callouts[2].locCode, "");
86015370292SArya K Padman     EXPECT_EQ(callouts[2].procedure, "");
86115370292SArya K Padman     EXPECT_EQ(callouts[2].symbolicFRU, "service_docs");
86215370292SArya K Padman     EXPECT_EQ(callouts[2].symbolicFRUTrusted, "");
86315370292SArya K Padman     EXPECT_EQ(callouts[3].priority, "low");
86415370292SArya K Padman     EXPECT_EQ(callouts[3].locCode, "");
86515370292SArya K Padman     EXPECT_EQ(callouts[3].procedure, "");
86615370292SArya K Padman     EXPECT_EQ(callouts[3].symbolicFRU, "");
86715370292SArya K Padman     EXPECT_EQ(callouts[3].symbolicFRUTrusted, "air_mover");
86815370292SArya K Padman     EXPECT_EQ(callouts[3].useInventoryLocCode, true);
86915370292SArya K Padman 
87015370292SArya K Padman     // System3 isn't in the JSON, so it will pick the default one
87115370292SArya K Padman     systemNames[0] = "system3";
87215370292SArya K Padman 
87315370292SArya K Padman     callouts = Registry::getCallouts(json, systemNames, ad);
87415370292SArya K Padman     EXPECT_EQ(callouts.size(), 2);
87515370292SArya K Padman     EXPECT_EQ(callouts[0].priority, "medium");
87615370292SArya K Padman     EXPECT_EQ(callouts[0].locCode, "");
87715370292SArya K Padman     EXPECT_EQ(callouts[0].procedure, "BMC0001");
87815370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRU, "");
87915370292SArya K Padman     EXPECT_EQ(callouts[1].priority, "low");
88015370292SArya K Padman     EXPECT_EQ(callouts[1].locCode, "P3-C8");
88115370292SArya K Padman     EXPECT_EQ(callouts[1].procedure, "");
88215370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRU, "");
88315370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRUTrusted, "service_docs");
88415370292SArya K Padman     EXPECT_EQ(callouts[1].useInventoryLocCode, false);
88515370292SArya K Padman }
88615370292SArya K Padman 
TEST_F(RegistryTest,TestGetCalloutsWithSystemAndSystems)88715370292SArya K Padman TEST_F(RegistryTest, TestGetCalloutsWithSystemAndSystems)
88815370292SArya K Padman {
88915370292SArya K Padman     std::vector<std::string> systemNames;
89015370292SArya K Padman 
89115370292SArya K Padman     auto json = R"(
89215370292SArya K Padman         [
89315370292SArya K Padman         {
89415370292SArya K Padman             "Systems": ["system1", "system2"],
89515370292SArya K Padman             "CalloutList":
89615370292SArya K Padman             [
89715370292SArya K Padman                 {
89815370292SArya K Padman                     "Priority": "high",
89915370292SArya K Padman                     "LocCode": "P1-C1"
90015370292SArya K Padman                 },
90115370292SArya K Padman                 {
90215370292SArya K Padman                     "Priority": "low",
90315370292SArya K Padman                     "LocCode": "P1"
90415370292SArya K Padman                 }
90515370292SArya K Padman             ]
90615370292SArya K Padman         },
90715370292SArya K Padman         {
90815370292SArya K Padman             "System": "system1",
90915370292SArya K Padman             "CalloutList":
91015370292SArya K Padman             [
91115370292SArya K Padman                 {
91215370292SArya K Padman                     "Priority": "low",
91315370292SArya K Padman                     "SymbolicFRU": "service_docs"
91415370292SArya K Padman                 },
91515370292SArya K Padman                 {
91615370292SArya K Padman                     "Priority": "low",
91715370292SArya K Padman                     "SymbolicFRUTrusted": "air_mover",
91815370292SArya K Padman                     "UseInventoryLocCode": true
91915370292SArya K Padman                 }
92015370292SArya K Padman             ]
92115370292SArya K Padman         },
92215370292SArya K Padman         {
92315370292SArya K Padman             "CalloutList":
92415370292SArya K Padman             [
92515370292SArya K Padman                 {
92615370292SArya K Padman                     "Priority": "medium",
92715370292SArya K Padman                     "Procedure": "BMC0001"
92815370292SArya K Padman                 },
92915370292SArya K Padman                 {
93015370292SArya K Padman                     "Priority": "low",
93115370292SArya K Padman                     "LocCode": "P3-C8",
93215370292SArya K Padman                     "SymbolicFRUTrusted": "service_docs"
93315370292SArya K Padman                 }
93415370292SArya K Padman             ]
93515370292SArya K Padman         }
93615370292SArya K Padman         ])"_json;
93715370292SArya K Padman 
93815370292SArya K Padman     AdditionalData ad;
93915370292SArya K Padman     systemNames.push_back("system1");
94015370292SArya K Padman 
94115370292SArya K Padman     auto callouts = Registry::getCallouts(json, systemNames, ad);
94215370292SArya K Padman     EXPECT_EQ(callouts.size(), 4);
94315370292SArya K Padman     EXPECT_EQ(callouts[0].priority, "high");
94415370292SArya K Padman     EXPECT_EQ(callouts[0].locCode, "P1-C1");
94515370292SArya K Padman     EXPECT_EQ(callouts[0].procedure, "");
94615370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRU, "");
94715370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRUTrusted, "");
94815370292SArya K Padman     EXPECT_EQ(callouts[1].priority, "low");
94915370292SArya K Padman     EXPECT_EQ(callouts[1].locCode, "P1");
95015370292SArya K Padman     EXPECT_EQ(callouts[1].procedure, "");
95115370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRU, "");
95215370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRUTrusted, "");
95315370292SArya K Padman     EXPECT_EQ(callouts[2].priority, "low");
95415370292SArya K Padman     EXPECT_EQ(callouts[2].locCode, "");
95515370292SArya K Padman     EXPECT_EQ(callouts[2].procedure, "");
95615370292SArya K Padman     EXPECT_EQ(callouts[2].symbolicFRU, "service_docs");
95715370292SArya K Padman     EXPECT_EQ(callouts[2].symbolicFRUTrusted, "");
95815370292SArya K Padman     EXPECT_EQ(callouts[3].priority, "low");
95915370292SArya K Padman     EXPECT_EQ(callouts[3].locCode, "");
96015370292SArya K Padman     EXPECT_EQ(callouts[3].procedure, "");
96115370292SArya K Padman     EXPECT_EQ(callouts[3].symbolicFRU, "");
96215370292SArya K Padman     EXPECT_EQ(callouts[3].symbolicFRUTrusted, "air_mover");
96315370292SArya K Padman     EXPECT_EQ(callouts[3].useInventoryLocCode, true);
96415370292SArya K Padman 
96515370292SArya K Padman     // if system name is "System2"
96615370292SArya K Padman     systemNames[0] = "system2";
96715370292SArya K Padman 
96815370292SArya K Padman     callouts = Registry::getCallouts(json, systemNames, ad);
96915370292SArya K Padman     EXPECT_EQ(callouts.size(), 2);
97015370292SArya K Padman     EXPECT_EQ(callouts[0].priority, "high");
97115370292SArya K Padman     EXPECT_EQ(callouts[0].locCode, "P1-C1");
97215370292SArya K Padman     EXPECT_EQ(callouts[0].procedure, "");
97315370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRU, "");
97415370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRUTrusted, "");
97515370292SArya K Padman     EXPECT_EQ(callouts[1].priority, "low");
97615370292SArya K Padman     EXPECT_EQ(callouts[1].locCode, "P1");
97715370292SArya K Padman     EXPECT_EQ(callouts[1].procedure, "");
97815370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRU, "");
97915370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRUTrusted, "");
98015370292SArya K Padman 
98115370292SArya K Padman     // system name is System3 which is not in json thereby will take default
98215370292SArya K Padman     systemNames[0] = "system3";
98315370292SArya K Padman 
98415370292SArya K Padman     callouts = Registry::getCallouts(json, systemNames, ad);
98515370292SArya K Padman     EXPECT_EQ(callouts.size(), 2);
98615370292SArya K Padman     EXPECT_EQ(callouts[0].priority, "medium");
98715370292SArya K Padman     EXPECT_EQ(callouts[0].locCode, "");
98815370292SArya K Padman     EXPECT_EQ(callouts[0].procedure, "BMC0001");
98915370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRU, "");
99015370292SArya K Padman     EXPECT_EQ(callouts[1].priority, "low");
99115370292SArya K Padman     EXPECT_EQ(callouts[1].locCode, "P3-C8");
99215370292SArya K Padman     EXPECT_EQ(callouts[1].procedure, "");
99315370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRU, "");
99415370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRUTrusted, "service_docs");
99515370292SArya K Padman     EXPECT_EQ(callouts[1].useInventoryLocCode, false);
99615370292SArya K Padman }
99715370292SArya K Padman 
TEST_F(RegistryTest,TestGetCalloutsWithOnlySystemAndSystems)99815370292SArya K Padman TEST_F(RegistryTest, TestGetCalloutsWithOnlySystemAndSystems)
99915370292SArya K Padman {
100015370292SArya K Padman     std::vector<std::string> systemNames;
100115370292SArya K Padman 
100215370292SArya K Padman     auto json = R"(
100315370292SArya K Padman         [
100415370292SArya K Padman         {
100515370292SArya K Padman             "Systems": ["system1", "system2"],
100615370292SArya K Padman             "CalloutList":
100715370292SArya K Padman             [
100815370292SArya K Padman                 {
100915370292SArya K Padman                     "Priority": "high",
101015370292SArya K Padman                     "LocCode": "P1-C1"
101115370292SArya K Padman                 },
101215370292SArya K Padman                 {
101315370292SArya K Padman                     "Priority": "low",
101415370292SArya K Padman                     "LocCode": "P1"
101515370292SArya K Padman                 }
101615370292SArya K Padman             ]
101715370292SArya K Padman         },
101815370292SArya K Padman         {
101915370292SArya K Padman             "System": "system1",
102015370292SArya K Padman             "CalloutList":
102115370292SArya K Padman             [
102215370292SArya K Padman                 {
102315370292SArya K Padman                     "Priority": "low",
102415370292SArya K Padman                     "SymbolicFRU": "service_docs"
102515370292SArya K Padman                 },
102615370292SArya K Padman                 {
102715370292SArya K Padman                     "Priority": "low",
102815370292SArya K Padman                     "SymbolicFRUTrusted": "air_mover",
102915370292SArya K Padman                     "UseInventoryLocCode": true
103015370292SArya K Padman                 }
103115370292SArya K Padman             ]
103215370292SArya K Padman         }
103315370292SArya K Padman         ])"_json;
103415370292SArya K Padman 
103515370292SArya K Padman     AdditionalData ad;
103615370292SArya K Padman     systemNames.push_back("system1");
103715370292SArya K Padman 
103815370292SArya K Padman     auto callouts = Registry::getCallouts(json, systemNames, ad);
103915370292SArya K Padman     EXPECT_EQ(callouts.size(), 4);
104015370292SArya K Padman     EXPECT_EQ(callouts[0].priority, "high");
104115370292SArya K Padman     EXPECT_EQ(callouts[0].locCode, "P1-C1");
104215370292SArya K Padman     EXPECT_EQ(callouts[0].procedure, "");
104315370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRU, "");
104415370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRUTrusted, "");
104515370292SArya K Padman     EXPECT_EQ(callouts[1].priority, "low");
104615370292SArya K Padman     EXPECT_EQ(callouts[1].locCode, "P1");
104715370292SArya K Padman     EXPECT_EQ(callouts[1].procedure, "");
104815370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRU, "");
104915370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRUTrusted, "");
105015370292SArya K Padman     EXPECT_EQ(callouts[2].priority, "low");
105115370292SArya K Padman     EXPECT_EQ(callouts[2].locCode, "");
105215370292SArya K Padman     EXPECT_EQ(callouts[2].procedure, "");
105315370292SArya K Padman     EXPECT_EQ(callouts[2].symbolicFRU, "service_docs");
105415370292SArya K Padman     EXPECT_EQ(callouts[2].symbolicFRUTrusted, "");
105515370292SArya K Padman     EXPECT_EQ(callouts[3].priority, "low");
105615370292SArya K Padman     EXPECT_EQ(callouts[3].locCode, "");
105715370292SArya K Padman     EXPECT_EQ(callouts[3].procedure, "");
105815370292SArya K Padman     EXPECT_EQ(callouts[3].symbolicFRU, "");
105915370292SArya K Padman     EXPECT_EQ(callouts[3].symbolicFRUTrusted, "air_mover");
106015370292SArya K Padman     EXPECT_EQ(callouts[3].useInventoryLocCode, true);
106115370292SArya K Padman 
106215370292SArya K Padman     // if system name is "System2"
106315370292SArya K Padman     systemNames[0] = "system2";
106415370292SArya K Padman 
106515370292SArya K Padman     callouts = Registry::getCallouts(json, systemNames, ad);
106615370292SArya K Padman     EXPECT_EQ(callouts.size(), 2);
106715370292SArya K Padman     EXPECT_EQ(callouts[0].priority, "high");
106815370292SArya K Padman     EXPECT_EQ(callouts[0].locCode, "P1-C1");
106915370292SArya K Padman     EXPECT_EQ(callouts[0].procedure, "");
107015370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRU, "");
107115370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRUTrusted, "");
107215370292SArya K Padman     EXPECT_EQ(callouts[1].priority, "low");
107315370292SArya K Padman     EXPECT_EQ(callouts[1].locCode, "P1");
107415370292SArya K Padman     EXPECT_EQ(callouts[1].procedure, "");
107515370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRU, "");
107615370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRUTrusted, "");
107715370292SArya K Padman 
107815370292SArya K Padman     // There is no entry for system3 or a default system,
107915370292SArya K Padman     // so this should fail.
108015370292SArya K Padman     systemNames[0] = "system3";
108115370292SArya K Padman     EXPECT_THROW(Registry::getCallouts(json, systemNames, ad),
108215370292SArya K Padman                  std::runtime_error);
108315370292SArya K Padman }
108415370292SArya K Padman 
TEST_F(RegistryTest,TestGetCalloutsWithOnlySystems)108515370292SArya K Padman TEST_F(RegistryTest, TestGetCalloutsWithOnlySystems)
108615370292SArya K Padman {
108715370292SArya K Padman     std::vector<std::string> systemNames;
108815370292SArya K Padman 
108915370292SArya K Padman     auto json = R"(
109015370292SArya K Padman         [
109115370292SArya K Padman         {
109215370292SArya K Padman             "Systems": ["system1", "system2"],
109315370292SArya K Padman             "CalloutList":
109415370292SArya K Padman             [
109515370292SArya K Padman                 {
109615370292SArya K Padman                     "Priority": "high",
109715370292SArya K Padman                     "LocCode": "P1-C1"
109815370292SArya K Padman                 },
109915370292SArya K Padman                 {
110015370292SArya K Padman                     "Priority": "low",
110115370292SArya K Padman                     "LocCode": "P1"
110215370292SArya K Padman                 }
110315370292SArya K Padman             ]
110415370292SArya K Padman         }
110515370292SArya K Padman         ])"_json;
110615370292SArya K Padman 
110715370292SArya K Padman     AdditionalData ad;
110815370292SArya K Padman     systemNames.push_back("system1");
110915370292SArya K Padman 
111015370292SArya K Padman     // system1 is available in JSON array
111115370292SArya K Padman     auto callouts = Registry::getCallouts(json, systemNames, ad);
111215370292SArya K Padman     EXPECT_EQ(callouts.size(), 2);
111315370292SArya K Padman     EXPECT_EQ(callouts[0].priority, "high");
111415370292SArya K Padman     EXPECT_EQ(callouts[0].locCode, "P1-C1");
111515370292SArya K Padman     EXPECT_EQ(callouts[0].procedure, "");
111615370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRU, "");
111715370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRUTrusted, "");
111815370292SArya K Padman     EXPECT_EQ(callouts[1].priority, "low");
111915370292SArya K Padman     EXPECT_EQ(callouts[1].locCode, "P1");
112015370292SArya K Padman     EXPECT_EQ(callouts[1].procedure, "");
112115370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRU, "");
112215370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRUTrusted, "");
112315370292SArya K Padman 
112415370292SArya K Padman     // There is no entry for system3 or a default system,
112515370292SArya K Padman     // so this should fail.
112615370292SArya K Padman     systemNames[0] = "system3";
112715370292SArya K Padman     EXPECT_THROW(Registry::getCallouts(json, systemNames, ad),
112815370292SArya K Padman                  std::runtime_error);
112915370292SArya K Padman }
113015370292SArya K Padman 
TEST_F(RegistryTest,TestGetCalloutsWithOnlyDefaults)113115370292SArya K Padman TEST_F(RegistryTest, TestGetCalloutsWithOnlyDefaults)
113215370292SArya K Padman {
113315370292SArya K Padman     std::vector<std::string> systemNames;
113415370292SArya K Padman 
113515370292SArya K Padman     auto json = R"(
113615370292SArya K Padman         [
113715370292SArya K Padman         {
113815370292SArya K Padman             "CalloutList":
113915370292SArya K Padman             [
114015370292SArya K Padman                 {
114115370292SArya K Padman                     "Priority": "high",
114215370292SArya K Padman                     "LocCode": "P1-C1"
114315370292SArya K Padman                 },
114415370292SArya K Padman                 {
114515370292SArya K Padman                     "Priority": "low",
114615370292SArya K Padman                     "LocCode": "P1"
114715370292SArya K Padman                 }
114815370292SArya K Padman             ]
114915370292SArya K Padman         }
115015370292SArya K Padman         ])"_json;
115115370292SArya K Padman 
115215370292SArya K Padman     AdditionalData ad;
115315370292SArya K Padman     systemNames.push_back("system1");
115415370292SArya K Padman 
115515370292SArya K Padman     // Since neither System or Systems available, it will pick the default one
115615370292SArya K Padman     // only
115715370292SArya K Padman     auto callouts = Registry::getCallouts(json, systemNames, ad);
115815370292SArya K Padman     EXPECT_EQ(callouts.size(), 2);
115915370292SArya K Padman     EXPECT_EQ(callouts[0].priority, "high");
116015370292SArya K Padman     EXPECT_EQ(callouts[0].locCode, "P1-C1");
116115370292SArya K Padman     EXPECT_EQ(callouts[0].procedure, "");
116215370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRU, "");
116315370292SArya K Padman     EXPECT_EQ(callouts[0].symbolicFRUTrusted, "");
116415370292SArya K Padman     EXPECT_EQ(callouts[1].priority, "low");
116515370292SArya K Padman     EXPECT_EQ(callouts[1].locCode, "P1");
116615370292SArya K Padman     EXPECT_EQ(callouts[1].procedure, "");
116715370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRU, "");
116815370292SArya K Padman     EXPECT_EQ(callouts[1].symbolicFRUTrusted, "");
116915370292SArya K Padman }
117015370292SArya K Padman 
TEST_F(RegistryTest,TestNoSubsystem)117123970b0dSMatt Spinler TEST_F(RegistryTest, TestNoSubsystem)
117223970b0dSMatt Spinler {
117323970b0dSMatt Spinler     auto path = RegistryTest::writeData(registryData);
117423970b0dSMatt Spinler     Registry registry{path};
117523970b0dSMatt Spinler 
117623970b0dSMatt Spinler     auto entry = registry.lookup("xyz.openbmc_project.Common.Error.Timeout",
117723970b0dSMatt Spinler                                  LookupType::name);
117823970b0dSMatt Spinler     ASSERT_TRUE(entry);
117923970b0dSMatt Spinler     EXPECT_FALSE(entry->subsystem);
118023970b0dSMatt Spinler }
1181711f1129SMatt Spinler 
TEST_F(RegistryTest,TestJournalSectionCapture)1182711f1129SMatt Spinler TEST_F(RegistryTest, TestJournalSectionCapture)
1183711f1129SMatt Spinler {
1184711f1129SMatt Spinler     auto path = RegistryTest::writeData(registryData);
1185711f1129SMatt Spinler     Registry registry{path};
1186711f1129SMatt Spinler 
1187711f1129SMatt Spinler     auto entry = registry.lookup("xyz.openbmc_project.Journal.Capture",
1188711f1129SMatt Spinler                                  LookupType::name);
1189711f1129SMatt Spinler     ASSERT_TRUE(entry);
1190711f1129SMatt Spinler 
1191711f1129SMatt Spinler     const auto& jc = entry->journalCapture;
1192711f1129SMatt Spinler     ASSERT_TRUE(jc);
1193711f1129SMatt Spinler     ASSERT_TRUE(std::holds_alternative<AppCaptureList>(*jc));
1194711f1129SMatt Spinler     const auto& acl = std::get<AppCaptureList>(*jc);
1195711f1129SMatt Spinler 
1196711f1129SMatt Spinler     ASSERT_EQ(acl.size(), 2);
1197711f1129SMatt Spinler 
1198711f1129SMatt Spinler     EXPECT_EQ(acl[0].syslogID, "test1");
1199711f1129SMatt Spinler     EXPECT_EQ(acl[0].numLines, 5);
1200711f1129SMatt Spinler 
1201711f1129SMatt Spinler     EXPECT_EQ(acl[1].syslogID, "test2");
1202711f1129SMatt Spinler     EXPECT_EQ(acl[1].numLines, 6);
1203711f1129SMatt Spinler }
1204