|  | // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "base/at_exit.h" | 
|  | #include "base/bind.h" | 
|  |  | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | int g_test_counter_1 = 0; | 
|  | int g_test_counter_2 = 0; | 
|  |  | 
|  | void IncrementTestCounter1(void* unused) { | 
|  | ++g_test_counter_1; | 
|  | } | 
|  |  | 
|  | void IncrementTestCounter2(void* unused) { | 
|  | ++g_test_counter_2; | 
|  | } | 
|  |  | 
|  | void ZeroTestCounters() { | 
|  | g_test_counter_1 = 0; | 
|  | g_test_counter_2 = 0; | 
|  | } | 
|  |  | 
|  | void ExpectCounter1IsZero(void* unused) { | 
|  | EXPECT_EQ(0, g_test_counter_1); | 
|  | } | 
|  |  | 
|  | void ExpectParamIsNull(void* param) { | 
|  | EXPECT_EQ(nullptr, param); | 
|  | } | 
|  |  | 
|  | void ExpectParamIsCounter(void* param) { | 
|  | EXPECT_EQ(&g_test_counter_1, param); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | class AtExitTest : public testing::Test { | 
|  | private: | 
|  | // Don't test the global AtExitManager, because asking it to process its | 
|  | // AtExit callbacks can ruin the global state that other tests may depend on. | 
|  | base::ShadowingAtExitManager exit_manager_; | 
|  | }; | 
|  |  | 
|  | TEST_F(AtExitTest, Basic) { | 
|  | ZeroTestCounters(); | 
|  | base::AtExitManager::RegisterCallback(&IncrementTestCounter1, nullptr); | 
|  | base::AtExitManager::RegisterCallback(&IncrementTestCounter2, nullptr); | 
|  | base::AtExitManager::RegisterCallback(&IncrementTestCounter1, nullptr); | 
|  |  | 
|  | EXPECT_EQ(0, g_test_counter_1); | 
|  | EXPECT_EQ(0, g_test_counter_2); | 
|  | base::AtExitManager::ProcessCallbacksNow(); | 
|  | EXPECT_EQ(2, g_test_counter_1); | 
|  | EXPECT_EQ(1, g_test_counter_2); | 
|  | } | 
|  |  | 
|  | TEST_F(AtExitTest, LIFOOrder) { | 
|  | ZeroTestCounters(); | 
|  | base::AtExitManager::RegisterCallback(&IncrementTestCounter1, nullptr); | 
|  | base::AtExitManager::RegisterCallback(&ExpectCounter1IsZero, nullptr); | 
|  | base::AtExitManager::RegisterCallback(&IncrementTestCounter2, nullptr); | 
|  |  | 
|  | EXPECT_EQ(0, g_test_counter_1); | 
|  | EXPECT_EQ(0, g_test_counter_2); | 
|  | base::AtExitManager::ProcessCallbacksNow(); | 
|  | EXPECT_EQ(1, g_test_counter_1); | 
|  | EXPECT_EQ(1, g_test_counter_2); | 
|  | } | 
|  |  | 
|  | TEST_F(AtExitTest, Param) { | 
|  | base::AtExitManager::RegisterCallback(&ExpectParamIsNull, nullptr); | 
|  | base::AtExitManager::RegisterCallback(&ExpectParamIsCounter, | 
|  | &g_test_counter_1); | 
|  | base::AtExitManager::ProcessCallbacksNow(); | 
|  | } | 
|  |  | 
|  | TEST_F(AtExitTest, Task) { | 
|  | ZeroTestCounters(); | 
|  | base::AtExitManager::RegisterTask(base::Bind(&ExpectParamIsCounter, | 
|  | &g_test_counter_1)); | 
|  | base::AtExitManager::ProcessCallbacksNow(); | 
|  | } |