@@ -130,3 +130,42 @@ TEST_F(SchedulerTest, EnqueueBlockedCommandEarlyExit) {
130130 << " Result of enqueueing blocked command should be BLOCKED.\n " ;
131131 ASSERT_EQ (&B, Res.MCmd ) << " Expected different failed command.\n " ;
132132}
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