| // Copyright 2011 The Chromium Authors |
| // 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/functional/bind.h" |
| #include"testing/gtest/include/gtest/gtest.h" |
| |
| namespace{ |
| |
| int g_test_counter_1=0; |
| int g_test_counter_2=0; |
| |
| voidIncrementTestCounter1(void* unused){ |
| ++g_test_counter_1; |
| } |
| |
| voidIncrementTestCounter2(void* unused){ |
| ++g_test_counter_2; |
| } |
| |
| voidZeroTestCounters(){ |
| g_test_counter_1=0; |
| g_test_counter_2=0; |
| } |
| |
| voidExpectCounter1IsZero(void* unused){ |
| EXPECT_EQ(0, g_test_counter_1); |
| } |
| |
| voidExpectParamIsNull(void* param){ |
| EXPECT_EQ(nullptr, param); |
| } |
| |
| voidExpectParamIsCounter(void* param){ |
| EXPECT_EQ(&g_test_counter_1, param); |
| } |
| |
| }// namespace |
| |
| classAtExitTest: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::BindOnce(&ExpectParamIsCounter,&g_test_counter_1)); |
| base::AtExitManager::ProcessCallbacksNow(); |
| } |