TEST_F(AutoInjectableTest, VerifySimpleThreadWait) { // Immediate kickoff: AutoCurrentContext()->Initiate(); // Make an injectable, run it, and stuff it right into a future: AutoFuture future; MakeInjectable<CoreThread>()(&future); // Make a thread and then start it going: Autowired<CoreThread> thread; ASSERT_TRUE(thread.IsAutowired()) << "Thread was not injected by an injector as expected"; AutoRequired<std::mutex> barr; { std::lock_guard<std::mutex> lk(*barr); // Add a lambda that we intentionally block: *thread += [] { Autowired<CoreThread> thread; Autowired<std::mutex> barr; ASSERT_TRUE(thread && barr) << "Failed to find a required type in the current context"; std::lock_guard<std::mutex> lk(*barr); thread->Stop(); }; // Instant wait: ASSERT_FALSE(future.WaitFor(std::chrono::nanoseconds(1))) << "Premature wait return on an injector-provided future"; } // Now that the thread is unblocked, verify that it quits: ASSERT_TRUE(future.WaitFor(std::chrono::seconds(5))) << "Wait failed to return on an injector-provided future"; }