| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/eintr_wrapper.h" | 10 #include "base/eintr_wrapper.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 | 77 |
| 78 ~Foo() {} | 78 ~Foo() {} |
| 79 | 79 |
| 80 int test_count_; | 80 int test_count_; |
| 81 std::string result_; | 81 std::string result_; |
| 82 }; | 82 }; |
| 83 | 83 |
| 84 // TODO(ajwong): Remove this once we've finished getting rid of the PostTask() | 84 // TODO(ajwong): Remove this once we've finished getting rid of the PostTask() |
| 85 // compatibility methods. | 85 // compatibility methods. |
| 86 void RunTest_PostLegacyTask(MessageLoop::Type message_loop_type) { | 86 void RunTest_PostLegacyTask(MessageLoop::Type message_loop_type) { |
| 87 MessageLoop loop(message_loop_type); | 87 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 88 | 88 |
| 89 // Add tests to message loop | 89 // Add tests to message loop |
| 90 scoped_refptr<Foo> foo(new Foo()); | 90 scoped_refptr<Foo> foo(new Foo()); |
| 91 std::string a("a"), b("b"), c("c"), d("d"); | 91 std::string a("a"), b("b"), c("c"), d("d"); |
| 92 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( | 92 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( |
| 93 foo.get(), &Foo::Test0)); | 93 foo.get(), &Foo::Test0)); |
| 94 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( | 94 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( |
| 95 foo.get(), &Foo::Test1ConstRef, a)); | 95 foo.get(), &Foo::Test1ConstRef, a)); |
| 96 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( | 96 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( |
| 97 foo.get(), &Foo::Test1Ptr, &b)); | 97 foo.get(), &Foo::Test1Ptr, &b)); |
| 98 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( | 98 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( |
| 99 foo.get(), &Foo::Test1Int, 100)); | 99 foo.get(), &Foo::Test1Int, 100)); |
| 100 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( | 100 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( |
| 101 foo.get(), &Foo::Test2Ptr, &a, &c)); | 101 foo.get(), &Foo::Test2Ptr, &a, &c)); |
| 102 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( | 102 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( |
| 103 foo.get(), &Foo::Test2Mixed, a, &d)); | 103 foo.get(), &Foo::Test2Mixed, a, &d)); |
| 104 | 104 |
| 105 // After all tests, post a message that will shut down the message loop | 105 // After all tests, post a message that will shut down the message loop |
| 106 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 106 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 107 &MessageLoop::Quit, base::Unretained(MessageLoop::current()))); | 107 &MessageLoop::Quit, base::Unretained(MessageLoop::current()))); |
| 108 | 108 |
| 109 // Now kick things off | 109 // Now kick things off |
| 110 MessageLoop::current()->Run(); | 110 MessageLoop::current()->Run(); |
| 111 | 111 |
| 112 EXPECT_EQ(foo->test_count(), 105); | 112 EXPECT_EQ(foo->test_count(), 105); |
| 113 EXPECT_EQ(foo->result(), "abacad"); | 113 EXPECT_EQ(foo->result(), "abacad"); |
| 114 } | 114 } |
| 115 | 115 |
| 116 void RunTest_PostTask(MessageLoop::Type message_loop_type) { | 116 void RunTest_PostTask(MessageLoop::Type message_loop_type) { |
| 117 MessageLoop loop(message_loop_type); | 117 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 118 | 118 |
| 119 // Add tests to message loop | 119 // Add tests to message loop |
| 120 scoped_refptr<Foo> foo(new Foo()); | 120 scoped_refptr<Foo> foo(new Foo()); |
| 121 std::string a("a"), b("b"), c("c"), d("d"); | 121 std::string a("a"), b("b"), c("c"), d("d"); |
| 122 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 122 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 123 &Foo::Test0, foo.get())); | 123 &Foo::Test0, foo.get())); |
| 124 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 124 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 125 &Foo::Test1ConstRef, foo.get(), a)); | 125 &Foo::Test1ConstRef, foo.get(), a)); |
| 126 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 126 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 127 &Foo::Test1Ptr, foo.get(), &b)); | 127 &Foo::Test1Ptr, foo.get(), &b)); |
| 128 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 128 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 129 &Foo::Test1Int, foo.get(), 100)); | 129 &Foo::Test1Int, foo.get(), 100)); |
| 130 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 130 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 131 &Foo::Test2Ptr, foo.get(), &a, &c)); | 131 &Foo::Test2Ptr, foo.get(), &a, &c)); |
| 132 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 132 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 133 &Foo::Test2Mixed, foo.get(), a, &d)); | 133 &Foo::Test2Mixed, foo.get(), a, &d)); |
| 134 | 134 |
| 135 // After all tests, post a message that will shut down the message loop | 135 // After all tests, post a message that will shut down the message loop |
| 136 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 136 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 137 &MessageLoop::Quit, base::Unretained(MessageLoop::current()))); | 137 &MessageLoop::Quit, base::Unretained(MessageLoop::current()))); |
| 138 | 138 |
| 139 // Now kick things off | 139 // Now kick things off |
| 140 MessageLoop::current()->Run(); | 140 MessageLoop::current()->Run(); |
| 141 | 141 |
| 142 EXPECT_EQ(foo->test_count(), 105); | 142 EXPECT_EQ(foo->test_count(), 105); |
| 143 EXPECT_EQ(foo->result(), "abacad"); | 143 EXPECT_EQ(foo->result(), "abacad"); |
| 144 } | 144 } |
| 145 | 145 |
| 146 void RunTest_PostTask_SEH(MessageLoop::Type message_loop_type) { | 146 void RunTest_PostTask_SEH(MessageLoop::Type message_loop_type) { |
| 147 MessageLoop loop(message_loop_type); | 147 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 148 | 148 |
| 149 // Add tests to message loop | 149 // Add tests to message loop |
| 150 scoped_refptr<Foo> foo(new Foo()); | 150 scoped_refptr<Foo> foo(new Foo()); |
| 151 std::string a("a"), b("b"), c("c"), d("d"); | 151 std::string a("a"), b("b"), c("c"), d("d"); |
| 152 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 152 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 153 &Foo::Test0, foo.get())); | 153 &Foo::Test0, foo.get())); |
| 154 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 154 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 155 &Foo::Test1ConstRef, foo.get(), a)); | 155 &Foo::Test1ConstRef, foo.get(), a)); |
| 156 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 156 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 157 &Foo::Test1Ptr, foo.get(), &b)); | 157 &Foo::Test1Ptr, foo.get(), &b)); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 187 static void RecordRunTimeFunc(Time* run_time, int* quit_counter) { | 187 static void RecordRunTimeFunc(Time* run_time, int* quit_counter) { |
| 188 *run_time = Time::Now(); | 188 *run_time = Time::Now(); |
| 189 | 189 |
| 190 // Cause our Run function to take some time to execute. As a result we can | 190 // Cause our Run function to take some time to execute. As a result we can |
| 191 // count on subsequent RecordRunTimeFunc()s running at a future time, | 191 // count on subsequent RecordRunTimeFunc()s running at a future time, |
| 192 // without worry about the resolution of our system clock being an issue. | 192 // without worry about the resolution of our system clock being an issue. |
| 193 SlowFunc(10, quit_counter); | 193 SlowFunc(10, quit_counter); |
| 194 } | 194 } |
| 195 | 195 |
| 196 void RunTest_PostDelayedTask_Basic(MessageLoop::Type message_loop_type) { | 196 void RunTest_PostDelayedTask_Basic(MessageLoop::Type message_loop_type) { |
| 197 MessageLoop loop(message_loop_type); | 197 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 198 | 198 |
| 199 // Test that PostDelayedTask results in a delayed task. | 199 // Test that PostDelayedTask results in a delayed task. |
| 200 | 200 |
| 201 const int kDelayMS = 100; | 201 const int kDelayMS = 100; |
| 202 | 202 |
| 203 int num_tasks = 1; | 203 int num_tasks = 1; |
| 204 Time run_time; | 204 Time run_time; |
| 205 | 205 |
| 206 loop.PostDelayedTask( | 206 loop.PostDelayedTask( |
| 207 FROM_HERE, base::Bind(&RecordRunTimeFunc, &run_time, &num_tasks), | 207 FROM_HERE, base::Bind(&RecordRunTimeFunc, &run_time, &num_tasks), |
| 208 kDelayMS); | 208 kDelayMS); |
| 209 | 209 |
| 210 Time time_before_run = Time::Now(); | 210 Time time_before_run = Time::Now(); |
| 211 loop.Run(); | 211 loop.Run(); |
| 212 Time time_after_run = Time::Now(); | 212 Time time_after_run = Time::Now(); |
| 213 | 213 |
| 214 EXPECT_EQ(0, num_tasks); | 214 EXPECT_EQ(0, num_tasks); |
| 215 EXPECT_LT(kDelayMS, (time_after_run - time_before_run).InMilliseconds()); | 215 EXPECT_LT(kDelayMS, (time_after_run - time_before_run).InMilliseconds()); |
| 216 } | 216 } |
| 217 | 217 |
| 218 void RunTest_PostDelayedTask_InDelayOrder( | 218 void RunTest_PostDelayedTask_InDelayOrder( |
| 219 MessageLoop::Type message_loop_type) { | 219 MessageLoop::Type message_loop_type) { |
| 220 MessageLoop loop(message_loop_type); | 220 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 221 | 221 |
| 222 // Test that two tasks with different delays run in the right order. | 222 // Test that two tasks with different delays run in the right order. |
| 223 int num_tasks = 2; | 223 int num_tasks = 2; |
| 224 Time run_time1, run_time2; | 224 Time run_time1, run_time2; |
| 225 | 225 |
| 226 loop.PostDelayedTask( | 226 loop.PostDelayedTask( |
| 227 FROM_HERE, base::Bind(&RecordRunTimeFunc, &run_time1, &num_tasks), 200); | 227 FROM_HERE, base::Bind(&RecordRunTimeFunc, &run_time1, &num_tasks), 200); |
| 228 // If we get a large pause in execution (due to a context switch) here, this | 228 // If we get a large pause in execution (due to a context switch) here, this |
| 229 // test could fail. | 229 // test could fail. |
| 230 loop.PostDelayedTask( | 230 loop.PostDelayedTask( |
| 231 FROM_HERE, base::Bind(&RecordRunTimeFunc, &run_time2, &num_tasks), 10); | 231 FROM_HERE, base::Bind(&RecordRunTimeFunc, &run_time2, &num_tasks), 10); |
| 232 | 232 |
| 233 loop.Run(); | 233 loop.Run(); |
| 234 EXPECT_EQ(0, num_tasks); | 234 EXPECT_EQ(0, num_tasks); |
| 235 | 235 |
| 236 EXPECT_TRUE(run_time2 < run_time1); | 236 EXPECT_TRUE(run_time2 < run_time1); |
| 237 } | 237 } |
| 238 | 238 |
| 239 void RunTest_PostDelayedTask_InPostOrder( | 239 void RunTest_PostDelayedTask_InPostOrder( |
| 240 MessageLoop::Type message_loop_type) { | 240 MessageLoop::Type message_loop_type) { |
| 241 MessageLoop loop(message_loop_type); | 241 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 242 | 242 |
| 243 // Test that two tasks with the same delay run in the order in which they | 243 // Test that two tasks with the same delay run in the order in which they |
| 244 // were posted. | 244 // were posted. |
| 245 // | 245 // |
| 246 // NOTE: This is actually an approximate test since the API only takes a | 246 // NOTE: This is actually an approximate test since the API only takes a |
| 247 // "delay" parameter, so we are not exactly simulating two tasks that get | 247 // "delay" parameter, so we are not exactly simulating two tasks that get |
| 248 // posted at the exact same time. It would be nice if the API allowed us to | 248 // posted at the exact same time. It would be nice if the API allowed us to |
| 249 // specify the desired run time. | 249 // specify the desired run time. |
| 250 | 250 |
| 251 const int kDelayMS = 100; | 251 const int kDelayMS = 100; |
| 252 | 252 |
| 253 int num_tasks = 2; | 253 int num_tasks = 2; |
| 254 Time run_time1, run_time2; | 254 Time run_time1, run_time2; |
| 255 | 255 |
| 256 loop.PostDelayedTask( | 256 loop.PostDelayedTask( |
| 257 FROM_HERE, | 257 FROM_HERE, |
| 258 base::Bind(&RecordRunTimeFunc, &run_time1, &num_tasks), kDelayMS); | 258 base::Bind(&RecordRunTimeFunc, &run_time1, &num_tasks), kDelayMS); |
| 259 loop.PostDelayedTask( | 259 loop.PostDelayedTask( |
| 260 FROM_HERE, | 260 FROM_HERE, |
| 261 base::Bind(&RecordRunTimeFunc, &run_time2, &num_tasks), kDelayMS); | 261 base::Bind(&RecordRunTimeFunc, &run_time2, &num_tasks), kDelayMS); |
| 262 | 262 |
| 263 loop.Run(); | 263 loop.Run(); |
| 264 EXPECT_EQ(0, num_tasks); | 264 EXPECT_EQ(0, num_tasks); |
| 265 | 265 |
| 266 EXPECT_TRUE(run_time1 < run_time2); | 266 EXPECT_TRUE(run_time1 < run_time2); |
| 267 } | 267 } |
| 268 | 268 |
| 269 void RunTest_PostDelayedTask_InPostOrder_2( | 269 void RunTest_PostDelayedTask_InPostOrder_2( |
| 270 MessageLoop::Type message_loop_type) { | 270 MessageLoop::Type message_loop_type) { |
| 271 MessageLoop loop(message_loop_type); | 271 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 272 | 272 |
| 273 // Test that a delayed task still runs after a normal tasks even if the | 273 // Test that a delayed task still runs after a normal tasks even if the |
| 274 // normal tasks take a long time to run. | 274 // normal tasks take a long time to run. |
| 275 | 275 |
| 276 const int kPauseMS = 50; | 276 const int kPauseMS = 50; |
| 277 | 277 |
| 278 int num_tasks = 2; | 278 int num_tasks = 2; |
| 279 Time run_time; | 279 Time run_time; |
| 280 | 280 |
| 281 loop.PostTask(FROM_HERE, base::Bind(&SlowFunc, kPauseMS, &num_tasks)); | 281 loop.PostTask(FROM_HERE, base::Bind(&SlowFunc, kPauseMS, &num_tasks)); |
| 282 loop.PostDelayedTask( | 282 loop.PostDelayedTask( |
| 283 FROM_HERE, base::Bind(&RecordRunTimeFunc, &run_time, &num_tasks), 10); | 283 FROM_HERE, base::Bind(&RecordRunTimeFunc, &run_time, &num_tasks), 10); |
| 284 | 284 |
| 285 Time time_before_run = Time::Now(); | 285 Time time_before_run = Time::Now(); |
| 286 loop.Run(); | 286 loop.Run(); |
| 287 Time time_after_run = Time::Now(); | 287 Time time_after_run = Time::Now(); |
| 288 | 288 |
| 289 EXPECT_EQ(0, num_tasks); | 289 EXPECT_EQ(0, num_tasks); |
| 290 | 290 |
| 291 EXPECT_LT(kPauseMS, (time_after_run - time_before_run).InMilliseconds()); | 291 EXPECT_LT(kPauseMS, (time_after_run - time_before_run).InMilliseconds()); |
| 292 } | 292 } |
| 293 | 293 |
| 294 void RunTest_PostDelayedTask_InPostOrder_3( | 294 void RunTest_PostDelayedTask_InPostOrder_3( |
| 295 MessageLoop::Type message_loop_type) { | 295 MessageLoop::Type message_loop_type) { |
| 296 MessageLoop loop(message_loop_type); | 296 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 297 | 297 |
| 298 // Test that a delayed task still runs after a pile of normal tasks. The key | 298 // Test that a delayed task still runs after a pile of normal tasks. The key |
| 299 // difference between this test and the previous one is that here we return | 299 // difference between this test and the previous one is that here we return |
| 300 // the MessageLoop a lot so we give the MessageLoop plenty of opportunities | 300 // the MessageLoop a lot so we give the MessageLoop plenty of opportunities |
| 301 // to maybe run the delayed task. It should know not to do so until the | 301 // to maybe run the delayed task. It should know not to do so until the |
| 302 // delayed task's delay has passed. | 302 // delayed task's delay has passed. |
| 303 | 303 |
| 304 int num_tasks = 11; | 304 int num_tasks = 11; |
| 305 Time run_time1, run_time2; | 305 Time run_time1, run_time2; |
| 306 | 306 |
| 307 // Clutter the ML with tasks. | 307 // Clutter the ML with tasks. |
| 308 for (int i = 1; i < num_tasks; ++i) | 308 for (int i = 1; i < num_tasks; ++i) |
| 309 loop.PostTask(FROM_HERE, | 309 loop.PostTask(FROM_HERE, |
| 310 base::Bind(&RecordRunTimeFunc, &run_time1, &num_tasks)); | 310 base::Bind(&RecordRunTimeFunc, &run_time1, &num_tasks)); |
| 311 | 311 |
| 312 loop.PostDelayedTask( | 312 loop.PostDelayedTask( |
| 313 FROM_HERE, base::Bind(&RecordRunTimeFunc, &run_time2, &num_tasks), 1); | 313 FROM_HERE, base::Bind(&RecordRunTimeFunc, &run_time2, &num_tasks), 1); |
| 314 | 314 |
| 315 loop.Run(); | 315 loop.Run(); |
| 316 EXPECT_EQ(0, num_tasks); | 316 EXPECT_EQ(0, num_tasks); |
| 317 | 317 |
| 318 EXPECT_TRUE(run_time2 > run_time1); | 318 EXPECT_TRUE(run_time2 > run_time1); |
| 319 } | 319 } |
| 320 | 320 |
| 321 void RunTest_PostDelayedTask_SharedTimer( | 321 void RunTest_PostDelayedTask_SharedTimer( |
| 322 MessageLoop::Type message_loop_type) { | 322 MessageLoop::Type message_loop_type) { |
| 323 MessageLoop loop(message_loop_type); | 323 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 324 | 324 |
| 325 // Test that the interval of the timer, used to run the next delayed task, is | 325 // Test that the interval of the timer, used to run the next delayed task, is |
| 326 // set to a value corresponding to when the next delayed task should run. | 326 // set to a value corresponding to when the next delayed task should run. |
| 327 | 327 |
| 328 // By setting num_tasks to 1, we ensure that the first task to run causes the | 328 // By setting num_tasks to 1, we ensure that the first task to run causes the |
| 329 // run loop to exit. | 329 // run loop to exit. |
| 330 int num_tasks = 1; | 330 int num_tasks = 1; |
| 331 Time run_time1, run_time2; | 331 Time run_time1, run_time2; |
| 332 | 332 |
| 333 loop.PostDelayedTask( | 333 loop.PostDelayedTask( |
| (...skipping 28 matching lines...) Expand all Loading... |
| 362 MessageLoop::current()->SetNestableTasksAllowed(true); | 362 MessageLoop::current()->SetNestableTasksAllowed(true); |
| 363 MSG msg; | 363 MSG msg; |
| 364 while (GetMessage(&msg, NULL, 0, 0)) { | 364 while (GetMessage(&msg, NULL, 0, 0)) { |
| 365 TranslateMessage(&msg); | 365 TranslateMessage(&msg); |
| 366 DispatchMessage(&msg); | 366 DispatchMessage(&msg); |
| 367 } | 367 } |
| 368 MessageLoop::current()->Quit(); | 368 MessageLoop::current()->Quit(); |
| 369 } | 369 } |
| 370 | 370 |
| 371 void RunTest_PostDelayedTask_SharedTimer_SubPump() { | 371 void RunTest_PostDelayedTask_SharedTimer_SubPump() { |
| 372 MessageLoop loop(MessageLoop::TYPE_UI); | 372 MessageLoop loop("MessageLoopTest", MessageLoop::TYPE_UI); |
| 373 | 373 |
| 374 // Test that the interval of the timer, used to run the next delayed task, is | 374 // Test that the interval of the timer, used to run the next delayed task, is |
| 375 // set to a value corresponding to when the next delayed task should run. | 375 // set to a value corresponding to when the next delayed task should run. |
| 376 | 376 |
| 377 // By setting num_tasks to 1, we ensure that the first task to run causes the | 377 // By setting num_tasks to 1, we ensure that the first task to run causes the |
| 378 // run loop to exit. | 378 // run loop to exit. |
| 379 int num_tasks = 1; | 379 int num_tasks = 1; |
| 380 Time run_time; | 380 Time run_time; |
| 381 | 381 |
| 382 loop.PostTask(FROM_HERE, base::Bind(&SubPumpFunc)); | 382 loop.PostTask(FROM_HERE, base::Bind(&SubPumpFunc)); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 void Run() {} | 428 void Run() {} |
| 429 private: | 429 private: |
| 430 scoped_refptr<RecordDeletionProbe> post_on_delete_; | 430 scoped_refptr<RecordDeletionProbe> post_on_delete_; |
| 431 bool* was_deleted_; | 431 bool* was_deleted_; |
| 432 }; | 432 }; |
| 433 | 433 |
| 434 void RunTest_EnsureDeletion(MessageLoop::Type message_loop_type) { | 434 void RunTest_EnsureDeletion(MessageLoop::Type message_loop_type) { |
| 435 bool a_was_deleted = false; | 435 bool a_was_deleted = false; |
| 436 bool b_was_deleted = false; | 436 bool b_was_deleted = false; |
| 437 { | 437 { |
| 438 MessageLoop loop(message_loop_type); | 438 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 439 loop.PostTask( | 439 loop.PostTask( |
| 440 FROM_HERE, base::Bind(&RecordDeletionProbe::Run, | 440 FROM_HERE, base::Bind(&RecordDeletionProbe::Run, |
| 441 new RecordDeletionProbe(NULL, &a_was_deleted))); | 441 new RecordDeletionProbe(NULL, &a_was_deleted))); |
| 442 loop.PostDelayedTask( | 442 loop.PostDelayedTask( |
| 443 FROM_HERE, base::Bind(&RecordDeletionProbe::Run, | 443 FROM_HERE, base::Bind(&RecordDeletionProbe::Run, |
| 444 new RecordDeletionProbe(NULL, &b_was_deleted)), | 444 new RecordDeletionProbe(NULL, &b_was_deleted)), |
| 445 1000); // TODO(ajwong): Do we really need 1000ms here? | 445 1000); // TODO(ajwong): Do we really need 1000ms here? |
| 446 } | 446 } |
| 447 EXPECT_TRUE(a_was_deleted); | 447 EXPECT_TRUE(a_was_deleted); |
| 448 EXPECT_TRUE(b_was_deleted); | 448 EXPECT_TRUE(b_was_deleted); |
| 449 } | 449 } |
| 450 | 450 |
| 451 void RunTest_EnsureDeletion_Chain(MessageLoop::Type message_loop_type) { | 451 void RunTest_EnsureDeletion_Chain(MessageLoop::Type message_loop_type) { |
| 452 bool a_was_deleted = false; | 452 bool a_was_deleted = false; |
| 453 bool b_was_deleted = false; | 453 bool b_was_deleted = false; |
| 454 bool c_was_deleted = false; | 454 bool c_was_deleted = false; |
| 455 { | 455 { |
| 456 MessageLoop loop(message_loop_type); | 456 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 457 // The scoped_refptr for each of the below is held either by the chained | 457 // The scoped_refptr for each of the below is held either by the chained |
| 458 // RecordDeletionProbe, or the bound RecordDeletionProbe::Run() callback. | 458 // RecordDeletionProbe, or the bound RecordDeletionProbe::Run() callback. |
| 459 RecordDeletionProbe* a = new RecordDeletionProbe(NULL, &a_was_deleted); | 459 RecordDeletionProbe* a = new RecordDeletionProbe(NULL, &a_was_deleted); |
| 460 RecordDeletionProbe* b = new RecordDeletionProbe(a, &b_was_deleted); | 460 RecordDeletionProbe* b = new RecordDeletionProbe(a, &b_was_deleted); |
| 461 RecordDeletionProbe* c = new RecordDeletionProbe(b, &c_was_deleted); | 461 RecordDeletionProbe* c = new RecordDeletionProbe(b, &c_was_deleted); |
| 462 loop.PostTask(FROM_HERE, base::Bind(&RecordDeletionProbe::Run, c)); | 462 loop.PostTask(FROM_HERE, base::Bind(&RecordDeletionProbe::Run, c)); |
| 463 } | 463 } |
| 464 EXPECT_TRUE(a_was_deleted); | 464 EXPECT_TRUE(a_was_deleted); |
| 465 EXPECT_TRUE(b_was_deleted); | 465 EXPECT_TRUE(b_was_deleted); |
| 466 EXPECT_TRUE(c_was_deleted); | 466 EXPECT_TRUE(c_was_deleted); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 #elif defined(_M_X64) | 550 #elif defined(_M_X64) |
| 551 | 551 |
| 552 ex_info->ContextRecord->Rip -= 5; | 552 ex_info->ContextRecord->Rip -= 5; |
| 553 | 553 |
| 554 #endif | 554 #endif |
| 555 | 555 |
| 556 return EXCEPTION_CONTINUE_EXECUTION; | 556 return EXCEPTION_CONTINUE_EXECUTION; |
| 557 } | 557 } |
| 558 | 558 |
| 559 void RunTest_Crasher(MessageLoop::Type message_loop_type) { | 559 void RunTest_Crasher(MessageLoop::Type message_loop_type) { |
| 560 MessageLoop loop(message_loop_type); | 560 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 561 | 561 |
| 562 if (::IsDebuggerPresent()) | 562 if (::IsDebuggerPresent()) |
| 563 return; | 563 return; |
| 564 | 564 |
| 565 LPTOP_LEVEL_EXCEPTION_FILTER old_SEH_filter = | 565 LPTOP_LEVEL_EXCEPTION_FILTER old_SEH_filter = |
| 566 ::SetUnhandledExceptionFilter(&HandleCrasherException); | 566 ::SetUnhandledExceptionFilter(&HandleCrasherException); |
| 567 | 567 |
| 568 MessageLoop::current()->PostTask( | 568 MessageLoop::current()->PostTask( |
| 569 FROM_HERE, | 569 FROM_HERE, |
| 570 base::Bind(&Crasher::Run, new Crasher(false))); | 570 base::Bind(&Crasher::Run, new Crasher(false))); |
| 571 MessageLoop::current()->set_exception_restoration(true); | 571 MessageLoop::current()->set_exception_restoration(true); |
| 572 MessageLoop::current()->Run(); | 572 MessageLoop::current()->Run(); |
| 573 MessageLoop::current()->set_exception_restoration(false); | 573 MessageLoop::current()->set_exception_restoration(false); |
| 574 | 574 |
| 575 ::SetUnhandledExceptionFilter(old_SEH_filter); | 575 ::SetUnhandledExceptionFilter(old_SEH_filter); |
| 576 } | 576 } |
| 577 | 577 |
| 578 void RunTest_CrasherNasty(MessageLoop::Type message_loop_type) { | 578 void RunTest_CrasherNasty(MessageLoop::Type message_loop_type) { |
| 579 MessageLoop loop(message_loop_type); | 579 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 580 | 580 |
| 581 if (::IsDebuggerPresent()) | 581 if (::IsDebuggerPresent()) |
| 582 return; | 582 return; |
| 583 | 583 |
| 584 LPTOP_LEVEL_EXCEPTION_FILTER old_SEH_filter = | 584 LPTOP_LEVEL_EXCEPTION_FILTER old_SEH_filter = |
| 585 ::SetUnhandledExceptionFilter(&HandleCrasherException); | 585 ::SetUnhandledExceptionFilter(&HandleCrasherException); |
| 586 | 586 |
| 587 MessageLoop::current()->PostTask( | 587 MessageLoop::current()->PostTask( |
| 588 FROM_HERE, | 588 FROM_HERE, |
| 589 base::Bind(&Crasher::Run, new Crasher(true))); | 589 base::Bind(&Crasher::Run, new Crasher(true))); |
| 590 MessageLoop::current()->set_exception_restoration(true); | 590 MessageLoop::current()->set_exception_restoration(true); |
| 591 MessageLoop::current()->Run(); | 591 MessageLoop::current()->Run(); |
| 592 MessageLoop::current()->set_exception_restoration(false); | 592 MessageLoop::current()->set_exception_restoration(false); |
| 593 | 593 |
| 594 ::SetUnhandledExceptionFilter(old_SEH_filter); | 594 ::SetUnhandledExceptionFilter(old_SEH_filter); |
| 595 } | 595 } |
| 596 | 596 |
| 597 #endif // defined(OS_WIN) | 597 #endif // defined(OS_WIN) |
| 598 | 598 |
| 599 void RunTest_Nesting(MessageLoop::Type message_loop_type) { | 599 void RunTest_Nesting(MessageLoop::Type message_loop_type) { |
| 600 MessageLoop loop(message_loop_type); | 600 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 601 | 601 |
| 602 int depth = 100; | 602 int depth = 100; |
| 603 MessageLoop::current()->PostTask(FROM_HERE, | 603 MessageLoop::current()->PostTask(FROM_HERE, |
| 604 base::Bind(&NestingFunc, &depth)); | 604 base::Bind(&NestingFunc, &depth)); |
| 605 MessageLoop::current()->Run(); | 605 MessageLoop::current()->Run(); |
| 606 EXPECT_EQ(depth, 0); | 606 EXPECT_EQ(depth, 0); |
| 607 } | 607 } |
| 608 | 608 |
| 609 const wchar_t* const kMessageBoxTitle = L"MessageLoop Unit Test"; | 609 const wchar_t* const kMessageBoxTitle = L"MessageLoop Unit Test"; |
| 610 | 610 |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 } | 793 } |
| 794 } | 794 } |
| 795 break; | 795 break; |
| 796 } | 796 } |
| 797 } | 797 } |
| 798 } | 798 } |
| 799 | 799 |
| 800 #endif // defined(OS_WIN) | 800 #endif // defined(OS_WIN) |
| 801 | 801 |
| 802 void RunTest_RecursiveDenial1(MessageLoop::Type message_loop_type) { | 802 void RunTest_RecursiveDenial1(MessageLoop::Type message_loop_type) { |
| 803 MessageLoop loop(message_loop_type); | 803 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 804 | 804 |
| 805 EXPECT_TRUE(MessageLoop::current()->NestableTasksAllowed()); | 805 EXPECT_TRUE(MessageLoop::current()->NestableTasksAllowed()); |
| 806 TaskList order; | 806 TaskList order; |
| 807 MessageLoop::current()->PostTask( | 807 MessageLoop::current()->PostTask( |
| 808 FROM_HERE, | 808 FROM_HERE, |
| 809 base::Bind(&RecursiveFunc, &order, 1, 2, false)); | 809 base::Bind(&RecursiveFunc, &order, 1, 2, false)); |
| 810 MessageLoop::current()->PostTask( | 810 MessageLoop::current()->PostTask( |
| 811 FROM_HERE, | 811 FROM_HERE, |
| 812 base::Bind(&RecursiveFunc, &order, 2, 2, false)); | 812 base::Bind(&RecursiveFunc, &order, 2, 2, false)); |
| 813 MessageLoop::current()->PostTask( | 813 MessageLoop::current()->PostTask( |
| (...skipping 14 matching lines...) Expand all Loading... |
| 828 EXPECT_EQ(order.Get(7), TaskItem(RECURSIVE, 1, false)); | 828 EXPECT_EQ(order.Get(7), TaskItem(RECURSIVE, 1, false)); |
| 829 EXPECT_EQ(order.Get(8), TaskItem(RECURSIVE, 2, true)); | 829 EXPECT_EQ(order.Get(8), TaskItem(RECURSIVE, 2, true)); |
| 830 EXPECT_EQ(order.Get(9), TaskItem(RECURSIVE, 2, false)); | 830 EXPECT_EQ(order.Get(9), TaskItem(RECURSIVE, 2, false)); |
| 831 EXPECT_EQ(order.Get(10), TaskItem(RECURSIVE, 1, true)); | 831 EXPECT_EQ(order.Get(10), TaskItem(RECURSIVE, 1, true)); |
| 832 EXPECT_EQ(order.Get(11), TaskItem(RECURSIVE, 1, false)); | 832 EXPECT_EQ(order.Get(11), TaskItem(RECURSIVE, 1, false)); |
| 833 EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 2, true)); | 833 EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 2, true)); |
| 834 EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 2, false)); | 834 EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 2, false)); |
| 835 } | 835 } |
| 836 | 836 |
| 837 void RunTest_RecursiveDenial3(MessageLoop::Type message_loop_type) { | 837 void RunTest_RecursiveDenial3(MessageLoop::Type message_loop_type) { |
| 838 MessageLoop loop(message_loop_type); | 838 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 839 | 839 |
| 840 EXPECT_TRUE(MessageLoop::current()->NestableTasksAllowed()); | 840 EXPECT_TRUE(MessageLoop::current()->NestableTasksAllowed()); |
| 841 TaskList order; | 841 TaskList order; |
| 842 MessageLoop::current()->PostTask( | 842 MessageLoop::current()->PostTask( |
| 843 FROM_HERE, base::Bind(&RecursiveSlowFunc, &order, 1, 2, false)); | 843 FROM_HERE, base::Bind(&RecursiveSlowFunc, &order, 1, 2, false)); |
| 844 MessageLoop::current()->PostTask( | 844 MessageLoop::current()->PostTask( |
| 845 FROM_HERE, base::Bind(&RecursiveSlowFunc, &order, 2, 2, false)); | 845 FROM_HERE, base::Bind(&RecursiveSlowFunc, &order, 2, 2, false)); |
| 846 MessageLoop::current()->PostDelayedTask( | 846 MessageLoop::current()->PostDelayedTask( |
| 847 FROM_HERE, base::Bind(&OrderedFunc, &order, 3), 5); | 847 FROM_HERE, base::Bind(&OrderedFunc, &order, 3), 5); |
| 848 MessageLoop::current()->PostDelayedTask( | 848 MessageLoop::current()->PostDelayedTask( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 864 EXPECT_EQ(order.Get(9), TaskItem(RECURSIVE, 2, false)); | 864 EXPECT_EQ(order.Get(9), TaskItem(RECURSIVE, 2, false)); |
| 865 EXPECT_EQ(order.Get(10), TaskItem(QUITMESSAGELOOP, 4, true)); | 865 EXPECT_EQ(order.Get(10), TaskItem(QUITMESSAGELOOP, 4, true)); |
| 866 EXPECT_EQ(order.Get(11), TaskItem(QUITMESSAGELOOP, 4, false)); | 866 EXPECT_EQ(order.Get(11), TaskItem(QUITMESSAGELOOP, 4, false)); |
| 867 EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 1, true)); | 867 EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 1, true)); |
| 868 EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 1, false)); | 868 EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 1, false)); |
| 869 EXPECT_EQ(order.Get(14), TaskItem(RECURSIVE, 2, true)); | 869 EXPECT_EQ(order.Get(14), TaskItem(RECURSIVE, 2, true)); |
| 870 EXPECT_EQ(order.Get(15), TaskItem(RECURSIVE, 2, false)); | 870 EXPECT_EQ(order.Get(15), TaskItem(RECURSIVE, 2, false)); |
| 871 } | 871 } |
| 872 | 872 |
| 873 void RunTest_RecursiveSupport1(MessageLoop::Type message_loop_type) { | 873 void RunTest_RecursiveSupport1(MessageLoop::Type message_loop_type) { |
| 874 MessageLoop loop(message_loop_type); | 874 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 875 | 875 |
| 876 TaskList order; | 876 TaskList order; |
| 877 MessageLoop::current()->PostTask( | 877 MessageLoop::current()->PostTask( |
| 878 FROM_HERE, base::Bind(&RecursiveFunc, &order, 1, 2, true)); | 878 FROM_HERE, base::Bind(&RecursiveFunc, &order, 1, 2, true)); |
| 879 MessageLoop::current()->PostTask( | 879 MessageLoop::current()->PostTask( |
| 880 FROM_HERE, base::Bind(&RecursiveFunc, &order, 2, 2, true)); | 880 FROM_HERE, base::Bind(&RecursiveFunc, &order, 2, 2, true)); |
| 881 MessageLoop::current()->PostTask( | 881 MessageLoop::current()->PostTask( |
| 882 FROM_HERE, base::Bind(&QuitFunc, &order, 3)); | 882 FROM_HERE, base::Bind(&QuitFunc, &order, 3)); |
| 883 | 883 |
| 884 MessageLoop::current()->Run(); | 884 MessageLoop::current()->Run(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 900 EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 2, true)); | 900 EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 2, true)); |
| 901 EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 2, false)); | 901 EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 2, false)); |
| 902 } | 902 } |
| 903 | 903 |
| 904 #if defined(OS_WIN) | 904 #if defined(OS_WIN) |
| 905 // TODO(darin): These tests need to be ported since they test critical | 905 // TODO(darin): These tests need to be ported since they test critical |
| 906 // message loop functionality. | 906 // message loop functionality. |
| 907 | 907 |
| 908 // A side effect of this test is the generation a beep. Sorry. | 908 // A side effect of this test is the generation a beep. Sorry. |
| 909 void RunTest_RecursiveDenial2(MessageLoop::Type message_loop_type) { | 909 void RunTest_RecursiveDenial2(MessageLoop::Type message_loop_type) { |
| 910 MessageLoop loop(message_loop_type); | 910 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 911 | 911 |
| 912 Thread worker("RecursiveDenial2_worker"); | 912 Thread worker("RecursiveDenial2_worker"); |
| 913 Thread::Options options; | 913 Thread::Options options; |
| 914 options.message_loop_type = message_loop_type; | 914 options.message_loop_type = message_loop_type; |
| 915 ASSERT_EQ(true, worker.StartWithOptions(options)); | 915 ASSERT_EQ(true, worker.StartWithOptions(options)); |
| 916 TaskList order; | 916 TaskList order; |
| 917 base::win::ScopedHandle event(CreateEvent(NULL, FALSE, FALSE, NULL)); | 917 base::win::ScopedHandle event(CreateEvent(NULL, FALSE, FALSE, NULL)); |
| 918 worker.message_loop()->PostTask(FROM_HERE, | 918 worker.message_loop()->PostTask(FROM_HERE, |
| 919 base::Bind(&RecursiveFuncWin, | 919 base::Bind(&RecursiveFuncWin, |
| 920 MessageLoop::current(), | 920 MessageLoop::current(), |
| (...skipping 23 matching lines...) Expand all Loading... |
| 944 EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 3, false)); | 944 EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 3, false)); |
| 945 EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 1, true)); | 945 EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 1, true)); |
| 946 EXPECT_EQ(order.Get(14), TaskItem(RECURSIVE, 1, false)); | 946 EXPECT_EQ(order.Get(14), TaskItem(RECURSIVE, 1, false)); |
| 947 EXPECT_EQ(order.Get(15), TaskItem(RECURSIVE, 3, true)); | 947 EXPECT_EQ(order.Get(15), TaskItem(RECURSIVE, 3, true)); |
| 948 EXPECT_EQ(order.Get(16), TaskItem(RECURSIVE, 3, false)); | 948 EXPECT_EQ(order.Get(16), TaskItem(RECURSIVE, 3, false)); |
| 949 } | 949 } |
| 950 | 950 |
| 951 // A side effect of this test is the generation a beep. Sorry. This test also | 951 // A side effect of this test is the generation a beep. Sorry. This test also |
| 952 // needs to process windows messages on the current thread. | 952 // needs to process windows messages on the current thread. |
| 953 void RunTest_RecursiveSupport2(MessageLoop::Type message_loop_type) { | 953 void RunTest_RecursiveSupport2(MessageLoop::Type message_loop_type) { |
| 954 MessageLoop loop(message_loop_type); | 954 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 955 | 955 |
| 956 Thread worker("RecursiveSupport2_worker"); | 956 Thread worker("RecursiveSupport2_worker"); |
| 957 Thread::Options options; | 957 Thread::Options options; |
| 958 options.message_loop_type = message_loop_type; | 958 options.message_loop_type = message_loop_type; |
| 959 ASSERT_EQ(true, worker.StartWithOptions(options)); | 959 ASSERT_EQ(true, worker.StartWithOptions(options)); |
| 960 TaskList order; | 960 TaskList order; |
| 961 base::win::ScopedHandle event(CreateEvent(NULL, FALSE, FALSE, NULL)); | 961 base::win::ScopedHandle event(CreateEvent(NULL, FALSE, FALSE, NULL)); |
| 962 worker.message_loop()->PostTask(FROM_HERE, | 962 worker.message_loop()->PostTask(FROM_HERE, |
| 963 base::Bind(&RecursiveFuncWin, | 963 base::Bind(&RecursiveFuncWin, |
| 964 MessageLoop::current(), | 964 MessageLoop::current(), |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1004 bool old_state = MessageLoop::current()->NestableTasksAllowed(); | 1004 bool old_state = MessageLoop::current()->NestableTasksAllowed(); |
| 1005 MessageLoop::current()->SetNestableTasksAllowed(true); | 1005 MessageLoop::current()->SetNestableTasksAllowed(true); |
| 1006 MessageLoop::current()->RunAllPending(); | 1006 MessageLoop::current()->RunAllPending(); |
| 1007 MessageLoop::current()->SetNestableTasksAllowed(old_state); | 1007 MessageLoop::current()->SetNestableTasksAllowed(old_state); |
| 1008 order->RecordEnd(PUMPS, cookie); | 1008 order->RecordEnd(PUMPS, cookie); |
| 1009 } | 1009 } |
| 1010 | 1010 |
| 1011 // Tests that non nestable tasks run in FIFO if there are no nested loops. | 1011 // Tests that non nestable tasks run in FIFO if there are no nested loops. |
| 1012 void RunTest_NonNestableWithNoNesting( | 1012 void RunTest_NonNestableWithNoNesting( |
| 1013 MessageLoop::Type message_loop_type) { | 1013 MessageLoop::Type message_loop_type) { |
| 1014 MessageLoop loop(message_loop_type); | 1014 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 1015 | 1015 |
| 1016 TaskList order; | 1016 TaskList order; |
| 1017 | 1017 |
| 1018 MessageLoop::current()->PostNonNestableTask( | 1018 MessageLoop::current()->PostNonNestableTask( |
| 1019 FROM_HERE, | 1019 FROM_HERE, |
| 1020 base::Bind(&OrderedFunc, &order, 1)); | 1020 base::Bind(&OrderedFunc, &order, 1)); |
| 1021 MessageLoop::current()->PostTask(FROM_HERE, | 1021 MessageLoop::current()->PostTask(FROM_HERE, |
| 1022 base::Bind(&OrderedFunc, &order, 2)); | 1022 base::Bind(&OrderedFunc, &order, 2)); |
| 1023 MessageLoop::current()->PostTask(FROM_HERE, | 1023 MessageLoop::current()->PostTask(FROM_HERE, |
| 1024 base::Bind(&QuitFunc, &order, 3)); | 1024 base::Bind(&QuitFunc, &order, 3)); |
| 1025 MessageLoop::current()->Run(); | 1025 MessageLoop::current()->Run(); |
| 1026 | 1026 |
| 1027 // FIFO order. | 1027 // FIFO order. |
| 1028 ASSERT_EQ(6U, order.Size()); | 1028 ASSERT_EQ(6U, order.Size()); |
| 1029 EXPECT_EQ(order.Get(0), TaskItem(ORDERERD, 1, true)); | 1029 EXPECT_EQ(order.Get(0), TaskItem(ORDERERD, 1, true)); |
| 1030 EXPECT_EQ(order.Get(1), TaskItem(ORDERERD, 1, false)); | 1030 EXPECT_EQ(order.Get(1), TaskItem(ORDERERD, 1, false)); |
| 1031 EXPECT_EQ(order.Get(2), TaskItem(ORDERERD, 2, true)); | 1031 EXPECT_EQ(order.Get(2), TaskItem(ORDERERD, 2, true)); |
| 1032 EXPECT_EQ(order.Get(3), TaskItem(ORDERERD, 2, false)); | 1032 EXPECT_EQ(order.Get(3), TaskItem(ORDERERD, 2, false)); |
| 1033 EXPECT_EQ(order.Get(4), TaskItem(QUITMESSAGELOOP, 3, true)); | 1033 EXPECT_EQ(order.Get(4), TaskItem(QUITMESSAGELOOP, 3, true)); |
| 1034 EXPECT_EQ(order.Get(5), TaskItem(QUITMESSAGELOOP, 3, false)); | 1034 EXPECT_EQ(order.Get(5), TaskItem(QUITMESSAGELOOP, 3, false)); |
| 1035 } | 1035 } |
| 1036 | 1036 |
| 1037 // Tests that non nestable tasks don't run when there's code in the call stack. | 1037 // Tests that non nestable tasks don't run when there's code in the call stack. |
| 1038 void RunTest_NonNestableInNestedLoop(MessageLoop::Type message_loop_type, | 1038 void RunTest_NonNestableInNestedLoop(MessageLoop::Type message_loop_type, |
| 1039 bool use_delayed) { | 1039 bool use_delayed) { |
| 1040 MessageLoop loop(message_loop_type); | 1040 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 1041 | 1041 |
| 1042 TaskList order; | 1042 TaskList order; |
| 1043 | 1043 |
| 1044 MessageLoop::current()->PostTask( | 1044 MessageLoop::current()->PostTask( |
| 1045 FROM_HERE, | 1045 FROM_HERE, |
| 1046 base::Bind(&FuncThatPumps, &order, 1)); | 1046 base::Bind(&FuncThatPumps, &order, 1)); |
| 1047 if (use_delayed) { | 1047 if (use_delayed) { |
| 1048 MessageLoop::current()->PostNonNestableDelayedTask( | 1048 MessageLoop::current()->PostNonNestableDelayedTask( |
| 1049 FROM_HERE, | 1049 FROM_HERE, |
| 1050 base::Bind(&OrderedFunc, &order, 2), | 1050 base::Bind(&OrderedFunc, &order, 2), |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1108 | 1108 |
| 1109 int dispatch_count_; | 1109 int dispatch_count_; |
| 1110 }; | 1110 }; |
| 1111 | 1111 |
| 1112 void MouseDownUp() { | 1112 void MouseDownUp() { |
| 1113 PostMessage(NULL, WM_LBUTTONDOWN, 0, 0); | 1113 PostMessage(NULL, WM_LBUTTONDOWN, 0, 0); |
| 1114 PostMessage(NULL, WM_LBUTTONUP, 'A', 0); | 1114 PostMessage(NULL, WM_LBUTTONUP, 'A', 0); |
| 1115 } | 1115 } |
| 1116 | 1116 |
| 1117 void RunTest_Dispatcher(MessageLoop::Type message_loop_type) { | 1117 void RunTest_Dispatcher(MessageLoop::Type message_loop_type) { |
| 1118 MessageLoop loop(message_loop_type); | 1118 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 1119 | 1119 |
| 1120 MessageLoop::current()->PostDelayedTask(FROM_HERE, | 1120 MessageLoop::current()->PostDelayedTask(FROM_HERE, |
| 1121 base::Bind(&MouseDownUp), 100); | 1121 base::Bind(&MouseDownUp), 100); |
| 1122 DispatcherImpl dispatcher; | 1122 DispatcherImpl dispatcher; |
| 1123 MessageLoopForUI::current()->Run(&dispatcher); | 1123 MessageLoopForUI::current()->Run(&dispatcher); |
| 1124 ASSERT_EQ(2, dispatcher.dispatch_count_); | 1124 ASSERT_EQ(2, dispatcher.dispatch_count_); |
| 1125 } | 1125 } |
| 1126 | 1126 |
| 1127 LRESULT CALLBACK MsgFilterProc(int code, WPARAM wparam, LPARAM lparam) { | 1127 LRESULT CALLBACK MsgFilterProc(int code, WPARAM wparam, LPARAM lparam) { |
| 1128 if (code == base::MessagePumpForUI::kMessageFilterCode) { | 1128 if (code == base::MessagePumpForUI::kMessageFilterCode) { |
| 1129 MSG* msg = reinterpret_cast<MSG*>(lparam); | 1129 MSG* msg = reinterpret_cast<MSG*>(lparam); |
| 1130 if (msg->message == WM_LBUTTONDOWN) | 1130 if (msg->message == WM_LBUTTONDOWN) |
| 1131 return TRUE; | 1131 return TRUE; |
| 1132 } | 1132 } |
| 1133 return FALSE; | 1133 return FALSE; |
| 1134 } | 1134 } |
| 1135 | 1135 |
| 1136 void RunTest_DispatcherWithMessageHook(MessageLoop::Type message_loop_type) { | 1136 void RunTest_DispatcherWithMessageHook(MessageLoop::Type message_loop_type) { |
| 1137 MessageLoop loop(message_loop_type); | 1137 MessageLoop loop("MessageLoopTest", message_loop_type); |
| 1138 | 1138 |
| 1139 MessageLoop::current()->PostDelayedTask(FROM_HERE, | 1139 MessageLoop::current()->PostDelayedTask(FROM_HERE, |
| 1140 base::Bind(&MouseDownUp), 100); | 1140 base::Bind(&MouseDownUp), 100); |
| 1141 HHOOK msg_hook = SetWindowsHookEx(WH_MSGFILTER, | 1141 HHOOK msg_hook = SetWindowsHookEx(WH_MSGFILTER, |
| 1142 MsgFilterProc, | 1142 MsgFilterProc, |
| 1143 NULL, | 1143 NULL, |
| 1144 GetCurrentThreadId()); | 1144 GetCurrentThreadId()); |
| 1145 DispatcherImpl dispatcher; | 1145 DispatcherImpl dispatcher; |
| 1146 MessageLoopForUI::current()->Run(&dispatcher); | 1146 MessageLoopForUI::current()->Run(&dispatcher); |
| 1147 ASSERT_EQ(1, dispatcher.dispatch_count_); | 1147 ASSERT_EQ(1, dispatcher.dispatch_count_); |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1484 int num_tasks_processed_; | 1484 int num_tasks_processed_; |
| 1485 const int num_tasks_; | 1485 const int num_tasks_; |
| 1486 | 1486 |
| 1487 DISALLOW_COPY_AND_ASSIGN(DummyTaskObserver); | 1487 DISALLOW_COPY_AND_ASSIGN(DummyTaskObserver); |
| 1488 }; | 1488 }; |
| 1489 | 1489 |
| 1490 TEST(MessageLoopTest, TaskObserver) { | 1490 TEST(MessageLoopTest, TaskObserver) { |
| 1491 const int kNumPosts = 6; | 1491 const int kNumPosts = 6; |
| 1492 DummyTaskObserver observer(kNumPosts); | 1492 DummyTaskObserver observer(kNumPosts); |
| 1493 | 1493 |
| 1494 MessageLoop loop; | 1494 MessageLoop loop("MessageLoopTest"); |
| 1495 loop.AddTaskObserver(&observer); | 1495 loop.AddTaskObserver(&observer); |
| 1496 loop.PostTask(FROM_HERE, base::Bind(&PostNTasksThenQuit, kNumPosts)); | 1496 loop.PostTask(FROM_HERE, base::Bind(&PostNTasksThenQuit, kNumPosts)); |
| 1497 loop.Run(); | 1497 loop.Run(); |
| 1498 loop.RemoveTaskObserver(&observer); | 1498 loop.RemoveTaskObserver(&observer); |
| 1499 | 1499 |
| 1500 EXPECT_EQ(kNumPosts, observer.num_tasks_started()); | 1500 EXPECT_EQ(kNumPosts, observer.num_tasks_started()); |
| 1501 EXPECT_EQ(kNumPosts, observer.num_tasks_processed()); | 1501 EXPECT_EQ(kNumPosts, observer.num_tasks_processed()); |
| 1502 } | 1502 } |
| 1503 | 1503 |
| 1504 #if defined(OS_WIN) | 1504 #if defined(OS_WIN) |
| 1505 TEST(MessageLoopTest, Dispatcher) { | 1505 TEST(MessageLoopTest, Dispatcher) { |
| 1506 // This test requires a UI loop | 1506 // This test requires a UI loop |
| 1507 RunTest_Dispatcher(MessageLoop::TYPE_UI); | 1507 RunTest_Dispatcher(MessageLoop::TYPE_UI); |
| 1508 } | 1508 } |
| 1509 | 1509 |
| 1510 TEST(MessageLoopTest, DispatcherWithMessageHook) { | 1510 TEST(MessageLoopTest, DispatcherWithMessageHook) { |
| 1511 // This test requires a UI loop | 1511 // This test requires a UI loop |
| 1512 RunTest_DispatcherWithMessageHook(MessageLoop::TYPE_UI); | 1512 RunTest_DispatcherWithMessageHook(MessageLoop::TYPE_UI); |
| 1513 } | 1513 } |
| 1514 | 1514 |
| 1515 TEST(MessageLoopTest, IOHandler) { | 1515 TEST(MessageLoopTest, IOHandler) { |
| 1516 RunTest_IOHandler(); | 1516 RunTest_IOHandler(); |
| 1517 } | 1517 } |
| 1518 | 1518 |
| 1519 TEST(MessageLoopTest, WaitForIO) { | 1519 TEST(MessageLoopTest, WaitForIO) { |
| 1520 RunTest_WaitForIO(); | 1520 RunTest_WaitForIO(); |
| 1521 } | 1521 } |
| 1522 | 1522 |
| 1523 TEST(MessageLoopTest, HighResolutionTimer) { | 1523 TEST(MessageLoopTest, HighResolutionTimer) { |
| 1524 MessageLoop loop; | 1524 MessageLoop loop("MessageLoopTest"); |
| 1525 | 1525 |
| 1526 const int kFastTimerMs = 5; | 1526 const int kFastTimerMs = 5; |
| 1527 const int kSlowTimerMs = 100; | 1527 const int kSlowTimerMs = 100; |
| 1528 | 1528 |
| 1529 EXPECT_FALSE(loop.high_resolution_timers_enabled()); | 1529 EXPECT_FALSE(loop.high_resolution_timers_enabled()); |
| 1530 | 1530 |
| 1531 // Post a fast task to enable the high resolution timers. | 1531 // Post a fast task to enable the high resolution timers. |
| 1532 loop.PostDelayedTask(FROM_HERE, base::Bind(&PostNTasksThenQuit, 1), | 1532 loop.PostDelayedTask(FROM_HERE, base::Bind(&PostNTasksThenQuit, 1), |
| 1533 kFastTimerMs); | 1533 kFastTimerMs); |
| 1534 loop.Run(); | 1534 loop.Run(); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1575 // as we don't need to actually get any notifications. | 1575 // as we don't need to actually get any notifications. |
| 1576 // pipe() is just the easiest way to do it. | 1576 // pipe() is just the easiest way to do it. |
| 1577 int pipefds[2]; | 1577 int pipefds[2]; |
| 1578 int err = pipe(pipefds); | 1578 int err = pipe(pipefds); |
| 1579 ASSERT_EQ(0, err); | 1579 ASSERT_EQ(0, err); |
| 1580 int fd = pipefds[1]; | 1580 int fd = pipefds[1]; |
| 1581 { | 1581 { |
| 1582 // Arrange for controller to live longer than message loop. | 1582 // Arrange for controller to live longer than message loop. |
| 1583 MessageLoopForIO::FileDescriptorWatcher controller; | 1583 MessageLoopForIO::FileDescriptorWatcher controller; |
| 1584 { | 1584 { |
| 1585 MessageLoopForIO message_loop; | 1585 MessageLoopForIO message_loop("MessageLoopTest"); |
| 1586 | 1586 |
| 1587 QuitDelegate delegate; | 1587 QuitDelegate delegate; |
| 1588 message_loop.WatchFileDescriptor(fd, | 1588 message_loop.WatchFileDescriptor(fd, |
| 1589 true, MessageLoopForIO::WATCH_WRITE, &controller, &delegate); | 1589 true, MessageLoopForIO::WATCH_WRITE, &controller, &delegate); |
| 1590 // and don't run the message loop, just destroy it. | 1590 // and don't run the message loop, just destroy it. |
| 1591 } | 1591 } |
| 1592 } | 1592 } |
| 1593 if (HANDLE_EINTR(close(pipefds[0])) < 0) | 1593 if (HANDLE_EINTR(close(pipefds[0])) < 0) |
| 1594 PLOG(ERROR) << "close"; | 1594 PLOG(ERROR) << "close"; |
| 1595 if (HANDLE_EINTR(close(pipefds[1])) < 0) | 1595 if (HANDLE_EINTR(close(pipefds[1])) < 0) |
| 1596 PLOG(ERROR) << "close"; | 1596 PLOG(ERROR) << "close"; |
| 1597 } | 1597 } |
| 1598 | 1598 |
| 1599 TEST(MessageLoopTest, FileDescriptorWatcherDoubleStop) { | 1599 TEST(MessageLoopTest, FileDescriptorWatcherDoubleStop) { |
| 1600 // Verify that it's ok to call StopWatchingFileDescriptor(). | 1600 // Verify that it's ok to call StopWatchingFileDescriptor(). |
| 1601 // (Errors only showed up in valgrind.) | 1601 // (Errors only showed up in valgrind.) |
| 1602 int pipefds[2]; | 1602 int pipefds[2]; |
| 1603 int err = pipe(pipefds); | 1603 int err = pipe(pipefds); |
| 1604 ASSERT_EQ(0, err); | 1604 ASSERT_EQ(0, err); |
| 1605 int fd = pipefds[1]; | 1605 int fd = pipefds[1]; |
| 1606 { | 1606 { |
| 1607 // Arrange for message loop to live longer than controller. | 1607 // Arrange for message loop to live longer than controller. |
| 1608 MessageLoopForIO message_loop; | 1608 MessageLoopForIO message_loop("MessageLoopTest"); |
| 1609 { | 1609 { |
| 1610 MessageLoopForIO::FileDescriptorWatcher controller; | 1610 MessageLoopForIO::FileDescriptorWatcher controller; |
| 1611 | 1611 |
| 1612 QuitDelegate delegate; | 1612 QuitDelegate delegate; |
| 1613 message_loop.WatchFileDescriptor(fd, | 1613 message_loop.WatchFileDescriptor(fd, |
| 1614 true, MessageLoopForIO::WATCH_WRITE, &controller, &delegate); | 1614 true, MessageLoopForIO::WATCH_WRITE, &controller, &delegate); |
| 1615 controller.StopWatchingFileDescriptor(); | 1615 controller.StopWatchingFileDescriptor(); |
| 1616 } | 1616 } |
| 1617 } | 1617 } |
| 1618 if (HANDLE_EINTR(close(pipefds[0])) < 0) | 1618 if (HANDLE_EINTR(close(pipefds[0])) < 0) |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1668 bool* task_destroyed_; | 1668 bool* task_destroyed_; |
| 1669 bool* destruction_observer_called_; | 1669 bool* destruction_observer_called_; |
| 1670 bool task_destroyed_before_message_loop_; | 1670 bool task_destroyed_before_message_loop_; |
| 1671 }; | 1671 }; |
| 1672 | 1672 |
| 1673 } // namespace | 1673 } // namespace |
| 1674 | 1674 |
| 1675 TEST(MessageLoopTest, DestructionObserverTest) { | 1675 TEST(MessageLoopTest, DestructionObserverTest) { |
| 1676 // Verify that the destruction observer gets called at the very end (after | 1676 // Verify that the destruction observer gets called at the very end (after |
| 1677 // all the pending tasks have been destroyed). | 1677 // all the pending tasks have been destroyed). |
| 1678 MessageLoop* loop = new MessageLoop; | 1678 MessageLoop* loop = new MessageLoop("MessageLoopTest"); |
| 1679 const int kDelayMS = 100; | 1679 const int kDelayMS = 100; |
| 1680 | 1680 |
| 1681 bool task_destroyed = false; | 1681 bool task_destroyed = false; |
| 1682 bool destruction_observer_called = false; | 1682 bool destruction_observer_called = false; |
| 1683 | 1683 |
| 1684 MLDestructionObserver observer(&task_destroyed, &destruction_observer_called); | 1684 MLDestructionObserver observer(&task_destroyed, &destruction_observer_called); |
| 1685 loop->AddDestructionObserver(&observer); | 1685 loop->AddDestructionObserver(&observer); |
| 1686 loop->PostDelayedTask( | 1686 loop->PostDelayedTask( |
| 1687 FROM_HERE, | 1687 FROM_HERE, |
| 1688 base::Bind(&DestructionObserverProbe::Run, | 1688 base::Bind(&DestructionObserverProbe::Run, |
| 1689 new DestructionObserverProbe(&task_destroyed, | 1689 new DestructionObserverProbe(&task_destroyed, |
| 1690 &destruction_observer_called)), | 1690 &destruction_observer_called)), |
| 1691 kDelayMS); | 1691 kDelayMS); |
| 1692 delete loop; | 1692 delete loop; |
| 1693 EXPECT_TRUE(observer.task_destroyed_before_message_loop()); | 1693 EXPECT_TRUE(observer.task_destroyed_before_message_loop()); |
| 1694 // The task should have been destroyed when we deleted the loop. | 1694 // The task should have been destroyed when we deleted the loop. |
| 1695 EXPECT_TRUE(task_destroyed); | 1695 EXPECT_TRUE(task_destroyed); |
| 1696 EXPECT_TRUE(destruction_observer_called); | 1696 EXPECT_TRUE(destruction_observer_called); |
| 1697 } | 1697 } |
| OLD | NEW |