xref: /aosp_15_r20/external/cronet/base/test/task_environment.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_TEST_TASK_ENVIRONMENT_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_TEST_TASK_ENVIRONMENT_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <memory>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_forward.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/observer_list_types.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/run_loop.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/task/lazy_thread_pool_task_runner.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/task/sequence_manager/sequence_manager.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/task/sequence_manager/task_queue.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_run_loop_timeout.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_checker.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/traits_bag.h"
24*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker namespace base {
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker class Clock;
29*6777b538SAndroid Build Coastguard Worker class FileDescriptorWatcher;
30*6777b538SAndroid Build Coastguard Worker class TickClock;
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker namespace subtle {
33*6777b538SAndroid Build Coastguard Worker class ScopedTimeClockOverrides;
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker namespace test {
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker // This header exposes SingleThreadTaskEnvironment and TaskEnvironment.
39*6777b538SAndroid Build Coastguard Worker //
40*6777b538SAndroid Build Coastguard Worker // SingleThreadTaskEnvironment enables the following APIs within its scope:
41*6777b538SAndroid Build Coastguard Worker //  - (SingleThread|Sequenced)TaskRunner::CurrentDefaultHandle on the main
42*6777b538SAndroid Build Coastguard Worker //    thread
43*6777b538SAndroid Build Coastguard Worker //  - RunLoop on the main thread
44*6777b538SAndroid Build Coastguard Worker //
45*6777b538SAndroid Build Coastguard Worker // TaskEnvironment additionally enables:
46*6777b538SAndroid Build Coastguard Worker //  - posting to base::ThreadPool through base/task/thread_pool.h.
47*6777b538SAndroid Build Coastguard Worker //
48*6777b538SAndroid Build Coastguard Worker // Hint: For content::BrowserThreads, use content::BrowserTaskEnvironment.
49*6777b538SAndroid Build Coastguard Worker //
50*6777b538SAndroid Build Coastguard Worker // Tests should prefer SingleThreadTaskEnvironment over TaskEnvironment when the
51*6777b538SAndroid Build Coastguard Worker // former is sufficient.
52*6777b538SAndroid Build Coastguard Worker //
53*6777b538SAndroid Build Coastguard Worker // Tasks posted to the (SingleThread|Sequenced)TaskRunner::CurrentDefaultHandle
54*6777b538SAndroid Build Coastguard Worker // run synchronously when RunLoop::Run(UntilIdle) or
55*6777b538SAndroid Build Coastguard Worker // TaskEnvironment::RunUntil(Idle|Quit) is called on the main thread.
56*6777b538SAndroid Build Coastguard Worker //
57*6777b538SAndroid Build Coastguard Worker // The TaskEnvironment requires TestTimeouts::Initialize() to be called in order
58*6777b538SAndroid Build Coastguard Worker // to run posted tasks, so that it can watch for problematic long-running tasks.
59*6777b538SAndroid Build Coastguard Worker //
60*6777b538SAndroid Build Coastguard Worker // The TimeSource trait can be used to request that delayed tasks be under the
61*6777b538SAndroid Build Coastguard Worker // manual control of RunLoop::Run() and TaskEnvironment::FastForward*() methods.
62*6777b538SAndroid Build Coastguard Worker //
63*6777b538SAndroid Build Coastguard Worker // If a TaskEnvironment's ThreadPoolExecutionMode is QUEUED, ThreadPool tasks
64*6777b538SAndroid Build Coastguard Worker // run when RunUntilIdle(), RunUntilQuit(), or ~TaskEnvironment is called. If
65*6777b538SAndroid Build Coastguard Worker // ThreadPoolExecutionMode is ASYNC, they run as they are posted.
66*6777b538SAndroid Build Coastguard Worker //
67*6777b538SAndroid Build Coastguard Worker // All TaskEnvironment methods must be called from the main thread.
68*6777b538SAndroid Build Coastguard Worker //
69*6777b538SAndroid Build Coastguard Worker // Usage:
70*6777b538SAndroid Build Coastguard Worker //
71*6777b538SAndroid Build Coastguard Worker //   class MyTestFixture : public testing::Test {
72*6777b538SAndroid Build Coastguard Worker //    public:
73*6777b538SAndroid Build Coastguard Worker //     (...)
74*6777b538SAndroid Build Coastguard Worker //
75*6777b538SAndroid Build Coastguard Worker //    // protected rather than private visibility will allow controlling the
76*6777b538SAndroid Build Coastguard Worker //    // task environment (e.g. RunUntilIdle(), FastForwardBy(), etc.). from the
77*6777b538SAndroid Build Coastguard Worker //    // test body.
78*6777b538SAndroid Build Coastguard Worker //    protected:
79*6777b538SAndroid Build Coastguard Worker //     // Must generally be the first member to be initialized first and
80*6777b538SAndroid Build Coastguard Worker //     // destroyed last (some members that require single-threaded
81*6777b538SAndroid Build Coastguard Worker //     // initialization and tear down may need to come before -- e.g.
82*6777b538SAndroid Build Coastguard Worker //     // base::test::ScopedFeatureList). Extra traits, like TimeSource, are
83*6777b538SAndroid Build Coastguard Worker //     // best provided inline when declaring the TaskEnvironment, as
84*6777b538SAndroid Build Coastguard Worker //     // such:
85*6777b538SAndroid Build Coastguard Worker //     base::test::TaskEnvironment task_environment_{
86*6777b538SAndroid Build Coastguard Worker //         base::test::TaskEnvironment::TimeSource::MOCK_TIME};
87*6777b538SAndroid Build Coastguard Worker //
88*6777b538SAndroid Build Coastguard Worker //     // Other members go here (or further below in private section.)
89*6777b538SAndroid Build Coastguard Worker //   };
90*6777b538SAndroid Build Coastguard Worker class TaskEnvironment {
91*6777b538SAndroid Build Coastguard Worker  protected:
92*6777b538SAndroid Build Coastguard Worker   // This enables a two-phase initialization for sub classes such as
93*6777b538SAndroid Build Coastguard Worker   // content::BrowserTaskEnvironment which need to provide the default task
94*6777b538SAndroid Build Coastguard Worker   // queue because they instantiate a scheduler on the same thread. Subclasses
95*6777b538SAndroid Build Coastguard Worker   // using this trait must invoke DeferredInitFromSubclass() before running the
96*6777b538SAndroid Build Coastguard Worker   // task environment.
97*6777b538SAndroid Build Coastguard Worker   struct SubclassCreatesDefaultTaskRunner {};
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker  public:
100*6777b538SAndroid Build Coastguard Worker   enum class TimeSource {
101*6777b538SAndroid Build Coastguard Worker     // Delayed tasks and Time/TimeTicks::Now() use the real-time system clock.
102*6777b538SAndroid Build Coastguard Worker     SYSTEM_TIME,
103*6777b538SAndroid Build Coastguard Worker 
104*6777b538SAndroid Build Coastguard Worker     // Delayed tasks use a mock clock which only advances when reaching "idle"
105*6777b538SAndroid Build Coastguard Worker     // during a RunLoop::Run() call on the main thread or a FastForward*() call
106*6777b538SAndroid Build Coastguard Worker     // to this TaskEnvironment. "idle" is defined as the main thread and thread
107*6777b538SAndroid Build Coastguard Worker     // pool being out of ready tasks. In that situation : time advances to the
108*6777b538SAndroid Build Coastguard Worker     // soonest delay between main thread and thread pool delayed tasks,
109*6777b538SAndroid Build Coastguard Worker     // according to the semantics of the current Run*() or FastForward*() call.
110*6777b538SAndroid Build Coastguard Worker     //
111*6777b538SAndroid Build Coastguard Worker     // This also mocks Time/TimeTicks::Now() with the same mock clock.
112*6777b538SAndroid Build Coastguard Worker     // Time::Now() and TimeTicks::Now() (with respect to its origin) start
113*6777b538SAndroid Build Coastguard Worker     // without submillisecond components.
114*6777b538SAndroid Build Coastguard Worker     //
115*6777b538SAndroid Build Coastguard Worker     // Warning some platform APIs are still real-time, e.g.:
116*6777b538SAndroid Build Coastguard Worker     //   * PlatformThread::Sleep
117*6777b538SAndroid Build Coastguard Worker     //   * WaitableEvent::TimedWait
118*6777b538SAndroid Build Coastguard Worker     //   * ConditionVariable::TimedWait
119*6777b538SAndroid Build Coastguard Worker     //   * Delayed tasks on unmanaged base::Thread's and other custom task
120*6777b538SAndroid Build Coastguard Worker     //     runners.
121*6777b538SAndroid Build Coastguard Worker     MOCK_TIME,
122*6777b538SAndroid Build Coastguard Worker 
123*6777b538SAndroid Build Coastguard Worker     DEFAULT = SYSTEM_TIME
124*6777b538SAndroid Build Coastguard Worker   };
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker   // This type will determine what types of messages will get pumped by the main
127*6777b538SAndroid Build Coastguard Worker   // thread.
128*6777b538SAndroid Build Coastguard Worker   // Note: If your test needs to use a custom MessagePump you should
129*6777b538SAndroid Build Coastguard Worker   // consider using a SingleThreadTaskExecutor instead.
130*6777b538SAndroid Build Coastguard Worker   enum class MainThreadType {
131*6777b538SAndroid Build Coastguard Worker     // The main thread doesn't pump system messages.
132*6777b538SAndroid Build Coastguard Worker     DEFAULT,
133*6777b538SAndroid Build Coastguard Worker     // The main thread pumps UI messages.
134*6777b538SAndroid Build Coastguard Worker     UI,
135*6777b538SAndroid Build Coastguard Worker     // The main thread pumps asynchronous IO messages and supports the
136*6777b538SAndroid Build Coastguard Worker     // FileDescriptorWatcher API on POSIX.
137*6777b538SAndroid Build Coastguard Worker     IO,
138*6777b538SAndroid Build Coastguard Worker   };
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker   // Note that this is irrelevant (and ignored) under
141*6777b538SAndroid Build Coastguard Worker   // ThreadingMode::MAIN_THREAD_ONLY
142*6777b538SAndroid Build Coastguard Worker   enum class ThreadPoolExecutionMode {
143*6777b538SAndroid Build Coastguard Worker     // Thread pool tasks are queued and only executed when RunUntilIdle(),
144*6777b538SAndroid Build Coastguard Worker     // FastForwardBy(), or FastForwardUntilNoTasksRemain() are explicitly
145*6777b538SAndroid Build Coastguard Worker     // called. Note: RunLoop::Run() does *not* unblock the ThreadPool in this
146*6777b538SAndroid Build Coastguard Worker     // mode (it strictly runs only the main thread).
147*6777b538SAndroid Build Coastguard Worker     QUEUED,
148*6777b538SAndroid Build Coastguard Worker     // Thread pool tasks run as they are posted. RunUntilIdle() can still be
149*6777b538SAndroid Build Coastguard Worker     // used to block until done.
150*6777b538SAndroid Build Coastguard Worker     // Note that regardless of this trait, delayed tasks are always "queued"
151*6777b538SAndroid Build Coastguard Worker     // under TimeSource::MOCK_TIME mode.
152*6777b538SAndroid Build Coastguard Worker     ASYNC,
153*6777b538SAndroid Build Coastguard Worker     DEFAULT = ASYNC
154*6777b538SAndroid Build Coastguard Worker   };
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker   enum class ThreadingMode {
157*6777b538SAndroid Build Coastguard Worker     // ThreadPool will be initialized, thus adding support for multi-threaded
158*6777b538SAndroid Build Coastguard Worker     // tests.
159*6777b538SAndroid Build Coastguard Worker     MULTIPLE_THREADS,
160*6777b538SAndroid Build Coastguard Worker     // No thread pool will be initialized. Useful for tests that want to run
161*6777b538SAndroid Build Coastguard Worker     // single threaded. Prefer using SingleThreadTaskEnvironment over this
162*6777b538SAndroid Build Coastguard Worker     // trait.
163*6777b538SAndroid Build Coastguard Worker     MAIN_THREAD_ONLY,
164*6777b538SAndroid Build Coastguard Worker     DEFAULT = MULTIPLE_THREADS
165*6777b538SAndroid Build Coastguard Worker   };
166*6777b538SAndroid Build Coastguard Worker 
167*6777b538SAndroid Build Coastguard Worker   // On Windows, sets the COM environment for the ThreadPoolInstance. Ignored
168*6777b538SAndroid Build Coastguard Worker   // on other platforms.
169*6777b538SAndroid Build Coastguard Worker   enum class ThreadPoolCOMEnvironment {
170*6777b538SAndroid Build Coastguard Worker     // Do not initialize COM for the pool's workers.
171*6777b538SAndroid Build Coastguard Worker     NONE,
172*6777b538SAndroid Build Coastguard Worker 
173*6777b538SAndroid Build Coastguard Worker     // Place the pool's workers in a COM MTA.
174*6777b538SAndroid Build Coastguard Worker     COM_MTA,
175*6777b538SAndroid Build Coastguard Worker 
176*6777b538SAndroid Build Coastguard Worker     // Enable the MTA by default in unit tests to match the browser process's
177*6777b538SAndroid Build Coastguard Worker     // ThreadPoolInstance configuration.
178*6777b538SAndroid Build Coastguard Worker     //
179*6777b538SAndroid Build Coastguard Worker     // This has the adverse side-effect of enabling the MTA in non-browser unit
180*6777b538SAndroid Build Coastguard Worker     // tests as well but the downside there is not as bad as not having it in
181*6777b538SAndroid Build Coastguard Worker     // browser unit tests. It just means some COM asserts may pass in unit
182*6777b538SAndroid Build Coastguard Worker     // tests where they wouldn't in integration tests or prod. That's okay
183*6777b538SAndroid Build Coastguard Worker     // because unit tests are already generally very loose on allowing I/O,
184*6777b538SAndroid Build Coastguard Worker     // waits, etc. Such misuse will still be caught in later phases (and COM
185*6777b538SAndroid Build Coastguard Worker     // usage should already be pretty much inexistent in sandboxed processes).
186*6777b538SAndroid Build Coastguard Worker     DEFAULT = COM_MTA,
187*6777b538SAndroid Build Coastguard Worker   };
188*6777b538SAndroid Build Coastguard Worker 
189*6777b538SAndroid Build Coastguard Worker   // List of traits that are valid inputs for the constructor below.
190*6777b538SAndroid Build Coastguard Worker   struct ValidTraits {
191*6777b538SAndroid Build Coastguard Worker     ValidTraits(TimeSource);
192*6777b538SAndroid Build Coastguard Worker     ValidTraits(MainThreadType);
193*6777b538SAndroid Build Coastguard Worker     ValidTraits(ThreadPoolExecutionMode);
194*6777b538SAndroid Build Coastguard Worker     ValidTraits(SubclassCreatesDefaultTaskRunner);
195*6777b538SAndroid Build Coastguard Worker     ValidTraits(ThreadingMode);
196*6777b538SAndroid Build Coastguard Worker     ValidTraits(ThreadPoolCOMEnvironment);
197*6777b538SAndroid Build Coastguard Worker   };
198*6777b538SAndroid Build Coastguard Worker 
199*6777b538SAndroid Build Coastguard Worker   // Constructor accepts zero or more traits which customize the testing
200*6777b538SAndroid Build Coastguard Worker   // environment.
201*6777b538SAndroid Build Coastguard Worker   template <typename... TaskEnvironmentTraits>
202*6777b538SAndroid Build Coastguard Worker     requires trait_helpers::AreValidTraits<ValidTraits,
203*6777b538SAndroid Build Coastguard Worker                                            TaskEnvironmentTraits...>
TaskEnvironment(TaskEnvironmentTraits...traits)204*6777b538SAndroid Build Coastguard Worker   NOINLINE explicit TaskEnvironment(TaskEnvironmentTraits... traits)
205*6777b538SAndroid Build Coastguard Worker       : TaskEnvironment(sequence_manager::SequenceManager::PrioritySettings::
206*6777b538SAndroid Build Coastguard Worker                             CreateDefault(),
207*6777b538SAndroid Build Coastguard Worker                         traits...) {}
208*6777b538SAndroid Build Coastguard Worker 
209*6777b538SAndroid Build Coastguard Worker   TaskEnvironment(const TaskEnvironment&) = delete;
210*6777b538SAndroid Build Coastguard Worker   TaskEnvironment& operator=(const TaskEnvironment&) = delete;
211*6777b538SAndroid Build Coastguard Worker 
212*6777b538SAndroid Build Coastguard Worker   // Waits until no undelayed ThreadPool tasks remain. Then, unregisters the
213*6777b538SAndroid Build Coastguard Worker   // ThreadPoolInstance and the
214*6777b538SAndroid Build Coastguard Worker   // (SingleThread|Sequenced)TaskRunner::CurrentDefaultHandle.
215*6777b538SAndroid Build Coastguard Worker   virtual ~TaskEnvironment();
216*6777b538SAndroid Build Coastguard Worker 
217*6777b538SAndroid Build Coastguard Worker   // Returns a TaskRunner that schedules tasks on the main thread.
218*6777b538SAndroid Build Coastguard Worker   scoped_refptr<base::SingleThreadTaskRunner> GetMainThreadTaskRunner();
219*6777b538SAndroid Build Coastguard Worker 
220*6777b538SAndroid Build Coastguard Worker   // Returns whether the main thread's TaskRunner has pending tasks. This will
221*6777b538SAndroid Build Coastguard Worker   // always return true if called right after RunUntilIdle.
222*6777b538SAndroid Build Coastguard Worker   bool MainThreadIsIdle() const;
223*6777b538SAndroid Build Coastguard Worker 
224*6777b538SAndroid Build Coastguard Worker   // Returns a RepeatingClosure that ends the next call to RunUntilQuit(). The
225*6777b538SAndroid Build Coastguard Worker   // quit closures must be obtained from the thread owning the TaskEnvironment
226*6777b538SAndroid Build Coastguard Worker   // but may then be invoked from any thread. To avoid a potential race
227*6777b538SAndroid Build Coastguard Worker   // condition, do not call QuitClosure() while RunUntilQuit() is running.
228*6777b538SAndroid Build Coastguard Worker   RepeatingClosure QuitClosure();
229*6777b538SAndroid Build Coastguard Worker 
230*6777b538SAndroid Build Coastguard Worker   // Runs tasks on both the main thread and the thread pool, until a quit
231*6777b538SAndroid Build Coastguard Worker   // closure is executed. When RunUntilQuit() returns, all previous quit
232*6777b538SAndroid Build Coastguard Worker   // closures are invalidated, and will have no effect on future calls. Be sure
233*6777b538SAndroid Build Coastguard Worker   // to create a new quit closure before calling RunUntilQuit() again.
234*6777b538SAndroid Build Coastguard Worker   void RunUntilQuit();
235*6777b538SAndroid Build Coastguard Worker 
236*6777b538SAndroid Build Coastguard Worker   // Runs tasks until both the
237*6777b538SAndroid Build Coastguard Worker   // (SingleThread|Sequenced)TaskRunner::CurrentDefaultHandle and the
238*6777b538SAndroid Build Coastguard Worker   // ThreadPool's non-delayed queues are empty.  While RunUntilIdle() is quite
239*6777b538SAndroid Build Coastguard Worker   // practical and sometimes even necessary -- for example, to flush all tasks
240*6777b538SAndroid Build Coastguard Worker   // bound to Unretained() state before destroying test members -- it should be
241*6777b538SAndroid Build Coastguard Worker   // used with caution per the following warnings:
242*6777b538SAndroid Build Coastguard Worker   //
243*6777b538SAndroid Build Coastguard Worker   // WARNING #1: This may run long (flakily timeout) and even never return! Do
244*6777b538SAndroid Build Coastguard Worker   //             not use this when repeating tasks such as animated web pages
245*6777b538SAndroid Build Coastguard Worker   //             are present.
246*6777b538SAndroid Build Coastguard Worker   // WARNING #2: This may return too early! For example, if used to run until an
247*6777b538SAndroid Build Coastguard Worker   //             incoming event has occurred but that event depends on a task in
248*6777b538SAndroid Build Coastguard Worker   //             a different queue -- e.g. a standalone base::Thread or a system
249*6777b538SAndroid Build Coastguard Worker   //             event.
250*6777b538SAndroid Build Coastguard Worker   //
251*6777b538SAndroid Build Coastguard Worker   // As such, prefer RunLoop::Run() with an explicit RunLoop::QuitClosure() when
252*6777b538SAndroid Build Coastguard Worker   // possible.
253*6777b538SAndroid Build Coastguard Worker   void RunUntilIdle();
254*6777b538SAndroid Build Coastguard Worker 
255*6777b538SAndroid Build Coastguard Worker   // Only valid for instances using |TimeSource::MOCK_TIME|. Fast-forwards
256*6777b538SAndroid Build Coastguard Worker   // virtual time by |delta|, causing all tasks on the main thread and thread
257*6777b538SAndroid Build Coastguard Worker   // pool with a remaining delay less than or equal to |delta| to be executed
258*6777b538SAndroid Build Coastguard Worker   // in their natural order before this method returns. Undelayed tasks are just
259*6777b538SAndroid Build Coastguard Worker   // delayed tasks with a delay of 0, so they are also executed. |delta| must be
260*6777b538SAndroid Build Coastguard Worker   // non-negative. Upon returning from this method, NowTicks() will be >= the
261*6777b538SAndroid Build Coastguard Worker   // initial |NowTicks() + delta|. It is guaranteed to be == iff tasks executed
262*6777b538SAndroid Build Coastguard Worker   // in this FastForwardBy() didn't result in nested calls to
263*6777b538SAndroid Build Coastguard Worker   // time-advancing-methods.
264*6777b538SAndroid Build Coastguard Worker   void FastForwardBy(TimeDelta delta);
265*6777b538SAndroid Build Coastguard Worker 
266*6777b538SAndroid Build Coastguard Worker   // Similar to `FastForwardBy` but doesn't advance `base::LiveTicks`, behaving
267*6777b538SAndroid Build Coastguard Worker   // as if the system was suspended for `delta` time and immediately woken up.
268*6777b538SAndroid Build Coastguard Worker   void SuspendedFastForwardBy(TimeDelta delta);
269*6777b538SAndroid Build Coastguard Worker 
270*6777b538SAndroid Build Coastguard Worker   // Only valid for instances using TimeSource::MOCK_TIME.
271*6777b538SAndroid Build Coastguard Worker   // Short for FastForwardBy(TimeDelta::Max()).
272*6777b538SAndroid Build Coastguard Worker   //
273*6777b538SAndroid Build Coastguard Worker   // WARNING: This has the same caveat as RunUntilIdle() and is even more likely
274*6777b538SAndroid Build Coastguard Worker   // to spin forever (any RepeatingTimer will cause this).
275*6777b538SAndroid Build Coastguard Worker   void FastForwardUntilNoTasksRemain();
276*6777b538SAndroid Build Coastguard Worker 
277*6777b538SAndroid Build Coastguard Worker   // Only valid for instances using TimeSource::MOCK_TIME. Advances virtual time
278*6777b538SAndroid Build Coastguard Worker   // by |delta|. Unlike FastForwardBy, this does not run tasks. Prefer
279*6777b538SAndroid Build Coastguard Worker   // FastForwardBy() when possible but this can be useful when testing blocked
280*6777b538SAndroid Build Coastguard Worker   // pending tasks where being idle (required to fast-forward) is not possible.
281*6777b538SAndroid Build Coastguard Worker   //
282*6777b538SAndroid Build Coastguard Worker   // Delayed tasks that are ripe as a result of this will be scheduled.
283*6777b538SAndroid Build Coastguard Worker   // RunUntilIdle() can be used after this call to ensure those tasks have run.
284*6777b538SAndroid Build Coastguard Worker   // Note: AdvanceClock(delta) + RunUntilIdle() is slightly different from
285*6777b538SAndroid Build Coastguard Worker   // FastForwardBy(delta) in that time passes instantly before running any task
286*6777b538SAndroid Build Coastguard Worker   // (whereas FastForwardBy() will advance the clock in the smallest increments
287*6777b538SAndroid Build Coastguard Worker   // possible at a time). Hence FastForwardBy() is more realistic but
288*6777b538SAndroid Build Coastguard Worker   // AdvanceClock() can be useful when testing edge case scenarios that
289*6777b538SAndroid Build Coastguard Worker   // specifically handle more time than expected to have passed.
290*6777b538SAndroid Build Coastguard Worker   void AdvanceClock(TimeDelta delta);
291*6777b538SAndroid Build Coastguard Worker 
292*6777b538SAndroid Build Coastguard Worker   // Similar to `AdvanceClock` but doesn't advance `base::LiveTicks`, behaving
293*6777b538SAndroid Build Coastguard Worker   // as if the system was suspended for `delta` time and immediately woken up.
294*6777b538SAndroid Build Coastguard Worker   void SuspendedAdvanceClock(TimeDelta delta);
295*6777b538SAndroid Build Coastguard Worker 
UsesMockTime()296*6777b538SAndroid Build Coastguard Worker   bool UsesMockTime() const { return !!mock_clock_; }
297*6777b538SAndroid Build Coastguard Worker 
298*6777b538SAndroid Build Coastguard Worker   // Only valid for instances using TimeSource::MOCK_TIME. Returns a
299*6777b538SAndroid Build Coastguard Worker   // TickClock whose time is updated by FastForward(By|UntilNoTasksRemain).
300*6777b538SAndroid Build Coastguard Worker   const TickClock* GetMockTickClock() const;
301*6777b538SAndroid Build Coastguard Worker 
302*6777b538SAndroid Build Coastguard Worker   // Only valid for instances using TimeSource::MOCK_TIME. Returns a
303*6777b538SAndroid Build Coastguard Worker   // Clock whose time is updated by FastForward(By|UntilNoTasksRemain). The
304*6777b538SAndroid Build Coastguard Worker   // initial value is implementation defined and should be queried by tests that
305*6777b538SAndroid Build Coastguard Worker   // depend on it.
306*6777b538SAndroid Build Coastguard Worker   // TickClock should be used instead of Clock to measure elapsed time in a
307*6777b538SAndroid Build Coastguard Worker   // process. See time.h.
308*6777b538SAndroid Build Coastguard Worker   const Clock* GetMockClock() const;
309*6777b538SAndroid Build Coastguard Worker 
310*6777b538SAndroid Build Coastguard Worker   // Only valid for instances using TimeSource::MOCK_TIME. Returns the current
311*6777b538SAndroid Build Coastguard Worker   // virtual tick time (based on a realistic Now(), sampled when this
312*6777b538SAndroid Build Coastguard Worker   // TaskEnvironment was created, and manually advanced from that point on).
313*6777b538SAndroid Build Coastguard Worker   // This is always equivalent to base::TimeTicks::Now() under
314*6777b538SAndroid Build Coastguard Worker   // TimeSource::MOCK_TIME.
315*6777b538SAndroid Build Coastguard Worker   base::TimeTicks NowTicks() const;
316*6777b538SAndroid Build Coastguard Worker 
317*6777b538SAndroid Build Coastguard Worker   // Only valid for instances using TimeSource::MOCK_TIME. Returns the current
318*6777b538SAndroid Build Coastguard Worker   // virtual live time (based on a realistic Now(), sampled when this
319*6777b538SAndroid Build Coastguard Worker   // TaskEnvironment was created, and manually advanced from that point on).
320*6777b538SAndroid Build Coastguard Worker   // This is always equivalent to base::LiveTicks::Now() under
321*6777b538SAndroid Build Coastguard Worker   // TimeSource::MOCK_TIME.
322*6777b538SAndroid Build Coastguard Worker   base::LiveTicks NowLiveTicks() const;
323*6777b538SAndroid Build Coastguard Worker 
324*6777b538SAndroid Build Coastguard Worker   // Only valid for instances using TimeSource::MOCK_TIME. Returns the number of
325*6777b538SAndroid Build Coastguard Worker   // pending tasks (delayed and non-delayed) of the main thread's TaskRunner.
326*6777b538SAndroid Build Coastguard Worker   // When debugging, you can use DescribeCurrentTasks() to see what those are.
327*6777b538SAndroid Build Coastguard Worker   size_t GetPendingMainThreadTaskCount() const;
328*6777b538SAndroid Build Coastguard Worker 
329*6777b538SAndroid Build Coastguard Worker   // Only valid for instances using TimeSource::MOCK_TIME.
330*6777b538SAndroid Build Coastguard Worker   // Returns the delay until the next pending task of the main thread's
331*6777b538SAndroid Build Coastguard Worker   // TaskRunner if there is one, otherwise it returns TimeDelta::Max().
332*6777b538SAndroid Build Coastguard Worker   TimeDelta NextMainThreadPendingTaskDelay() const;
333*6777b538SAndroid Build Coastguard Worker 
334*6777b538SAndroid Build Coastguard Worker   // Only valid for instances using TimeSource::MOCK_TIME.
335*6777b538SAndroid Build Coastguard Worker   // Returns true iff the next task is delayed. Returns false if the next task
336*6777b538SAndroid Build Coastguard Worker   // is immediate or if there is no next task.
337*6777b538SAndroid Build Coastguard Worker   bool NextTaskIsDelayed() const;
338*6777b538SAndroid Build Coastguard Worker 
339*6777b538SAndroid Build Coastguard Worker   // For debugging purposes: Dumps information about pending tasks on the main
340*6777b538SAndroid Build Coastguard Worker   // thread, and currently running tasks on the thread pool.
341*6777b538SAndroid Build Coastguard Worker   void DescribeCurrentTasks() const;
342*6777b538SAndroid Build Coastguard Worker 
343*6777b538SAndroid Build Coastguard Worker   // Detach ThreadCheckers (will rebind on next usage), useful for the odd test
344*6777b538SAndroid Build Coastguard Worker   // suite which doesn't run on the main thread but still has exclusive access
345*6777b538SAndroid Build Coastguard Worker   // to driving this TaskEnvironment (e.g. WaylandClientTestSuiteServer).
346*6777b538SAndroid Build Coastguard Worker   void DetachFromThread();
347*6777b538SAndroid Build Coastguard Worker 
348*6777b538SAndroid Build Coastguard Worker   class TestTaskTracker;
349*6777b538SAndroid Build Coastguard Worker   // Callers outside of TaskEnvironment may not use the returned pointer. They
350*6777b538SAndroid Build Coastguard Worker   // should just use base::ThreadPoolInstance::Get().
351*6777b538SAndroid Build Coastguard Worker   static TestTaskTracker* CreateThreadPool();
352*6777b538SAndroid Build Coastguard Worker 
353*6777b538SAndroid Build Coastguard Worker   class DestructionObserver : public CheckedObserver {
354*6777b538SAndroid Build Coastguard Worker    public:
355*6777b538SAndroid Build Coastguard Worker     DestructionObserver() = default;
356*6777b538SAndroid Build Coastguard Worker     ~DestructionObserver() override = default;
357*6777b538SAndroid Build Coastguard Worker 
358*6777b538SAndroid Build Coastguard Worker     DestructionObserver(const DestructionObserver&) = delete;
359*6777b538SAndroid Build Coastguard Worker     DestructionObserver& operator=(const DestructionObserver&) = delete;
360*6777b538SAndroid Build Coastguard Worker 
361*6777b538SAndroid Build Coastguard Worker     virtual void WillDestroyCurrentTaskEnvironment() = 0;
362*6777b538SAndroid Build Coastguard Worker   };
363*6777b538SAndroid Build Coastguard Worker 
364*6777b538SAndroid Build Coastguard Worker   // Adds/removes a DestructionObserver to any TaskEnvironment. Observers are
365*6777b538SAndroid Build Coastguard Worker   // notified when any TaskEnvironment goes out of scope (other than with a move
366*6777b538SAndroid Build Coastguard Worker   // operation). Must be called on the main thread.
367*6777b538SAndroid Build Coastguard Worker   static void AddDestructionObserver(DestructionObserver* observer);
368*6777b538SAndroid Build Coastguard Worker   static void RemoveDestructionObserver(DestructionObserver* observer);
369*6777b538SAndroid Build Coastguard Worker 
370*6777b538SAndroid Build Coastguard Worker   // Instantiating a ParallelExecutionFence waits for all currently running
371*6777b538SAndroid Build Coastguard Worker   // ThreadPool tasks before the constructor returns and from then on prevents
372*6777b538SAndroid Build Coastguard Worker   // additional tasks from running during its lifetime.
373*6777b538SAndroid Build Coastguard Worker   //
374*6777b538SAndroid Build Coastguard Worker   // Must be instantiated from the test main thread.
375*6777b538SAndroid Build Coastguard Worker   class ParallelExecutionFence {
376*6777b538SAndroid Build Coastguard Worker    public:
377*6777b538SAndroid Build Coastguard Worker     // Instantiates a ParallelExecutionFence, crashes with an optional
378*6777b538SAndroid Build Coastguard Worker     // |error_message| if not invoked from test main thread.
379*6777b538SAndroid Build Coastguard Worker     explicit ParallelExecutionFence(const char* error_message = "");
380*6777b538SAndroid Build Coastguard Worker     ~ParallelExecutionFence();
381*6777b538SAndroid Build Coastguard Worker 
382*6777b538SAndroid Build Coastguard Worker     ParallelExecutionFence(const ParallelExecutionFence&) = delete;
383*6777b538SAndroid Build Coastguard Worker     ParallelExecutionFence& operator=(const ParallelExecutionFence& other) =
384*6777b538SAndroid Build Coastguard Worker         delete;
385*6777b538SAndroid Build Coastguard Worker 
386*6777b538SAndroid Build Coastguard Worker    private:
387*6777b538SAndroid Build Coastguard Worker     bool previously_allowed_to_run_ = false;
388*6777b538SAndroid Build Coastguard Worker   };
389*6777b538SAndroid Build Coastguard Worker 
390*6777b538SAndroid Build Coastguard Worker   // The number of foreground workers in the ThreadPool managed by a
391*6777b538SAndroid Build Coastguard Worker   // TaskEnvironment instance. This can be used to determine the maximum
392*6777b538SAndroid Build Coastguard Worker   // parallelism in tests that require each parallel task it spawns to be
393*6777b538SAndroid Build Coastguard Worker   // running at once. Having multiple threads prevents deadlocks should some
394*6777b538SAndroid Build Coastguard Worker   // blocking APIs not use ScopedBlockingCall. It also allows enough concurrency
395*6777b538SAndroid Build Coastguard Worker   // to allow TSAN to spot data races.
396*6777b538SAndroid Build Coastguard Worker   static constexpr int kNumForegroundThreadPoolThreads = 4;
397*6777b538SAndroid Build Coastguard Worker 
398*6777b538SAndroid Build Coastguard Worker  protected:
399*6777b538SAndroid Build Coastguard Worker   template <typename... TaskEnvironmentTraits>
400*6777b538SAndroid Build Coastguard Worker     requires trait_helpers::AreValidTraits<ValidTraits,
401*6777b538SAndroid Build Coastguard Worker                                            TaskEnvironmentTraits...>
CreateTaskEnvironmentWithPriorities(sequence_manager::SequenceManager::PrioritySettings priority_settings,TaskEnvironmentTraits...traits)402*6777b538SAndroid Build Coastguard Worker   NOINLINE static TaskEnvironment CreateTaskEnvironmentWithPriorities(
403*6777b538SAndroid Build Coastguard Worker       sequence_manager::SequenceManager::PrioritySettings priority_settings,
404*6777b538SAndroid Build Coastguard Worker       TaskEnvironmentTraits... traits) {
405*6777b538SAndroid Build Coastguard Worker     return TaskEnvironment(std::move(priority_settings), traits...);
406*6777b538SAndroid Build Coastguard Worker   }
407*6777b538SAndroid Build Coastguard Worker 
408*6777b538SAndroid Build Coastguard Worker   // Constructor accepts zero or more traits which customize the testing
409*6777b538SAndroid Build Coastguard Worker   // environment.
410*6777b538SAndroid Build Coastguard Worker   template <typename... TaskEnvironmentTraits>
411*6777b538SAndroid Build Coastguard Worker     requires trait_helpers::AreValidTraits<ValidTraits,
412*6777b538SAndroid Build Coastguard Worker                                            TaskEnvironmentTraits...>
TaskEnvironment(sequence_manager::SequenceManager::PrioritySettings priority_settings,TaskEnvironmentTraits...traits)413*6777b538SAndroid Build Coastguard Worker   NOINLINE explicit TaskEnvironment(
414*6777b538SAndroid Build Coastguard Worker       sequence_manager::SequenceManager::PrioritySettings priority_settings,
415*6777b538SAndroid Build Coastguard Worker       TaskEnvironmentTraits... traits)
416*6777b538SAndroid Build Coastguard Worker       : TaskEnvironment(
417*6777b538SAndroid Build Coastguard Worker             std::move(priority_settings),
418*6777b538SAndroid Build Coastguard Worker             trait_helpers::GetEnum<TimeSource, TimeSource::DEFAULT>(traits...),
419*6777b538SAndroid Build Coastguard Worker             trait_helpers::GetEnum<MainThreadType, MainThreadType::DEFAULT>(
420*6777b538SAndroid Build Coastguard Worker                 traits...),
421*6777b538SAndroid Build Coastguard Worker             trait_helpers::GetEnum<ThreadPoolExecutionMode,
422*6777b538SAndroid Build Coastguard Worker                                    ThreadPoolExecutionMode::DEFAULT>(traits...),
423*6777b538SAndroid Build Coastguard Worker             trait_helpers::GetEnum<ThreadingMode, ThreadingMode::DEFAULT>(
424*6777b538SAndroid Build Coastguard Worker                 traits...),
425*6777b538SAndroid Build Coastguard Worker             trait_helpers::GetEnum<ThreadPoolCOMEnvironment,
426*6777b538SAndroid Build Coastguard Worker                                    ThreadPoolCOMEnvironment::DEFAULT>(
427*6777b538SAndroid Build Coastguard Worker                 traits...),
428*6777b538SAndroid Build Coastguard Worker             trait_helpers::HasTrait<SubclassCreatesDefaultTaskRunner,
429*6777b538SAndroid Build Coastguard Worker                                     TaskEnvironmentTraits...>(),
430*6777b538SAndroid Build Coastguard Worker             trait_helpers::NotATraitTag()) {}
431*6777b538SAndroid Build Coastguard Worker 
432*6777b538SAndroid Build Coastguard Worker   TaskEnvironment(TaskEnvironment&& other);
433*6777b538SAndroid Build Coastguard Worker 
main_thread_type()434*6777b538SAndroid Build Coastguard Worker   constexpr MainThreadType main_thread_type() const {
435*6777b538SAndroid Build Coastguard Worker     return main_thread_type_;
436*6777b538SAndroid Build Coastguard Worker   }
437*6777b538SAndroid Build Coastguard Worker 
thread_pool_execution_mode()438*6777b538SAndroid Build Coastguard Worker   constexpr ThreadPoolExecutionMode thread_pool_execution_mode() const {
439*6777b538SAndroid Build Coastguard Worker     return thread_pool_execution_mode_;
440*6777b538SAndroid Build Coastguard Worker   }
441*6777b538SAndroid Build Coastguard Worker 
442*6777b538SAndroid Build Coastguard Worker   // Returns the MockTimeDomain driving this TaskEnvironment if this instance is
443*6777b538SAndroid Build Coastguard Worker   // using TimeSource::MOCK_TIME, nullptr otherwise.
444*6777b538SAndroid Build Coastguard Worker   sequence_manager::TimeDomain* GetMockTimeDomain() const;
445*6777b538SAndroid Build Coastguard Worker 
446*6777b538SAndroid Build Coastguard Worker   sequence_manager::SequenceManager* sequence_manager() const;
447*6777b538SAndroid Build Coastguard Worker 
448*6777b538SAndroid Build Coastguard Worker   void DeferredInitFromSubclass(
449*6777b538SAndroid Build Coastguard Worker       scoped_refptr<base::SingleThreadTaskRunner> task_runner);
450*6777b538SAndroid Build Coastguard Worker 
451*6777b538SAndroid Build Coastguard Worker   // Derived classes may need to control when the task environment goes away
452*6777b538SAndroid Build Coastguard Worker   // (e.g. ~FooTaskEnvironment() may want to effectively trigger
453*6777b538SAndroid Build Coastguard Worker   // ~TaskEnvironment() before its members are destroyed).
454*6777b538SAndroid Build Coastguard Worker   void DestroyTaskEnvironment();
455*6777b538SAndroid Build Coastguard Worker 
456*6777b538SAndroid Build Coastguard Worker  private:
457*6777b538SAndroid Build Coastguard Worker   class MockTimeDomain;
458*6777b538SAndroid Build Coastguard Worker 
459*6777b538SAndroid Build Coastguard Worker   void InitializeThreadPool();
460*6777b538SAndroid Build Coastguard Worker   void ShutdownAndJoinThreadPool();
461*6777b538SAndroid Build Coastguard Worker   void DestroyThreadPool();
462*6777b538SAndroid Build Coastguard Worker 
463*6777b538SAndroid Build Coastguard Worker   void CompleteInitialization();
464*6777b538SAndroid Build Coastguard Worker 
465*6777b538SAndroid Build Coastguard Worker   void FastForwardByInternal(TimeDelta delta, bool advance_live_ticks);
466*6777b538SAndroid Build Coastguard Worker 
467*6777b538SAndroid Build Coastguard Worker   // The template constructor has to be in the header but it delegates to this
468*6777b538SAndroid Build Coastguard Worker   // constructor to initialize all other members out-of-line.
469*6777b538SAndroid Build Coastguard Worker   TaskEnvironment(
470*6777b538SAndroid Build Coastguard Worker       sequence_manager::SequenceManager::PrioritySettings priority_settings,
471*6777b538SAndroid Build Coastguard Worker       TimeSource time_source,
472*6777b538SAndroid Build Coastguard Worker       MainThreadType main_thread_type,
473*6777b538SAndroid Build Coastguard Worker       ThreadPoolExecutionMode thread_pool_execution_mode,
474*6777b538SAndroid Build Coastguard Worker       ThreadingMode threading_mode,
475*6777b538SAndroid Build Coastguard Worker       ThreadPoolCOMEnvironment thread_pool_com_environment,
476*6777b538SAndroid Build Coastguard Worker       bool subclass_creates_default_taskrunner,
477*6777b538SAndroid Build Coastguard Worker       trait_helpers::NotATraitTag tag);
478*6777b538SAndroid Build Coastguard Worker 
479*6777b538SAndroid Build Coastguard Worker   const MainThreadType main_thread_type_;
480*6777b538SAndroid Build Coastguard Worker   const ThreadPoolExecutionMode thread_pool_execution_mode_;
481*6777b538SAndroid Build Coastguard Worker   const ThreadingMode threading_mode_;
482*6777b538SAndroid Build Coastguard Worker   const ThreadPoolCOMEnvironment thread_pool_com_environment_;
483*6777b538SAndroid Build Coastguard Worker   const bool subclass_creates_default_taskrunner_;
484*6777b538SAndroid Build Coastguard Worker 
485*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<sequence_manager::SequenceManager> sequence_manager_;
486*6777b538SAndroid Build Coastguard Worker 
487*6777b538SAndroid Build Coastguard Worker   // Manages the clock under TimeSource::MOCK_TIME modes. Null in
488*6777b538SAndroid Build Coastguard Worker   // TimeSource::SYSTEM_TIME mode.
489*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<MockTimeDomain> mock_time_domain_;
490*6777b538SAndroid Build Coastguard Worker 
491*6777b538SAndroid Build Coastguard Worker   // Overrides Time/TimeTicks::Now() under TimeSource::MOCK_TIME mode.
492*6777b538SAndroid Build Coastguard Worker   // Null in other modes.
493*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<subtle::ScopedTimeClockOverrides> time_overrides_;
494*6777b538SAndroid Build Coastguard Worker 
495*6777b538SAndroid Build Coastguard Worker   sequence_manager::TaskQueue::Handle task_queue_;
496*6777b538SAndroid Build Coastguard Worker   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
497*6777b538SAndroid Build Coastguard Worker 
498*6777b538SAndroid Build Coastguard Worker   // Only set for instances using TimeSource::MOCK_TIME.
499*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<Clock> mock_clock_;
500*6777b538SAndroid Build Coastguard Worker 
501*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
502*6777b538SAndroid Build Coastguard Worker   // Enables the FileDescriptorWatcher API iff running a MainThreadType::IO.
503*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<FileDescriptorWatcher> file_descriptor_watcher_;
504*6777b538SAndroid Build Coastguard Worker #endif
505*6777b538SAndroid Build Coastguard Worker 
506*6777b538SAndroid Build Coastguard Worker   // Owned by the ThreadPoolInstance.
507*6777b538SAndroid Build Coastguard Worker   raw_ptr<TestTaskTracker, DanglingUntriaged> task_tracker_ = nullptr;
508*6777b538SAndroid Build Coastguard Worker 
509*6777b538SAndroid Build Coastguard Worker   // Ensures destruction of lazy TaskRunners when this is destroyed.
510*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<base::internal::ScopedLazyTaskRunnerListForTesting>
511*6777b538SAndroid Build Coastguard Worker       scoped_lazy_task_runner_list_for_testing_;
512*6777b538SAndroid Build Coastguard Worker 
513*6777b538SAndroid Build Coastguard Worker   // Sets RunLoop::Run() to LOG(FATAL) if not Quit() in a timely manner.
514*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<ScopedRunLoopTimeout> run_loop_timeout_;
515*6777b538SAndroid Build Coastguard Worker 
516*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<bool> owns_instance_ = std::make_unique<bool>(true);
517*6777b538SAndroid Build Coastguard Worker 
518*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<RunLoop> run_until_quit_loop_;
519*6777b538SAndroid Build Coastguard Worker 
520*6777b538SAndroid Build Coastguard Worker   // Used to verify thread-affinity of operations that must occur on the main
521*6777b538SAndroid Build Coastguard Worker   // thread. This is the case for anything that modifies or drives the
522*6777b538SAndroid Build Coastguard Worker   // |sequence_manager_|.
523*6777b538SAndroid Build Coastguard Worker   THREAD_CHECKER(main_thread_checker_);
524*6777b538SAndroid Build Coastguard Worker };
525*6777b538SAndroid Build Coastguard Worker 
526*6777b538SAndroid Build Coastguard Worker // SingleThreadTaskEnvironment takes the same traits as TaskEnvironment and is
527*6777b538SAndroid Build Coastguard Worker // used the exact same way. It's a short-form for
528*6777b538SAndroid Build Coastguard Worker //   TaskEnvironment{TaskEnvironment::ThreadingMode::MAIN_THREAD_ONLY, ...};
529*6777b538SAndroid Build Coastguard Worker class SingleThreadTaskEnvironment : public TaskEnvironment {
530*6777b538SAndroid Build Coastguard Worker  public:
531*6777b538SAndroid Build Coastguard Worker   template <class... ArgTypes>
SingleThreadTaskEnvironment(ArgTypes...args)532*6777b538SAndroid Build Coastguard Worker   SingleThreadTaskEnvironment(ArgTypes... args)
533*6777b538SAndroid Build Coastguard Worker       : TaskEnvironment(ThreadingMode::MAIN_THREAD_ONLY, args...) {}
534*6777b538SAndroid Build Coastguard Worker };
535*6777b538SAndroid Build Coastguard Worker 
536*6777b538SAndroid Build Coastguard Worker }  // namespace test
537*6777b538SAndroid Build Coastguard Worker }  // namespace base
538*6777b538SAndroid Build Coastguard Worker 
539*6777b538SAndroid Build Coastguard Worker #endif  // BASE_TEST_TASK_ENVIRONMENT_H_
540