• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
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/at_exit.h"
6 
7 #include "testing/gtest/include/gtest/gtest.h"
8 
9 namespace {
10 
11 int g_test_counter_1 = 0;
12 int g_test_counter_2 = 0;
13 
IncrementTestCounter1(void * unused)14 void IncrementTestCounter1(void* unused) {
15   ++g_test_counter_1;
16 }
17 
IncrementTestCounter2(void * unused)18 void IncrementTestCounter2(void* unused) {
19   ++g_test_counter_2;
20 }
21 
ZeroTestCounters()22 void ZeroTestCounters() {
23   g_test_counter_1 = 0;
24   g_test_counter_2 = 0;
25 }
26 
ExpectCounter1IsZero(void * unused)27 void ExpectCounter1IsZero(void* unused) {
28   EXPECT_EQ(0, g_test_counter_1);
29 }
30 
ExpectParamIsNull(void * param)31 void ExpectParamIsNull(void* param) {
32   EXPECT_EQ(static_cast<void*>(NULL), param);
33 }
34 
ExpectParamIsCounter(void * param)35 void ExpectParamIsCounter(void* param) {
36   EXPECT_EQ(&g_test_counter_1, param);
37 }
38 
39 }  // namespace
40 
41 class AtExitTest : public testing::Test {
42  private:
43   // Don't test the global AtExitManager, because asking it to process its
44   // AtExit callbacks can ruin the global state that other tests may depend on.
45   base::ShadowingAtExitManager exit_manager_;
46 };
47 
TEST_F(AtExitTest,Basic)48 TEST_F(AtExitTest, Basic) {
49   ZeroTestCounters();
50   base::AtExitManager::RegisterCallback(&IncrementTestCounter1, NULL);
51   base::AtExitManager::RegisterCallback(&IncrementTestCounter2, NULL);
52   base::AtExitManager::RegisterCallback(&IncrementTestCounter1, NULL);
53 
54   EXPECT_EQ(0, g_test_counter_1);
55   EXPECT_EQ(0, g_test_counter_2);
56   base::AtExitManager::ProcessCallbacksNow();
57   EXPECT_EQ(2, g_test_counter_1);
58   EXPECT_EQ(1, g_test_counter_2);
59 }
60 
TEST_F(AtExitTest,LIFOOrder)61 TEST_F(AtExitTest, LIFOOrder) {
62   ZeroTestCounters();
63   base::AtExitManager::RegisterCallback(&IncrementTestCounter1, NULL);
64   base::AtExitManager::RegisterCallback(&ExpectCounter1IsZero, NULL);
65   base::AtExitManager::RegisterCallback(&IncrementTestCounter2, NULL);
66 
67   EXPECT_EQ(0, g_test_counter_1);
68   EXPECT_EQ(0, g_test_counter_2);
69   base::AtExitManager::ProcessCallbacksNow();
70   EXPECT_EQ(1, g_test_counter_1);
71   EXPECT_EQ(1, g_test_counter_2);
72 }
73 
TEST_F(AtExitTest,Param)74 TEST_F(AtExitTest, Param) {
75   base::AtExitManager::RegisterCallback(&ExpectParamIsNull, NULL);
76   base::AtExitManager::RegisterCallback(&ExpectParamIsCounter,
77                                         &g_test_counter_1);
78   base::AtExitManager::ProcessCallbacksNow();
79 }
80