blob: fdeea4396097b0c7f0dfbc2de7ea168c83560538 [file] [log] [blame]
Avi Drissmane4622aa2022-09-08 20:36:061// Copyright 2011 The Chromium Authors
[email protected]b2e97292008-09-02 18:20:342// 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/at_exit.h"
6
Peter Kasting134ef9af2024-12-28 02:30:097#include "base/functional/bind.h"
[email protected]b2e97292008-09-02 18:20:348#include "testing/gtest/include/gtest/gtest.h"
9
10namespace {
11
[email protected]b2e97292008-09-02 18:20:3412int g_test_counter_1 = 0;
13int g_test_counter_2 = 0;
14
[email protected]9795ec12008-09-08 09:06:5115void IncrementTestCounter1(void* unused) {
[email protected]b2e97292008-09-02 18:20:3416 ++g_test_counter_1;
17}
18
[email protected]9795ec12008-09-08 09:06:5119void IncrementTestCounter2(void* unused) {
[email protected]b2e97292008-09-02 18:20:3420 ++g_test_counter_2;
21}
22
23void ZeroTestCounters() {
24 g_test_counter_1 = 0;
25 g_test_counter_2 = 0;
26}
27
[email protected]9795ec12008-09-08 09:06:5128void ExpectCounter1IsZero(void* unused) {
[email protected]b2e97292008-09-02 18:20:3429 EXPECT_EQ(0, g_test_counter_1);
30}
31
[email protected]9795ec12008-09-08 09:06:5132void ExpectParamIsNull(void* param) {
Ivan Kotenkova16212a52017-11-08 12:37:3333 EXPECT_EQ(nullptr, param);
[email protected]9795ec12008-09-08 09:06:5134}
35
36void ExpectParamIsCounter(void* param) {
37 EXPECT_EQ(&g_test_counter_1, param);
38}
39
[email protected]b2e97292008-09-02 18:20:3440} // namespace
41
[email protected]4ea927b2009-11-19 09:11:3942class AtExitTest : public testing::Test {
43 private:
44 // Don't test the global AtExitManager, because asking it to process its
45 // AtExit callbacks can ruin the global state that other tests may depend on.
46 base::ShadowingAtExitManager exit_manager_;
47};
[email protected]b2e97292008-09-02 18:20:3448
[email protected]4ea927b2009-11-19 09:11:3949TEST_F(AtExitTest, Basic) {
[email protected]b2e97292008-09-02 18:20:3450 ZeroTestCounters();
Ivan Kotenkova16212a52017-11-08 12:37:3351 base::AtExitManager::RegisterCallback(&IncrementTestCounter1, nullptr);
52 base::AtExitManager::RegisterCallback(&IncrementTestCounter2, nullptr);
53 base::AtExitManager::RegisterCallback(&IncrementTestCounter1, nullptr);
[email protected]52a261f2009-03-03 15:01:1254
[email protected]b2e97292008-09-02 18:20:3455 EXPECT_EQ(0, g_test_counter_1);
56 EXPECT_EQ(0, g_test_counter_2);
57 base::AtExitManager::ProcessCallbacksNow();
58 EXPECT_EQ(2, g_test_counter_1);
59 EXPECT_EQ(1, g_test_counter_2);
60}
61
[email protected]4ea927b2009-11-19 09:11:3962TEST_F(AtExitTest, LIFOOrder) {
[email protected]b2e97292008-09-02 18:20:3463 ZeroTestCounters();
Ivan Kotenkova16212a52017-11-08 12:37:3364 base::AtExitManager::RegisterCallback(&IncrementTestCounter1, nullptr);
65 base::AtExitManager::RegisterCallback(&ExpectCounter1IsZero, nullptr);
66 base::AtExitManager::RegisterCallback(&IncrementTestCounter2, nullptr);
[email protected]52a261f2009-03-03 15:01:1267
[email protected]b2e97292008-09-02 18:20:3468 EXPECT_EQ(0, g_test_counter_1);
69 EXPECT_EQ(0, g_test_counter_2);
70 base::AtExitManager::ProcessCallbacksNow();
71 EXPECT_EQ(1, g_test_counter_1);
72 EXPECT_EQ(1, g_test_counter_2);
73}
74
[email protected]4ea927b2009-11-19 09:11:3975TEST_F(AtExitTest, Param) {
Ivan Kotenkova16212a52017-11-08 12:37:3376 base::AtExitManager::RegisterCallback(&ExpectParamIsNull, nullptr);
[email protected]9795ec12008-09-08 09:06:5177 base::AtExitManager::RegisterCallback(&ExpectParamIsCounter,
78 &g_test_counter_1);
79 base::AtExitManager::ProcessCallbacksNow();
80}
[email protected]762de912011-09-06 23:14:4781
82TEST_F(AtExitTest, Task) {
83 ZeroTestCounters();
kylecharb2695fc2019-04-24 14:51:2084 base::AtExitManager::RegisterTask(
85 base::BindOnce(&ExpectParamIsCounter, &g_test_counter_1));
[email protected]762de912011-09-06 23:14:4786 base::AtExitManager::ProcessCallbacksNow();
87}