Commit d1317fc3 authored by Alex Clarke's avatar Alex Clarke Committed by Commit Bot

[Reland #3] Use the SequenceManager in ScopedTaskEnvironment

A reland of https://crrev.com/c/1324391

This is necessary because we want content::TestBrowserThreadBundle to
own a BrowserUIThreadScheduler, but that also owns a ScopedTaskEnvironment
and you can't have two SequenceManagers on the same thread.

This patch allows ScopedTaskEnvironment to optionally work with an
externally owned SequenceManager solving the problem.

This implements https://docs.google.com/document/d/1y08C6JQ9Yta3EQXzwIqqIIKHq9500WV6CWFZzZfDx7I/edit?usp=drivesdk,

We now have the ability to mock time on the UI and IO threads.

RE HttpServiceTest change HttpServiceTest.MultipleRequests was failing
mysteriously on fuschia on the bots only (not locally). IO_MOCK_TIME seems
to have fixed this.


TBR=gab@chromium.org,fdoray@chromium.org,wez@chromium.org

Bug: 863341, 891670, 708584
Change-Id: I95444a0a50f8b577c5fae62c12c8423c7e8f21d6
Reviewed-on: https://chromium-review.googlesource.com/c/1361863
Commit-Queue: Alex Clarke <alexclarke@chromium.org>
Reviewed-by: default avatarAlex Clarke <alexclarke@chromium.org>
Reviewed-by: default avatarSami Kyöstilä <skyostil@chromium.org>
Cr-Commit-Position: refs/heads/master@{#615496}
parent f326f2b3
This diff is collapsed.
......@@ -9,21 +9,16 @@
#include "base/memory/ref_counted.h"
#include "base/single_thread_task_runner.h"
#include "base/task/lazy_task_runner.h"
#include "base/task/sequence_manager/sequence_manager.h"
#include "base/time/time.h"
#include "build/build_config.h"
namespace base {
namespace internal {
class ScopedSetSequenceLocalStorageMapForCurrentThread;
class SequenceLocalStorageMap;
} // namespace internal
class Clock;
class FileDescriptorWatcher;
class MessageLoop;
class TaskScheduler;
class TestMockTimeTaskRunner;
class TickClock;
namespace test {
......@@ -78,9 +73,18 @@ class ScopedTaskEnvironment {
MOCK_TIME,
// The main thread pumps UI messages.
UI,
// The main thread pumps UI messages and uses a mock clock for delayed tasks
// (controllable via FastForward*() methods).
// TODO(gab@): Enable mock time on all threads and make MOCK_TIME
// configurable independent of MainThreadType.
UI_MOCK_TIME,
// The main thread pumps asynchronous IO messages and supports the
// FileDescriptorWatcher API on POSIX.
IO,
// The main thread pumps IO messages and uses a mock clock for delayed tasks
// (controllable via FastForward*() methods). In addition it supports the
// FileDescriptorWatcher API on POSIX.
IO_MOCK_TIME,
};
enum class ExecutionMode {
......@@ -96,6 +100,13 @@ class ScopedTaskEnvironment {
MainThreadType main_thread_type = MainThreadType::DEFAULT,
ExecutionMode execution_control_mode = ExecutionMode::ASYNC);
// Constructs a ScopedTaskEnvironment using a preexisting |sequence_manager|.
// |sequence_manager| must outlive this ScopedTaskEnvironment.
ScopedTaskEnvironment(
sequence_manager::SequenceManager* sequence_manager,
MainThreadType main_thread_type = MainThreadType::DEFAULT,
ExecutionMode execution_control_mode = ExecutionMode::ASYNC);
// Waits until no undelayed TaskScheduler tasks remain. Then, unregisters the
// TaskScheduler and the (Thread|Sequenced)TaskRunnerHandle.
~ScopedTaskEnvironment();
......@@ -165,24 +176,25 @@ class ScopedTaskEnvironment {
TimeDelta NextMainThreadPendingTaskDelay() const;
private:
class MockTimeDomain;
class TestTaskTracker;
ScopedTaskEnvironment(
std::unique_ptr<sequence_manager::SequenceManager> owned_sequence_manager,
sequence_manager::SequenceManager* sequence_manager,
MainThreadType main_thread_type,
ExecutionMode execution_control_mode);
scoped_refptr<sequence_manager::TaskQueue> CreateDefaultTaskQueue();
const ExecutionMode execution_control_mode_;
// Exactly one of these will be non-null to provide the task environment on
// the main thread. Users of this class should NOT rely on the presence of a
// MessageLoop beyond (Thread|Sequenced)TaskRunnerHandle and RunLoop as
// the backing implementation of each MainThreadType may change over time.
const std::unique_ptr<MessageLoop> message_loop_;
const scoped_refptr<TestMockTimeTaskRunner> mock_time_task_runner_;
// Non-null in MOCK_TIME, where an explicit SequenceLocalStorageMap needs to
// be provided. TODO(gab): This can be removed once mock time support is added
// to MessageLoop directly.
const std::unique_ptr<internal::SequenceLocalStorageMap> slsm_for_mock_time_;
const std::unique_ptr<
internal::ScopedSetSequenceLocalStorageMapForCurrentThread>
slsm_registration_for_mock_time_;
const std::unique_ptr<MockTimeDomain> mock_time_domain_;
const std::unique_ptr<sequence_manager::SequenceManager>
owned_sequence_manager_;
sequence_manager::SequenceManager* const sequence_manager_;
scoped_refptr<sequence_manager::TaskQueue> task_queue_;
// Only set for instances with a MOCK_TIME MainThreadType.
const std::unique_ptr<Clock> mock_clock_;
......
......@@ -372,6 +372,10 @@ INSTANTIATE_TEST_CASE_P(
MainThreadMockTime,
ScopedTaskEnvironmentTest,
::testing::Values(ScopedTaskEnvironment::MainThreadType::MOCK_TIME));
INSTANTIATE_TEST_CASE_P(
MainThreadUiMockTime,
ScopedTaskEnvironmentTest,
::testing::Values(ScopedTaskEnvironment::MainThreadType::UI_MOCK_TIME));
INSTANTIATE_TEST_CASE_P(
MainThreadUI,
ScopedTaskEnvironmentTest,
......@@ -587,6 +591,10 @@ INSTANTIATE_TEST_CASE_P(
MainThreadMockTime,
ScopedTaskEnvironmentMockedTime,
::testing::Values(ScopedTaskEnvironment::MainThreadType::MOCK_TIME));
INSTANTIATE_TEST_CASE_P(
MainThreadUiMockTime,
ScopedTaskEnvironmentMockedTime,
::testing::Values(ScopedTaskEnvironment::MainThreadType::UI_MOCK_TIME));
} // namespace test
} // namespace base
......@@ -35,7 +35,7 @@ class HttpServiceTest : public ::testing::Test {
public:
HttpServiceTest()
: task_environment_(
base::test::ScopedTaskEnvironment::MainThreadType::IO),
base::test::ScopedTaskEnvironment::MainThreadType::IO_MOCK_TIME),
binding_(&http_service_server_) {
// Initialize the test server.
test_server_.AddDefaultHandlers(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment