1 #include <attn/attention.hpp>
2 #include <attn/attn_common.hpp>
3 #include <attn/attn_config.hpp>
4 #include <attn/attn_handler.hpp>
5 #include <util/pdbg.hpp>
6 #include <util/trace.hpp>
7 
8 #include "gtest/gtest.h"
9 
10 namespace attn
11 {
12 // these are in the attn_lib but not all exposed via headers
13 int handleSpecial(Attention* i_attention);
14 } // namespace attn
15 
16 using namespace attn;
17 using namespace util::pdbg;
18 
19 /** @brief global function to be called back. */
20 int handleAttention(Attention* attention)
21 {
22     int rc = RC_SUCCESS;
23     if (attention != nullptr)
24     {
25         return rc;
26     }
27     else
28     {
29         return RC_NOT_HANDLED;
30     }
31 }
32 
33 // Global variables for UT #1 and UT#2.
34 // Attention type
35 Attention::AttentionType gType = Attention::AttentionType::Special;
36 // pointer to handler callback function
37 int (*gHandler)(Attention*)   = &(handleSpecial);
38 const AttentionFlag gAttnFlag = AttentionFlag::enBreakpoints;
39 
40 // Start preparation for UT case #1.
41 
42 // Global variables for UT #1
43 const char* gPosPath = "/proc0/pib/perv12";
44 const uint32_t gPos  = 12;
45 
46 /** @brief Fixture class for TEST_F(). */
47 class AttentionTestPos : public testing::Test
48 {
49   public:
50     AttentionTestPos() {}
51 
52     void SetUp()
53     {
54         pdbg_targets_init(nullptr);
55 
56         target = pdbg_target_from_path(nullptr, gPosPath);
57         EXPECT_NE(nullptr, target);
58 
59         config = new Config;
60         EXPECT_EQ(true, config->getFlag(gAttnFlag));
61 
62         pAttn = std::make_unique<Attention>(
63             Attention(gType, gHandler, target, config));
64     }
65 
66     void TearDown()
67     {
68         delete config;
69     }
70 
71     std::unique_ptr<Attention> pAttn;
72     Config* config      = nullptr;
73     pdbg_target* target = nullptr;
74 };
75 
76 TEST_F(AttentionTestPos, TestAttnTargetPos)
77 {
78     EXPECT_EQ(0, pAttn->getPriority());
79     EXPECT_EQ(RC_SUCCESS, pAttn->handle());
80 
81     // Verify the global target_tmp.
82     EXPECT_NE(nullptr, target);
83     uint32_t attr = std::numeric_limits<uint32_t>::max();
84     pdbg_target_get_attribute(target, "ATTR_FAPI_POS", 4, 1, &attr);
85     EXPECT_EQ(gPos, attr);
86 
87     // Verify the target in Attention object.
88     attr                    = std::numeric_limits<uint32_t>::max();
89     pdbg_target* target_tmp = pAttn->getTarget();
90     EXPECT_NE(nullptr, target_tmp);
91     pdbg_target_get_attribute(target_tmp, "ATTR_FAPI_POS", 4, 1, &attr);
92     EXPECT_EQ(gPos, attr);
93 
94     // Verify the config in Attention object.
95     Config* config_tmp = pAttn->getConfig();
96     EXPECT_EQ(true, config_tmp->getFlag(gAttnFlag));
97     config_tmp->clearFlag(gAttnFlag);
98     EXPECT_EQ(false, config_tmp->getFlag(gAttnFlag));
99     config_tmp->setFlag(gAttnFlag);
100     EXPECT_EQ(true, config_tmp->getFlag(gAttnFlag));
101 }
102 
103 // Start preparation for UT case #2.
104 
105 // Global variables for UT #2
106 const uint32_t gChipId = 0x20da; // Chip ID for proc0.
107 
108 /** @brief Fixture class for TEST_F(). */
109 class AttentionTestProc : public testing::Test
110 {
111   public:
112     AttentionTestProc() {}
113 
114     void SetUp()
115     {
116         pdbg_targets_init(nullptr);
117         target = getPrimaryProcessor();
118 
119         EXPECT_NE(nullptr, target);
120 
121         attr = std::numeric_limits<uint32_t>::max();
122         attr = getTrgtType(target);
123 
124         EXPECT_EQ(TYPE_PROC, attr);
125 
126         attr = std::numeric_limits<uint32_t>::max();
127         pdbg_target_get_attribute(target, "ATTR_CHIP_ID", 4, 1, &attr);
128         EXPECT_EQ(attr, gChipId);
129 
130         config = new Config;
131         EXPECT_EQ(true, config->getFlag(gAttnFlag));
132 
133         pAttn = std::make_unique<Attention>(
134             Attention(gType, gHandler, target, config));
135     }
136 
137     void TearDown()
138     {
139         delete config;
140     }
141 
142     std::unique_ptr<Attention> pAttn;
143     Config* config      = nullptr;
144     pdbg_target* target = nullptr;
145     uint32_t attr;
146 };
147 
148 TEST_F(AttentionTestProc, TestAttentionProc)
149 {
150     EXPECT_EQ(0, pAttn->getPriority());
151     EXPECT_EQ(RC_SUCCESS, pAttn->handle());
152 
153     // Verify the target in Attention object.
154     attr                    = std::numeric_limits<uint32_t>::max();
155     pdbg_target* target_tmp = pAttn->getTarget();
156     EXPECT_NE(nullptr, target_tmp);
157     attr = getTrgtType(target_tmp);
158     EXPECT_EQ(TYPE_PROC, attr);
159 
160     attr = std::numeric_limits<uint32_t>::max();
161     pdbg_target_get_attribute(target_tmp, "ATTR_CHIP_ID", 4, 1, &attr);
162     EXPECT_EQ(attr, gChipId);
163 
164     // Verify the config in Attention object.
165     Config* config_tmp = pAttn->getConfig();
166     EXPECT_EQ(true, config_tmp->getFlag(gAttnFlag));
167     config_tmp->clearFlag(gAttnFlag);
168     EXPECT_EQ(false, config_tmp->getFlag(gAttnFlag));
169     config_tmp->setFlag(gAttnFlag);
170     EXPECT_EQ(true, config_tmp->getFlag(gAttnFlag));
171 }