1 /*
2 * Copyright (C) 2021 Intel Corporation
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 */
7
8 #include "shared/test/common/helpers/debug_manager_state_restore.h"
9 #include "shared/test/common/test_macros/test.h"
10
11 #include "level_zero/tools/source/debug/eu_thread.h"
12
13 namespace L0 {
14 namespace ult {
15
TEST(EuThread,WhenConstructingEuThreadThenCorrectIdsAreSet)16 TEST(EuThread, WhenConstructingEuThreadThenCorrectIdsAreSet) {
17 ze_device_thread_t devThread = {3, 4, 5, 6};
18
19 EuThread::ThreadId threadId(0, devThread);
20
21 EXPECT_EQ(0u, threadId.tileIndex);
22 EXPECT_EQ(3u, threadId.slice);
23 EXPECT_EQ(4u, threadId.subslice);
24 EXPECT_EQ(5u, threadId.eu);
25 EXPECT_EQ(6u, threadId.thread);
26
27 EuThread::ThreadId threadId2(3, 1, 2, 3, 4);
28
29 EXPECT_EQ(3u, threadId2.tileIndex);
30 EXPECT_EQ(1u, threadId2.slice);
31 EXPECT_EQ(2u, threadId2.subslice);
32 EXPECT_EQ(3u, threadId2.eu);
33 EXPECT_EQ(4u, threadId2.thread);
34
35 auto castValue = static_cast<uint64_t>(threadId2);
36
37 EXPECT_EQ(threadId2.packed, castValue);
38 }
39
TEST(EuThread,GivenEuThreadWhenGettingThreadIdThenValidIdReturned)40 TEST(EuThread, GivenEuThreadWhenGettingThreadIdThenValidIdReturned) {
41 ze_device_thread_t devThread = {3, 4, 5, 6};
42 EuThread::ThreadId threadId(0, devThread);
43 EuThread euThread(threadId);
44
45 auto id = euThread.getThreadId();
46
47 EXPECT_EQ(threadId.packed, id.packed);
48 }
49
TEST(EuThread,GivenEuThreadWhenChangingAndQueryingStatesThenStateIsChanged)50 TEST(EuThread, GivenEuThreadWhenChangingAndQueryingStatesThenStateIsChanged) {
51 ze_device_thread_t devThread = {3, 4, 5, 6};
52 EuThread::ThreadId threadId(0, devThread);
53 EuThread euThread(threadId);
54
55 EXPECT_FALSE(euThread.isStopped());
56 EXPECT_TRUE(euThread.isRunning());
57
58 bool result = euThread.stopThread(0x1234);
59
60 EXPECT_TRUE(result);
61 EXPECT_TRUE(euThread.isStopped());
62 EXPECT_FALSE(euThread.isRunning());
63 EXPECT_EQ(0x1234u, euThread.getMemoryHandle());
64
65 result = euThread.stopThread(0x5678);
66
67 EXPECT_FALSE(result);
68 EXPECT_TRUE(euThread.isStopped());
69 EXPECT_FALSE(euThread.isRunning());
70 EXPECT_EQ(0x5678u, euThread.getMemoryHandle());
71
72 result = euThread.resumeThread();
73 EXPECT_EQ(EuThread::invalidHandle, euThread.getMemoryHandle());
74
75 EXPECT_TRUE(result);
76 EXPECT_FALSE(euThread.isStopped());
77 EXPECT_TRUE(euThread.isRunning());
78
79 result = euThread.resumeThread();
80
81 EXPECT_FALSE(result);
82 EXPECT_FALSE(euThread.isStopped());
83 EXPECT_TRUE(euThread.isRunning());
84 EXPECT_EQ(EuThread::invalidHandle, euThread.getMemoryHandle());
85 }
86
TEST(EuThread,GivenEuThreadWhenToStringCalledThenCorrectStringReturned)87 TEST(EuThread, GivenEuThreadWhenToStringCalledThenCorrectStringReturned) {
88 ze_device_thread_t devThread = {3, 4, 5, 6};
89 EuThread::ThreadId threadId(0, devThread);
90 EuThread euThread(threadId);
91
92 auto threadString = euThread.toString();
93 EXPECT_EQ("device index = 0 slice = 3 subslice = 4 eu = 5 thread = 6", threadString);
94 }
95
TEST(EuThread,GivenThreadStateRunningWhenVerifyingStopWithOddCounterThenTrueReturnedAndStateStopped)96 TEST(EuThread, GivenThreadStateRunningWhenVerifyingStopWithOddCounterThenTrueReturnedAndStateStopped) {
97 ze_device_thread_t devThread = {3, 4, 5, 6};
98 EuThread::ThreadId threadId(0, devThread);
99 EuThread euThread(threadId);
100 EXPECT_TRUE(euThread.isRunning());
101
102 EXPECT_TRUE(euThread.verifyStopped(1));
103 EXPECT_TRUE(euThread.isStopped());
104 }
105
TEST(EuThread,GivenThreadStateStoppedWhenVerifyingStopWithOddCounterThenTrueReturnedAndStateStopped)106 TEST(EuThread, GivenThreadStateStoppedWhenVerifyingStopWithOddCounterThenTrueReturnedAndStateStopped) {
107 ze_device_thread_t devThread = {3, 4, 5, 6};
108 EuThread::ThreadId threadId(0, devThread);
109 EuThread euThread(threadId);
110
111 euThread.verifyStopped(1);
112 euThread.stopThread(1u);
113
114 EXPECT_TRUE(euThread.verifyStopped(1));
115 EXPECT_TRUE(euThread.isStopped());
116 }
117
TEST(EuThread,GivenThreadStateStoppedWhenVerifyingStopWithEvenCounterThenFalseReturnedAndStateRunning)118 TEST(EuThread, GivenThreadStateStoppedWhenVerifyingStopWithEvenCounterThenFalseReturnedAndStateRunning) {
119 ze_device_thread_t devThread = {3, 4, 5, 6};
120 EuThread::ThreadId threadId(0, devThread);
121 EuThread euThread(threadId);
122
123 euThread.verifyStopped(1);
124 euThread.stopThread(1u);
125
126 EXPECT_FALSE(euThread.verifyStopped(2));
127 EXPECT_TRUE(euThread.isRunning());
128 }
129
TEST(EuThread,GivenEnabledErrorLogsWhenThreadStateStoppedAndVerifyingStopWithEvenCounterThenErrorMessageIsPrinted)130 TEST(EuThread, GivenEnabledErrorLogsWhenThreadStateStoppedAndVerifyingStopWithEvenCounterThenErrorMessageIsPrinted) {
131
132 DebugManagerStateRestore restorer;
133 NEO::DebugManager.flags.DebuggerLogBitmask.set(NEO::DebugVariables::DEBUGGER_LOG_BITMASK::LOG_ERROR);
134
135 ze_device_thread_t devThread = {0, 0, 0, 0};
136 EuThread::ThreadId threadId(0, devThread);
137 EuThread euThread(threadId);
138
139 euThread.verifyStopped(1);
140 euThread.stopThread(1u);
141
142 ::testing::internal::CaptureStderr();
143
144 EXPECT_FALSE(euThread.verifyStopped(2));
145 EXPECT_TRUE(euThread.isRunning());
146
147 auto message = ::testing::internal::GetCapturedStderr();
148 EXPECT_STREQ("\nERROR: Thread: device index = 0 slice = 0 subslice = 0 eu = 0 thread = 0 state STOPPED when thread is running. Switching to RUNNING", message.c_str());
149 }
150
TEST(EuThread,GivenThreadStateRunningWhenVerifyingStopWithOddCounterForSecondStopThenTrueIsReturnedAndStateStopped)151 TEST(EuThread, GivenThreadStateRunningWhenVerifyingStopWithOddCounterForSecondStopThenTrueIsReturnedAndStateStopped) {
152 ze_device_thread_t devThread = {3, 4, 5, 6};
153 EuThread::ThreadId threadId(0, devThread);
154 EuThread euThread(threadId);
155
156 euThread.verifyStopped(1);
157 euThread.resumeThread();
158
159 EXPECT_TRUE(euThread.verifyStopped(3));
160 EXPECT_TRUE(euThread.isStopped());
161 }
162
TEST(EuThread,GivenThreadStateRunningWhenVerifyingStopWithEvenCounteThenFalseIsReturnedAndStateRunning)163 TEST(EuThread, GivenThreadStateRunningWhenVerifyingStopWithEvenCounteThenFalseIsReturnedAndStateRunning) {
164 ze_device_thread_t devThread = {3, 4, 5, 6};
165 EuThread::ThreadId threadId(0, devThread);
166 EuThread euThread(threadId);
167 euThread.verifyStopped(1);
168 euThread.resumeThread();
169
170 EXPECT_FALSE(euThread.verifyStopped(2));
171 EXPECT_TRUE(euThread.isRunning());
172 }
173
TEST(EuThread,GivenThreadStateStoppedWhenVerifyingStopWithOddCounterBiggerByMoreThanTwoThenTrueIsReturnedAndStateStopped)174 TEST(EuThread, GivenThreadStateStoppedWhenVerifyingStopWithOddCounterBiggerByMoreThanTwoThenTrueIsReturnedAndStateStopped) {
175 ze_device_thread_t devThread = {3, 4, 5, 6};
176 EuThread::ThreadId threadId(0, devThread);
177 EuThread euThread(threadId);
178 euThread.verifyStopped(1);
179
180 EXPECT_TRUE(euThread.verifyStopped(7));
181 EXPECT_TRUE(euThread.isStopped());
182 }
183
TEST(EuThread,GivenEnabledErrorLogsWhenThreadStateStoppedAndVerifyingStopWithOddCounterBiggerByMoreThanTwoThenErrorMessageIsPrinted)184 TEST(EuThread, GivenEnabledErrorLogsWhenThreadStateStoppedAndVerifyingStopWithOddCounterBiggerByMoreThanTwoThenErrorMessageIsPrinted) {
185 DebugManagerStateRestore restorer;
186 NEO::DebugManager.flags.DebuggerLogBitmask.set(NEO::DebugVariables::DEBUGGER_LOG_BITMASK::LOG_ERROR);
187
188 ze_device_thread_t devThread = {0, 0, 0, 0};
189 EuThread::ThreadId threadId(0, devThread);
190 EuThread euThread(threadId);
191
192 euThread.verifyStopped(1);
193
194 ::testing::internal::CaptureStderr();
195
196 EXPECT_TRUE(euThread.verifyStopped(7));
197 EXPECT_TRUE(euThread.isStopped());
198
199 auto message = ::testing::internal::GetCapturedStderr();
200 EXPECT_STREQ("\nERROR: Thread: device index = 0 slice = 0 subslice = 0 eu = 0 thread = 0 state out of sync.", message.c_str());
201 }
202
TEST(EuThread,GivenEnabledErrorLogsWhenThreadStateRunningAndVerifyingStopWithOddCounterEqualToPreviousThenErrorMessageIsPrinted)203 TEST(EuThread, GivenEnabledErrorLogsWhenThreadStateRunningAndVerifyingStopWithOddCounterEqualToPreviousThenErrorMessageIsPrinted) {
204
205 DebugManagerStateRestore restorer;
206 NEO::DebugManager.flags.DebuggerLogBitmask.set(NEO::DebugVariables::DEBUGGER_LOG_BITMASK::LOG_ERROR);
207
208 ze_device_thread_t devThread = {0, 0, 0, 0};
209 EuThread::ThreadId threadId(0, devThread);
210 EuThread euThread(threadId);
211
212 euThread.verifyStopped(1);
213 euThread.resumeThread();
214
215 ::testing::internal::CaptureStderr();
216
217 EXPECT_TRUE(euThread.verifyStopped(1));
218 EXPECT_TRUE(euThread.isStopped());
219
220 auto message = ::testing::internal::GetCapturedStderr();
221 EXPECT_STREQ("\nERROR: Thread: device index = 0 slice = 0 subslice = 0 eu = 0 thread = 0 state RUNNING when thread is stopped. Switching to STOPPED", message.c_str());
222 }
223
TEST(EuThread,GivenThreadStateStoppedWhenVerifyingStopWithEvenCounterBiggerByMoreThanTwoThenFalseIsReturnedAndStateRunning)224 TEST(EuThread, GivenThreadStateStoppedWhenVerifyingStopWithEvenCounterBiggerByMoreThanTwoThenFalseIsReturnedAndStateRunning) {
225 ze_device_thread_t devThread = {3, 4, 5, 6};
226 EuThread::ThreadId threadId(0, devThread);
227 EuThread euThread(threadId);
228 euThread.verifyStopped(1);
229
230 EXPECT_FALSE(euThread.verifyStopped(8));
231 EXPECT_TRUE(euThread.isRunning());
232 }
233
234 } // namespace ult
235 } // namespace L0
236