callback_holder_unittest.cc 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // Copyright 2013 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 "media/base/callback_holder.h"
  5. #include "base/bind.h"
  6. #include "testing/gtest/include/gtest/gtest.h"
  7. namespace media {
  8. static void SetBool(bool* var) {
  9. DCHECK(!*var);
  10. *var = true;
  11. }
  12. static void CopyVar(int var1, int* var2) {
  13. DCHECK_NE(var1, *var2);
  14. *var2 = var1;
  15. }
  16. TEST(CallbackHolderTest, SetAfterHold_Closure) {
  17. CallbackHolder<base::OnceClosure> cb;
  18. EXPECT_TRUE(cb.IsNull());
  19. cb.HoldCallback();
  20. bool closure_called = false;
  21. cb.SetCallback(base::BindOnce(&SetBool, &closure_called));
  22. EXPECT_FALSE(cb.IsNull());
  23. cb.RunOrHold();
  24. EXPECT_FALSE(closure_called);
  25. EXPECT_FALSE(cb.IsNull());
  26. cb.RunHeldCallback();
  27. EXPECT_TRUE(cb.IsNull());
  28. EXPECT_TRUE(closure_called);
  29. }
  30. TEST(CallbackHolderTest, HoldAfterSet_Closure) {
  31. CallbackHolder<base::OnceClosure> cb;
  32. EXPECT_TRUE(cb.IsNull());
  33. bool closure_called = false;
  34. cb.SetCallback(base::BindOnce(&SetBool, &closure_called));
  35. EXPECT_FALSE(cb.IsNull());
  36. cb.HoldCallback();
  37. cb.RunOrHold();
  38. EXPECT_FALSE(closure_called);
  39. EXPECT_FALSE(cb.IsNull());
  40. cb.RunHeldCallback();
  41. EXPECT_TRUE(cb.IsNull());
  42. EXPECT_TRUE(closure_called);
  43. }
  44. TEST(CallbackHolderTest, NotHold_Closure) {
  45. CallbackHolder<base::OnceClosure> cb;
  46. EXPECT_TRUE(cb.IsNull());
  47. bool closure_called = false;
  48. cb.SetCallback(base::BindOnce(&SetBool, &closure_called));
  49. EXPECT_FALSE(cb.IsNull());
  50. cb.RunOrHold();
  51. EXPECT_TRUE(cb.IsNull());
  52. EXPECT_TRUE(closure_called);
  53. }
  54. TEST(CallbackHolderTest, SetAfterHold_Callback) {
  55. CallbackHolder<base::OnceCallback<void(int, int*)>> cb;
  56. EXPECT_TRUE(cb.IsNull());
  57. cb.HoldCallback();
  58. cb.SetCallback(base::BindOnce(&CopyVar));
  59. EXPECT_FALSE(cb.IsNull());
  60. int var1 = 100;
  61. int var2 = 0;
  62. cb.RunOrHold(var1, &var2);
  63. EXPECT_FALSE(cb.IsNull());
  64. EXPECT_NE(var1, var2);
  65. cb.RunHeldCallback();
  66. EXPECT_TRUE(cb.IsNull());
  67. EXPECT_EQ(var1, var2);
  68. }
  69. TEST(CallbackHolderTest, HoldAfterSet_Callback) {
  70. CallbackHolder<base::OnceCallback<void(int, int*)>> cb;
  71. EXPECT_TRUE(cb.IsNull());
  72. cb.SetCallback(base::BindOnce(&CopyVar));
  73. EXPECT_FALSE(cb.IsNull());
  74. cb.HoldCallback();
  75. int var1 = 100;
  76. int var2 = 0;
  77. cb.RunOrHold(var1, &var2);
  78. EXPECT_FALSE(cb.IsNull());
  79. EXPECT_NE(var1, var2);
  80. cb.RunHeldCallback();
  81. EXPECT_TRUE(cb.IsNull());
  82. EXPECT_EQ(var1, var2);
  83. }
  84. TEST(CallbackHolderTest, NotHold_Callback) {
  85. CallbackHolder<base::OnceCallback<void(int, int*)>> cb;
  86. EXPECT_TRUE(cb.IsNull());
  87. cb.SetCallback(base::BindOnce(&CopyVar));
  88. EXPECT_FALSE(cb.IsNull());
  89. int var1 = 100;
  90. int var2 = 0;
  91. cb.RunOrHold(var1, &var2);
  92. EXPECT_TRUE(cb.IsNull());
  93. EXPECT_EQ(var1, var2);
  94. }
  95. } // namespace media