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