Home | History | Annotate | Download | only in base
      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