• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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/bind_to_loop.h"
6 
7 #include "base/message_loop/message_loop.h"
8 #include "base/synchronization/waitable_event.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 
11 namespace media {
12 
BoundBoolSet(bool * var,bool val)13 void BoundBoolSet(bool* var, bool val) {
14   *var = val;
15 }
16 
BoundBoolSetFromScopedPtr(bool * var,scoped_ptr<bool> val)17 void BoundBoolSetFromScopedPtr(bool* var, scoped_ptr<bool> val) {
18   *var = *val;
19 }
20 
BoundBoolSetFromScopedPtrMalloc(bool * var,scoped_ptr_malloc<bool> val)21 void BoundBoolSetFromScopedPtrMalloc(bool* var, scoped_ptr_malloc<bool> val) {
22   *var = val;
23 }
24 
BoundBoolSetFromScopedArray(bool * var,scoped_ptr<bool[]> val)25 void BoundBoolSetFromScopedArray(bool* var, scoped_ptr<bool[]> val) {
26   *var = val[0];
27 }
28 
BoundBoolSetFromConstRef(bool * var,const bool & val)29 void BoundBoolSetFromConstRef(bool* var, const bool& val) {
30   *var = val;
31 }
32 
BoundIntegersSet(int * a_var,int * b_var,int a_val,int b_val)33 void BoundIntegersSet(int* a_var, int* b_var, int a_val, int b_val) {
34   *a_var = a_val;
35   *b_var = b_val;
36 }
37 
38 // Various tests that check that the bound function is only actually executed
39 // on the message loop, not during the original Run.
40 class BindToLoopTest : public ::testing::Test {
41  public:
BindToLoopTest()42   BindToLoopTest() : proxy_(loop_.message_loop_proxy()) {}
43 
44  protected:
45   base::MessageLoop loop_;
46   scoped_refptr<base::MessageLoopProxy> proxy_;
47 };
48 
TEST_F(BindToLoopTest,Closure)49 TEST_F(BindToLoopTest, Closure) {
50   // Test the closure is run inside the loop, not outside it.
51   base::WaitableEvent waiter(false, false);
52   base::Closure cb = BindToLoop(proxy_, base::Bind(
53       &base::WaitableEvent::Signal, base::Unretained(&waiter)));
54   cb.Run();
55   EXPECT_FALSE(waiter.IsSignaled());
56   loop_.RunUntilIdle();
57   EXPECT_TRUE(waiter.IsSignaled());
58 }
59 
TEST_F(BindToLoopTest,Bool)60 TEST_F(BindToLoopTest, Bool) {
61   bool bool_var = false;
62   base::Callback<void(bool)> cb = BindToLoop(proxy_, base::Bind(
63       &BoundBoolSet, &bool_var));
64   cb.Run(true);
65   EXPECT_FALSE(bool_var);
66   loop_.RunUntilIdle();
67   EXPECT_TRUE(bool_var);
68 }
69 
TEST_F(BindToLoopTest,BoundScopedPtrBool)70 TEST_F(BindToLoopTest, BoundScopedPtrBool) {
71   bool bool_val = false;
72   scoped_ptr<bool> scoped_ptr_bool(new bool(true));
73   base::Closure cb = BindToLoop(proxy_, base::Bind(
74       &BoundBoolSetFromScopedPtr, &bool_val, base::Passed(&scoped_ptr_bool)));
75   cb.Run();
76   EXPECT_FALSE(bool_val);
77   loop_.RunUntilIdle();
78   EXPECT_TRUE(bool_val);
79 }
80 
TEST_F(BindToLoopTest,PassedScopedPtrBool)81 TEST_F(BindToLoopTest, PassedScopedPtrBool) {
82   bool bool_val = false;
83   scoped_ptr<bool> scoped_ptr_bool(new bool(true));
84   base::Callback<void(scoped_ptr<bool>)> cb = BindToLoop(proxy_, base::Bind(
85       &BoundBoolSetFromScopedPtr, &bool_val));
86   cb.Run(scoped_ptr_bool.Pass());
87   EXPECT_FALSE(bool_val);
88   loop_.RunUntilIdle();
89   EXPECT_TRUE(bool_val);
90 }
91 
TEST_F(BindToLoopTest,BoundScopedArrayBool)92 TEST_F(BindToLoopTest, BoundScopedArrayBool) {
93   bool bool_val = false;
94   scoped_ptr<bool[]> scoped_array_bool(new bool[1]);
95   scoped_array_bool[0] = true;
96   base::Closure cb = BindToLoop(proxy_, base::Bind(
97       &BoundBoolSetFromScopedArray, &bool_val,
98       base::Passed(&scoped_array_bool)));
99   cb.Run();
100   EXPECT_FALSE(bool_val);
101   loop_.RunUntilIdle();
102   EXPECT_TRUE(bool_val);
103 }
104 
TEST_F(BindToLoopTest,PassedScopedArrayBool)105 TEST_F(BindToLoopTest, PassedScopedArrayBool) {
106   bool bool_val = false;
107   scoped_ptr<bool[]> scoped_array_bool(new bool[1]);
108   scoped_array_bool[0] = true;
109   base::Callback<void(scoped_ptr<bool[]>)> cb = BindToLoop(proxy_, base::Bind(
110       &BoundBoolSetFromScopedArray, &bool_val));
111   cb.Run(scoped_array_bool.Pass());
112   EXPECT_FALSE(bool_val);
113   loop_.RunUntilIdle();
114   EXPECT_TRUE(bool_val);
115 }
116 
TEST_F(BindToLoopTest,BoundScopedPtrMallocBool)117 TEST_F(BindToLoopTest, BoundScopedPtrMallocBool) {
118   bool bool_val = false;
119   scoped_ptr_malloc<bool> scoped_ptr_malloc_bool(
120       static_cast<bool*>(malloc(sizeof(bool))));
121   *scoped_ptr_malloc_bool = true;
122   base::Closure cb = BindToLoop(proxy_, base::Bind(
123       &BoundBoolSetFromScopedPtrMalloc, &bool_val,
124       base::Passed(&scoped_ptr_malloc_bool)));
125   cb.Run();
126   EXPECT_FALSE(bool_val);
127   loop_.RunUntilIdle();
128   EXPECT_TRUE(bool_val);
129 }
130 
TEST_F(BindToLoopTest,PassedScopedPtrMallocBool)131 TEST_F(BindToLoopTest, PassedScopedPtrMallocBool) {
132   bool bool_val = false;
133   scoped_ptr_malloc<bool> scoped_ptr_malloc_bool(
134       static_cast<bool*>(malloc(sizeof(bool))));
135   *scoped_ptr_malloc_bool = true;
136   base::Callback<void(scoped_ptr_malloc<bool>)> cb = BindToLoop(
137       proxy_, base::Bind(&BoundBoolSetFromScopedPtrMalloc, &bool_val));
138   cb.Run(scoped_ptr_malloc_bool.Pass());
139   EXPECT_FALSE(bool_val);
140   loop_.RunUntilIdle();
141   EXPECT_TRUE(bool_val);
142 }
143 
TEST_F(BindToLoopTest,BoolConstRef)144 TEST_F(BindToLoopTest, BoolConstRef) {
145   bool bool_var = false;
146   bool true_var = true;
147   const bool& true_ref = true_var;
148   base::Closure cb = BindToLoop(proxy_, base::Bind(
149       &BoundBoolSetFromConstRef, &bool_var, true_ref));
150   cb.Run();
151   EXPECT_FALSE(bool_var);
152   loop_.RunUntilIdle();
153   EXPECT_TRUE(bool_var);
154 }
155 
TEST_F(BindToLoopTest,Integers)156 TEST_F(BindToLoopTest, Integers) {
157   int a = 0;
158   int b = 0;
159   base::Callback<void(int, int)> cb = BindToLoop(proxy_, base::Bind(
160       &BoundIntegersSet, &a, &b));
161   cb.Run(1, -1);
162   EXPECT_EQ(a, 0);
163   EXPECT_EQ(b, 0);
164   loop_.RunUntilIdle();
165   EXPECT_EQ(a, 1);
166   EXPECT_EQ(b, -1);
167 }
168 
169 }  // namespace media
170