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