1 // Copyright 2021 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/task/default_delayed_task_handle_delegate.h" 6 7 #include "base/functional/callback_helpers.h" 8 #include "base/task/delayed_task_handle.h" 9 #include "base/test/bind.h" 10 #include "testing/gtest/include/gtest/gtest.h" 11 12 namespace base { 13 14 // Tests that running the bound callback invalidates the handle. TEST(DefaultDelayedTaskHandleDelegateTest,RunTask)15TEST(DefaultDelayedTaskHandleDelegateTest, RunTask) { 16 auto delegate = std::make_unique<DefaultDelayedTaskHandleDelegate>(); 17 EXPECT_FALSE(delegate->IsValid()); 18 19 auto bound_callback = delegate->BindCallback(DoNothing()); 20 EXPECT_TRUE(delegate->IsValid()); 21 22 DelayedTaskHandle delayed_task_handle(std::move(delegate)); 23 EXPECT_TRUE(delayed_task_handle.IsValid()); 24 25 std::move(bound_callback).Run(); 26 EXPECT_FALSE(delayed_task_handle.IsValid()); 27 } 28 29 // Tests that DefaultDelayedTaskHandleDelegate supports CancelTask(). TEST(DefaultDelayedTaskHandleDelegateTest,CancelTask)30TEST(DefaultDelayedTaskHandleDelegateTest, CancelTask) { 31 auto delegate = std::make_unique<DefaultDelayedTaskHandleDelegate>(); 32 EXPECT_FALSE(delegate->IsValid()); 33 34 auto bound_callback = delegate->BindCallback(DoNothing()); 35 EXPECT_TRUE(delegate->IsValid()); 36 37 DelayedTaskHandle delayed_task_handle(std::move(delegate)); 38 EXPECT_TRUE(delayed_task_handle.IsValid()); 39 40 delayed_task_handle.CancelTask(); 41 EXPECT_FALSE(delayed_task_handle.IsValid()); 42 EXPECT_TRUE(bound_callback.IsCancelled()); 43 } 44 45 // Tests that destroying the bound callback invalidates the handle. TEST(DefaultDelayedTaskHandleDelegateTest,DestroyTask)46TEST(DefaultDelayedTaskHandleDelegateTest, DestroyTask) { 47 auto delegate = std::make_unique<DefaultDelayedTaskHandleDelegate>(); 48 EXPECT_FALSE(delegate->IsValid()); 49 50 auto bound_callback = delegate->BindCallback(DoNothing()); 51 EXPECT_TRUE(delegate->IsValid()); 52 53 DelayedTaskHandle delayed_task_handle(std::move(delegate)); 54 EXPECT_TRUE(delayed_task_handle.IsValid()); 55 56 bound_callback = OnceClosure(); 57 EXPECT_FALSE(delayed_task_handle.IsValid()); 58 } 59 60 // Tests that the handle is invalid while the task is running. TEST(DefaultDelayedTaskHandleDelegateTest,HandleInvalidInsideCallback)61TEST(DefaultDelayedTaskHandleDelegateTest, HandleInvalidInsideCallback) { 62 auto delegate = std::make_unique<DefaultDelayedTaskHandleDelegate>(); 63 EXPECT_FALSE(delegate->IsValid()); 64 65 auto bound_callback = delegate->BindCallback( 66 BindLambdaForTesting([delegate = delegate.get()]() { 67 // Check that the delegate is invalid inside the callback. 68 EXPECT_FALSE(delegate->IsValid()); 69 })); 70 EXPECT_TRUE(delegate->IsValid()); 71 72 DelayedTaskHandle delayed_task_handle(std::move(delegate)); 73 EXPECT_TRUE(delayed_task_handle.IsValid()); 74 75 std::move(bound_callback).Run(); 76 EXPECT_FALSE(delayed_task_handle.IsValid()); 77 } 78 79 } // namespace base 80