1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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_TEST_PENDING_TASK_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_TEST_TEST_PENDING_TASK_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <string> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/location.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker namespace base { 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker namespace trace_event { 17*6777b538SAndroid Build Coastguard Worker class TracedValue; 18*6777b538SAndroid Build Coastguard Worker class ConvertableToTraceFormat; 19*6777b538SAndroid Build Coastguard Worker } // namespace trace_event 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker // TestPendingTask is a helper class for test TaskRunner 22*6777b538SAndroid Build Coastguard Worker // implementations. See test_simple_task_runner.h for example usage. 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker struct TestPendingTask { 25*6777b538SAndroid Build Coastguard Worker enum TestNestability { NESTABLE, NON_NESTABLE }; 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker TestPendingTask(); 28*6777b538SAndroid Build Coastguard Worker TestPendingTask(const Location& location, 29*6777b538SAndroid Build Coastguard Worker OnceClosure task, 30*6777b538SAndroid Build Coastguard Worker TimeTicks post_time, 31*6777b538SAndroid Build Coastguard Worker TimeDelta delay, 32*6777b538SAndroid Build Coastguard Worker TestNestability nestability); 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker TestPendingTask(const TestPendingTask&) = delete; 35*6777b538SAndroid Build Coastguard Worker TestPendingTask& operator=(const TestPendingTask&) = delete; 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker TestPendingTask(TestPendingTask&& other); 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker ~TestPendingTask(); 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker TestPendingTask& operator=(TestPendingTask&& other); 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker // Returns post_time + delay. 44*6777b538SAndroid Build Coastguard Worker TimeTicks GetTimeToRun() const; 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker // Returns true if this task is nestable and |other| isn't, or if 47*6777b538SAndroid Build Coastguard Worker // this task's time to run is strictly earlier than |other|'s time 48*6777b538SAndroid Build Coastguard Worker // to run. 49*6777b538SAndroid Build Coastguard Worker // 50*6777b538SAndroid Build Coastguard Worker // Note that two tasks may both have the same nestability and delay. 51*6777b538SAndroid Build Coastguard Worker // In that case, the caller must use some other criterion (probably 52*6777b538SAndroid Build Coastguard Worker // the position in some queue) to break the tie. Conveniently, the 53*6777b538SAndroid Build Coastguard Worker // following STL functions already do so: 54*6777b538SAndroid Build Coastguard Worker // 55*6777b538SAndroid Build Coastguard Worker // - std::min_element 56*6777b538SAndroid Build Coastguard Worker // - std::stable_sort 57*6777b538SAndroid Build Coastguard Worker // 58*6777b538SAndroid Build Coastguard Worker // but the following STL functions don't: 59*6777b538SAndroid Build Coastguard Worker // 60*6777b538SAndroid Build Coastguard Worker // - std::max_element 61*6777b538SAndroid Build Coastguard Worker // - std::sort. 62*6777b538SAndroid Build Coastguard Worker bool ShouldRunBefore(const TestPendingTask& other) const; 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Worker Location location; 65*6777b538SAndroid Build Coastguard Worker OnceClosure task; 66*6777b538SAndroid Build Coastguard Worker TimeTicks post_time; 67*6777b538SAndroid Build Coastguard Worker TimeDelta delay; 68*6777b538SAndroid Build Coastguard Worker TestNestability nestability; 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker // Functions for using test pending task with tracing, useful in unit 71*6777b538SAndroid Build Coastguard Worker // testing. 72*6777b538SAndroid Build Coastguard Worker void AsValueInto(base::trace_event::TracedValue* state) const; 73*6777b538SAndroid Build Coastguard Worker std::unique_ptr<base::trace_event::ConvertableToTraceFormat> AsValue() const; 74*6777b538SAndroid Build Coastguard Worker std::string ToString() const; 75*6777b538SAndroid Build Coastguard Worker }; 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker // gtest helpers which allow pretty printing of the tasks, very useful in unit 78*6777b538SAndroid Build Coastguard Worker // testing. 79*6777b538SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const TestPendingTask& task); 80*6777b538SAndroid Build Coastguard Worker void PrintTo(const TestPendingTask& task, std::ostream* os); 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker } // namespace base 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker #endif // BASE_TEST_TEST_PENDING_TASK_H_ 85