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

Unified Diff: base/deferred_sequenced_task_runner_unittest.cc

Issue 12952005: Delay bookmarks load while the profile is loading. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add ObjectDestructionOrder unit test. Created 7 years, 8 months 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 side-by-side diff with in-line comments
Download patch
Index: base/deferred_sequenced_task_runner_unittest.cc
diff --git a/base/deferred_sequenced_task_runner_unittest.cc b/base/deferred_sequenced_task_runner_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..6654b14b95270eb9127427a34e2125730ecafc99
--- /dev/null
+++ b/base/deferred_sequenced_task_runner_unittest.cc
@@ -0,0 +1,207 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/deferred_sequenced_task_runner.h"
+
+#include "base/basictypes.h"
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/memory/ref_counted.h"
+#include "base/message_loop.h"
+#include "base/message_loop_proxy.h"
+#include "base/threading/non_thread_safe.h"
+#include "base/threading/thread.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+class DeferredSequencedTaskRunnerTest : public testing::Test,
+ public base::NonThreadSafe {
+ public:
+ class ExecuteTaskOnDestructor :
+ public base::RefCounted<ExecuteTaskOnDestructor> {
+ public:
+ ExecuteTaskOnDestructor(
+ DeferredSequencedTaskRunnerTest* executor,
+ int task_id)
+ : executor_(executor),
+ task_id_(task_id) {
+ }
+ private:
+ friend class base::RefCounted<ExecuteTaskOnDestructor>;
+ virtual ~ExecuteTaskOnDestructor() {
+ executor_->ExecuteTask(task_id_);
+ }
+ DeferredSequencedTaskRunnerTest* executor_;
+ int task_id_;
+ };
+
+ void ExecuteTask(int task_id) {
+ base::AutoLock lock(lock_);
+ executed_task_ids_.push_back(task_id);
+ }
+
+ void PostExecuteTask(int task_id) {
+ runner_->PostTask(FROM_HERE,
+ base::Bind(&DeferredSequencedTaskRunnerTest::ExecuteTask,
+ base::Unretained(this),
+ task_id));
+ }
+
+ void StartRunner() {
+ runner_->Start();
+ }
+
+ void DoNothing(ExecuteTaskOnDestructor* object) {
+ }
+
+ protected:
+ DeferredSequencedTaskRunnerTest() :
+ loop_(),
+ runner_(
+ new base::DeferredSequencedTaskRunner(loop_.message_loop_proxy())) {
+ }
+
+ MessageLoop loop_;
+ scoped_refptr<base::DeferredSequencedTaskRunner> runner_;
+ mutable base::Lock lock_;
+ std::vector<int> executed_task_ids_;
+};
+
+TEST_F(DeferredSequencedTaskRunnerTest, Stopped) {
+ runner_->PostTask(FROM_HERE,
+ base::Bind(&DeferredSequencedTaskRunnerTest::ExecuteTask,
erikwright (departed) 2013/04/15 17:56:25 I'd consider wrapping the bind into a member metho
+ base::Unretained(this),
+ 1));
+ loop_.RunUntilIdle();
+ EXPECT_THAT(executed_task_ids_, testing::ElementsAre());
+}
+
+TEST_F(DeferredSequencedTaskRunnerTest, Start) {
+ runner_->Start();
+ runner_->PostTask(FROM_HERE,
+ base::Bind(&DeferredSequencedTaskRunnerTest::ExecuteTask,
+ base::Unretained(this),
+ 1));
+ loop_.RunUntilIdle();
+ EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1));
+}
+
+TEST_F(DeferredSequencedTaskRunnerTest, StartWithMultipleElements) {
+ runner_->Start();
+ for (int i = 1; i < 5; ++i) {
+ runner_->PostTask(FROM_HERE,
+ base::Bind(&DeferredSequencedTaskRunnerTest::ExecuteTask,
+ base::Unretained(this),
+ i));
+ }
+ loop_.RunUntilIdle();
+ EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2, 3, 4));
+}
+
+TEST_F(DeferredSequencedTaskRunnerTest, DeferredStart) {
+ runner_->PostTask(FROM_HERE,
+ base::Bind(&DeferredSequencedTaskRunnerTest::ExecuteTask,
+ base::Unretained(this),
+ 1));
+ loop_.RunUntilIdle();
+ EXPECT_THAT(executed_task_ids_, testing::ElementsAre());
+
+ runner_->Start();
+ loop_.RunUntilIdle();
+ EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1));
+
+ runner_->PostTask(FROM_HERE,
+ base::Bind(&DeferredSequencedTaskRunnerTest::ExecuteTask,
+ base::Unretained(this),
+ 2));
+ loop_.RunUntilIdle();
+ EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2));
+}
+
+TEST_F(DeferredSequencedTaskRunnerTest, DeferredStartWithMultipleElements) {
+ for (int i = 1; i < 5; ++i) {
+ runner_->PostTask(FROM_HERE,
+ base::Bind(&DeferredSequencedTaskRunnerTest::ExecuteTask,
+ base::Unretained(this),
+ i));
+ }
+ loop_.RunUntilIdle();
+ EXPECT_THAT(executed_task_ids_, testing::ElementsAre());
+
+ runner_->Start();
+
+ for (int i = 5; i < 9; ++i) {
+ runner_->PostTask(FROM_HERE,
+ base::Bind(&DeferredSequencedTaskRunnerTest::ExecuteTask,
+ base::Unretained(this),
+ i));
+ }
+ loop_.RunUntilIdle();
+ EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2, 3, 4, 5, 6, 7, 8));
+}
+
+TEST_F(DeferredSequencedTaskRunnerTest, DeferredStartWithMultipleThreads) {
+ {
+ base::Thread thread1("DeferredSequencedTaskRunnerTestThread1");
+ base::Thread thread2("DeferredSequencedTaskRunnerTestThread2");
+ thread1.Start();
+ thread2.Start();
+ for (int i = 0; i < 5; ++i) {
+ thread1.message_loop()->PostTask(FROM_HERE,
willchan no longer on Chromium 2013/04/16 01:03:04 Indentation is off here. All the parameters should
msarda 2013/04/17 09:53:55 Done.
+ base::Bind(&DeferredSequencedTaskRunnerTest::PostExecuteTask,
+ base::Unretained(this),
+ 2 * i));
+ thread2.message_loop()->PostTask(FROM_HERE,
+ base::Bind(&DeferredSequencedTaskRunnerTest::PostExecuteTask,
+ base::Unretained(this),
+ 2 * i + 1));
+ if (i == 2) {
+ thread1.message_loop()->PostTask(FROM_HERE,
+ base::Bind(&DeferredSequencedTaskRunnerTest::StartRunner,
+ base::Unretained(this)));
+ }
+ }
+ }
+
+ loop_.RunUntilIdle();
+ EXPECT_THAT(executed_task_ids_,
+ testing::WhenSorted(testing::ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)));
+}
+
+TEST_F(DeferredSequencedTaskRunnerTest, ObjectDestructionOrder) {
+ {
+ base::Thread thread("DeferredSequencedTaskRunnerTestThread");
+ thread.Start();
+ runner_ =
+ new base::DeferredSequencedTaskRunner(thread.message_loop_proxy());
+ for (int i = 0; i < 5; ++i) {
+ {
+ // Use a block to ensure that no reference to |short_lived_object|
+ // is kept on the main thread after it is posted to |runner_|.
+ scoped_refptr<ExecuteTaskOnDestructor> short_lived_object =
+ new ExecuteTaskOnDestructor(this, 2 * i);
+ runner_->PostTask(FROM_HERE,
willchan no longer on Chromium 2013/04/16 01:03:04 Ditto here on parameter alignment.
msarda 2013/04/17 09:53:55 Done.
+ base::Bind(&DeferredSequencedTaskRunnerTest::DoNothing,
+ base::Unretained(this),
+ short_lived_object));
+ }
+ // |short_lived_object| with id |2 * i| should be destroyed before the
+ // task |2 * i + 1| is executed.
+ runner_->PostTask(FROM_HERE,
+ base::Bind(&DeferredSequencedTaskRunnerTest::ExecuteTask,
+ base::Unretained(this),
+ 2 * i + 1));
+ }
+ runner_->Start();
+ }
+
+ // All |short_lived_object| with id |2 * i| are destroyed before the task
+ // |2 * i + 1| is executed.
+ EXPECT_THAT(executed_task_ids_,
+ testing::ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
+}
+
+} // namespace

Powered by Google App Engine
This is Rietveld 408576698