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 11 static void SetBool(bool* var) { 12 DCHECK(!*var); 13 *var = true; 14 } 15 16 static void CopyVar(int var1, int* var2) { 17 DCHECK_NE(var1, *var2); 18 *var2 = var1; 19 } 20 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 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 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 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 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 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