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