Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(594)

Side by Side Diff: base/test/scoped_task_environment_unittest.cc

Issue 2891363005: Add ScopedTaskEnvironment::ExecutionControlMode. (Closed)
Patch Set: self-review Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/test/scoped_task_environment.h" 5 #include "base/test/scoped_task_environment.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/synchronization/atomic_flag.h" 8 #include "base/synchronization/atomic_flag.h"
9 #include "base/synchronization/waitable_event.h"
9 #include "base/task_scheduler/post_task.h" 10 #include "base/task_scheduler/post_task.h"
11 #include "base/test/test_timeouts.h"
12 #include "base/threading/platform_thread.h"
10 #include "base/threading/thread_task_runner_handle.h" 13 #include "base/threading/thread_task_runner_handle.h"
11 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
12 15
13 namespace base { 16 namespace base {
14 namespace test { 17 namespace test {
15 18
16 namespace { 19 namespace {
17 20
18 void VerifyRunUntilIdleDidNotReturnAndSetFlag( 21 void VerifyRunUntilIdleDidNotReturnAndSetFlag(
19 AtomicFlag* run_until_idle_returned, 22 AtomicFlag* run_until_idle_returned,
20 AtomicFlag* task_ran) { 23 AtomicFlag* task_ran) {
21 EXPECT_FALSE(run_until_idle_returned->IsSet()); 24 EXPECT_FALSE(run_until_idle_returned->IsSet());
22 task_ran->Set(); 25 task_ran->Set();
23 } 26 }
24 27
25 } // namespace 28 void RunUntilIdleTest(
26 29 ScopedTaskEnvironment::ExecutionMode execution_control_mode) {
27 TEST(ScopedTaskEnvironmentTest, RunUntilIdle) {
28 AtomicFlag run_until_idle_returned; 30 AtomicFlag run_until_idle_returned;
29 ScopedTaskEnvironment scoped_task_environment; 31 ScopedTaskEnvironment scoped_task_environment(
32 ScopedTaskEnvironment::MainThreadType::DEFAULT, execution_control_mode);
30 33
31 AtomicFlag first_main_thread_task_ran; 34 AtomicFlag first_main_thread_task_ran;
32 ThreadTaskRunnerHandle::Get()->PostTask( 35 ThreadTaskRunnerHandle::Get()->PostTask(
33 FROM_HERE, BindOnce(&VerifyRunUntilIdleDidNotReturnAndSetFlag, 36 FROM_HERE, BindOnce(&VerifyRunUntilIdleDidNotReturnAndSetFlag,
34 Unretained(&run_until_idle_returned), 37 Unretained(&run_until_idle_returned),
35 Unretained(&first_main_thread_task_ran))); 38 Unretained(&first_main_thread_task_ran)));
36 39
37 AtomicFlag first_task_scheduler_task_ran; 40 AtomicFlag first_task_scheduler_task_ran;
38 PostTask(FROM_HERE, BindOnce(&VerifyRunUntilIdleDidNotReturnAndSetFlag, 41 PostTask(FROM_HERE, BindOnce(&VerifyRunUntilIdleDidNotReturnAndSetFlag,
39 Unretained(&run_until_idle_returned), 42 Unretained(&run_until_idle_returned),
(...skipping 11 matching lines...) Expand all
51 54
52 scoped_task_environment.RunUntilIdle(); 55 scoped_task_environment.RunUntilIdle();
53 run_until_idle_returned.Set(); 56 run_until_idle_returned.Set();
54 57
55 EXPECT_TRUE(first_main_thread_task_ran.IsSet()); 58 EXPECT_TRUE(first_main_thread_task_ran.IsSet());
56 EXPECT_TRUE(first_task_scheduler_task_ran.IsSet()); 59 EXPECT_TRUE(first_task_scheduler_task_ran.IsSet());
57 EXPECT_TRUE(second_task_scheduler_task_ran.IsSet()); 60 EXPECT_TRUE(second_task_scheduler_task_ran.IsSet());
58 EXPECT_TRUE(second_main_thread_task_ran.IsSet()); 61 EXPECT_TRUE(second_main_thread_task_ran.IsSet());
59 } 62 }
60 63
64 } // namespace
65
66 TEST(ScopedTaskEnvironmentTest, QueuedRunUntilIdle) {
67 RunUntilIdleTest(ScopedTaskEnvironment::ExecutionMode::QUEUED);
68 }
69
70 TEST(ScopedTaskEnvironmentTest, AsyncRunUntilIdle) {
71 RunUntilIdleTest(ScopedTaskEnvironment::ExecutionMode::ASYNC);
72 }
73
74 // Verify that tasks posted to an ExecutionMode::QUEUED ScopedTaskEnvironment do
75 // not run outside of RunUntilIdle().
76 TEST(ScopedTaskEnvironmentTest, QueuedTasksDoNotRunOutsideOfRunUntilIdle) {
77 ScopedTaskEnvironment scoped_task_environment(
78 ScopedTaskEnvironment::MainThreadType::DEFAULT,
79 ScopedTaskEnvironment::ExecutionMode::QUEUED);
80
81 AtomicFlag run_until_idle_called;
82 PostTask(FROM_HERE, BindOnce(
83 [](AtomicFlag* run_until_idle_called) {
84 EXPECT_TRUE(run_until_idle_called->IsSet());
85 },
86 Unretained(&run_until_idle_called)));
87 PlatformThread::Sleep(TestTimeouts::tiny_timeout());
88 run_until_idle_called.Set();
89 scoped_task_environment.RunUntilIdle();
90
91 AtomicFlag other_run_until_idle_called;
92 PostTask(FROM_HERE, BindOnce(
93 [](AtomicFlag* other_run_until_idle_called) {
94 EXPECT_TRUE(other_run_until_idle_called->IsSet());
95 },
96 Unretained(&other_run_until_idle_called)));
97 PlatformThread::Sleep(TestTimeouts::tiny_timeout());
98 other_run_until_idle_called.Set();
99 scoped_task_environment.RunUntilIdle();
100 }
101
102 // Verify that a task posted to an ExecutionMode::Async ScopedTaskEnvironment
gab 2017/05/25 19:28:57 ASYNC (caps)
fdoray 2017/05/25 20:06:44 Done.
103 // can run without a call to RunUntilIdle().
104 TEST(ScopedTaskEnvironmentTest, AsyncTasksRunAsTheyArePosted) {
105 ScopedTaskEnvironment scoped_task_environment(
106 ScopedTaskEnvironment::MainThreadType::DEFAULT,
107 ScopedTaskEnvironment::ExecutionMode::ASYNC);
108
109 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL,
110 WaitableEvent::InitialState::NOT_SIGNALED);
111 PostTask(FROM_HERE,
112 BindOnce([](WaitableEvent* task_ran) { task_ran->Signal(); },
113 Unretained(&task_ran)));
114 task_ran.Wait();
115 }
116
117 // Verify that a task posted to an ExecutionMode::ASYNC ScopedTaskEnvironment
118 // after a call to RunUntilIdle() can run without another call to
119 // RunUntilIdle().
120 TEST(ScopedTaskEnvironmentTest, AsyncTasksRunAsTheyArePostedAfterRunUntilIdle) {
121 ScopedTaskEnvironment scoped_task_environment(
122 ScopedTaskEnvironment::MainThreadType::DEFAULT,
123 ScopedTaskEnvironment::ExecutionMode::ASYNC);
124
125 scoped_task_environment.RunUntilIdle();
126
127 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL,
128 WaitableEvent::InitialState::NOT_SIGNALED);
129 PostTask(FROM_HERE,
130 BindOnce([](WaitableEvent* task_ran) { task_ran->Signal(); },
131 Unretained(&task_ran)));
132 task_ran.Wait();
133 }
134
61 } // namespace test 135 } // namespace test
62 } // namespace base 136 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698