xref: /openbmc/phosphor-logging/test/openpower-pels/device_callouts_test.cpp (revision 70e8a11beb0b2783f609872a197b1dbca6636009)
118c42b0fSMatt Spinler /**
218c42b0fSMatt Spinler  * Copyright © 2020 IBM Corporation
318c42b0fSMatt Spinler  *
418c42b0fSMatt Spinler  * Licensed under the Apache License, Version 2.0 (the "License");
518c42b0fSMatt Spinler  * you may not use this file except in compliance with the License.
618c42b0fSMatt Spinler  * You may obtain a copy of the License at
718c42b0fSMatt Spinler  *
818c42b0fSMatt Spinler  *     http://www.apache.org/licenses/LICENSE-2.0
918c42b0fSMatt Spinler  *
1018c42b0fSMatt Spinler  * Unless required by applicable law or agreed to in writing, software
1118c42b0fSMatt Spinler  * distributed under the License is distributed on an "AS IS" BASIS,
1218c42b0fSMatt Spinler  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1318c42b0fSMatt Spinler  * See the License for the specific language governing permissions and
1418c42b0fSMatt Spinler  * limitations under the License.
1518c42b0fSMatt Spinler  */
1618c42b0fSMatt Spinler 
1718c42b0fSMatt Spinler #include "extensions/openpower-pels/device_callouts.hpp"
1818c42b0fSMatt Spinler #include "extensions/openpower-pels/paths.hpp"
1918c42b0fSMatt Spinler 
2018c42b0fSMatt Spinler #include <fstream>
2118c42b0fSMatt Spinler 
2218c42b0fSMatt Spinler #include <gtest/gtest.h>
2318c42b0fSMatt Spinler 
2418c42b0fSMatt Spinler using namespace openpower::pels;
2518c42b0fSMatt Spinler using namespace openpower::pels::device_callouts;
2618c42b0fSMatt Spinler namespace fs = std::filesystem;
2718c42b0fSMatt Spinler 
2818c42b0fSMatt Spinler // The callout JSON looks like:
2918c42b0fSMatt Spinler // "I2C":
3018c42b0fSMatt Spinler //   "<bus>":
3118c42b0fSMatt Spinler //     "<address>":
3218c42b0fSMatt Spinler //       "Callouts": ...
3318c42b0fSMatt Spinler //
3418c42b0fSMatt Spinler // "FSI":
3518c42b0fSMatt Spinler //   "<fsi link>":
3618c42b0fSMatt Spinler //     "Callouts": ...
3718c42b0fSMatt Spinler //
3818c42b0fSMatt Spinler // "FSI-I2C":
3918c42b0fSMatt Spinler //    "<fsi link>":
4018c42b0fSMatt Spinler //      "<bus>":
4118c42b0fSMatt Spinler //        "<address>":
4218c42b0fSMatt Spinler //          "Callouts": ...
4318c42b0fSMatt Spinler //
4418c42b0fSMatt Spinler // "FSI-SPI":
4518c42b0fSMatt Spinler //    "<fsi link>":
4618c42b0fSMatt Spinler //      "<bus>":
4718c42b0fSMatt Spinler //        "Callouts": ...
4818c42b0fSMatt Spinler 
4918c42b0fSMatt Spinler const auto calloutJSON = R"(
5018c42b0fSMatt Spinler {
5118c42b0fSMatt Spinler     "I2C":
5218c42b0fSMatt Spinler     {
5318c42b0fSMatt Spinler         "0":
5418c42b0fSMatt Spinler         {
5518c42b0fSMatt Spinler             "32":
5618c42b0fSMatt Spinler             {
5718c42b0fSMatt Spinler                 "Callouts":[
5818c42b0fSMatt Spinler                     {
5918c42b0fSMatt Spinler                        "Name": "/chassis/motherboard/cpu0",
6018c42b0fSMatt Spinler                        "LocationCode": "P1-C19",
6118c42b0fSMatt Spinler                        "Priority": "H"
6218c42b0fSMatt Spinler                     }
6318c42b0fSMatt Spinler                 ],
6418c42b0fSMatt Spinler                 "Dest": "proc-0 target"
6518c42b0fSMatt Spinler             },
6618c42b0fSMatt Spinler             "81":
6718c42b0fSMatt Spinler             {
6818c42b0fSMatt Spinler                 "Callouts":[
6918c42b0fSMatt Spinler                     {
7018c42b0fSMatt Spinler                        "Name": "/chassis/motherboard/cpu0",
7118c42b0fSMatt Spinler                        "LocationCode": "P1-C19",
7218c42b0fSMatt Spinler                        "Priority": "H"
7318c42b0fSMatt Spinler                     }
7418c42b0fSMatt Spinler                 ],
7518c42b0fSMatt Spinler                 "Dest": "proc-0 target"
766bc74ae6SMatt Spinler             },
776bc74ae6SMatt Spinler             "90":
786bc74ae6SMatt Spinler             {
796bc74ae6SMatt Spinler                 "Callouts":[
806bc74ae6SMatt Spinler                     {
816bc74ae6SMatt Spinler                        "Name": "This is missing the location code",
826bc74ae6SMatt Spinler                        "Priority": "H"
836bc74ae6SMatt Spinler                     }
846bc74ae6SMatt Spinler                 ],
856bc74ae6SMatt Spinler                 "Dest": "proc-0 target"
8618c42b0fSMatt Spinler             }
8718c42b0fSMatt Spinler         },
8818c42b0fSMatt Spinler         "14":
8918c42b0fSMatt Spinler         {
9018c42b0fSMatt Spinler             "112":
9118c42b0fSMatt Spinler             {
9218c42b0fSMatt Spinler                 "Callouts":[
9318c42b0fSMatt Spinler                     {
9418c42b0fSMatt Spinler                        "Name": "/chassis/motherboard/cpu0",
9518c42b0fSMatt Spinler                        "LocationCode": "P1-C19",
9618c42b0fSMatt Spinler                        "Priority": "H"
9718c42b0fSMatt Spinler                     }
9818c42b0fSMatt Spinler                 ],
9918c42b0fSMatt Spinler                 "Dest": "proc-0 target"
10018c42b0fSMatt Spinler             },
10118c42b0fSMatt Spinler             "114":
10218c42b0fSMatt Spinler             {
10318c42b0fSMatt Spinler                 "Callouts":[
10418c42b0fSMatt Spinler                     {
10518c42b0fSMatt Spinler                        "Name": "/chassis/motherboard/cpu0",
10618c42b0fSMatt Spinler                        "LocationCode": "P1-C19",
1076bc74ae6SMatt Spinler                        "Priority": "H",
1086bc74ae6SMatt Spinler                        "MRU": "core0"
10918c42b0fSMatt Spinler                     },
11018c42b0fSMatt Spinler                     {
11118c42b0fSMatt Spinler                        "Name": "/chassis/motherboard",
11218c42b0fSMatt Spinler                        "LocationCode": "P1",
11318c42b0fSMatt Spinler                        "Priority": "M"
11418c42b0fSMatt Spinler                     }
11518c42b0fSMatt Spinler                 ],
11618c42b0fSMatt Spinler                 "Dest": "proc-0 target"
11718c42b0fSMatt Spinler             }
11818c42b0fSMatt Spinler         }
11918c42b0fSMatt Spinler     },
12018c42b0fSMatt Spinler     "FSI":
12118c42b0fSMatt Spinler     {
12218c42b0fSMatt Spinler         "0":
12318c42b0fSMatt Spinler         {
12418c42b0fSMatt Spinler            "Callouts":[
12518c42b0fSMatt Spinler                 {
12618c42b0fSMatt Spinler                     "Name": "/chassis/motherboard/cpu0",
12718c42b0fSMatt Spinler                     "LocationCode": "P1-C19",
12818c42b0fSMatt Spinler                     "Priority": "H"
12918c42b0fSMatt Spinler                 }
13018c42b0fSMatt Spinler            ],
13118c42b0fSMatt Spinler            "Dest": "proc-0 target"
13218c42b0fSMatt Spinler         },
13318c42b0fSMatt Spinler         "0-1":
13418c42b0fSMatt Spinler         {
13518c42b0fSMatt Spinler            "Callouts":[
13618c42b0fSMatt Spinler                 {
13718c42b0fSMatt Spinler                     "Name": "/chassis/motherboard/cpu0",
13818c42b0fSMatt Spinler                     "LocationCode": "P1-C19",
13918c42b0fSMatt Spinler                     "Priority": "H",
14018c42b0fSMatt Spinler                     "MRU": "core"
14118c42b0fSMatt Spinler                 }
14218c42b0fSMatt Spinler            ],
14318c42b0fSMatt Spinler            "Dest": "proc-0 target"
14418c42b0fSMatt Spinler         }
14518c42b0fSMatt Spinler     },
14618c42b0fSMatt Spinler     "FSI-I2C":
14718c42b0fSMatt Spinler     {
14818c42b0fSMatt Spinler         "0-3":
14918c42b0fSMatt Spinler         {
15018c42b0fSMatt Spinler            "7":
15118c42b0fSMatt Spinler            {
15218c42b0fSMatt Spinler               "24":
15318c42b0fSMatt Spinler               {
15418c42b0fSMatt Spinler                  "Callouts":[
15518c42b0fSMatt Spinler                     {
15618c42b0fSMatt Spinler                        "Name": "/chassis/motherboard/cpu0",
15718c42b0fSMatt Spinler                        "LocationCode": "P1-C19",
15818c42b0fSMatt Spinler                        "Priority": "H"
15918c42b0fSMatt Spinler                     }
16018c42b0fSMatt Spinler                  ],
16118c42b0fSMatt Spinler                  "Dest": "proc-0 target"
16218c42b0fSMatt Spinler               },
16318c42b0fSMatt Spinler               "25":
16418c42b0fSMatt Spinler               {
16518c42b0fSMatt Spinler                  "Callouts":[
16618c42b0fSMatt Spinler                     {
16718c42b0fSMatt Spinler                        "Name": "/chassis/motherboard/cpu5",
16818c42b0fSMatt Spinler                        "LocationCode": "P1-C25",
16918c42b0fSMatt Spinler                        "Priority": "H"
17018c42b0fSMatt Spinler                     },
17118c42b0fSMatt Spinler                     {
17218c42b0fSMatt Spinler                        "Name": "/chassis/motherboard",
17318c42b0fSMatt Spinler                        "LocationCode": "P1",
17418c42b0fSMatt Spinler                        "Priority": "M"
17518c42b0fSMatt Spinler                     },
17618c42b0fSMatt Spinler                     {
17718c42b0fSMatt Spinler                         "Name": "/chassis/motherboard/bmc",
17818c42b0fSMatt Spinler                         "LocationCode": "P2",
17918c42b0fSMatt Spinler                         "Priority": "L"
18018c42b0fSMatt Spinler                     }
18118c42b0fSMatt Spinler                  ],
18218c42b0fSMatt Spinler                  "Dest": "proc-5 target"
18318c42b0fSMatt Spinler               }
18418c42b0fSMatt Spinler            }
18518c42b0fSMatt Spinler         }
18618c42b0fSMatt Spinler     },
18718c42b0fSMatt Spinler     "FSI-SPI":
18818c42b0fSMatt Spinler     {
18918c42b0fSMatt Spinler         "8":
19018c42b0fSMatt Spinler         {
19118c42b0fSMatt Spinler             "3":
19218c42b0fSMatt Spinler             {
19318c42b0fSMatt Spinler                 "Callouts":[
19418c42b0fSMatt Spinler                     {
19518c42b0fSMatt Spinler                        "Name": "/chassis/motherboard/cpu0",
19618c42b0fSMatt Spinler                        "LocationCode": "P1-C19",
19718c42b0fSMatt Spinler                        "Priority": "H"
19818c42b0fSMatt Spinler                     }
19918c42b0fSMatt Spinler                 ],
20018c42b0fSMatt Spinler                 "Dest": "proc-0 target"
20118c42b0fSMatt Spinler             },
20218c42b0fSMatt Spinler             "4":
20318c42b0fSMatt Spinler             {
20418c42b0fSMatt Spinler                 "Callouts":[
20518c42b0fSMatt Spinler                     {
2066bc74ae6SMatt Spinler                        "Name": "/chassis/motherboard/cpu2",
2076bc74ae6SMatt Spinler                        "LocationCode": "P1-C12",
2086bc74ae6SMatt Spinler                        "Priority": "M"
20918c42b0fSMatt Spinler                     }
21018c42b0fSMatt Spinler                 ],
21118c42b0fSMatt Spinler                 "Dest": "proc-0 target"
21218c42b0fSMatt Spinler             }
21318c42b0fSMatt Spinler         }
21418c42b0fSMatt Spinler     }
21518c42b0fSMatt Spinler })"_json;
21618c42b0fSMatt Spinler 
21718c42b0fSMatt Spinler class DeviceCalloutsTest : public ::testing::Test
21818c42b0fSMatt Spinler {
21918c42b0fSMatt Spinler   public:
SetUpTestCase()22018c42b0fSMatt Spinler     static void SetUpTestCase()
22118c42b0fSMatt Spinler     {
22218c42b0fSMatt Spinler         dataPath = getPELReadOnlyDataPath();
22318c42b0fSMatt Spinler         std::ofstream file{dataPath / filename};
22418c42b0fSMatt Spinler         file << calloutJSON.dump();
22518c42b0fSMatt Spinler     }
22618c42b0fSMatt Spinler 
TearDownTestCase()22718c42b0fSMatt Spinler     static void TearDownTestCase()
22818c42b0fSMatt Spinler     {
22918c42b0fSMatt Spinler         fs::remove_all(dataPath);
23018c42b0fSMatt Spinler     }
23118c42b0fSMatt Spinler 
23218c42b0fSMatt Spinler     static std::string filename;
23318c42b0fSMatt Spinler     static fs::path dataPath;
23418c42b0fSMatt Spinler };
23518c42b0fSMatt Spinler 
23618c42b0fSMatt Spinler std::string DeviceCalloutsTest::filename = "systemA_dev_callouts.json";
23718c42b0fSMatt Spinler fs::path DeviceCalloutsTest::dataPath;
23818c42b0fSMatt Spinler 
2396bc74ae6SMatt Spinler namespace openpower::pels::device_callouts
2406bc74ae6SMatt Spinler {
2416bc74ae6SMatt Spinler 
2426bc74ae6SMatt Spinler // Helpers to compair vectors of Callout objects
operator !=(const Callout & left,const Callout & right)2436bc74ae6SMatt Spinler bool operator!=(const Callout& left, const Callout& right)
2446bc74ae6SMatt Spinler {
2456bc74ae6SMatt Spinler     return (left.priority != right.priority) ||
2466bc74ae6SMatt Spinler            (left.locationCode != right.locationCode) ||
2476bc74ae6SMatt Spinler            (left.name != right.name) || (left.mru != right.mru) ||
2486bc74ae6SMatt Spinler            (left.debug != right.debug);
2496bc74ae6SMatt Spinler }
2506bc74ae6SMatt Spinler 
operator ==(const std::vector<Callout> & left,const std::vector<Callout> & right)2516bc74ae6SMatt Spinler bool operator==(const std::vector<Callout>& left,
2526bc74ae6SMatt Spinler                 const std::vector<Callout>& right)
2536bc74ae6SMatt Spinler {
2546bc74ae6SMatt Spinler     if (left.size() != right.size())
2556bc74ae6SMatt Spinler     {
2566bc74ae6SMatt Spinler         return false;
2576bc74ae6SMatt Spinler     }
2586bc74ae6SMatt Spinler 
2596bc74ae6SMatt Spinler     for (size_t i = 0; i < left.size(); i++)
2606bc74ae6SMatt Spinler     {
2616bc74ae6SMatt Spinler         if (left[i] != right[i])
2626bc74ae6SMatt Spinler         {
2636bc74ae6SMatt Spinler             return false;
2646bc74ae6SMatt Spinler         }
2656bc74ae6SMatt Spinler     }
2666bc74ae6SMatt Spinler 
2676bc74ae6SMatt Spinler     return true;
2686bc74ae6SMatt Spinler }
2696bc74ae6SMatt Spinler 
2706bc74ae6SMatt Spinler } // namespace openpower::pels::device_callouts
2716bc74ae6SMatt Spinler 
27218c42b0fSMatt Spinler // Test looking up the JSON file based on the system compatible names
TEST_F(DeviceCalloutsTest,getJSONFilenameTest)27318c42b0fSMatt Spinler TEST_F(DeviceCalloutsTest, getJSONFilenameTest)
27418c42b0fSMatt Spinler {
27518c42b0fSMatt Spinler     {
27618c42b0fSMatt Spinler         std::vector<std::string> compatibles{"system1", "systemA", "system3"};
27718c42b0fSMatt Spinler         EXPECT_EQ(util::getJSONFilename(compatibles),
27818c42b0fSMatt Spinler                   fs::path{dataPath / filename});
27918c42b0fSMatt Spinler     }
28018c42b0fSMatt Spinler 
28118c42b0fSMatt Spinler     // Actual filename not in compatibles
28218c42b0fSMatt Spinler     {
28318c42b0fSMatt Spinler         std::vector<std::string> compatibles{"system5", "system6"};
28418c42b0fSMatt Spinler         EXPECT_THROW(util::getJSONFilename(compatibles), std::invalid_argument);
28518c42b0fSMatt Spinler     }
2860f8a7382SMatt Spinler 
2870f8a7382SMatt Spinler     // Test using the fallback name
2880f8a7382SMatt Spinler     {
2890f8a7382SMatt Spinler         // If _dev_callouts.json is there, it will be used if no other
2900f8a7382SMatt Spinler         // match is found.
2910f8a7382SMatt Spinler         fs::path fallbackFile{dataPath / "_dev_callouts.json"};
2920f8a7382SMatt Spinler         std::ofstream file{fallbackFile};
2930f8a7382SMatt Spinler         file << calloutJSON.dump();
2940f8a7382SMatt Spinler         file.close();
2950f8a7382SMatt Spinler 
2960f8a7382SMatt Spinler         // Fallback shouldn't be used because the actual systemA file is there
2970f8a7382SMatt Spinler         {
2980f8a7382SMatt Spinler             std::vector<std::string> compatibles{"system1", "systemA",
2990f8a7382SMatt Spinler                                                  "system3"};
3000f8a7382SMatt Spinler             EXPECT_EQ(util::getJSONFilename(compatibles),
3010f8a7382SMatt Spinler                       fs::path{dataPath / filename});
3020f8a7382SMatt Spinler         }
3030f8a7382SMatt Spinler 
3040f8a7382SMatt Spinler         // Fallback should be used because no other match
3050f8a7382SMatt Spinler         {
3060f8a7382SMatt Spinler             std::vector<std::string> compatibles{"systemX", "systemY"};
3070f8a7382SMatt Spinler             EXPECT_EQ(util::getJSONFilename(compatibles), fallbackFile);
3080f8a7382SMatt Spinler         }
3090f8a7382SMatt Spinler     }
31018c42b0fSMatt Spinler }
311a307089cSMatt Spinler 
312a307089cSMatt Spinler // Test determining the callout type from the device path
TEST_F(DeviceCalloutsTest,getCalloutTypeTest)313a307089cSMatt Spinler TEST_F(DeviceCalloutsTest, getCalloutTypeTest)
314a307089cSMatt Spinler {
315a307089cSMatt Spinler     // Invalid
316a307089cSMatt Spinler     {
317a307089cSMatt Spinler         EXPECT_EQ(util::getCalloutType("/some/bad/device/path"),
318a307089cSMatt Spinler                   util::CalloutType::unknown);
319a307089cSMatt Spinler     }
320a307089cSMatt Spinler 
321a307089cSMatt Spinler     // I2C
322a307089cSMatt Spinler     {
323a307089cSMatt Spinler         EXPECT_EQ(util::getCalloutType(
324a307089cSMatt Spinler                       "/sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/"
325*70e8a11bSMatt Spinler                       "1e78a340.i2c/i2c-14/14-0072"),
326a307089cSMatt Spinler                   util::CalloutType::i2c);
327a307089cSMatt Spinler     }
328a307089cSMatt Spinler 
329a307089cSMatt Spinler     // FSI
330a307089cSMatt Spinler     {
331a307089cSMatt Spinler         EXPECT_EQ(util::getCalloutType(
332a307089cSMatt Spinler                       "/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/"
333a307089cSMatt Spinler                       "fsi-master/fsi0/slave@00:00/00:00:00:0a/fsi-master/fsi1/"
334a307089cSMatt Spinler                       "slave@01:00/01:01:00:06/sbefifo2-dev0/occ-hwmon.2"),
335a307089cSMatt Spinler                   util::CalloutType::fsi);
336a307089cSMatt Spinler     }
337a307089cSMatt Spinler 
338a307089cSMatt Spinler     // FSI-I2C
339a307089cSMatt Spinler     {
340a307089cSMatt Spinler         EXPECT_EQ(util::getCalloutType(
341a307089cSMatt Spinler                       "/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/"
342a307089cSMatt Spinler                       "fsi-master/fsi0/slave@00:00/00:00:00:0a/fsi-master/fsi1/"
343a307089cSMatt Spinler                       "slave@01:00/01:01:00:03/i2c-211/211-0055"),
344a307089cSMatt Spinler                   util::CalloutType::fsii2c);
345a307089cSMatt Spinler     }
346a307089cSMatt Spinler 
347a307089cSMatt Spinler     // FSI-SPI
348a307089cSMatt Spinler     {
349a307089cSMatt Spinler         EXPECT_EQ(
350a307089cSMatt Spinler             util::getCalloutType(
351a307089cSMatt Spinler                 "/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/fsi-master/"
352a307089cSMatt Spinler                 "fsi0/slave@00:00/00:00:00:0a/fsi-master/fsi1/slave@08:00/"
353a307089cSMatt Spinler                 "01:03:00:04/spi_master/spi9/spi9.0/spi9.00/nvmem"),
354a307089cSMatt Spinler             util::CalloutType::fsispi);
355a307089cSMatt Spinler     }
356a307089cSMatt Spinler }
35744c0a643SMatt Spinler 
35844c0a643SMatt Spinler // Test getting I2C search keys
TEST_F(DeviceCalloutsTest,getI2CSearchKeysTest)35944c0a643SMatt Spinler TEST_F(DeviceCalloutsTest, getI2CSearchKeysTest)
36044c0a643SMatt Spinler {
36144c0a643SMatt Spinler     {
36244c0a643SMatt Spinler         EXPECT_EQ(util::getI2CSearchKeys(
36344c0a643SMatt Spinler                       "/sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/"
364*70e8a11bSMatt Spinler                       "1e78a340.i2c/i2c-10/10-0022"),
36544c0a643SMatt Spinler                   (std::tuple{10, 0x22}));
36644c0a643SMatt Spinler 
36744c0a643SMatt Spinler         EXPECT_EQ(util::getI2CSearchKeys(
36844c0a643SMatt Spinler                       "/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/"
36944c0a643SMatt Spinler                       "fsi-master/fsi0/slave@00:00/00:00:00:0a/fsi-master/fsi1/"
37044c0a643SMatt Spinler                       "slave@01:00/01:01:00:03/i2c-211/211-0055"),
37144c0a643SMatt Spinler                   (std::tuple{11, 0x55}));
37244c0a643SMatt Spinler     }
37344c0a643SMatt Spinler 
37444c0a643SMatt Spinler     {
37544c0a643SMatt Spinler         EXPECT_THROW(util::getI2CSearchKeys("/sys/some/bad/path"),
37644c0a643SMatt Spinler                      std::invalid_argument);
37744c0a643SMatt Spinler     }
37844c0a643SMatt Spinler }
37944c0a643SMatt Spinler //
38044c0a643SMatt Spinler // Test getting SPI search keys
TEST_F(DeviceCalloutsTest,getSPISearchKeysTest)38144c0a643SMatt Spinler TEST_F(DeviceCalloutsTest, getSPISearchKeysTest)
38244c0a643SMatt Spinler {
38344c0a643SMatt Spinler     {
38444c0a643SMatt Spinler         EXPECT_EQ(
38544c0a643SMatt Spinler             util::getSPISearchKeys(
38644c0a643SMatt Spinler                 "/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/fsi-master/"
38744c0a643SMatt Spinler                 "fsi0/slave@00:00/00:00:00:0a/fsi-master/fsi1/slave@08:00/"
38844c0a643SMatt Spinler                 "01:03:00:04/spi_master/spi9/spi9.0/spi9.00/nvmem"),
38944c0a643SMatt Spinler             9);
39044c0a643SMatt Spinler     }
39144c0a643SMatt Spinler 
39244c0a643SMatt Spinler     {
39344c0a643SMatt Spinler         EXPECT_THROW(util::getSPISearchKeys("/sys/some/bad/path"),
39444c0a643SMatt Spinler                      std::invalid_argument);
39544c0a643SMatt Spinler     }
39644c0a643SMatt Spinler }
39744c0a643SMatt Spinler 
39844c0a643SMatt Spinler // Test getting FSI search keys
TEST_F(DeviceCalloutsTest,getFSISearchKeysTest)39944c0a643SMatt Spinler TEST_F(DeviceCalloutsTest, getFSISearchKeysTest)
40044c0a643SMatt Spinler {
40144c0a643SMatt Spinler     {
40244c0a643SMatt Spinler         EXPECT_EQ(util::getFSISearchKeys(
40344c0a643SMatt Spinler                       "/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/"
40444c0a643SMatt Spinler                       "fsi-master/fsi0/slave@00:00/00:00:00:04/spi_master/spi2/"
40544c0a643SMatt Spinler                       "spi2.0/spi2.00/nvmem"),
40644c0a643SMatt Spinler                   "0");
40744c0a643SMatt Spinler     }
40844c0a643SMatt Spinler 
40944c0a643SMatt Spinler     {
41044c0a643SMatt Spinler         EXPECT_EQ(util::getFSISearchKeys(
41144c0a643SMatt Spinler                       "/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/"
41244c0a643SMatt Spinler                       "fsi-master/fsi0/slave@00:00/00:00:00:0a/fsi-master/fsi1/"
41344c0a643SMatt Spinler                       "slave@01:00/01:01:00:06/sbefifo2-dev0/occ-hwmon.2"),
41444c0a643SMatt Spinler                   "0-1");
41544c0a643SMatt Spinler     }
41644c0a643SMatt Spinler 
41744c0a643SMatt Spinler     {
41844c0a643SMatt Spinler         EXPECT_EQ(
41944c0a643SMatt Spinler             util::getFSISearchKeys(
42044c0a643SMatt Spinler                 "/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/"
42144c0a643SMatt Spinler                 "fsi-master/fsi0/slave@00:00/00:00:00:0a/fsi-master/fsi1/"
42244c0a643SMatt Spinler                 "slave@01:00/01:01:00:0a:/fsi-master/slave@04:00/01:01:00:0a"),
42344c0a643SMatt Spinler             "0-1-4");
42444c0a643SMatt Spinler     }
42544c0a643SMatt Spinler 
42644c0a643SMatt Spinler     {
42744c0a643SMatt Spinler         EXPECT_THROW(util::getFSISearchKeys("/sys/some/bad/path"),
42844c0a643SMatt Spinler                      std::invalid_argument);
42944c0a643SMatt Spinler     }
43044c0a643SMatt Spinler }
43144c0a643SMatt Spinler 
43244c0a643SMatt Spinler // Test getting FSI-I2C search keys
TEST_F(DeviceCalloutsTest,getFSII2CSearchKeysTest)43344c0a643SMatt Spinler TEST_F(DeviceCalloutsTest, getFSII2CSearchKeysTest)
43444c0a643SMatt Spinler {
43544c0a643SMatt Spinler     {
43644c0a643SMatt Spinler         // Link 0-1 bus 11 address 0x55
43744c0a643SMatt Spinler         EXPECT_EQ(util::getFSII2CSearchKeys(
43844c0a643SMatt Spinler                       "/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/"
43944c0a643SMatt Spinler                       "fsi-master/fsi0/slave@00:00/00:00:00:0a/fsi-master/fsi1/"
44044c0a643SMatt Spinler                       "slave@01:00/01:01:00:03/i2c-211/211-0055"),
44144c0a643SMatt Spinler                   (std::tuple{"0-1", std::tuple{11, 0x55}}));
44244c0a643SMatt Spinler     }
44344c0a643SMatt Spinler 
44444c0a643SMatt Spinler     {
44544c0a643SMatt Spinler         EXPECT_THROW(util::getFSII2CSearchKeys("/sys/some/bad/path"),
44644c0a643SMatt Spinler                      std::invalid_argument);
44744c0a643SMatt Spinler     }
44844c0a643SMatt Spinler }
44944c0a643SMatt Spinler 
45044c0a643SMatt Spinler // Test getting FSI-SPI search keys
TEST_F(DeviceCalloutsTest,getFSISPISearchKeysTest)45144c0a643SMatt Spinler TEST_F(DeviceCalloutsTest, getFSISPISearchKeysTest)
45244c0a643SMatt Spinler {
45344c0a643SMatt Spinler     {
45444c0a643SMatt Spinler         // Link 0-8 SPI 9
45544c0a643SMatt Spinler         EXPECT_EQ(
45644c0a643SMatt Spinler             util::getFSISPISearchKeys(
45744c0a643SMatt Spinler                 "/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/fsi-master/"
45844c0a643SMatt Spinler                 "fsi0/slave@00:00/00:00:00:0a/fsi-master/fsi1/slave@08:00/"
45944c0a643SMatt Spinler                 "01:03:00:04/spi_master/spi9/spi9.0/spi9.00/nvmem"),
46044c0a643SMatt Spinler             (std::tuple{"0-8", 9}));
46144c0a643SMatt Spinler     }
46244c0a643SMatt Spinler 
46344c0a643SMatt Spinler     {
46444c0a643SMatt Spinler         EXPECT_THROW(util::getFSISPISearchKeys("/sys/some/bad/path"),
46544c0a643SMatt Spinler                      std::invalid_argument);
46644c0a643SMatt Spinler     }
46744c0a643SMatt Spinler }
4686bc74ae6SMatt Spinler 
TEST_F(DeviceCalloutsTest,getCalloutsTest)4696bc74ae6SMatt Spinler TEST_F(DeviceCalloutsTest, getCalloutsTest)
4706bc74ae6SMatt Spinler {
4716bc74ae6SMatt Spinler     std::vector<std::string> systemTypes{"systemA", "systemB"};
4726bc74ae6SMatt Spinler 
4736bc74ae6SMatt Spinler     // A really bogus path
4746bc74ae6SMatt Spinler     {
4756bc74ae6SMatt Spinler         EXPECT_THROW(getCallouts("/bad/path", systemTypes),
4766bc74ae6SMatt Spinler                      std::invalid_argument);
4776bc74ae6SMatt Spinler     }
4786bc74ae6SMatt Spinler 
4796bc74ae6SMatt Spinler     // I2C
4806bc74ae6SMatt Spinler     {
4816bc74ae6SMatt Spinler         auto callouts = getCallouts(
4826bc74ae6SMatt Spinler             "/sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/"
483*70e8a11bSMatt Spinler             "1e78a340.i2c/i2c-14/14-0072",
4846bc74ae6SMatt Spinler             systemTypes);
4856bc74ae6SMatt Spinler 
4866bc74ae6SMatt Spinler         std::vector<Callout> expected{
4876bc74ae6SMatt Spinler             {"H", "P1-C19", "/chassis/motherboard/cpu0", "core0",
4886bc74ae6SMatt Spinler              "I2C: bus: 14 address: 114 dest: proc-0 target"},
4896bc74ae6SMatt Spinler             {"M", "P1", "/chassis/motherboard", "", ""}};
4906bc74ae6SMatt Spinler 
4916bc74ae6SMatt Spinler         EXPECT_EQ(callouts, expected);
4926bc74ae6SMatt Spinler 
4936bc74ae6SMatt Spinler         // Use the bus/address API instead of the device path one
4946bc74ae6SMatt Spinler         callouts = getI2CCallouts(14, 0x72, systemTypes);
4956bc74ae6SMatt Spinler         EXPECT_EQ(callouts, expected);
4966bc74ae6SMatt Spinler 
4976bc74ae6SMatt Spinler         // I2C address not in JSON
4986bc74ae6SMatt Spinler         EXPECT_THROW(
4996bc74ae6SMatt Spinler             getCallouts(
5006bc74ae6SMatt Spinler                 "/sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/"
501*70e8a11bSMatt Spinler                 "1e78a340.i2c/i2c-14/14-0099",
5026bc74ae6SMatt Spinler                 systemTypes),
5036bc74ae6SMatt Spinler             std::invalid_argument);
5046bc74ae6SMatt Spinler 
5056bc74ae6SMatt Spinler         // A bad JSON entry, missing the location code
5066bc74ae6SMatt Spinler         EXPECT_THROW(
5076bc74ae6SMatt Spinler             getCallouts(
5086bc74ae6SMatt Spinler                 "/sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/"
509*70e8a11bSMatt Spinler                 "1e78a340.i2c/i2c-0/0-005a",
5106bc74ae6SMatt Spinler                 systemTypes),
5116bc74ae6SMatt Spinler             std::runtime_error);
5126bc74ae6SMatt Spinler     }
5136bc74ae6SMatt Spinler 
5146bc74ae6SMatt Spinler     // FSI
5156bc74ae6SMatt Spinler     {
5166bc74ae6SMatt Spinler         auto callouts = getCallouts(
5176bc74ae6SMatt Spinler             "/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/"
5186bc74ae6SMatt Spinler             "fsi-master/fsi0/slave@00:00/00:00:00:0a/fsi-master/fsi1/"
5196bc74ae6SMatt Spinler             "slave@01:00/01:01:00:06/sbefifo2-dev0/occ-hwmon.2",
5206bc74ae6SMatt Spinler             systemTypes);
5216bc74ae6SMatt Spinler 
522075c7923SPatrick Williams         std::vector<Callout> expected{
523075c7923SPatrick Williams             {"H", "P1-C19", "/chassis/motherboard/cpu0", "core",
5246bc74ae6SMatt Spinler              "FSI: links: 0-1 dest: proc-0 target"}};
5256bc74ae6SMatt Spinler 
5266bc74ae6SMatt Spinler         EXPECT_EQ(callouts, expected);
5276bc74ae6SMatt Spinler 
5286bc74ae6SMatt Spinler         // link 9-1 not in JSON
5296bc74ae6SMatt Spinler         EXPECT_THROW(
5306bc74ae6SMatt Spinler             getCallouts(
5316bc74ae6SMatt Spinler                 "/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/"
5326bc74ae6SMatt Spinler                 "fsi-master/fsi0/slave@09:00/00:00:00:0a/fsi-master/fsi1/"
5336bc74ae6SMatt Spinler                 "slave@01:00/01:01:00:06/sbefifo2-dev0/occ-hwmon.2",
5346bc74ae6SMatt Spinler                 systemTypes),
5356bc74ae6SMatt Spinler             std::invalid_argument);
5366bc74ae6SMatt Spinler     }
5376bc74ae6SMatt Spinler 
5386bc74ae6SMatt Spinler     // FSI-I2C
5396bc74ae6SMatt Spinler     {
5406bc74ae6SMatt Spinler         auto callouts = getCallouts(
5416bc74ae6SMatt Spinler             "/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/"
5426bc74ae6SMatt Spinler             "fsi-master/fsi0/slave@00:00/00:00:00:0a/fsi-master/fsi1/"
5436bc74ae6SMatt Spinler             "slave@03:00/01:01:00:03/i2c-207/207-0019",
5446bc74ae6SMatt Spinler             systemTypes);
5456bc74ae6SMatt Spinler 
5466bc74ae6SMatt Spinler         std::vector<Callout> expected{
5476bc74ae6SMatt Spinler             {"H", "P1-C25", "/chassis/motherboard/cpu5", "",
5486bc74ae6SMatt Spinler              "FSI-I2C: links: 0-3 bus: 7 addr: 25 dest: proc-5 target"},
5496bc74ae6SMatt Spinler             {"M", "P1", "/chassis/motherboard", "", ""},
5506bc74ae6SMatt Spinler             {"L", "P2", "/chassis/motherboard/bmc", "", ""}};
5516bc74ae6SMatt Spinler 
5526bc74ae6SMatt Spinler         EXPECT_EQ(callouts, expected);
5536bc74ae6SMatt Spinler 
5546bc74ae6SMatt Spinler         // Bus 2 not in JSON
5556bc74ae6SMatt Spinler         EXPECT_THROW(
5566bc74ae6SMatt Spinler             getCallouts(
5576bc74ae6SMatt Spinler                 "/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/"
5586bc74ae6SMatt Spinler                 "fsi-master/fsi0/slave@00:00/00:00:00:0a/fsi-master/fsi1/"
5596bc74ae6SMatt Spinler                 "slave@03:00/01:01:00:03/i2c-202/202-0019",
5606bc74ae6SMatt Spinler                 systemTypes),
5616bc74ae6SMatt Spinler             std::invalid_argument);
5626bc74ae6SMatt Spinler     }
5636bc74ae6SMatt Spinler 
5646bc74ae6SMatt Spinler     // FSI-SPI
5656bc74ae6SMatt Spinler     {
5666bc74ae6SMatt Spinler         auto callouts =
5676bc74ae6SMatt Spinler             getCallouts("/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/"
5686bc74ae6SMatt Spinler                         "fsi-master/fsi0/slave@08:00/00:00:00:04/spi_master/"
5696bc74ae6SMatt Spinler                         "spi3/spi3.0/spi3.00/nvmem",
5706bc74ae6SMatt Spinler                         systemTypes);
5716bc74ae6SMatt Spinler 
5726bc74ae6SMatt Spinler         std::vector<Callout> expected{
5736bc74ae6SMatt Spinler             {"H", "P1-C19", "/chassis/motherboard/cpu0", "",
5746bc74ae6SMatt Spinler              "FSI-SPI: links: 8 bus: 3 dest: proc-0 target"}};
5756bc74ae6SMatt Spinler 
5766bc74ae6SMatt Spinler         EXPECT_EQ(callouts, expected);
5776bc74ae6SMatt Spinler 
5786bc74ae6SMatt Spinler         // Bus 7 not in the JSON
5796bc74ae6SMatt Spinler         EXPECT_THROW(
5806bc74ae6SMatt Spinler             getCallouts("/sys/devices/platform/ahb/ahb:apb/1e79b000.fsi/"
5816bc74ae6SMatt Spinler                         "fsi-master/fsi0/slave@08:00/00:00:00:04/spi_master/"
5826bc74ae6SMatt Spinler                         "spi7/spi7.0/spi7.00/nvmem",
5836bc74ae6SMatt Spinler                         systemTypes),
5846bc74ae6SMatt Spinler             std::invalid_argument);
5856bc74ae6SMatt Spinler     }
5866bc74ae6SMatt Spinler }
587