Introduce a RunLoop class that supports the TaskQueue interface on the current thread. This simplifies writing async tests that use TaskQueue and doesn't require spinning up a new thread for simple things. The implementation is currently based on rtc::Thread, which could also be useful in some circumstances while migrating code over to TQ. Remove PressEnterToContinue from the test_common files since it's very specific and only used from one file. Bug: none Change-Id: I8b2c6c40809271a109ec17cf7e1120847645d58a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/174260 Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Commit-Queue: Tommi <tommi@webrtc.org> Cr-Commit-Position: refs/heads/master@{#31160}
diff --git a/test/run_loop.h b/test/run_loop.h index 414e72c..f350b2c 100644 --- a/test/run_loop.h +++ b/test/run_loop.h
@@ -10,13 +10,69 @@ #ifndef TEST_RUN_LOOP_H_ #define TEST_RUN_LOOP_H_ -#include "api/task_queue/task_queue_base.h" +#include "rtc_base/task_utils/to_queued_task.h" +#include "rtc_base/thread.h" namespace webrtc { namespace test { -// Blocks until the user presses enter. -void PressEnterToContinue(TaskQueueBase* task_queue); +// This utility class allows you to run a TaskQueue supported interface on the +// main test thread, call Run() while doing things asynchonously and break +// the loop (from the same thread) from a callback by calling Quit(). +class RunLoop { + public: + RunLoop(); + ~RunLoop(); + + TaskQueueBase* task_queue(); + + void Run(); + void Quit(); + + void Flush(); + + // Convenience methods since TaskQueueBase doesn't support this sort of magic. + template <typename Closure> + void PostTask(Closure&& task) { + task_queue()->PostTask(ToQueuedTask(std::forward<Closure>(task))); + } + + template <typename Closure> + void PostDelayedTask(Closure&& task, uint32_t milliseconds) { + task_queue()->PostDelayedTask(ToQueuedTask(std::forward<Closure>(task)), + milliseconds); + } + + private: + class FakeSocketServer : public rtc::SocketServer { + public: + FakeSocketServer(); + ~FakeSocketServer(); + + void FailNextWait(); + + private: + bool Wait(int cms, bool process_io) override; + void WakeUp() override; + + rtc::Socket* CreateSocket(int family, int type) override; + rtc::AsyncSocket* CreateAsyncSocket(int family, int type) override; + + private: + bool fail_next_wait_ = false; + }; + + class WorkerThread : public rtc::Thread { + public: + explicit WorkerThread(rtc::SocketServer* ss); + + private: + CurrentTaskQueueSetter tq_setter_; + }; + + FakeSocketServer socket_server_; + WorkerThread worker_thread_{&socket_server_}; +}; } // namespace test } // namespace webrtc