|  | /* | 
|  | *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  | #include "test/run_loop.h" | 
|  |  | 
|  | #include "rtc_base/time_utils.h" | 
|  |  | 
|  | namespace webrtc { | 
|  | namespace test { | 
|  |  | 
|  | RunLoop::RunLoop() { | 
|  | worker_thread_.WrapCurrent(); | 
|  | } | 
|  |  | 
|  | RunLoop::~RunLoop() { | 
|  | worker_thread_.UnwrapCurrent(); | 
|  | } | 
|  |  | 
|  | TaskQueueBase* RunLoop::task_queue() { | 
|  | return &worker_thread_; | 
|  | } | 
|  |  | 
|  | void RunLoop::Run() { | 
|  | worker_thread_.ProcessMessages(WorkerThread::kForever); | 
|  | } | 
|  |  | 
|  | void RunLoop::Quit() { | 
|  | socket_server_.FailNextWait(); | 
|  | } | 
|  |  | 
|  | void RunLoop::Flush() { | 
|  | worker_thread_.PostTask([this]() { socket_server_.FailNextWait(); }); | 
|  | // If a test clock is used, like with GlobalSimulatedTimeController then the | 
|  | // thread will loop forever since time never increases. Since the clock is | 
|  | // simulated, 0ms can be used as the loop delay, which will process all | 
|  | // messages ready for execution. | 
|  | int cms = rtc::GetClockForTesting() ? 0 : 1000; | 
|  | worker_thread_.ProcessMessages(cms); | 
|  | } | 
|  |  | 
|  | RunLoop::FakeSocketServer::FakeSocketServer() = default; | 
|  | RunLoop::FakeSocketServer::~FakeSocketServer() = default; | 
|  |  | 
|  | void RunLoop::FakeSocketServer::FailNextWait() { | 
|  | fail_next_wait_ = true; | 
|  | } | 
|  |  | 
|  | bool RunLoop::FakeSocketServer::Wait(webrtc::TimeDelta max_wait_duration, | 
|  | bool process_io) { | 
|  | if (fail_next_wait_) { | 
|  | fail_next_wait_ = false; | 
|  | return false; | 
|  | } | 
|  | return true; | 
|  | } | 
|  |  | 
|  | void RunLoop::FakeSocketServer::WakeUp() {} | 
|  |  | 
|  | rtc::Socket* RunLoop::FakeSocketServer::CreateSocket(int family, int type) { | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | RunLoop::WorkerThread::WorkerThread(rtc::SocketServer* ss) | 
|  | : rtc::Thread(ss), tq_setter_(this) {} | 
|  |  | 
|  | }  // namespace test | 
|  | }  // namespace webrtc |