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

Side by Side Diff: base/sequence_checker_impl_unittest.cc

Issue 11550031: Implement SequenceChecker, which is a generalization of ThreadChecker (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 8 years 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 | Annotate | Revision Log
« no previous file with comments | « base/sequence_checker_impl.cc ('k') | base/sequence_checker_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/sequence_checker_impl.h"
6
7 #include <cstddef>
8
9 #include "base/bind.h"
10 #include "base/compiler_specific.h"
11 #include "base/location.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/message_loop.h"
14 #include "base/sequenced_task_runner.h"
15 #include "base/threading/thread.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 namespace base {
19
20 namespace {
21
22 // Implementation of SequencedTaskRunner that lets us control what
23 // RunsTasksOnCurrentThread() returns.
24 class FakeTaskRunner : public SequencedTaskRunner {
25 public:
26 FakeTaskRunner() : runs_tasks_on_current_thread_(false) {}
27
28 void SetRunsTasksOnCurrentThread(bool runs_tasks_on_current_thread) {
29 runs_tasks_on_current_thread_ = runs_tasks_on_current_thread;
30 }
31
32 // SequencedTaskRunner implementation.
33 virtual bool PostDelayedTask(const tracked_objects::Location& from_here,
34 const Closure& task,
35 TimeDelta delay) OVERRIDE {
36 ADD_FAILURE();
37 return false;
38 }
39
40 virtual bool PostNonNestableDelayedTask(
41 const tracked_objects::Location& from_here,
42 const Closure& task,
43 TimeDelta delay) OVERRIDE {
44 ADD_FAILURE();
45 return false;
46 }
47
48 virtual bool RunsTasksOnCurrentThread() const OVERRIDE {
49 return runs_tasks_on_current_thread_;
50 }
51
52 protected:
53 virtual ~FakeTaskRunner() {}
54
55 private:
56 bool runs_tasks_on_current_thread_;
57 };
58
59 class SequenceCheckerImplTest : public ::testing::Test {
60 };
61
62 // Create a SequenceCheckerImpl with a SequencedTaskRunner and make
63 // sure that CalledOnValidSequence() returns what that SequencedTaskRunner
64 // returns for RunsTasksOnCurrentThread().
65 TEST_F(SequenceCheckerImplTest, CalledOnValidSequenceNonNull) {
66 const scoped_refptr<FakeTaskRunner> fake_sequenced_task_runner(
67 new FakeTaskRunner());
68
69 const SequenceCheckerImpl sequence_checker_impl(fake_sequenced_task_runner);
70 EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
71
72 fake_sequenced_task_runner->SetRunsTasksOnCurrentThread(true);
73 EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
74
75 fake_sequenced_task_runner->SetRunsTasksOnCurrentThread(false);
76 EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
77 }
78
79 void ExpectCalledOnValidSequence(
80 const tracked_objects::Location& location,
81 const SequenceCheckerImpl* sequence_checker_impl,
82 bool expected_value) {
83 EXPECT_EQ(expected_value, sequence_checker_impl->CalledOnValidSequence())
84 << location.ToString();
85 }
86
87 // Create a SequenceCheckerImpl with no SequencedTaskRunner and make
88 // sure that CalledOnValidSequence() behaves like
89 // ThreadChecker::CalledOnValidThread().
90 TEST_F(SequenceCheckerImplTest, CalledOnValidSequenceNull) {
91 const SequenceCheckerImpl sequence_checker_impl(NULL);
92 EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
93
94 {
95 Thread thread("thread 1");
96 ASSERT_TRUE(thread.Start());
97 thread.message_loop()->PostTask(
98 FROM_HERE, Bind(&ExpectCalledOnValidSequence,
99 FROM_HERE,
100 Unretained(&sequence_checker_impl),
101 false));
102 }
Ryan Sleevi 2012/12/21 20:26:47 I would add one more check here, before exiting, t
akalin 2012/12/21 20:41:40 Done.
103 }
104
105 // Create a SequenceCheckerImpl with a SequencedTaskRunner and switch
106 // it to another one. CalledOnValidSequence() should return what its
Ryan Sleevi 2012/12/21 20:26:47 comment nit: In what will probably prove to be my
akalin 2012/12/21 20:41:40 Done. Not judged.
107 // underlying SequencedTaskRunner returns for
108 // RunsTasksOnCurrentThread().
109 TEST_F(SequenceCheckerImplTest, ChangeSequenceNonNull) {
110 const scoped_refptr<FakeTaskRunner> fake_sequenced_task_runner1(
111 new FakeTaskRunner());
112
113 const scoped_refptr<FakeTaskRunner> fake_sequenced_task_runner2(
114 new FakeTaskRunner());
115
116 SequenceCheckerImpl sequence_checker_impl(fake_sequenced_task_runner1);
117 EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
118
119 fake_sequenced_task_runner2->SetRunsTasksOnCurrentThread(true);
120 EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
121
122 sequence_checker_impl.ChangeSequence(fake_sequenced_task_runner2);
123 EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
Ryan Sleevi 2012/12/21 20:26:47 For complete-ness sake in terms of testing, I woul
akalin 2012/12/21 20:41:40 Done.
124 }
125
126 // Create a SequenceCheckerImpl with a SequencedTaskRunner and switch
127 // it to a NULL one. CalledOnValidSequence() should then behave like
128 // ThreadChecker::CalledOnValidThread().
129 TEST_F(SequenceCheckerImplTest, ChangeSequenceNull) {
130 const scoped_refptr<FakeTaskRunner> fake_sequenced_task_runner(
131 new FakeTaskRunner());
132
133 SequenceCheckerImpl sequence_checker_impl(fake_sequenced_task_runner);
134 EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
135
136 sequence_checker_impl.ChangeSequence(NULL);
137 // Binds to current thread.
138 EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
139 {
140 Thread thread("thread 1");
141 ASSERT_TRUE(thread.Start());
142 thread.message_loop()->PostTask(
143 FROM_HERE, Bind(&ExpectCalledOnValidSequence,
144 FROM_HERE,
145 Unretained(&sequence_checker_impl),
146 false));
147 }
148
Ryan Sleevi 2012/12/21 20:26:47 I'd add an EXPECT_TRUE() here (for the same reason
akalin 2012/12/21 20:41:40 Done.
149 sequence_checker_impl.ChangeSequence(NULL);
150 // Binds to worker thread.
151 {
152 Thread thread("thread 2");
153 ASSERT_TRUE(thread.Start());
154 thread.message_loop()->PostTask(
155 FROM_HERE, Bind(&ExpectCalledOnValidSequence,
156 FROM_HERE,
157 Unretained(&sequence_checker_impl),
158 true));
159 }
160 EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
161 }
162
163 // Create a SequenceCheckerImpl with the current thread's task runner
164 // and switch it to other ones. CalledOnValidSequence() should return true
Ryan Sleevi 2012/12/21 20:26:47 comment nit: "ones" here is a bit weird. You mean
akalin 2012/12/21 20:41:40 Done.
165 // only when it's on the correct thread.
166 TEST_F(SequenceCheckerImplTest, MultipleThreads) {
167 MessageLoop loop;
168
169 SequenceCheckerImpl sequence_checker_impl(loop.message_loop_proxy());
170 EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
171
172 {
173 Thread thread("thread 1");
174 ASSERT_TRUE(thread.Start());
175 thread.message_loop()->PostTask(
176 FROM_HERE, Bind(&ExpectCalledOnValidSequence,
177 FROM_HERE,
178 Unretained(&sequence_checker_impl),
179 false));
180 thread.message_loop()->PostTask(
181 FROM_HERE, Bind(&SequenceCheckerImpl::ChangeSequence,
182 Unretained(&sequence_checker_impl),
183 thread.message_loop_proxy()));
184 thread.message_loop()->PostTask(
185 FROM_HERE, Bind(&ExpectCalledOnValidSequence,
186 FROM_HERE,
187 Unretained(&sequence_checker_impl),
188 true));
189 }
190
191 EXPECT_FALSE(sequence_checker_impl.CalledOnValidSequence());
192
193 sequence_checker_impl.ChangeSequence(loop.message_loop_proxy());
194 EXPECT_TRUE(sequence_checker_impl.CalledOnValidSequence());
195
196 {
197 Thread thread("thread 2");
198 ASSERT_TRUE(thread.Start());
199 thread.message_loop()->PostTask(
200 FROM_HERE, Bind(&ExpectCalledOnValidSequence,
201 FROM_HERE,
202 Unretained(&sequence_checker_impl),
203 false));
204 }
205 }
Ryan Sleevi 2012/12/21 20:26:47 nit: Add an EXPECT_TRUE here as well (same as line
akalin 2012/12/21 20:41:40 Done.
206
207 } // namespace
208
209 } // namespace base
OLDNEW
« no previous file with comments | « base/sequence_checker_impl.cc ('k') | base/sequence_checker_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698