at_exit_unittest.cc revision c7f5f8508d98d5952d42ed7648c2a8f30a4da156
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
9namespace {
10
11int g_test_counter_1 = 0;
12int g_test_counter_2 = 0;
13
14void IncrementTestCounter1(void* unused) {
15  ++g_test_counter_1;
16}
17
18void IncrementTestCounter2(void* unused) {
19  ++g_test_counter_2;
20}
21
22void ZeroTestCounters() {
23  g_test_counter_1 = 0;
24  g_test_counter_2 = 0;
25}
26
27void ExpectCounter1IsZero(void* unused) {
28  EXPECT_EQ(0, g_test_counter_1);
29}
30
31void ExpectParamIsNull(void* param) {
32  EXPECT_EQ(static_cast<void*>(NULL), param);
33}
34
35void ExpectParamIsCounter(void* param) {
36  EXPECT_EQ(&g_test_counter_1, param);
37}
38
39}  // namespace
40
41class 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
48TEST_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
61TEST_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
74TEST_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