1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 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_THREAD_TEST_HELPER_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_TEST_THREAD_TEST_HELPER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/waitable_event.h" 10*6777b538SAndroid Build Coastguard Worker #include "base/task/sequenced_task_runner.h" 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker namespace base { 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker // Helper class that executes code on a given target sequence/thread while 15*6777b538SAndroid Build Coastguard Worker // blocking on the invoking sequence/thread. To use, derive from this class and 16*6777b538SAndroid Build Coastguard Worker // overwrite RunTest. An alternative use of this class is to use it directly. It 17*6777b538SAndroid Build Coastguard Worker // will then block until all pending tasks on a given sequence/thread have been 18*6777b538SAndroid Build Coastguard Worker // executed. 19*6777b538SAndroid Build Coastguard Worker class ThreadTestHelper : public RefCountedThreadSafe<ThreadTestHelper> { 20*6777b538SAndroid Build Coastguard Worker public: 21*6777b538SAndroid Build Coastguard Worker explicit ThreadTestHelper(scoped_refptr<SequencedTaskRunner> target_sequence); 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker ThreadTestHelper(const ThreadTestHelper&) = delete; 24*6777b538SAndroid Build Coastguard Worker ThreadTestHelper& operator=(const ThreadTestHelper&) = delete; 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker // True if RunTest() was successfully executed on the target sequence. 27*6777b538SAndroid Build Coastguard Worker [[nodiscard]] bool Run(); 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker virtual void RunTest(); 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker protected: 32*6777b538SAndroid Build Coastguard Worker friend class RefCountedThreadSafe<ThreadTestHelper>; 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker virtual ~ThreadTestHelper(); 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker // Use this method to store the result of RunTest(). set_test_result(bool test_result)37*6777b538SAndroid Build Coastguard Worker void set_test_result(bool test_result) { test_result_ = test_result; } 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker private: 40*6777b538SAndroid Build Coastguard Worker void RunOnSequence(); 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker bool test_result_; 43*6777b538SAndroid Build Coastguard Worker scoped_refptr<SequencedTaskRunner> target_sequence_; 44*6777b538SAndroid Build Coastguard Worker WaitableEvent done_event_; 45*6777b538SAndroid Build Coastguard Worker }; 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker } // namespace base 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker #endif // BASE_TEST_THREAD_TEST_HELPER_H_ 50