1 #include <stdio.h>
2 
3 #include <analyzer/analyzer_main.hpp>
4 #include <analyzer/plugins/plugin.hpp>
5 #include <analyzer/ras-data/ras-data-parser.hpp>
6 #include <hei_util.hpp>
7 #include <util/pdbg.hpp>
8 #include <util/trace.hpp>
9 
10 #include "gtest/gtest.h"
11 
12 namespace analyzer
13 {
14 // Forward reference of filterRootCause
15 bool filterRootCause(AnalysisType i_type,
16                      const libhei::IsolationData& i_isoData,
17                      libhei::Signature& o_rootCause,
18                      const RasDataParser& i_rasData);
19 } // namespace analyzer
20 
21 using namespace analyzer;
22 
23 static const auto eqCoreFir = static_cast<libhei::NodeId_t>(
24     libhei::hash<libhei::NodeId_t>("EQ_CORE_FIR"));
25 
26 static const auto rdfFir =
27     static_cast<libhei::NodeId_t>(libhei::hash<libhei::NodeId_t>("RDFFIR"));
28 
29 static const auto mc_dstl_fir = static_cast<libhei::NodeId_t>(
30     libhei::hash<libhei::NodeId_t>("MC_DSTL_FIR"));
31 
32 TEST(RootCauseFilter, Filter1)
33 {
34     pdbg_targets_init(nullptr);
35 
36     RasDataParser rasData{};
37 
38     // Test 1: Test a checkstop with a UE root cause on an OCMB
39 
40     // Checkstop signature on the proc
41     auto proc0 = util::pdbg::getTrgt("/proc0");
42     libhei::Chip procChip0{proc0, P10_20};
43 
44     // EQ_CORE_FIR[14]: ME = 0 checkstop
45     libhei::Signature checkstopSig{procChip0, eqCoreFir, 0, 14,
46                                    libhei::ATTN_TYPE_CHECKSTOP};
47 
48     // MC_DSTL_FIR[1]: AFU initiated Recoverable Attn on Subchannel A
49     libhei::Signature reAttnSig{procChip0, mc_dstl_fir, 0, 1,
50                                 libhei::ATTN_TYPE_RECOVERABLE};
51 
52     // Root cause signature on the ocmb
53     auto ocmb0 =
54         util::pdbg::getTrgt("proc0/pib/perv12/mc0/mi0/mcc0/omi0/ocmb0");
55     libhei::Chip ocmbChip0{ocmb0, EXPLORER_20};
56 
57     // RDFFIR[14]: Mainline read UE
58     libhei::Signature ueSig{ocmbChip0, rdfFir, 0, 14,
59                             libhei::ATTN_TYPE_RECOVERABLE};
60 
61     // Add the signatures to the isolation data
62     libhei::IsolationData isoData{};
63     isoData.addSignature(checkstopSig);
64     isoData.addSignature(reAttnSig);
65     isoData.addSignature(ueSig);
66 
67     libhei::Signature rootCause;
68     bool attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
69                                      rootCause, rasData);
70     EXPECT_TRUE(attnFound);
71     EXPECT_EQ(ueSig.toUint32(), rootCause.toUint32());
72 
73     // Test 2: Test a checkstop with an unknown RE attn on an OCMB
74 
75     // Add the signatures to the isolation data
76     isoData.flush();
77     isoData.addSignature(checkstopSig);
78     isoData.addSignature(reAttnSig);
79 
80     attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
81                                 rootCause, rasData);
82     EXPECT_TRUE(attnFound);
83     EXPECT_EQ(reAttnSig.toUint32(), rootCause.toUint32());
84 
85     // Test 3: Test a checkstop with an unknown UCS attn on an OCMB
86 
87     // MC_DSTL_FIR[0]: AFU initiated Checkstop on Subchannel A
88     libhei::Signature ucsAttnSig{procChip0, mc_dstl_fir, 0, 0,
89                                  libhei::ATTN_TYPE_UNIT_CS};
90 
91     isoData.flush();
92     isoData.addSignature(checkstopSig);
93     isoData.addSignature(ucsAttnSig);
94 
95     attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
96                                 rootCause, rasData);
97     EXPECT_TRUE(attnFound);
98     EXPECT_EQ(ucsAttnSig.toUint32(), rootCause.toUint32());
99 
100     // Test 4: Test a checkstop with a non-root cause recoverable from an OCMB
101 
102     // RDFFIR[42]: SCOM recoverable register parity error
103     libhei::Signature reSig{ocmbChip0, rdfFir, 0, 42,
104                             libhei::ATTN_TYPE_RECOVERABLE};
105 
106     isoData.flush();
107     isoData.addSignature(checkstopSig);
108     isoData.addSignature(reAttnSig);
109     isoData.addSignature(reSig);
110 
111     attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
112                                 rootCause, rasData);
113     EXPECT_TRUE(attnFound);
114     EXPECT_EQ(checkstopSig.toUint32(), rootCause.toUint32());
115 }
116