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. */
handleAttention(Attention * attention)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:
AttentionTestPos()50 AttentionTestPos() {}
51
SetUp()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
TearDown()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
TEST_F(AttentionTestPos,TestAttnTargetPos)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:
AttentionTestProc()112 AttentionTestProc() {}
113
SetUp()114 void SetUp()
115 {
116 pdbg_targets_init(nullptr);
117 target = getPrimaryProcessor();
118
119 EXPECT_NE(nullptr, target);
120
121 attr = getTrgtType(target);
122 EXPECT_EQ(TYPE_PROC, attr);
123
124 attr = std::numeric_limits<uint32_t>::max();
125 pdbg_target_get_attribute(target, "ATTR_CHIP_ID", 4, 1, &attr);
126 EXPECT_EQ(attr, gChipId);
127
128 config = new Config;
129 EXPECT_EQ(true, config->getFlag(gAttnFlag));
130
131 pAttn = std::make_unique<Attention>(
132 Attention(gType, gHandler, target, config));
133 }
134
TearDown()135 void TearDown()
136 {
137 delete config;
138 }
139
140 std::unique_ptr<Attention> pAttn;
141 Config* config = nullptr;
142 pdbg_target* target = nullptr;
143 uint32_t attr = std::numeric_limits<uint32_t>::max();
144 };
145
TEST_F(AttentionTestProc,TestAttentionProc)146 TEST_F(AttentionTestProc, TestAttentionProc)
147 {
148 EXPECT_EQ(0, pAttn->getPriority());
149 EXPECT_EQ(RC_SUCCESS, pAttn->handle());
150
151 // Verify the target in Attention object.
152 attr = std::numeric_limits<uint32_t>::max();
153 pdbg_target* target_tmp = pAttn->getTarget();
154 EXPECT_NE(nullptr, target_tmp);
155 attr = getTrgtType(target_tmp);
156 EXPECT_EQ(TYPE_PROC, attr);
157
158 attr = std::numeric_limits<uint32_t>::max();
159 pdbg_target_get_attribute(target_tmp, "ATTR_CHIP_ID", 4, 1, &attr);
160 EXPECT_EQ(attr, gChipId);
161
162 // Verify the config in Attention object.
163 Config* config_tmp = pAttn->getConfig();
164 EXPECT_EQ(true, config_tmp->getFlag(gAttnFlag));
165 config_tmp->clearFlag(gAttnFlag);
166 EXPECT_EQ(false, config_tmp->getFlag(gAttnFlag));
167 config_tmp->setFlag(gAttnFlag);
168 EXPECT_EQ(true, config_tmp->getFlag(gAttnFlag));
169 }
170
TEST(AttnConfig,TestAttnConfig)171 TEST(AttnConfig, TestAttnConfig)
172 {
173 Config* config = new Config();
174
175 // Test clearFlagAll() function.
176 config->clearFlagAll();
177 EXPECT_EQ(false, config->getFlag(AttentionFlag::enVital));
178 EXPECT_EQ(false, config->getFlag(AttentionFlag::enCheckstop));
179 EXPECT_EQ(false, config->getFlag(AttentionFlag::enTerminate));
180 EXPECT_EQ(false, config->getFlag(AttentionFlag::enBreakpoints));
181 // The dfltTi flag is not impacted.
182 EXPECT_EQ(false, config->getFlag(AttentionFlag::dfltTi));
183 EXPECT_EQ(false, config->getFlag(AttentionFlag::enClrAttnIntr));
184
185 // Test setFlagAll() function.
186 config->setFlagAll();
187 EXPECT_EQ(true, config->getFlag(AttentionFlag::enVital));
188 EXPECT_EQ(true, config->getFlag(AttentionFlag::enCheckstop));
189 EXPECT_EQ(true, config->getFlag(AttentionFlag::enTerminate));
190 EXPECT_EQ(true, config->getFlag(AttentionFlag::enBreakpoints));
191 // The dfltTi flag is not impacted.
192 EXPECT_EQ(false, config->getFlag(AttentionFlag::dfltTi));
193 EXPECT_EQ(true, config->getFlag(AttentionFlag::enClrAttnIntr));
194
195 // Test setFlag() and getFlag() functions.
196 // Only test one flag.
197 config->clearFlagAll();
198 config->setFlag(enVital);
199 EXPECT_EQ(true, config->getFlag(enVital));
200
201 delete config;
202 }
203