• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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