| 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 |