at_exit_unittest.cc 2.4 KB

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