OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "mojo/public/cpp/utility/run_loop.h" | 5 #include "mojo/public/cpp/utility/run_loop.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "mojo/public/cpp/system/core.h" | 9 #include "mojo/public/cpp/system/core.h" |
10 #include "mojo/public/cpp/test_support/test_utils.h" | 10 #include "mojo/public/cpp/test_support/test_utils.h" |
11 #include "mojo/public/cpp/utility/run_loop_handler.h" | 11 #include "mojo/public/cpp/utility/run_loop_handler.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
13 | 13 |
14 namespace mojo { | 14 namespace mojo { |
15 namespace { | 15 namespace { |
16 | 16 |
17 class TestRunLoopHandler : public RunLoopHandler { | 17 class TestRunLoopHandler : public RunLoopHandler { |
18 public: | 18 public: |
19 TestRunLoopHandler() | 19 TestRunLoopHandler() |
20 : ready_count_(0), | 20 : ready_count_(0), |
21 error_count_(0), | 21 error_count_(0), |
22 last_error_result_(MOJO_RESULT_OK) { | 22 last_error_result_(MOJO_RESULT_OK) { |
23 } | 23 } |
24 virtual ~TestRunLoopHandler() {} | 24 ~TestRunLoopHandler() override {} |
25 | 25 |
26 void clear_ready_count() { ready_count_ = 0; } | 26 void clear_ready_count() { ready_count_ = 0; } |
27 int ready_count() const { return ready_count_; } | 27 int ready_count() const { return ready_count_; } |
28 | 28 |
29 void clear_error_count() { error_count_ = 0; } | 29 void clear_error_count() { error_count_ = 0; } |
30 int error_count() const { return error_count_; } | 30 int error_count() const { return error_count_; } |
31 | 31 |
32 MojoResult last_error_result() const { return last_error_result_; } | 32 MojoResult last_error_result() const { return last_error_result_; } |
33 | 33 |
34 // RunLoopHandler: | 34 // RunLoopHandler: |
35 virtual void OnHandleReady(const Handle& handle) override { ready_count_++; } | 35 void OnHandleReady(const Handle& handle) override { ready_count_++; } |
36 virtual void OnHandleError(const Handle& handle, MojoResult result) override { | 36 void OnHandleError(const Handle& handle, MojoResult result) override { |
37 error_count_++; | 37 error_count_++; |
38 last_error_result_ = result; | 38 last_error_result_ = result; |
39 } | 39 } |
40 | 40 |
41 private: | 41 private: |
42 int ready_count_; | 42 int ready_count_; |
43 int error_count_; | 43 int error_count_; |
44 MojoResult last_error_result_; | 44 MojoResult last_error_result_; |
45 | 45 |
46 MOJO_DISALLOW_COPY_AND_ASSIGN(TestRunLoopHandler); | 46 MOJO_DISALLOW_COPY_AND_ASSIGN(TestRunLoopHandler); |
(...skipping 19 matching lines...) Expand all Loading... |
66 // Trivial test to verify Run() with no added handles returns. | 66 // Trivial test to verify Run() with no added handles returns. |
67 TEST_F(RunLoopTest, ExitsWithNoHandles) { | 67 TEST_F(RunLoopTest, ExitsWithNoHandles) { |
68 RunLoop run_loop; | 68 RunLoop run_loop; |
69 run_loop.Run(); | 69 run_loop.Run(); |
70 } | 70 } |
71 | 71 |
72 class RemoveOnReadyRunLoopHandler : public TestRunLoopHandler { | 72 class RemoveOnReadyRunLoopHandler : public TestRunLoopHandler { |
73 public: | 73 public: |
74 RemoveOnReadyRunLoopHandler() : run_loop_(NULL) { | 74 RemoveOnReadyRunLoopHandler() : run_loop_(NULL) { |
75 } | 75 } |
76 virtual ~RemoveOnReadyRunLoopHandler() {} | 76 ~RemoveOnReadyRunLoopHandler() override {} |
77 | 77 |
78 void set_run_loop(RunLoop* run_loop) { run_loop_ = run_loop; } | 78 void set_run_loop(RunLoop* run_loop) { run_loop_ = run_loop; } |
79 | 79 |
80 // RunLoopHandler: | 80 // RunLoopHandler: |
81 virtual void OnHandleReady(const Handle& handle) override { | 81 void OnHandleReady(const Handle& handle) override { |
82 run_loop_->RemoveHandler(handle); | 82 run_loop_->RemoveHandler(handle); |
83 TestRunLoopHandler::OnHandleReady(handle); | 83 TestRunLoopHandler::OnHandleReady(handle); |
84 } | 84 } |
85 | 85 |
86 private: | 86 private: |
87 RunLoop* run_loop_; | 87 RunLoop* run_loop_; |
88 | 88 |
89 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoveOnReadyRunLoopHandler); | 89 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoveOnReadyRunLoopHandler); |
90 }; | 90 }; |
91 | 91 |
(...skipping 10 matching lines...) Expand all Loading... |
102 run_loop.Run(); | 102 run_loop.Run(); |
103 EXPECT_EQ(1, handler.ready_count()); | 103 EXPECT_EQ(1, handler.ready_count()); |
104 EXPECT_EQ(0, handler.error_count()); | 104 EXPECT_EQ(0, handler.error_count()); |
105 EXPECT_FALSE(run_loop.HasHandler(test_pipe.handle0.get())); | 105 EXPECT_FALSE(run_loop.HasHandler(test_pipe.handle0.get())); |
106 } | 106 } |
107 | 107 |
108 class QuitOnReadyRunLoopHandler : public TestRunLoopHandler { | 108 class QuitOnReadyRunLoopHandler : public TestRunLoopHandler { |
109 public: | 109 public: |
110 QuitOnReadyRunLoopHandler() : run_loop_(NULL) { | 110 QuitOnReadyRunLoopHandler() : run_loop_(NULL) { |
111 } | 111 } |
112 virtual ~QuitOnReadyRunLoopHandler() {} | 112 ~QuitOnReadyRunLoopHandler() override {} |
113 | 113 |
114 void set_run_loop(RunLoop* run_loop) { run_loop_ = run_loop; } | 114 void set_run_loop(RunLoop* run_loop) { run_loop_ = run_loop; } |
115 | 115 |
116 // RunLoopHandler: | 116 // RunLoopHandler: |
117 virtual void OnHandleReady(const Handle& handle) override { | 117 void OnHandleReady(const Handle& handle) override { |
118 run_loop_->Quit(); | 118 run_loop_->Quit(); |
119 TestRunLoopHandler::OnHandleReady(handle); | 119 TestRunLoopHandler::OnHandleReady(handle); |
120 } | 120 } |
121 | 121 |
122 private: | 122 private: |
123 RunLoop* run_loop_; | 123 RunLoop* run_loop_; |
124 | 124 |
125 MOJO_DISALLOW_COPY_AND_ASSIGN(QuitOnReadyRunLoopHandler); | 125 MOJO_DISALLOW_COPY_AND_ASSIGN(QuitOnReadyRunLoopHandler); |
126 }; | 126 }; |
127 | 127 |
(...skipping 10 matching lines...) Expand all Loading... |
138 run_loop.Run(); | 138 run_loop.Run(); |
139 EXPECT_EQ(1, handler.ready_count()); | 139 EXPECT_EQ(1, handler.ready_count()); |
140 EXPECT_EQ(0, handler.error_count()); | 140 EXPECT_EQ(0, handler.error_count()); |
141 EXPECT_TRUE(run_loop.HasHandler(test_pipe.handle0.get())); | 141 EXPECT_TRUE(run_loop.HasHandler(test_pipe.handle0.get())); |
142 } | 142 } |
143 | 143 |
144 class QuitOnErrorRunLoopHandler : public TestRunLoopHandler { | 144 class QuitOnErrorRunLoopHandler : public TestRunLoopHandler { |
145 public: | 145 public: |
146 QuitOnErrorRunLoopHandler() : run_loop_(NULL) { | 146 QuitOnErrorRunLoopHandler() : run_loop_(NULL) { |
147 } | 147 } |
148 virtual ~QuitOnErrorRunLoopHandler() {} | 148 ~QuitOnErrorRunLoopHandler() override {} |
149 | 149 |
150 void set_run_loop(RunLoop* run_loop) { run_loop_ = run_loop; } | 150 void set_run_loop(RunLoop* run_loop) { run_loop_ = run_loop; } |
151 | 151 |
152 // RunLoopHandler: | 152 // RunLoopHandler: |
153 virtual void OnHandleError(const Handle& handle, MojoResult result) override { | 153 void OnHandleError(const Handle& handle, MojoResult result) override { |
154 run_loop_->Quit(); | 154 run_loop_->Quit(); |
155 TestRunLoopHandler::OnHandleError(handle, result); | 155 TestRunLoopHandler::OnHandleError(handle, result); |
156 } | 156 } |
157 | 157 |
158 private: | 158 private: |
159 RunLoop* run_loop_; | 159 RunLoop* run_loop_; |
160 | 160 |
161 MOJO_DISALLOW_COPY_AND_ASSIGN(QuitOnErrorRunLoopHandler); | 161 MOJO_DISALLOW_COPY_AND_ASSIGN(QuitOnErrorRunLoopHandler); |
162 }; | 162 }; |
163 | 163 |
(...skipping 25 matching lines...) Expand all Loading... |
189 MOJO_DEADLINE_INDEFINITE); | 189 MOJO_DEADLINE_INDEFINITE); |
190 } | 190 } |
191 EXPECT_EQ(1, handler.error_count()); | 191 EXPECT_EQ(1, handler.error_count()); |
192 EXPECT_EQ(MOJO_RESULT_ABORTED, handler.last_error_result()); | 192 EXPECT_EQ(MOJO_RESULT_ABORTED, handler.last_error_result()); |
193 } | 193 } |
194 | 194 |
195 class RemoveManyRunLoopHandler : public TestRunLoopHandler { | 195 class RemoveManyRunLoopHandler : public TestRunLoopHandler { |
196 public: | 196 public: |
197 RemoveManyRunLoopHandler() : run_loop_(NULL) { | 197 RemoveManyRunLoopHandler() : run_loop_(NULL) { |
198 } | 198 } |
199 virtual ~RemoveManyRunLoopHandler() {} | 199 ~RemoveManyRunLoopHandler() override {} |
200 | 200 |
201 void set_run_loop(RunLoop* run_loop) { run_loop_ = run_loop; } | 201 void set_run_loop(RunLoop* run_loop) { run_loop_ = run_loop; } |
202 void add_handle(const Handle& handle) { handles_.push_back(handle); } | 202 void add_handle(const Handle& handle) { handles_.push_back(handle); } |
203 | 203 |
204 // RunLoopHandler: | 204 // RunLoopHandler: |
205 virtual void OnHandleError(const Handle& handle, MojoResult result) override { | 205 void OnHandleError(const Handle& handle, MojoResult result) override { |
206 for (size_t i = 0; i < handles_.size(); i++) | 206 for (size_t i = 0; i < handles_.size(); i++) |
207 run_loop_->RemoveHandler(handles_[i]); | 207 run_loop_->RemoveHandler(handles_[i]); |
208 TestRunLoopHandler::OnHandleError(handle, result); | 208 TestRunLoopHandler::OnHandleError(handle, result); |
209 } | 209 } |
210 | 210 |
211 private: | 211 private: |
212 std::vector<Handle> handles_; | 212 std::vector<Handle> handles_; |
213 RunLoop* run_loop_; | 213 RunLoop* run_loop_; |
214 | 214 |
215 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoveManyRunLoopHandler); | 215 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoveManyRunLoopHandler); |
(...skipping 25 matching lines...) Expand all Loading... |
241 EXPECT_EQ(1, odd_handler.error_count()); | 241 EXPECT_EQ(1, odd_handler.error_count()); |
242 EXPECT_EQ(1, even_handler.error_count()); | 242 EXPECT_EQ(1, even_handler.error_count()); |
243 EXPECT_EQ(MOJO_RESULT_ABORTED, odd_handler.last_error_result()); | 243 EXPECT_EQ(MOJO_RESULT_ABORTED, odd_handler.last_error_result()); |
244 EXPECT_EQ(MOJO_RESULT_ABORTED, even_handler.last_error_result()); | 244 EXPECT_EQ(MOJO_RESULT_ABORTED, even_handler.last_error_result()); |
245 } | 245 } |
246 | 246 |
247 class AddHandlerOnErrorHandler : public TestRunLoopHandler { | 247 class AddHandlerOnErrorHandler : public TestRunLoopHandler { |
248 public: | 248 public: |
249 AddHandlerOnErrorHandler() : run_loop_(NULL) { | 249 AddHandlerOnErrorHandler() : run_loop_(NULL) { |
250 } | 250 } |
251 virtual ~AddHandlerOnErrorHandler() {} | 251 ~AddHandlerOnErrorHandler() override {} |
252 | 252 |
253 void set_run_loop(RunLoop* run_loop) { run_loop_ = run_loop; } | 253 void set_run_loop(RunLoop* run_loop) { run_loop_ = run_loop; } |
254 | 254 |
255 // RunLoopHandler: | 255 // RunLoopHandler: |
256 virtual void OnHandleError(const Handle& handle, MojoResult result) override { | 256 void OnHandleError(const Handle& handle, MojoResult result) override { |
257 run_loop_->AddHandler(this, handle, | 257 run_loop_->AddHandler(this, handle, |
258 MOJO_HANDLE_SIGNAL_READABLE, | 258 MOJO_HANDLE_SIGNAL_READABLE, |
259 MOJO_DEADLINE_INDEFINITE); | 259 MOJO_DEADLINE_INDEFINITE); |
260 TestRunLoopHandler::OnHandleError(handle, result); | 260 TestRunLoopHandler::OnHandleError(handle, result); |
261 } | 261 } |
262 | 262 |
263 private: | 263 private: |
264 RunLoop* run_loop_; | 264 RunLoop* run_loop_; |
265 | 265 |
266 MOJO_DISALLOW_COPY_AND_ASSIGN(AddHandlerOnErrorHandler); | 266 MOJO_DISALLOW_COPY_AND_ASSIGN(AddHandlerOnErrorHandler); |
(...skipping 27 matching lines...) Expand all Loading... |
294 public: | 294 public: |
295 static const size_t kDepthLimit; | 295 static const size_t kDepthLimit; |
296 static const char kSignalMagic; | 296 static const char kSignalMagic; |
297 | 297 |
298 NestingRunLoopHandler() | 298 NestingRunLoopHandler() |
299 : run_loop_(NULL), | 299 : run_loop_(NULL), |
300 pipe_(NULL), | 300 pipe_(NULL), |
301 depth_(0), | 301 depth_(0), |
302 reached_depth_limit_(false) {} | 302 reached_depth_limit_(false) {} |
303 | 303 |
304 virtual ~NestingRunLoopHandler() {} | 304 ~NestingRunLoopHandler() override {} |
305 | 305 |
306 void set_run_loop(RunLoop* run_loop) { run_loop_ = run_loop; } | 306 void set_run_loop(RunLoop* run_loop) { run_loop_ = run_loop; } |
307 void set_pipe(MessagePipe* pipe) { pipe_ = pipe; } | 307 void set_pipe(MessagePipe* pipe) { pipe_ = pipe; } |
308 bool reached_depth_limit() const { return reached_depth_limit_; } | 308 bool reached_depth_limit() const { return reached_depth_limit_; } |
309 | 309 |
310 // RunLoopHandler: | 310 // RunLoopHandler: |
311 virtual void OnHandleReady(const Handle& handle) override { | 311 void OnHandleReady(const Handle& handle) override { |
312 TestRunLoopHandler::OnHandleReady(handle); | 312 TestRunLoopHandler::OnHandleReady(handle); |
313 EXPECT_EQ(handle.value(), pipe_->handle0.get().value()); | 313 EXPECT_EQ(handle.value(), pipe_->handle0.get().value()); |
314 | 314 |
315 ReadSignal(); | 315 ReadSignal(); |
316 size_t current_depth = ++depth_; | 316 size_t current_depth = ++depth_; |
317 if (current_depth < kDepthLimit) { | 317 if (current_depth < kDepthLimit) { |
318 WriteSignal(); | 318 WriteSignal(); |
319 run_loop_->Run(); | 319 run_loop_->Run(); |
320 if (current_depth == kDepthLimit - 1) { | 320 if (current_depth == kDepthLimit - 1) { |
321 // The topmost loop Quit()-ed, so its parent takes back the | 321 // The topmost loop Quit()-ed, so its parent takes back the |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 run_loop.AddHandler(&handler, | 422 run_loop.AddHandler(&handler, |
423 test_pipe.handle0.get(), | 423 test_pipe.handle0.get(), |
424 MOJO_HANDLE_SIGNAL_READABLE, | 424 MOJO_HANDLE_SIGNAL_READABLE, |
425 MOJO_DEADLINE_INDEFINITE); | 425 MOJO_DEADLINE_INDEFINITE); |
426 run_loop.PostDelayedTask(Closure(QuittingTask(&run_loop)), 0); | 426 run_loop.PostDelayedTask(Closure(QuittingTask(&run_loop)), 0); |
427 run_loop.Run(); | 427 run_loop.Run(); |
428 } | 428 } |
429 | 429 |
430 } // namespace | 430 } // namespace |
431 } // namespace mojo | 431 } // namespace mojo |
OLD | NEW |