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
5 #include "media/base/callback_holder.h"
6
7 #include "testing/gtest/include/gtest/gtest.h"
8
9 namespace media {
10
SetBool(bool * var)11 static void SetBool(bool* var) {
12 DCHECK(!*var);
13 *var = true;
14 }
15
CopyVar(int var1,int * var2)16 static void CopyVar(int var1, int* var2) {
17 DCHECK_NE(var1, *var2);
18 *var2 = var1;
19 }
20
TEST(CallbackHolderTest,SetAfterHold_Closure)21 TEST(CallbackHolderTest, SetAfterHold_Closure) {
22 CallbackHolder<base::Closure> cb;
23 EXPECT_TRUE(cb.IsNull());
24
25 cb.HoldCallback();
26
27 bool closure_called = false;
28 cb.SetCallback(base::Bind(&SetBool, &closure_called));
29 EXPECT_FALSE(cb.IsNull());
30
31 cb.RunOrHold();
32 EXPECT_FALSE(closure_called);
33
34 EXPECT_FALSE(cb.IsNull());
35 cb.RunHeldCallback();
36 EXPECT_TRUE(cb.IsNull());
37 EXPECT_TRUE(closure_called);
38 }
39
TEST(CallbackHolderTest,HoldAfterSet_Closure)40 TEST(CallbackHolderTest, HoldAfterSet_Closure) {
41 CallbackHolder<base::Closure> cb;
42 EXPECT_TRUE(cb.IsNull());
43
44 bool closure_called = false;
45 cb.SetCallback(base::Bind(&SetBool, &closure_called));
46 EXPECT_FALSE(cb.IsNull());
47
48 cb.HoldCallback();
49
50 cb.RunOrHold();
51 EXPECT_FALSE(closure_called);
52 EXPECT_FALSE(cb.IsNull());
53 cb.RunHeldCallback();
54 EXPECT_TRUE(cb.IsNull());
55 EXPECT_TRUE(closure_called);
56 }
57
TEST(CallbackHolderTest,NotHold_Closure)58 TEST(CallbackHolderTest, NotHold_Closure) {
59 CallbackHolder<base::Closure> cb;
60 EXPECT_TRUE(cb.IsNull());
61
62 bool closure_called = false;
63 cb.SetCallback(base::Bind(&SetBool, &closure_called));
64 EXPECT_FALSE(cb.IsNull());
65
66 cb.RunOrHold();
67 EXPECT_TRUE(cb.IsNull());
68 EXPECT_TRUE(closure_called);
69 }
70
TEST(CallbackHolderTest,SetAfterHold_Callback)71 TEST(CallbackHolderTest, SetAfterHold_Callback) {
72 CallbackHolder<base::Callback<void(int, int*)> > cb;
73 EXPECT_TRUE(cb.IsNull());
74
75 cb.HoldCallback();
76
77 cb.SetCallback(base::Bind(&CopyVar));
78 EXPECT_FALSE(cb.IsNull());
79
80 int var1 = 100;
81 int var2 = 0;
82 cb.RunOrHold(var1, &var2);
83 EXPECT_FALSE(cb.IsNull());
84 EXPECT_NE(var1, var2);
85
86 cb.RunHeldCallback();
87 EXPECT_TRUE(cb.IsNull());
88 EXPECT_EQ(var1, var2);
89 }
90
TEST(CallbackHolderTest,HoldAfterSet_Callback)91 TEST(CallbackHolderTest, HoldAfterSet_Callback) {
92 CallbackHolder<base::Callback<void(int, int*)> > cb;
93 EXPECT_TRUE(cb.IsNull());
94
95 cb.SetCallback(base::Bind(&CopyVar));
96 EXPECT_FALSE(cb.IsNull());
97
98 cb.HoldCallback();
99
100 int var1 = 100;
101 int var2 = 0;
102 cb.RunOrHold(var1, &var2);
103 EXPECT_FALSE(cb.IsNull());
104 EXPECT_NE(var1, var2);
105
106 cb.RunHeldCallback();
107 EXPECT_TRUE(cb.IsNull());
108 EXPECT_EQ(var1, var2);
109 }
110
TEST(CallbackHolderTest,NotHold_Callback)111 TEST(CallbackHolderTest, NotHold_Callback) {
112 CallbackHolder<base::Callback<void(int, int*)> > cb;
113 EXPECT_TRUE(cb.IsNull());
114
115 cb.SetCallback(base::Bind(&CopyVar));
116 EXPECT_FALSE(cb.IsNull());
117
118 int var1 = 100;
119 int var2 = 0;
120 cb.RunOrHold(var1, &var2);
121 EXPECT_TRUE(cb.IsNull());
122 EXPECT_EQ(var1, var2);
123 }
124
125 } // namespace media
126