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