| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/deferred_sequenced_task_runner.h" | 5 #include "base/deferred_sequenced_task_runner.h" |
| 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/location.h" | 9 #include "base/location.h" |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| 11 #include "base/run_loop.h" |
| 11 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
| 12 #include "base/threading/non_thread_safe.h" | 13 #include "base/threading/non_thread_safe.h" |
| 13 #include "base/threading/thread.h" | 14 #include "base/threading/thread.h" |
| 14 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 17 |
| 17 namespace { | 18 namespace { |
| 18 | 19 |
| 19 class DeferredSequencedTaskRunnerTest : public testing::Test, | 20 class DeferredSequencedTaskRunnerTest : public testing::Test, |
| 20 public base::NonThreadSafe { | 21 public base::NonThreadSafe { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 runner_(new base::DeferredSequencedTaskRunner(loop_.task_runner())) {} | 63 runner_(new base::DeferredSequencedTaskRunner(loop_.task_runner())) {} |
| 63 | 64 |
| 64 base::MessageLoop loop_; | 65 base::MessageLoop loop_; |
| 65 scoped_refptr<base::DeferredSequencedTaskRunner> runner_; | 66 scoped_refptr<base::DeferredSequencedTaskRunner> runner_; |
| 66 mutable base::Lock lock_; | 67 mutable base::Lock lock_; |
| 67 std::vector<int> executed_task_ids_; | 68 std::vector<int> executed_task_ids_; |
| 68 }; | 69 }; |
| 69 | 70 |
| 70 TEST_F(DeferredSequencedTaskRunnerTest, Stopped) { | 71 TEST_F(DeferredSequencedTaskRunnerTest, Stopped) { |
| 71 PostExecuteTask(1); | 72 PostExecuteTask(1); |
| 72 loop_.RunUntilIdle(); | 73 base::RunLoop().RunUntilIdle(); |
| 73 EXPECT_THAT(executed_task_ids_, testing::ElementsAre()); | 74 EXPECT_THAT(executed_task_ids_, testing::ElementsAre()); |
| 74 } | 75 } |
| 75 | 76 |
| 76 TEST_F(DeferredSequencedTaskRunnerTest, Start) { | 77 TEST_F(DeferredSequencedTaskRunnerTest, Start) { |
| 77 StartRunner(); | 78 StartRunner(); |
| 78 PostExecuteTask(1); | 79 PostExecuteTask(1); |
| 79 loop_.RunUntilIdle(); | 80 base::RunLoop().RunUntilIdle(); |
| 80 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1)); | 81 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1)); |
| 81 } | 82 } |
| 82 | 83 |
| 83 TEST_F(DeferredSequencedTaskRunnerTest, StartWithMultipleElements) { | 84 TEST_F(DeferredSequencedTaskRunnerTest, StartWithMultipleElements) { |
| 84 StartRunner(); | 85 StartRunner(); |
| 85 for (int i = 1; i < 5; ++i) | 86 for (int i = 1; i < 5; ++i) |
| 86 PostExecuteTask(i); | 87 PostExecuteTask(i); |
| 87 | 88 |
| 88 loop_.RunUntilIdle(); | 89 base::RunLoop().RunUntilIdle(); |
| 89 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2, 3, 4)); | 90 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2, 3, 4)); |
| 90 } | 91 } |
| 91 | 92 |
| 92 TEST_F(DeferredSequencedTaskRunnerTest, DeferredStart) { | 93 TEST_F(DeferredSequencedTaskRunnerTest, DeferredStart) { |
| 93 PostExecuteTask(1); | 94 PostExecuteTask(1); |
| 94 loop_.RunUntilIdle(); | 95 base::RunLoop().RunUntilIdle(); |
| 95 EXPECT_THAT(executed_task_ids_, testing::ElementsAre()); | 96 EXPECT_THAT(executed_task_ids_, testing::ElementsAre()); |
| 96 | 97 |
| 97 StartRunner(); | 98 StartRunner(); |
| 98 loop_.RunUntilIdle(); | 99 base::RunLoop().RunUntilIdle(); |
| 99 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1)); | 100 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1)); |
| 100 | 101 |
| 101 PostExecuteTask(2); | 102 PostExecuteTask(2); |
| 102 loop_.RunUntilIdle(); | 103 base::RunLoop().RunUntilIdle(); |
| 103 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2)); | 104 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2)); |
| 104 } | 105 } |
| 105 | 106 |
| 106 TEST_F(DeferredSequencedTaskRunnerTest, DeferredStartWithMultipleElements) { | 107 TEST_F(DeferredSequencedTaskRunnerTest, DeferredStartWithMultipleElements) { |
| 107 for (int i = 1; i < 5; ++i) | 108 for (int i = 1; i < 5; ++i) |
| 108 PostExecuteTask(i); | 109 PostExecuteTask(i); |
| 109 loop_.RunUntilIdle(); | 110 base::RunLoop().RunUntilIdle(); |
| 110 EXPECT_THAT(executed_task_ids_, testing::ElementsAre()); | 111 EXPECT_THAT(executed_task_ids_, testing::ElementsAre()); |
| 111 | 112 |
| 112 StartRunner(); | 113 StartRunner(); |
| 113 for (int i = 5; i < 9; ++i) | 114 for (int i = 5; i < 9; ++i) |
| 114 PostExecuteTask(i); | 115 PostExecuteTask(i); |
| 115 loop_.RunUntilIdle(); | 116 base::RunLoop().RunUntilIdle(); |
| 116 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2, 3, 4, 5, 6, 7, 8)); | 117 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2, 3, 4, 5, 6, 7, 8)); |
| 117 } | 118 } |
| 118 | 119 |
| 119 TEST_F(DeferredSequencedTaskRunnerTest, DeferredStartWithMultipleThreads) { | 120 TEST_F(DeferredSequencedTaskRunnerTest, DeferredStartWithMultipleThreads) { |
| 120 { | 121 { |
| 121 base::Thread thread1("DeferredSequencedTaskRunnerTestThread1"); | 122 base::Thread thread1("DeferredSequencedTaskRunnerTestThread1"); |
| 122 base::Thread thread2("DeferredSequencedTaskRunnerTestThread2"); | 123 base::Thread thread2("DeferredSequencedTaskRunnerTestThread2"); |
| 123 thread1.Start(); | 124 thread1.Start(); |
| 124 thread2.Start(); | 125 thread2.Start(); |
| 125 for (int i = 0; i < 5; ++i) { | 126 for (int i = 0; i < 5; ++i) { |
| 126 thread1.task_runner()->PostTask( | 127 thread1.task_runner()->PostTask( |
| 127 FROM_HERE, | 128 FROM_HERE, |
| 128 base::Bind(&DeferredSequencedTaskRunnerTest::PostExecuteTask, | 129 base::Bind(&DeferredSequencedTaskRunnerTest::PostExecuteTask, |
| 129 base::Unretained(this), 2 * i)); | 130 base::Unretained(this), 2 * i)); |
| 130 thread2.task_runner()->PostTask( | 131 thread2.task_runner()->PostTask( |
| 131 FROM_HERE, | 132 FROM_HERE, |
| 132 base::Bind(&DeferredSequencedTaskRunnerTest::PostExecuteTask, | 133 base::Bind(&DeferredSequencedTaskRunnerTest::PostExecuteTask, |
| 133 base::Unretained(this), 2 * i + 1)); | 134 base::Unretained(this), 2 * i + 1)); |
| 134 if (i == 2) { | 135 if (i == 2) { |
| 135 thread1.task_runner()->PostTask( | 136 thread1.task_runner()->PostTask( |
| 136 FROM_HERE, base::Bind(&DeferredSequencedTaskRunnerTest::StartRunner, | 137 FROM_HERE, base::Bind(&DeferredSequencedTaskRunnerTest::StartRunner, |
| 137 base::Unretained(this))); | 138 base::Unretained(this))); |
| 138 } | 139 } |
| 139 } | 140 } |
| 140 } | 141 } |
| 141 | 142 |
| 142 loop_.RunUntilIdle(); | 143 base::RunLoop().RunUntilIdle(); |
| 143 EXPECT_THAT(executed_task_ids_, | 144 EXPECT_THAT(executed_task_ids_, |
| 144 testing::WhenSorted(testing::ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9))); | 145 testing::WhenSorted(testing::ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9))); |
| 145 } | 146 } |
| 146 | 147 |
| 147 TEST_F(DeferredSequencedTaskRunnerTest, ObjectDestructionOrder) { | 148 TEST_F(DeferredSequencedTaskRunnerTest, ObjectDestructionOrder) { |
| 148 { | 149 { |
| 149 base::Thread thread("DeferredSequencedTaskRunnerTestThread"); | 150 base::Thread thread("DeferredSequencedTaskRunnerTestThread"); |
| 150 thread.Start(); | 151 thread.Start(); |
| 151 runner_ = new base::DeferredSequencedTaskRunner(thread.task_runner()); | 152 runner_ = new base::DeferredSequencedTaskRunner(thread.task_runner()); |
| 152 for (int i = 0; i < 5; ++i) { | 153 for (int i = 0; i < 5; ++i) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 167 StartRunner(); | 168 StartRunner(); |
| 168 } | 169 } |
| 169 | 170 |
| 170 // All |short_lived_object| with id |2 * i| are destroyed before the task | 171 // All |short_lived_object| with id |2 * i| are destroyed before the task |
| 171 // |2 * i + 1| is executed. | 172 // |2 * i + 1| is executed. |
| 172 EXPECT_THAT(executed_task_ids_, | 173 EXPECT_THAT(executed_task_ids_, |
| 173 testing::ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); | 174 testing::ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); |
| 174 } | 175 } |
| 175 | 176 |
| 176 } // namespace | 177 } // namespace |
| OLD | NEW |