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