diff options
Diffstat (limited to 'chromium/base/task/promise/promise_unittest.cc')
-rw-r--r-- | chromium/base/task/promise/promise_unittest.cc | 88 |
1 files changed, 86 insertions, 2 deletions
diff --git a/chromium/base/task/promise/promise_unittest.cc b/chromium/base/task/promise/promise_unittest.cc index bb3dda41cb3..d81adacb1a0 100644 --- a/chromium/base/task/promise/promise_unittest.cc +++ b/chromium/base/task/promise/promise_unittest.cc @@ -106,6 +106,86 @@ TEST(PromiseMemoryLeakTest, TargetTaskRunnerClearsTasks) { EXPECT_TRUE(delete_reply_flag); } +TEST(PromiseMemoryLeakTest, GetResolveCallbackNeverRun) { + test::TaskEnvironment task_environment_; + OnceCallback<void(int)> cb; + MockObject mock_object; + bool delete_task_flag = false; + + { + ManualPromiseResolver<int> p(FROM_HERE); + cb = p.GetResolveCallback(); + + p.promise().ThenHere( + FROM_HERE, BindOnce(&MockObject::Task, Unretained(&mock_object), + MakeRefCounted<ObjectToDelete>(&delete_task_flag))); + } + + EXPECT_FALSE(delete_task_flag); + cb = OnceCallback<void(int)>(); + EXPECT_TRUE(delete_task_flag); +} + +TEST(PromiseMemoryLeakTest, GetRepeatingResolveCallbackNeverRun) { + test::TaskEnvironment task_environment_; + RepeatingCallback<void(int)> cb; + MockObject mock_object; + bool delete_task_flag = false; + + { + ManualPromiseResolver<int> p(FROM_HERE); + cb = p.GetRepeatingResolveCallback(); + + p.promise().ThenHere( + FROM_HERE, BindOnce(&MockObject::Task, Unretained(&mock_object), + MakeRefCounted<ObjectToDelete>(&delete_task_flag))); + } + + EXPECT_FALSE(delete_task_flag); + cb = RepeatingCallback<void(int)>(); + EXPECT_TRUE(delete_task_flag); +} + +TEST(PromiseMemoryLeakTest, GetRejectCallbackNeverRun) { + test::TaskEnvironment task_environment_; + OnceCallback<void(int)> cb; + MockObject mock_object; + bool delete_task_flag = false; + + { + ManualPromiseResolver<void, int> p(FROM_HERE); + cb = p.GetRejectCallback(); + + p.promise().CatchHere( + FROM_HERE, BindOnce(&MockObject::Task, Unretained(&mock_object), + MakeRefCounted<ObjectToDelete>(&delete_task_flag))); + } + + EXPECT_FALSE(delete_task_flag); + cb = OnceCallback<void(int)>(); + EXPECT_TRUE(delete_task_flag); +} + +TEST(PromiseMemoryLeakTest, GetRepeatingRejectCallbackNeverRun) { + test::TaskEnvironment task_environment_; + RepeatingCallback<void(int)> cb; + MockObject mock_object; + bool delete_task_flag = false; + + { + ManualPromiseResolver<void, int> p(FROM_HERE); + cb = p.GetRepeatingRejectCallback(); + + p.promise().CatchHere( + FROM_HERE, BindOnce(&MockObject::Task, Unretained(&mock_object), + MakeRefCounted<ObjectToDelete>(&delete_task_flag))); + } + + EXPECT_FALSE(delete_task_flag); + cb = RepeatingCallback<void(int)>(); + EXPECT_TRUE(delete_task_flag); +} + TEST_F(PromiseTest, GetResolveCallbackThen) { ManualPromiseResolver<int> p(FROM_HERE); p.GetResolveCallback().Run(123); @@ -1602,13 +1682,17 @@ TEST_F(PromiseTest, MoveOnlyTypeMultipleCatchesNotAllowed) { auto p = Promise<void, std::unique_ptr<int>>::CreateRejected( FROM_HERE, std::make_unique<int>(123)); - p.CatchHere(FROM_HERE, - BindOnce([](std::unique_ptr<int> i) { EXPECT_EQ(123, *i); })); + auto r = p.CatchHere( + FROM_HERE, BindOnce([](std::unique_ptr<int> i) { EXPECT_EQ(123, *i); })); EXPECT_DCHECK_DEATH({ p.CatchHere(FROM_HERE, BindOnce([](std::unique_ptr<int> i) { EXPECT_EQ(123, *i); })); }); + + // TODO(alexclarke): Temporary, remove when SequenceManager handles promises + // natively. + r.GetScopedRefptrForTesting()->OnCanceled(); #endif } |