1// Copyright 2023 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/ios/scoped_critical_action.h" 6 7#include <memory> 8 9#include "base/strings/string_piece.h" 10#include "base/test/task_environment.h" 11#include "testing/gtest/include/gtest/gtest.h" 12#include "testing/platform_test.h" 13 14namespace base::ios { 15namespace { 16 17class ScopedCriticalActionTest : public PlatformTest { 18 protected: 19 ScopedCriticalActionTest() { 20 ScopedCriticalAction::ClearNumActiveBackgroundTasksForTest(); 21 } 22 23 ~ScopedCriticalActionTest() override = default; 24 25 base::test::TaskEnvironment task_environment_{ 26 base::test::TaskEnvironment::TimeSource::MOCK_TIME}; 27}; 28 29TEST_F(ScopedCriticalActionTest, ShouldStartBackgroundTaskWhenConstructed) { 30 ASSERT_EQ(0, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 31 32 ScopedCriticalAction scoped_critical_action("name"); 33 EXPECT_EQ(1, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 34} 35 36TEST_F(ScopedCriticalActionTest, ShouldEndBackgroundTaskWhenDestructed) { 37 ScopedCriticalAction::ClearNumActiveBackgroundTasksForTest(); 38 ASSERT_EQ(0, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 39 40 auto scoped_critical_action = std::make_unique<ScopedCriticalAction>("name"); 41 ASSERT_EQ(1, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 42 43 scoped_critical_action.reset(); 44 EXPECT_EQ(0, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 45} 46 47TEST_F(ScopedCriticalActionTest, ShouldUseMultipleBackgroundTasks) { 48 ScopedCriticalAction::ClearNumActiveBackgroundTasksForTest(); 49 ASSERT_EQ(0, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 50 51 auto scoped_critical_action1 = 52 std::make_unique<ScopedCriticalAction>("name1"); 53 ASSERT_EQ(1, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 54 55 auto scoped_critical_action2 = 56 std::make_unique<ScopedCriticalAction>("name2"); 57 EXPECT_EQ(2, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 58 59 scoped_critical_action1.reset(); 60 EXPECT_EQ(1, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 61 62 scoped_critical_action2.reset(); 63 EXPECT_EQ(0, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 64} 65 66TEST_F(ScopedCriticalActionTest, ShouldReuseBackgroundTasksForSameName) { 67 ScopedCriticalAction::ClearNumActiveBackgroundTasksForTest(); 68 ASSERT_EQ(0, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 69 70 auto scoped_critical_action1 = std::make_unique<ScopedCriticalAction>("name"); 71 ASSERT_EQ(1, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 72 73 auto scoped_critical_action2 = std::make_unique<ScopedCriticalAction>("name"); 74 EXPECT_EQ(1, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 75 76 scoped_critical_action1.reset(); 77 EXPECT_EQ(1, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 78 79 scoped_critical_action2.reset(); 80 EXPECT_EQ(0, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 81} 82 83TEST_F(ScopedCriticalActionTest, 84 ShouldNotReuseBackgroundTasksForSameNameIfTimeDifferenceLarge) { 85 ScopedCriticalAction::ClearNumActiveBackgroundTasksForTest(); 86 ASSERT_EQ(0, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 87 88 auto scoped_critical_action1 = std::make_unique<ScopedCriticalAction>("name"); 89 ASSERT_EQ(1, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 90 91 // Mimic advancing time more than 3 seconds (kMaxTaskReuseDelay). 92 task_environment_.FastForwardBy(base::Seconds(4)); 93 94 auto scoped_critical_action2 = std::make_unique<ScopedCriticalAction>("name"); 95 EXPECT_EQ(2, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 96 97 scoped_critical_action1.reset(); 98 EXPECT_EQ(1, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 99 100 scoped_critical_action2.reset(); 101 EXPECT_EQ(0, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 102} 103 104TEST_F(ScopedCriticalActionTest, 105 ShouldReuseBackgroundTasksForSameNameIfTimeDifferenceSmall) { 106 ScopedCriticalAction::ClearNumActiveBackgroundTasksForTest(); 107 ASSERT_EQ(0, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 108 109 auto scoped_critical_action1 = std::make_unique<ScopedCriticalAction>("name"); 110 ASSERT_EQ(1, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 111 112 // Mimic advancing time less than 3 seconds (kMaxTaskReuseDelay). 113 task_environment_.FastForwardBy(base::Seconds(2)); 114 115 auto scoped_critical_action2 = std::make_unique<ScopedCriticalAction>("name"); 116 EXPECT_EQ(1, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 117 118 scoped_critical_action1.reset(); 119 EXPECT_EQ(1, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 120 121 scoped_critical_action2.reset(); 122 EXPECT_EQ(0, ScopedCriticalAction::GetNumActiveBackgroundTasksForTest()); 123} 124 125} // namespace 126} // namespace base::ios 127