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 */
166c9662c9SMatt Spinler #include "extensions/openpower-pels/callout.hpp"
176c9662c9SMatt Spinler #include "pel_utils.hpp"
186c9662c9SMatt Spinler
196c9662c9SMatt Spinler #include <gtest/gtest.h>
206c9662c9SMatt Spinler
216c9662c9SMatt Spinler using namespace openpower::pels;
226c9662c9SMatt Spinler using namespace openpower::pels::src;
236c9662c9SMatt Spinler
246c9662c9SMatt Spinler // Unflatten the callout section with all three substructures
TEST(CalloutTest,TestUnflattenAllSubstructures)256c9662c9SMatt Spinler TEST(CalloutTest, TestUnflattenAllSubstructures)
266c9662c9SMatt Spinler {
276c9662c9SMatt Spinler // The base data.
286c9662c9SMatt Spinler std::vector<uint8_t> data{
296c9662c9SMatt Spinler 0xFF, 0x2F, 'H', 8, // size, flags, priority, LC length
306c9662c9SMatt Spinler 'U', '1', '2', '-', 'P', '1', 0x00, 0x00 // LC
316c9662c9SMatt Spinler };
326c9662c9SMatt Spinler
336c9662c9SMatt Spinler auto fruIdentity = srcDataFactory(TestSRCType::fruIdentityStructure);
346c9662c9SMatt Spinler auto pceIdentity = srcDataFactory(TestSRCType::pceIdentityStructure);
356c9662c9SMatt Spinler auto mrus = srcDataFactory(TestSRCType::mruStructure);
366c9662c9SMatt Spinler
376c9662c9SMatt Spinler // Add all 3 substructures
386c9662c9SMatt Spinler data.insert(data.end(), fruIdentity.begin(), fruIdentity.end());
396c9662c9SMatt Spinler data.insert(data.end(), pceIdentity.begin(), pceIdentity.end());
406c9662c9SMatt Spinler data.insert(data.end(), mrus.begin(), mrus.end());
416c9662c9SMatt Spinler
426c9662c9SMatt Spinler // The final size
436c9662c9SMatt Spinler data[0] = data.size();
446c9662c9SMatt Spinler
456c9662c9SMatt Spinler Stream stream{data};
466c9662c9SMatt Spinler Callout callout{stream};
476c9662c9SMatt Spinler
486c9662c9SMatt Spinler EXPECT_EQ(callout.flattenedSize(), data.size());
496c9662c9SMatt Spinler EXPECT_EQ(callout.priority(), 'H');
506c9662c9SMatt Spinler EXPECT_EQ(callout.locationCode(), "U12-P1");
516c9662c9SMatt Spinler
526c9662c9SMatt Spinler // Spot check the 3 substructures
536c9662c9SMatt Spinler EXPECT_TRUE(callout.fruIdentity());
546c9662c9SMatt Spinler EXPECT_EQ(callout.fruIdentity()->getSN(), "123456789ABC");
556c9662c9SMatt Spinler
566c9662c9SMatt Spinler EXPECT_TRUE(callout.pceIdentity());
576c9662c9SMatt Spinler EXPECT_EQ(callout.pceIdentity()->enclosureName(), "PCENAME12");
586c9662c9SMatt Spinler
596c9662c9SMatt Spinler EXPECT_TRUE(callout.mru());
606c9662c9SMatt Spinler EXPECT_EQ(callout.mru()->mrus().size(), 4);
616c9662c9SMatt Spinler EXPECT_EQ(callout.mru()->mrus().at(3).id, 0x04040404);
626c9662c9SMatt Spinler
636c9662c9SMatt Spinler // Now flatten
646c9662c9SMatt Spinler std::vector<uint8_t> newData;
656c9662c9SMatt Spinler Stream newStream{newData};
666c9662c9SMatt Spinler
676c9662c9SMatt Spinler callout.flatten(newStream);
686c9662c9SMatt Spinler EXPECT_EQ(data, newData);
696c9662c9SMatt Spinler }
706c9662c9SMatt Spinler
TEST(CalloutTest,TestUnflattenOneSubstructure)716c9662c9SMatt Spinler TEST(CalloutTest, TestUnflattenOneSubstructure)
726c9662c9SMatt Spinler {
736c9662c9SMatt Spinler std::vector<uint8_t> data{
746c9662c9SMatt Spinler 0xFF, 0x28, 'H', 0x08, // size, flags, priority, LC length
756c9662c9SMatt Spinler 'U', '1', '2', '-', 'P', '1', 0x00, 0x00 // LC
766c9662c9SMatt Spinler };
776c9662c9SMatt Spinler
786c9662c9SMatt Spinler auto fruIdentity = srcDataFactory(TestSRCType::fruIdentityStructure);
796c9662c9SMatt Spinler
806c9662c9SMatt Spinler data.insert(data.end(), fruIdentity.begin(), fruIdentity.end());
816c9662c9SMatt Spinler
826c9662c9SMatt Spinler // The final size
836c9662c9SMatt Spinler data[0] = data.size();
846c9662c9SMatt Spinler
856c9662c9SMatt Spinler Stream stream{data};
866c9662c9SMatt Spinler Callout callout{stream};
876c9662c9SMatt Spinler
886c9662c9SMatt Spinler EXPECT_EQ(callout.flattenedSize(), data.size());
896c9662c9SMatt Spinler
906c9662c9SMatt Spinler // Spot check the substructure
916c9662c9SMatt Spinler EXPECT_TRUE(callout.fruIdentity());
926c9662c9SMatt Spinler EXPECT_EQ(callout.fruIdentity()->getSN(), "123456789ABC");
936c9662c9SMatt Spinler
946c9662c9SMatt Spinler // Not present
956c9662c9SMatt Spinler EXPECT_FALSE(callout.pceIdentity());
966c9662c9SMatt Spinler EXPECT_FALSE(callout.mru());
976c9662c9SMatt Spinler
986c9662c9SMatt Spinler // Now flatten
996c9662c9SMatt Spinler std::vector<uint8_t> newData;
1006c9662c9SMatt Spinler Stream newStream{newData};
1016c9662c9SMatt Spinler
1026c9662c9SMatt Spinler callout.flatten(newStream);
1036c9662c9SMatt Spinler EXPECT_EQ(data, newData);
1046c9662c9SMatt Spinler }
1056c9662c9SMatt Spinler
TEST(CalloutTest,TestUnflattenTwoSubstructures)1066c9662c9SMatt Spinler TEST(CalloutTest, TestUnflattenTwoSubstructures)
1076c9662c9SMatt Spinler {
1086c9662c9SMatt Spinler std::vector<uint8_t> data{
1096c9662c9SMatt Spinler 0xFF, 0x2B, 'H', 0x08, // size, flags, priority, LC length
1106c9662c9SMatt Spinler 'U', '1', '2', '-', 'P', '1', 0x00, 0x00 // LC
1116c9662c9SMatt Spinler };
1126c9662c9SMatt Spinler
1136c9662c9SMatt Spinler auto fruIdentity = srcDataFactory(TestSRCType::fruIdentityStructure);
1146c9662c9SMatt Spinler auto pceIdentity = srcDataFactory(TestSRCType::pceIdentityStructure);
1156c9662c9SMatt Spinler
1166c9662c9SMatt Spinler data.insert(data.end(), fruIdentity.begin(), fruIdentity.end());
1176c9662c9SMatt Spinler data.insert(data.end(), pceIdentity.begin(), pceIdentity.end());
1186c9662c9SMatt Spinler
1196c9662c9SMatt Spinler // The final size
1206c9662c9SMatt Spinler data[0] = data.size();
1216c9662c9SMatt Spinler
1226c9662c9SMatt Spinler Stream stream{data};
1236c9662c9SMatt Spinler Callout callout{stream};
1246c9662c9SMatt Spinler
1256c9662c9SMatt Spinler EXPECT_EQ(callout.flattenedSize(), data.size());
1266c9662c9SMatt Spinler
1276c9662c9SMatt Spinler // Spot check the 2 substructures
1286c9662c9SMatt Spinler EXPECT_TRUE(callout.fruIdentity());
1296c9662c9SMatt Spinler EXPECT_EQ(callout.fruIdentity()->getSN(), "123456789ABC");
1306c9662c9SMatt Spinler
1316c9662c9SMatt Spinler EXPECT_TRUE(callout.pceIdentity());
1326c9662c9SMatt Spinler EXPECT_EQ(callout.pceIdentity()->enclosureName(), "PCENAME12");
1336c9662c9SMatt Spinler
1346c9662c9SMatt Spinler // Not present
1356c9662c9SMatt Spinler EXPECT_FALSE(callout.mru());
1366c9662c9SMatt Spinler
1376c9662c9SMatt Spinler // Now flatten
1386c9662c9SMatt Spinler std::vector<uint8_t> newData;
1396c9662c9SMatt Spinler Stream newStream{newData};
1406c9662c9SMatt Spinler
1416c9662c9SMatt Spinler callout.flatten(newStream);
1426c9662c9SMatt Spinler EXPECT_EQ(data, newData);
1436c9662c9SMatt Spinler }
1446c9662c9SMatt Spinler
TEST(CalloutTest,TestNoLocationCode)1456c9662c9SMatt Spinler TEST(CalloutTest, TestNoLocationCode)
1466c9662c9SMatt Spinler {
1476c9662c9SMatt Spinler std::vector<uint8_t> data{
1486c9662c9SMatt Spinler 0xFF, 0x2B, 'H', 0x00 // size, flags, priority, LC length
1496c9662c9SMatt Spinler };
1506c9662c9SMatt Spinler
1516c9662c9SMatt Spinler auto fruIdentity = srcDataFactory(TestSRCType::fruIdentityStructure);
1526c9662c9SMatt Spinler data.insert(data.end(), fruIdentity.begin(), fruIdentity.end());
1536c9662c9SMatt Spinler
1546c9662c9SMatt Spinler // The final size
1556c9662c9SMatt Spinler data[0] = data.size();
1566c9662c9SMatt Spinler
1576c9662c9SMatt Spinler Stream stream{data};
1586c9662c9SMatt Spinler Callout callout{stream};
1596c9662c9SMatt Spinler
1606c9662c9SMatt Spinler EXPECT_TRUE(callout.locationCode().empty());
1616c9662c9SMatt Spinler }
1620a5d10ceSMatt Spinler
1630a5d10ceSMatt Spinler // Create a callout object by passing in the hardware fields to add
TEST(CalloutTest,TestHardwareCallout)1640a5d10ceSMatt Spinler TEST(CalloutTest, TestHardwareCallout)
1650a5d10ceSMatt Spinler {
1660a5d10ceSMatt Spinler constexpr size_t fruIdentitySize = 28;
1670a5d10ceSMatt Spinler
1680a5d10ceSMatt Spinler {
1690a5d10ceSMatt Spinler Callout callout{CalloutPriority::high, "U99-42.5-P1-C2-E1", "1234567",
1700a5d10ceSMatt Spinler "ABCD", "123456789ABC"};
1710a5d10ceSMatt Spinler
1720a5d10ceSMatt Spinler // size/flags/pri/locsize fields +
1730a5d10ceSMatt Spinler // rounded up location code length +
1740a5d10ceSMatt Spinler // FRUIdentity size
1750a5d10ceSMatt Spinler size_t size = 4 + 20 + fruIdentitySize;
1760a5d10ceSMatt Spinler
1770a5d10ceSMatt Spinler EXPECT_EQ(callout.flags(),
1780a5d10ceSMatt Spinler Callout::calloutType | Callout::fruIdentIncluded);
1790a5d10ceSMatt Spinler
1800a5d10ceSMatt Spinler EXPECT_EQ(callout.flattenedSize(), size);
1810a5d10ceSMatt Spinler EXPECT_EQ(callout.priority(), 'H');
1820a5d10ceSMatt Spinler EXPECT_EQ(callout.locationCode(), "U99-42.5-P1-C2-E1");
1830a5d10ceSMatt Spinler EXPECT_EQ(callout.locationCodeSize(), 20);
1840a5d10ceSMatt Spinler
1850a5d10ceSMatt Spinler auto& fru = callout.fruIdentity();
1860a5d10ceSMatt Spinler EXPECT_EQ(fru->getPN().value(), "1234567");
1870a5d10ceSMatt Spinler EXPECT_EQ(fru->getCCIN().value(), "ABCD");
1880a5d10ceSMatt Spinler EXPECT_EQ(fru->getSN().value(), "123456789ABC");
1890a5d10ceSMatt Spinler }
1900a5d10ceSMatt Spinler
1910a5d10ceSMatt Spinler {
1920a5d10ceSMatt Spinler // A 3B location code, plus null = 4
1930a5d10ceSMatt Spinler Callout callout{CalloutPriority::high, "123", "1234567", "ABCD",
1940a5d10ceSMatt Spinler "123456789ABC"};
1950a5d10ceSMatt Spinler
1960a5d10ceSMatt Spinler size_t size = 4 + 4 + fruIdentitySize;
1970a5d10ceSMatt Spinler EXPECT_EQ(callout.locationCodeSize(), 4);
1980a5d10ceSMatt Spinler EXPECT_EQ(callout.flattenedSize(), size);
1990a5d10ceSMatt Spinler EXPECT_EQ(callout.locationCode(), "123");
2000a5d10ceSMatt Spinler }
2010a5d10ceSMatt Spinler
2020a5d10ceSMatt Spinler {
2030a5d10ceSMatt Spinler // A 4B location code, plus null = 5, then pad to 8
2040a5d10ceSMatt Spinler Callout callout{CalloutPriority::high, "1234", "1234567", "ABCD",
2050a5d10ceSMatt Spinler "123456789ABC"};
2060a5d10ceSMatt Spinler
2070a5d10ceSMatt Spinler size_t size = 4 + 8 + fruIdentitySize;
2080a5d10ceSMatt Spinler EXPECT_EQ(callout.locationCodeSize(), 8);
2090a5d10ceSMatt Spinler EXPECT_EQ(callout.flattenedSize(), size);
2100a5d10ceSMatt Spinler EXPECT_EQ(callout.locationCode(), "1234");
2110a5d10ceSMatt Spinler }
2120a5d10ceSMatt Spinler
2130a5d10ceSMatt Spinler {
2140a5d10ceSMatt Spinler // A truncated location code (80 is max size, including null)
2150a5d10ceSMatt Spinler std::string locCode(81, 'L');
2160a5d10ceSMatt Spinler Callout callout{CalloutPriority::high, locCode, "1234567", "ABCD",
2170a5d10ceSMatt Spinler "123456789ABC"};
2180a5d10ceSMatt Spinler
2190a5d10ceSMatt Spinler size_t size = 4 + 80 + fruIdentitySize;
2200a5d10ceSMatt Spinler EXPECT_EQ(callout.locationCodeSize(), 80);
2210a5d10ceSMatt Spinler EXPECT_EQ(callout.flattenedSize(), size);
2220a5d10ceSMatt Spinler
2230a5d10ceSMatt Spinler // take off 1 to get to 80, and another for the null
2240a5d10ceSMatt Spinler locCode = locCode.substr(0, locCode.size() - 2);
2250a5d10ceSMatt Spinler EXPECT_EQ(callout.locationCode(), locCode);
2260a5d10ceSMatt Spinler }
2270a5d10ceSMatt Spinler
2280a5d10ceSMatt Spinler {
2290a5d10ceSMatt Spinler // A truncated location code by 1 because of the null
2300a5d10ceSMatt Spinler std::string locCode(80, 'L');
2310a5d10ceSMatt Spinler Callout callout{CalloutPriority::high, locCode, "1234567", "ABCD",
2320a5d10ceSMatt Spinler "123456789ABC"};
2330a5d10ceSMatt Spinler
2340a5d10ceSMatt Spinler size_t size = 4 + 80 + fruIdentitySize;
2350a5d10ceSMatt Spinler EXPECT_EQ(callout.locationCodeSize(), 80);
2360a5d10ceSMatt Spinler EXPECT_EQ(callout.flattenedSize(), size);
2370a5d10ceSMatt Spinler
2380a5d10ceSMatt Spinler locCode.pop_back();
2390a5d10ceSMatt Spinler EXPECT_EQ(callout.locationCode(), locCode);
2400a5d10ceSMatt Spinler }
2410a5d10ceSMatt Spinler
2420a5d10ceSMatt Spinler {
2430a5d10ceSMatt Spinler // Max size location code
2440a5d10ceSMatt Spinler std::string locCode(79, 'L');
2450a5d10ceSMatt Spinler Callout callout{CalloutPriority::low, locCode, "1234567", "ABCD",
2460a5d10ceSMatt Spinler "123456789ABC"};
2470a5d10ceSMatt Spinler
2480a5d10ceSMatt Spinler size_t size = 4 + 80 + fruIdentitySize;
2490a5d10ceSMatt Spinler EXPECT_EQ(callout.locationCodeSize(), 80);
2500a5d10ceSMatt Spinler EXPECT_EQ(callout.flattenedSize(), size);
2510a5d10ceSMatt Spinler
2520a5d10ceSMatt Spinler EXPECT_EQ(callout.locationCode(), locCode);
2530a5d10ceSMatt Spinler
2540a5d10ceSMatt Spinler // How about we flatten/unflatten this last one
2550a5d10ceSMatt Spinler std::vector<uint8_t> data;
2560a5d10ceSMatt Spinler Stream stream{data};
2570a5d10ceSMatt Spinler
2580a5d10ceSMatt Spinler callout.flatten(stream);
2590a5d10ceSMatt Spinler
2600a5d10ceSMatt Spinler {
2610a5d10ceSMatt Spinler Stream newStream{data};
2620a5d10ceSMatt Spinler Callout newCallout{newStream};
2630a5d10ceSMatt Spinler
2640a5d10ceSMatt Spinler EXPECT_EQ(newCallout.flags(),
2650a5d10ceSMatt Spinler Callout::calloutType | Callout::fruIdentIncluded);
2660a5d10ceSMatt Spinler
2670a5d10ceSMatt Spinler EXPECT_EQ(newCallout.flattenedSize(), callout.flattenedSize());
2680a5d10ceSMatt Spinler EXPECT_EQ(newCallout.priority(), callout.priority());
2690a5d10ceSMatt Spinler EXPECT_EQ(newCallout.locationCode(), callout.locationCode());
2700a5d10ceSMatt Spinler EXPECT_EQ(newCallout.locationCodeSize(),
2710a5d10ceSMatt Spinler callout.locationCodeSize());
2720a5d10ceSMatt Spinler
2730a5d10ceSMatt Spinler auto& fru = newCallout.fruIdentity();
2740a5d10ceSMatt Spinler EXPECT_EQ(fru->getPN().value(), "1234567");
2750a5d10ceSMatt Spinler EXPECT_EQ(fru->getCCIN().value(), "ABCD");
2760a5d10ceSMatt Spinler EXPECT_EQ(fru->getSN().value(), "123456789ABC");
2770a5d10ceSMatt Spinler }
2780a5d10ceSMatt Spinler }
2795ab39978SMatt Spinler
2805ab39978SMatt Spinler {
2815ab39978SMatt Spinler // With MRUs
2825ab39978SMatt Spinler std::vector<MRU::MRUCallout> mruList{{'H', 1}, {'H', 2}};
2835ab39978SMatt Spinler
2845ab39978SMatt Spinler Callout callout{CalloutPriority::high, "U99-P5", "1234567", "ABCD",
2855ab39978SMatt Spinler "123456789ABC", mruList};
2865ab39978SMatt Spinler
287*075c7923SPatrick Williams EXPECT_EQ(callout.flags(),
288*075c7923SPatrick Williams Callout::calloutType | Callout::fruIdentIncluded |
2895ab39978SMatt Spinler Callout::mruIncluded);
2905ab39978SMatt Spinler
2915ab39978SMatt Spinler EXPECT_EQ(callout.priority(), 'H');
2925ab39978SMatt Spinler EXPECT_EQ(callout.locationCode(), "U99-P5");
2935ab39978SMatt Spinler EXPECT_EQ(callout.locationCodeSize(), 8);
2945ab39978SMatt Spinler
2955ab39978SMatt Spinler auto& fru = callout.fruIdentity();
2965ab39978SMatt Spinler EXPECT_EQ(fru->getPN().value(), "1234567");
2975ab39978SMatt Spinler EXPECT_EQ(fru->getCCIN().value(), "ABCD");
2985ab39978SMatt Spinler EXPECT_EQ(fru->getSN().value(), "123456789ABC");
2995ab39978SMatt Spinler
3005ab39978SMatt Spinler auto& mruSection = callout.mru();
3015ab39978SMatt Spinler EXPECT_EQ(mruSection->mrus().size(), 2);
3025ab39978SMatt Spinler EXPECT_EQ(mruSection->mrus().at(0).priority, 'H');
3035ab39978SMatt Spinler EXPECT_EQ(mruSection->mrus().at(0).id, 1);
3045ab39978SMatt Spinler EXPECT_EQ(mruSection->mrus().at(1).priority, 'H');
3055ab39978SMatt Spinler EXPECT_EQ(mruSection->mrus().at(1).id, 2);
3065ab39978SMatt Spinler }
3070a5d10ceSMatt Spinler }
3080a5d10ceSMatt Spinler
3090a5d10ceSMatt Spinler // Create a callout object by passing in the maintenance procedure to add.
TEST(CalloutTest,TestProcedureCallout)3100a5d10ceSMatt Spinler TEST(CalloutTest, TestProcedureCallout)
3110a5d10ceSMatt Spinler {
312479b6927SMatt Spinler Callout callout{CalloutPriority::medium, "bmc_code"};
3130a5d10ceSMatt Spinler
3140a5d10ceSMatt Spinler // size/flags/pri/locsize fields + FRUIdentity size
3150a5d10ceSMatt Spinler // No location code.
3160a5d10ceSMatt Spinler size_t size = 4 + 12;
3170a5d10ceSMatt Spinler
3180a5d10ceSMatt Spinler EXPECT_EQ(callout.flags(),
3190a5d10ceSMatt Spinler Callout::calloutType | Callout::fruIdentIncluded);
3200a5d10ceSMatt Spinler
3210a5d10ceSMatt Spinler EXPECT_EQ(callout.flattenedSize(), size);
3220a5d10ceSMatt Spinler EXPECT_EQ(callout.priority(), 'M');
3230a5d10ceSMatt Spinler EXPECT_EQ(callout.locationCode(), "");
3240a5d10ceSMatt Spinler EXPECT_EQ(callout.locationCodeSize(), 0);
3250a5d10ceSMatt Spinler
3260a5d10ceSMatt Spinler auto& fru = callout.fruIdentity();
327ea2873ddSMatt Spinler EXPECT_EQ(fru->getMaintProc().value(), "BMC0001");
3280a5d10ceSMatt Spinler
3290a5d10ceSMatt Spinler // flatten/unflatten
3300a5d10ceSMatt Spinler std::vector<uint8_t> data;
3310a5d10ceSMatt Spinler Stream stream{data};
3320a5d10ceSMatt Spinler
3330a5d10ceSMatt Spinler callout.flatten(stream);
3340a5d10ceSMatt Spinler
3350a5d10ceSMatt Spinler Stream newStream{data};
3360a5d10ceSMatt Spinler Callout newCallout{newStream};
3370a5d10ceSMatt Spinler
3380a5d10ceSMatt Spinler EXPECT_EQ(newCallout.flags(),
3390a5d10ceSMatt Spinler Callout::calloutType | Callout::fruIdentIncluded);
3400a5d10ceSMatt Spinler
3410a5d10ceSMatt Spinler EXPECT_EQ(newCallout.flattenedSize(), callout.flattenedSize());
3420a5d10ceSMatt Spinler EXPECT_EQ(newCallout.priority(), callout.priority());
3430a5d10ceSMatt Spinler EXPECT_EQ(newCallout.locationCode(), callout.locationCode());
3440a5d10ceSMatt Spinler EXPECT_EQ(newCallout.locationCodeSize(), callout.locationCodeSize());
3450a5d10ceSMatt Spinler
3460a5d10ceSMatt Spinler auto& newFRU = newCallout.fruIdentity();
3470a5d10ceSMatt Spinler EXPECT_EQ(newFRU->getMaintProc().value(), fru->getMaintProc().value());
348468aab5fSMatt Spinler
349468aab5fSMatt Spinler // Use raw procedure value
350468aab5fSMatt Spinler
351ea2873ddSMatt Spinler Callout rawCallout{CalloutPriority::medium, "BMCXXXX",
352468aab5fSMatt Spinler CalloutValueType::raw};
353468aab5fSMatt Spinler auto& rawFRU = rawCallout.fruIdentity();
354ea2873ddSMatt Spinler EXPECT_EQ(rawFRU->getMaintProc().value(), "BMCXXXX");
3550a5d10ceSMatt Spinler }
356a86ec996SMatt Spinler
357a86ec996SMatt Spinler // Create a callout object by passing in the symbolic FRU to add.
TEST(CalloutTest,TestSymbolicFRUCallout)358a86ec996SMatt Spinler TEST(CalloutTest, TestSymbolicFRUCallout)
359a86ec996SMatt Spinler {
360a86ec996SMatt Spinler // symbolic FRU with a location code
361a86ec996SMatt Spinler {
362a86ec996SMatt Spinler Callout callout{CalloutPriority::high, "service_docs", "P1-C3", false};
363a86ec996SMatt Spinler
364a86ec996SMatt Spinler // size/flags/pri/locsize fields + plus loc + FRUIdentity size
365a86ec996SMatt Spinler size_t size = 4 + 8 + 12;
366a86ec996SMatt Spinler
367a86ec996SMatt Spinler EXPECT_EQ(callout.flags(),
368a86ec996SMatt Spinler Callout::calloutType | Callout::fruIdentIncluded);
369a86ec996SMatt Spinler
370a86ec996SMatt Spinler EXPECT_EQ(callout.flattenedSize(), size);
371a86ec996SMatt Spinler EXPECT_EQ(callout.priority(), 'H');
372a86ec996SMatt Spinler EXPECT_EQ(callout.locationCode(), "P1-C3");
373a86ec996SMatt Spinler EXPECT_EQ(callout.locationCodeSize(), 8);
374a86ec996SMatt Spinler
375a86ec996SMatt Spinler auto& fru = callout.fruIdentity();
376a86ec996SMatt Spinler
377a86ec996SMatt Spinler EXPECT_EQ(fru->failingComponentType(), FRUIdentity::symbolicFRU);
378a86ec996SMatt Spinler EXPECT_EQ(fru->getPN().value(), "SVCDOCS");
379a86ec996SMatt Spinler }
380a86ec996SMatt Spinler
381a86ec996SMatt Spinler // symbolic FRU without a location code
382a86ec996SMatt Spinler {
383a86ec996SMatt Spinler Callout callout{CalloutPriority::high, "service_docs", "", false};
384a86ec996SMatt Spinler
385a86ec996SMatt Spinler // size/flags/pri/locsize fields + plus loc + FRUIdentity size
386a86ec996SMatt Spinler size_t size = 4 + 0 + 12;
387a86ec996SMatt Spinler
388a86ec996SMatt Spinler EXPECT_EQ(callout.flags(),
389a86ec996SMatt Spinler Callout::calloutType | Callout::fruIdentIncluded);
390a86ec996SMatt Spinler
391a86ec996SMatt Spinler EXPECT_EQ(callout.flattenedSize(), size);
392a86ec996SMatt Spinler EXPECT_EQ(callout.priority(), 'H');
393a86ec996SMatt Spinler EXPECT_EQ(callout.locationCode(), "");
394a86ec996SMatt Spinler EXPECT_EQ(callout.locationCodeSize(), 0);
395a86ec996SMatt Spinler
396a86ec996SMatt Spinler auto& fru = callout.fruIdentity();
397a86ec996SMatt Spinler
398a86ec996SMatt Spinler EXPECT_EQ(fru->failingComponentType(), FRUIdentity::symbolicFRU);
399a86ec996SMatt Spinler EXPECT_EQ(fru->getPN().value(), "SVCDOCS");
400a86ec996SMatt Spinler }
401a86ec996SMatt Spinler
402a86ec996SMatt Spinler // symbolic FRU with a trusted location code
403a86ec996SMatt Spinler {
404a86ec996SMatt Spinler Callout callout{CalloutPriority::high, "service_docs", "P1-C3", true};
405a86ec996SMatt Spinler
406a86ec996SMatt Spinler // size/flags/pri/locsize fields + plus loc + FRUIdentity size
407a86ec996SMatt Spinler size_t size = 4 + 8 + 12;
408a86ec996SMatt Spinler
409a86ec996SMatt Spinler EXPECT_EQ(callout.flags(),
410a86ec996SMatt Spinler Callout::calloutType | Callout::fruIdentIncluded);
411a86ec996SMatt Spinler
412a86ec996SMatt Spinler EXPECT_EQ(callout.flattenedSize(), size);
413a86ec996SMatt Spinler EXPECT_EQ(callout.priority(), 'H');
414a86ec996SMatt Spinler EXPECT_EQ(callout.locationCode(), "P1-C3");
415a86ec996SMatt Spinler EXPECT_EQ(callout.locationCodeSize(), 8);
416a86ec996SMatt Spinler
417a86ec996SMatt Spinler auto& fru = callout.fruIdentity();
418a86ec996SMatt Spinler EXPECT_EQ(fru->failingComponentType(),
419a86ec996SMatt Spinler FRUIdentity::symbolicFRUTrustedLocCode);
420a86ec996SMatt Spinler EXPECT_EQ(fru->getPN().value(), "SVCDOCS");
421a86ec996SMatt Spinler }
422468aab5fSMatt Spinler
423468aab5fSMatt Spinler // symbolic FRU with raw FRU value
424468aab5fSMatt Spinler {
425468aab5fSMatt Spinler {
426468aab5fSMatt Spinler Callout callout{CalloutPriority::high, "SYMBFRU",
427468aab5fSMatt Spinler CalloutValueType::raw, "", false};
428468aab5fSMatt Spinler
429468aab5fSMatt Spinler auto& fru = callout.fruIdentity();
430468aab5fSMatt Spinler
431468aab5fSMatt Spinler EXPECT_EQ(fru->getPN().value(), "SYMBFRU");
432468aab5fSMatt Spinler }
433468aab5fSMatt Spinler }
434a86ec996SMatt Spinler }
4354efed0efSMatt Spinler
TEST(CalloutTest,OperatorEqualTest)4364efed0efSMatt Spinler TEST(CalloutTest, OperatorEqualTest)
4374efed0efSMatt Spinler {
4384efed0efSMatt Spinler {
4394efed0efSMatt Spinler Callout c1{CalloutPriority::high, "A1", "1234567", "ABCD",
4404efed0efSMatt Spinler "123456789ABC"};
4414efed0efSMatt Spinler Callout c2{CalloutPriority::high, "A1", "1234567", "ABCD",
4424efed0efSMatt Spinler "123456789ABC"};
4434efed0efSMatt Spinler EXPECT_EQ(c1, c2);
4444efed0efSMatt Spinler }
4454efed0efSMatt Spinler
4464efed0efSMatt Spinler {
4474efed0efSMatt Spinler // Different location code
4484efed0efSMatt Spinler Callout c1{CalloutPriority::high, "A1", "1234567", "ABCD",
4494efed0efSMatt Spinler "123456789ABC"};
4504efed0efSMatt Spinler Callout c2{CalloutPriority::high, "A2", "1234567", "ABCD",
4514efed0efSMatt Spinler "123456789ABC"};
4524efed0efSMatt Spinler EXPECT_NE(c1, c2);
4534efed0efSMatt Spinler }
4544efed0efSMatt Spinler
4554efed0efSMatt Spinler {
4564efed0efSMatt Spinler // maintenance procedure
4574efed0efSMatt Spinler Callout c1{CalloutPriority::medium, "bmc_code"};
4584efed0efSMatt Spinler Callout c2{CalloutPriority::medium, "bmc_code"};
4594efed0efSMatt Spinler EXPECT_EQ(c1, c2);
4604efed0efSMatt Spinler }
4614efed0efSMatt Spinler
4624efed0efSMatt Spinler {
4634efed0efSMatt Spinler // different maintenance procedures
4644efed0efSMatt Spinler Callout c1{CalloutPriority::medium, "bmc_code"};
4654efed0efSMatt Spinler Callout c2{CalloutPriority::medium, "sbe_code"};
4664efed0efSMatt Spinler EXPECT_NE(c1, c2);
4674efed0efSMatt Spinler }
4684efed0efSMatt Spinler
4694efed0efSMatt Spinler {
4704efed0efSMatt Spinler // symbolic FRU
4714efed0efSMatt Spinler Callout c1{CalloutPriority::high, "service_docs", "", false};
4724efed0efSMatt Spinler Callout c2{CalloutPriority::high, "service_docs", "", false};
4734efed0efSMatt Spinler EXPECT_EQ(c1, c2);
4744efed0efSMatt Spinler }
4754efed0efSMatt Spinler
4764efed0efSMatt Spinler {
4774efed0efSMatt Spinler // different symbolic FRUs
4784efed0efSMatt Spinler Callout c1{CalloutPriority::high, "service_docs", "", false};
4794efed0efSMatt Spinler Callout c2{CalloutPriority::high, "air_mover", "", false};
4804efed0efSMatt Spinler EXPECT_NE(c1, c2);
4814efed0efSMatt Spinler }
4824efed0efSMatt Spinler
4834efed0efSMatt Spinler {
4844efed0efSMatt Spinler // HW callout vs symbolic FRU
4854efed0efSMatt Spinler Callout c1{CalloutPriority::high, "A1", "1234567", "ABCD",
4864efed0efSMatt Spinler "123456789ABC"};
4874efed0efSMatt Spinler Callout c2{CalloutPriority::high, "service_docs", "", false};
4884efed0efSMatt Spinler EXPECT_NE(c1, c2);
4894efed0efSMatt Spinler }
4904efed0efSMatt Spinler
4914efed0efSMatt Spinler {
4924efed0efSMatt Spinler // HW callout vs maintenance procedure
4934efed0efSMatt Spinler Callout c1{CalloutPriority::high, "A1", "1234567", "ABCD",
4944efed0efSMatt Spinler "123456789ABC"};
4954efed0efSMatt Spinler Callout c2{CalloutPriority::medium, "bmc_code"};
4964efed0efSMatt Spinler EXPECT_NE(c1, c2);
4974efed0efSMatt Spinler }
4984efed0efSMatt Spinler
4994efed0efSMatt Spinler {
5004efed0efSMatt Spinler // symbolic FRU vs maintenance procedure
5014efed0efSMatt Spinler Callout c1{CalloutPriority::high, "service_docs", "", false};
5024efed0efSMatt Spinler Callout c2{CalloutPriority::medium, "bmc_code"};
5034efed0efSMatt Spinler EXPECT_NE(c1, c2);
5044efed0efSMatt Spinler }
5054efed0efSMatt Spinler
5064efed0efSMatt Spinler {
5074efed0efSMatt Spinler // HW callout vs symbolic FRU is still considered equal if
5084efed0efSMatt Spinler // the location code is the same
5094efed0efSMatt Spinler Callout c1{CalloutPriority::high, "A1", "1234567", "ABCD",
5104efed0efSMatt Spinler "123456789ABC"};
5114efed0efSMatt Spinler Callout c2{CalloutPriority::high, "service_docs", "A1", true};
5124efed0efSMatt Spinler EXPECT_EQ(c1, c2);
5134efed0efSMatt Spinler }
5144efed0efSMatt Spinler }
5154efed0efSMatt Spinler
TEST(CalloutTest,OperatorGreaterThanTest)5164efed0efSMatt Spinler TEST(CalloutTest, OperatorGreaterThanTest)
5174efed0efSMatt Spinler {
5184efed0efSMatt Spinler {
5194efed0efSMatt Spinler Callout c1{CalloutPriority::high, "bmc_code"};
5204efed0efSMatt Spinler Callout c2{CalloutPriority::medium, "bmc_code"};
5214efed0efSMatt Spinler EXPECT_TRUE(c1 > c2);
5224efed0efSMatt Spinler }
5234efed0efSMatt Spinler {
5244efed0efSMatt Spinler Callout c1{CalloutPriority::high, "bmc_code"};
5254efed0efSMatt Spinler Callout c2{CalloutPriority::low, "bmc_code"};
5264efed0efSMatt Spinler EXPECT_TRUE(c1 > c2);
5274efed0efSMatt Spinler }
5284efed0efSMatt Spinler {
5294efed0efSMatt Spinler Callout c1{CalloutPriority::medium, "bmc_code"};
5304efed0efSMatt Spinler Callout c2{CalloutPriority::low, "bmc_code"};
5314efed0efSMatt Spinler EXPECT_TRUE(c1 > c2);
5324efed0efSMatt Spinler }
5334efed0efSMatt Spinler {
5344efed0efSMatt Spinler Callout c1{CalloutPriority::mediumGroupA, "bmc_code"};
5354efed0efSMatt Spinler Callout c2{CalloutPriority::low, "bmc_code"};
5364efed0efSMatt Spinler EXPECT_TRUE(c1 > c2);
5374efed0efSMatt Spinler }
5384efed0efSMatt Spinler {
5394efed0efSMatt Spinler Callout c1{CalloutPriority::medium, "bmc_code"};
5404efed0efSMatt Spinler Callout c2{CalloutPriority::high, "bmc_code"};
5414efed0efSMatt Spinler EXPECT_FALSE(c1 > c2);
5424efed0efSMatt Spinler }
5434efed0efSMatt Spinler {
5444efed0efSMatt Spinler Callout c1{CalloutPriority::high, "bmc_code"};
5454efed0efSMatt Spinler Callout c2{CalloutPriority::high, "bmc_code"};
5464efed0efSMatt Spinler EXPECT_FALSE(c1 > c2);
5474efed0efSMatt Spinler }
5484efed0efSMatt Spinler {
5494efed0efSMatt Spinler Callout c1{CalloutPriority::low, "bmc_code"};
5504efed0efSMatt Spinler Callout c2{CalloutPriority::high, "bmc_code"};
5514efed0efSMatt Spinler EXPECT_FALSE(c1 > c2);
5524efed0efSMatt Spinler }
5534efed0efSMatt Spinler {
5544efed0efSMatt Spinler // Treat the different mediums the same
5554efed0efSMatt Spinler Callout c1{CalloutPriority::medium, "bmc_code"};
5564efed0efSMatt Spinler Callout c2{CalloutPriority::mediumGroupA, "bmc_code"};
5574efed0efSMatt Spinler EXPECT_FALSE(c1 > c2);
5584efed0efSMatt Spinler }
5594efed0efSMatt Spinler }
560