@@ -130,3 +130,42 @@ TEST_F(SchedulerTest, EnqueueBlockedCommandEarlyExit) {
130
130
<< " Result of enqueueing blocked command should be BLOCKED.\n " ;
131
131
ASSERT_EQ (&B, Res.MCmd ) << " Expected different failed command.\n " ;
132
132
}
133
+
134
+ // This unit test is for workaround described in GraphProcessor::enqueueCommand
135
+ // method.
136
+ TEST_F (SchedulerTest, EnqueueHostDependency) {
137
+ MockCommand A (detail::getSyclObjImpl (MQueue));
138
+ A.MEnqueueStatus = detail::EnqueueResultT::SyclEnqueueReady;
139
+ A.MIsBlockable = true ;
140
+ A.MRetVal = CL_SUCCESS;
141
+
142
+ MockCommand B (detail::getSyclObjImpl (MQueue));
143
+ B.MEnqueueStatus = detail::EnqueueResultT::SyclEnqueueReady;
144
+ B.MIsBlockable = true ;
145
+ B.MRetVal = CL_SUCCESS;
146
+
147
+ cl::sycl::detail::EventImplPtr DepEvent{
148
+ new cl::sycl::detail::event_impl (detail::getSyclObjImpl (MQueue))};
149
+ DepEvent->setCommand (&B);
150
+
151
+ A.addDep (DepEvent);
152
+
153
+ // We have such a "graph":
154
+ //
155
+ // A
156
+ // |
157
+ // B
158
+ //
159
+ // A depends on B. B is host command.
160
+ // "Graph" is quoted as we don't have this dependency in MDeps. Instead, we
161
+ // have this dependecy as result of handler::depends_on() call.
162
+
163
+ EXPECT_CALL (A, enqueue (_, _)).Times (1 );
164
+ EXPECT_CALL (B, enqueue (_, _)).Times (1 );
165
+
166
+ detail::EnqueueResultT Res;
167
+ bool Enqueued = MockScheduler::enqueueCommand (&A, Res, detail::NON_BLOCKING);
168
+ ASSERT_TRUE (Enqueued) << " The command should be enqueued\n " ;
169
+ ASSERT_EQ (detail::EnqueueResultT::SyclEnqueueSuccess, Res.MResult )
170
+ << " Enqueue operation should return successfully.\n " ;
171
+ }
0 commit comments