xref: /aosp_15_r20/external/cronet/base/ios/scoped_critical_action_unittest.mm (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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