xref: /aosp_15_r20/external/libchrome/base/at_exit_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/at_exit.h"
6*635a8641SAndroid Build Coastguard Worker #include "base/bind.h"
7*635a8641SAndroid Build Coastguard Worker 
8*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker namespace {
11*635a8641SAndroid Build Coastguard Worker 
12*635a8641SAndroid Build Coastguard Worker int g_test_counter_1 = 0;
13*635a8641SAndroid Build Coastguard Worker int g_test_counter_2 = 0;
14*635a8641SAndroid Build Coastguard Worker 
IncrementTestCounter1(void * unused)15*635a8641SAndroid Build Coastguard Worker void IncrementTestCounter1(void* unused) {
16*635a8641SAndroid Build Coastguard Worker   ++g_test_counter_1;
17*635a8641SAndroid Build Coastguard Worker }
18*635a8641SAndroid Build Coastguard Worker 
IncrementTestCounter2(void * unused)19*635a8641SAndroid Build Coastguard Worker void IncrementTestCounter2(void* unused) {
20*635a8641SAndroid Build Coastguard Worker   ++g_test_counter_2;
21*635a8641SAndroid Build Coastguard Worker }
22*635a8641SAndroid Build Coastguard Worker 
ZeroTestCounters()23*635a8641SAndroid Build Coastguard Worker void ZeroTestCounters() {
24*635a8641SAndroid Build Coastguard Worker   g_test_counter_1 = 0;
25*635a8641SAndroid Build Coastguard Worker   g_test_counter_2 = 0;
26*635a8641SAndroid Build Coastguard Worker }
27*635a8641SAndroid Build Coastguard Worker 
ExpectCounter1IsZero(void * unused)28*635a8641SAndroid Build Coastguard Worker void ExpectCounter1IsZero(void* unused) {
29*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, g_test_counter_1);
30*635a8641SAndroid Build Coastguard Worker }
31*635a8641SAndroid Build Coastguard Worker 
ExpectParamIsNull(void * param)32*635a8641SAndroid Build Coastguard Worker void ExpectParamIsNull(void* param) {
33*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, param);
34*635a8641SAndroid Build Coastguard Worker }
35*635a8641SAndroid Build Coastguard Worker 
ExpectParamIsCounter(void * param)36*635a8641SAndroid Build Coastguard Worker void ExpectParamIsCounter(void* param) {
37*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(&g_test_counter_1, param);
38*635a8641SAndroid Build Coastguard Worker }
39*635a8641SAndroid Build Coastguard Worker 
40*635a8641SAndroid Build Coastguard Worker }  // namespace
41*635a8641SAndroid Build Coastguard Worker 
42*635a8641SAndroid Build Coastguard Worker class AtExitTest : public testing::Test {
43*635a8641SAndroid Build Coastguard Worker  private:
44*635a8641SAndroid Build Coastguard Worker   // Don't test the global AtExitManager, because asking it to process its
45*635a8641SAndroid Build Coastguard Worker   // AtExit callbacks can ruin the global state that other tests may depend on.
46*635a8641SAndroid Build Coastguard Worker   base::ShadowingAtExitManager exit_manager_;
47*635a8641SAndroid Build Coastguard Worker };
48*635a8641SAndroid Build Coastguard Worker 
TEST_F(AtExitTest,Basic)49*635a8641SAndroid Build Coastguard Worker TEST_F(AtExitTest, Basic) {
50*635a8641SAndroid Build Coastguard Worker   ZeroTestCounters();
51*635a8641SAndroid Build Coastguard Worker   base::AtExitManager::RegisterCallback(&IncrementTestCounter1, nullptr);
52*635a8641SAndroid Build Coastguard Worker   base::AtExitManager::RegisterCallback(&IncrementTestCounter2, nullptr);
53*635a8641SAndroid Build Coastguard Worker   base::AtExitManager::RegisterCallback(&IncrementTestCounter1, nullptr);
54*635a8641SAndroid Build Coastguard Worker 
55*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, g_test_counter_1);
56*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, g_test_counter_2);
57*635a8641SAndroid Build Coastguard Worker   base::AtExitManager::ProcessCallbacksNow();
58*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, g_test_counter_1);
59*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, g_test_counter_2);
60*635a8641SAndroid Build Coastguard Worker }
61*635a8641SAndroid Build Coastguard Worker 
TEST_F(AtExitTest,LIFOOrder)62*635a8641SAndroid Build Coastguard Worker TEST_F(AtExitTest, LIFOOrder) {
63*635a8641SAndroid Build Coastguard Worker   ZeroTestCounters();
64*635a8641SAndroid Build Coastguard Worker   base::AtExitManager::RegisterCallback(&IncrementTestCounter1, nullptr);
65*635a8641SAndroid Build Coastguard Worker   base::AtExitManager::RegisterCallback(&ExpectCounter1IsZero, nullptr);
66*635a8641SAndroid Build Coastguard Worker   base::AtExitManager::RegisterCallback(&IncrementTestCounter2, nullptr);
67*635a8641SAndroid Build Coastguard Worker 
68*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, g_test_counter_1);
69*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, g_test_counter_2);
70*635a8641SAndroid Build Coastguard Worker   base::AtExitManager::ProcessCallbacksNow();
71*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, g_test_counter_1);
72*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, g_test_counter_2);
73*635a8641SAndroid Build Coastguard Worker }
74*635a8641SAndroid Build Coastguard Worker 
TEST_F(AtExitTest,Param)75*635a8641SAndroid Build Coastguard Worker TEST_F(AtExitTest, Param) {
76*635a8641SAndroid Build Coastguard Worker   base::AtExitManager::RegisterCallback(&ExpectParamIsNull, nullptr);
77*635a8641SAndroid Build Coastguard Worker   base::AtExitManager::RegisterCallback(&ExpectParamIsCounter,
78*635a8641SAndroid Build Coastguard Worker                                         &g_test_counter_1);
79*635a8641SAndroid Build Coastguard Worker   base::AtExitManager::ProcessCallbacksNow();
80*635a8641SAndroid Build Coastguard Worker }
81*635a8641SAndroid Build Coastguard Worker 
TEST_F(AtExitTest,Task)82*635a8641SAndroid Build Coastguard Worker TEST_F(AtExitTest, Task) {
83*635a8641SAndroid Build Coastguard Worker   ZeroTestCounters();
84*635a8641SAndroid Build Coastguard Worker   base::AtExitManager::RegisterTask(base::Bind(&ExpectParamIsCounter,
85*635a8641SAndroid Build Coastguard Worker                                                &g_test_counter_1));
86*635a8641SAndroid Build Coastguard Worker   base::AtExitManager::ProcessCallbacksNow();
87*635a8641SAndroid Build Coastguard Worker }
88