Chromium Code Reviews| Index: base/threading/post_task_and_reply_impl_unittest.cc |
| diff --git a/base/threading/post_task_and_reply_impl_unittest.cc b/base/threading/post_task_and_reply_impl_unittest.cc |
| index 2e8fc44291b0eab156d05bf20268bafb4f1eae83..7335dd3664ad147f38c8dec33fc28f16205b64df 100644 |
| --- a/base/threading/post_task_and_reply_impl_unittest.cc |
| +++ b/base/threading/post_task_and_reply_impl_unittest.cc |
| @@ -10,6 +10,7 @@ |
| #include "base/bind_helpers.h" |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| +#include "base/single_thread_task_runner.h" |
| #include "base/test/test_simple_task_runner.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| @@ -71,16 +72,67 @@ class MockObject { |
| DISALLOW_COPY_AND_ASSIGN(MockObject); |
| }; |
| +class WrappedTaskRunner : public SingleThreadTaskRunner { |
|
gab
2017/03/29 18:21:35
Hmmm sorry I wasn't clear, I didn't mean to make t
tzik
2017/03/30 09:01:18
Ah, sorry for confusion. Updated the test.
|
| + public: |
| + explicit WrappedTaskRunner( |
| + scoped_refptr<SingleThreadTaskRunner> underlying_task_runner) |
| + : underlying_task_runner_(std::move(underlying_task_runner)) {} |
| + |
| + bool PostDelayedTask(const tracked_objects::Location& from_here, |
| + Closure task, |
| + base::TimeDelta delay) override { |
| + if (post_task_hook_) |
| + std::move(post_task_hook_).Run(); |
| + return underlying_task_runner_->PostDelayedTask(from_here, std::move(task), |
| + delay); |
| + } |
| + |
| + bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
| + Closure task, |
| + base::TimeDelta delay) override { |
| + if (post_task_hook_) |
| + std::move(post_task_hook_).Run(); |
| + return underlying_task_runner_->PostNonNestableDelayedTask( |
| + from_here, std::move(task), delay); |
| + } |
| + |
| + void set_post_task_hook(OnceClosure hook) { |
| + post_task_hook_ = std::move(hook); |
| + } |
| + |
| + bool has_post_task_hook() const { return !post_task_hook_.is_null(); } |
| + |
| + bool RunsTasksOnCurrentThread() const override { |
| + return underlying_task_runner_->RunsTasksOnCurrentThread(); |
| + } |
| + |
| + private: |
| + ~WrappedTaskRunner() override {} |
| + |
| + scoped_refptr<SingleThreadTaskRunner> underlying_task_runner_; |
| + OnceClosure post_task_hook_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(WrappedTaskRunner); |
| +}; |
| + |
| } // namespace |
| TEST(PostTaskAndReplyImplTest, PostTaskAndReply) { |
| scoped_refptr<TestSimpleTaskRunner> post_runner(new TestSimpleTaskRunner); |
| scoped_refptr<TestSimpleTaskRunner> reply_runner(new TestSimpleTaskRunner); |
| - ThreadTaskRunnerHandle task_runner_handle(reply_runner); |
| + scoped_refptr<WrappedTaskRunner> wrapped_reply_runner( |
| + new WrappedTaskRunner(reply_runner)); |
| + ThreadTaskRunnerHandle task_runner_handle(wrapped_reply_runner); |
| testing::StrictMock<MockObject> mock_object; |
| bool delete_flag = false; |
| + auto expect_true = [](bool* delete_flag) { EXPECT_TRUE(*delete_flag); }; |
| + |
| + // Expect the posted callback is destroyed before the reply task is scheduled. |
| + wrapped_reply_runner->set_post_task_hook( |
| + base::BindOnce(expect_true, &delete_flag)); |
| + |
| EXPECT_TRUE( |
| PostTaskAndReplyTaskRunner(post_runner.get()) |
| .PostTaskAndReply( |
| @@ -99,8 +151,9 @@ TEST(PostTaskAndReplyImplTest, PostTaskAndReply) { |
| post_runner->RunUntilIdle(); |
| testing::Mock::VerifyAndClear(&mock_object); |
| - // Expect the task's argument not to have been deleted yet. |
| - EXPECT_FALSE(delete_flag); |
| + // Expect the task's argument to have been deleted. |
| + EXPECT_FALSE(wrapped_reply_runner->has_post_task_hook()); |
| + EXPECT_TRUE(delete_flag); |
| // Expect the reply to be posted to |reply_runner|. |
| EXPECT_FALSE(post_runner->HasPendingTask()); |