blob: ea75c8db6ebf79e6910502c8d4605bd9f63a31ec [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ios/web/public/test/test_web_thread_bundle.h"
#include <memory>
#include "base/run_loop.h"
#include "ios/web/public/test/test_web_thread.h"
#include "ios/web/web_thread_impl.h"
namespace web {
TestWebThreadBundle::TestWebThreadBundle(int options)
: base::test::ScopedTaskEnvironment(
options == IO_MAINLOOP ? MainThreadType::IO : MainThreadType::UI) {
Init(options);
}
TestWebThreadBundle::~TestWebThreadBundle() {
// To ensure a clean teardown, each thread's message loop must be flushed
// just before the thread is destroyed. But stopping a fake thread does not
// automatically flush the message loop, so do it manually.
// See http://crbug.com/247525 for discussion.
base::RunLoop().RunUntilIdle();
io_thread_->Stop();
base::RunLoop().RunUntilIdle();
ui_thread_->Stop();
base::RunLoop().RunUntilIdle();
// This is required to ensure that all remaining MessageLoop and ThreadPool
// tasks run in an atomic step. This is a bit different than production where
// the main thread is not flushed after it's done running but this approach is
// preferred in unit tests as running more tasks can merely uncover more
// issues (e.g. if a bad tasks is posted but never blocked upon it could make
// a test flaky whereas by flushing, the test will always fail).
RunUntilIdle();
WebThreadImpl::ResetTaskExecutorForTesting();
}
void TestWebThreadBundle::Init(int options) {
WebThreadImpl::CreateTaskExecutor();
ui_thread_ =
std::make_unique<TestWebThread>(WebThread::UI, GetMainThreadTaskRunner());
if (options & TestWebThreadBundle::REAL_IO_THREAD) {
io_thread_ = std::make_unique<TestWebThread>(WebThread::IO);
io_thread_->StartIOThread();
} else {
io_thread_ = std::make_unique<TestWebThread>(WebThread::IO,
GetMainThreadTaskRunner());
}
}
} // namespace web