blob: 0d97c4174f01c31bad5ebf248742322bf9b6a765 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2013 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
Henrik Kjellander15583c12016-02-10 10:53:12 +010011#include "webrtc/api/proxy.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000012
kwibergd1fe2812016-04-27 06:47:29 -070013#include <memory>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000014#include <string>
15
Edward Lemurc20978e2017-07-06 19:44:34 +020016#include "webrtc/rtc_base/gunit.h"
17#include "webrtc/rtc_base/refcount.h"
18#include "webrtc/rtc_base/thread.h"
kwibergac9f8762016-09-30 22:29:43 -070019#include "webrtc/test/gmock.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000020
21using ::testing::_;
22using ::testing::DoAll;
23using ::testing::Exactly;
24using ::testing::InvokeWithoutArgs;
25using ::testing::Return;
26
27namespace webrtc {
28
29// Interface used for testing here.
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000030class FakeInterface : public rtc::RefCountInterface {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031 public:
32 virtual void VoidMethod0() = 0;
33 virtual std::string Method0() = 0;
34 virtual std::string ConstMethod0() const = 0;
35 virtual std::string Method1(std::string s) = 0;
36 virtual std::string ConstMethod1(std::string s) const = 0;
37 virtual std::string Method2(std::string s1, std::string s2) = 0;
38
39 protected:
deadbeefd99a2002017-01-18 08:55:23 -080040 virtual ~FakeInterface() {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000041};
42
henrike@webrtc.org28e20752013-07-10 00:45:36 +000043// Implementation of the test interface.
44class Fake : public FakeInterface {
45 public:
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000046 static rtc::scoped_refptr<Fake> Create() {
47 return new rtc::RefCountedObject<Fake>();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000048 }
deadbeefd99a2002017-01-18 08:55:23 -080049 // Used to verify destructor is called on the correct thread.
50 MOCK_METHOD0(Destroy, void());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000051
52 MOCK_METHOD0(VoidMethod0, void());
53 MOCK_METHOD0(Method0, std::string());
54 MOCK_CONST_METHOD0(ConstMethod0, std::string());
55
56 MOCK_METHOD1(Method1, std::string(std::string));
57 MOCK_CONST_METHOD1(ConstMethod1, std::string(std::string));
58
59 MOCK_METHOD2(Method2, std::string(std::string, std::string));
60
61 protected:
62 Fake() {}
deadbeefd99a2002017-01-18 08:55:23 -080063 ~Fake() { Destroy(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064};
65
nisse72c8d2b2016-04-15 03:49:07 -070066// Proxies for the test interface.
67BEGIN_PROXY_MAP(Fake)
deadbeefd99a2002017-01-18 08:55:23 -080068 PROXY_WORKER_THREAD_DESTRUCTOR()
nisse72c8d2b2016-04-15 03:49:07 -070069 PROXY_METHOD0(void, VoidMethod0)
70 PROXY_METHOD0(std::string, Method0)
71 PROXY_CONSTMETHOD0(std::string, ConstMethod0)
72 PROXY_WORKER_METHOD1(std::string, Method1, std::string)
73 PROXY_CONSTMETHOD1(std::string, ConstMethod1, std::string)
74 PROXY_WORKER_METHOD2(std::string, Method2, std::string, std::string)
deadbeefd99a2002017-01-18 08:55:23 -080075END_PROXY_MAP()
nisse72c8d2b2016-04-15 03:49:07 -070076
77// Preprocessor hack to get a proxy class a name different than FakeProxy.
78#define FakeProxy FakeSignalingProxy
deadbeefa601f5c2016-06-06 14:27:39 -070079#define FakeProxyWithInternal FakeSignalingProxyWithInternal
nisse72c8d2b2016-04-15 03:49:07 -070080BEGIN_SIGNALING_PROXY_MAP(Fake)
deadbeefd99a2002017-01-18 08:55:23 -080081 PROXY_SIGNALING_THREAD_DESTRUCTOR()
nisse72c8d2b2016-04-15 03:49:07 -070082 PROXY_METHOD0(void, VoidMethod0)
83 PROXY_METHOD0(std::string, Method0)
84 PROXY_CONSTMETHOD0(std::string, ConstMethod0)
85 PROXY_METHOD1(std::string, Method1, std::string)
86 PROXY_CONSTMETHOD1(std::string, ConstMethod1, std::string)
87 PROXY_METHOD2(std::string, Method2, std::string, std::string)
deadbeefd99a2002017-01-18 08:55:23 -080088END_PROXY_MAP()
nisse72c8d2b2016-04-15 03:49:07 -070089#undef FakeProxy
90
91class SignalingProxyTest : public testing::Test {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092 public:
nisse72c8d2b2016-04-15 03:49:07 -070093 // Checks that the functions are called on the right thread.
94 void CheckSignalingThread() { EXPECT_TRUE(signaling_thread_->IsCurrent()); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000095
96 protected:
nisse72c8d2b2016-04-15 03:49:07 -070097 void SetUp() override {
charujaina117b042017-07-13 07:06:39 -070098 signaling_thread_.reset(new rtc::Thread());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099 ASSERT_TRUE(signaling_thread_->Start());
100 fake_ = Fake::Create();
nisse72c8d2b2016-04-15 03:49:07 -0700101 fake_signaling_proxy_ =
102 FakeSignalingProxy::Create(signaling_thread_.get(), fake_.get());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103 }
104
105 protected:
kwibergd1fe2812016-04-27 06:47:29 -0700106 std::unique_ptr<rtc::Thread> signaling_thread_;
nisse72c8d2b2016-04-15 03:49:07 -0700107 rtc::scoped_refptr<FakeInterface> fake_signaling_proxy_;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000108 rtc::scoped_refptr<Fake> fake_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000109};
110
deadbeefd99a2002017-01-18 08:55:23 -0800111TEST_F(SignalingProxyTest, SignalingThreadDestructor) {
112 EXPECT_CALL(*fake_, Destroy())
113 .Times(Exactly(1))
114 .WillOnce(
115 InvokeWithoutArgs(this, &SignalingProxyTest::CheckSignalingThread));
116 fake_ = nullptr;
117 fake_signaling_proxy_ = nullptr;
118}
119
nisse72c8d2b2016-04-15 03:49:07 -0700120TEST_F(SignalingProxyTest, VoidMethod0) {
121 EXPECT_CALL(*fake_, VoidMethod0())
122 .Times(Exactly(1))
123 .WillOnce(
124 InvokeWithoutArgs(this, &SignalingProxyTest::CheckSignalingThread));
125 fake_signaling_proxy_->VoidMethod0();
126}
127
128TEST_F(SignalingProxyTest, Method0) {
129 EXPECT_CALL(*fake_, Method0())
130 .Times(Exactly(1))
131 .WillOnce(DoAll(
132 InvokeWithoutArgs(this, &SignalingProxyTest::CheckSignalingThread),
133 Return("Method0")));
134 EXPECT_EQ("Method0", fake_signaling_proxy_->Method0());
135}
136
137TEST_F(SignalingProxyTest, ConstMethod0) {
138 EXPECT_CALL(*fake_, ConstMethod0())
139 .Times(Exactly(1))
140 .WillOnce(DoAll(
141 InvokeWithoutArgs(this, &SignalingProxyTest::CheckSignalingThread),
142 Return("ConstMethod0")));
143 EXPECT_EQ("ConstMethod0", fake_signaling_proxy_->ConstMethod0());
144}
145
146TEST_F(SignalingProxyTest, Method1) {
147 const std::string arg1 = "arg1";
148 EXPECT_CALL(*fake_, Method1(arg1))
149 .Times(Exactly(1))
150 .WillOnce(DoAll(
151 InvokeWithoutArgs(this, &SignalingProxyTest::CheckSignalingThread),
152 Return("Method1")));
153 EXPECT_EQ("Method1", fake_signaling_proxy_->Method1(arg1));
154}
155
156TEST_F(SignalingProxyTest, ConstMethod1) {
157 const std::string arg1 = "arg1";
158 EXPECT_CALL(*fake_, ConstMethod1(arg1))
159 .Times(Exactly(1))
160 .WillOnce(DoAll(
161 InvokeWithoutArgs(this, &SignalingProxyTest::CheckSignalingThread),
162 Return("ConstMethod1")));
163 EXPECT_EQ("ConstMethod1", fake_signaling_proxy_->ConstMethod1(arg1));
164}
165
166TEST_F(SignalingProxyTest, Method2) {
167 const std::string arg1 = "arg1";
168 const std::string arg2 = "arg2";
169 EXPECT_CALL(*fake_, Method2(arg1, arg2))
170 .Times(Exactly(1))
171 .WillOnce(DoAll(
172 InvokeWithoutArgs(this, &SignalingProxyTest::CheckSignalingThread),
173 Return("Method2")));
174 EXPECT_EQ("Method2", fake_signaling_proxy_->Method2(arg1, arg2));
175}
176
deadbeefd99a2002017-01-18 08:55:23 -0800177class ProxyTest : public testing::Test {
nisse72c8d2b2016-04-15 03:49:07 -0700178 public:
179 // Checks that the functions are called on the right thread.
deadbeefd99a2002017-01-18 08:55:23 -0800180 void CheckSignalingThread() { EXPECT_TRUE(signaling_thread_->IsCurrent()); }
nisse72c8d2b2016-04-15 03:49:07 -0700181 void CheckWorkerThread() { EXPECT_TRUE(worker_thread_->IsCurrent()); }
182
183 protected:
184 void SetUp() override {
charujaina117b042017-07-13 07:06:39 -0700185 signaling_thread_.reset(new rtc::Thread());
186 worker_thread_.reset(new rtc::Thread());
deadbeefd99a2002017-01-18 08:55:23 -0800187 ASSERT_TRUE(signaling_thread_->Start());
nisse72c8d2b2016-04-15 03:49:07 -0700188 ASSERT_TRUE(worker_thread_->Start());
deadbeefd99a2002017-01-18 08:55:23 -0800189 fake_ = Fake::Create();
nisse72c8d2b2016-04-15 03:49:07 -0700190 fake_proxy_ = FakeProxy::Create(signaling_thread_.get(),
191 worker_thread_.get(), fake_.get());
192 }
193
194 protected:
deadbeefd99a2002017-01-18 08:55:23 -0800195 std::unique_ptr<rtc::Thread> signaling_thread_;
kwibergd1fe2812016-04-27 06:47:29 -0700196 std::unique_ptr<rtc::Thread> worker_thread_;
nisse72c8d2b2016-04-15 03:49:07 -0700197 rtc::scoped_refptr<FakeInterface> fake_proxy_;
deadbeefd99a2002017-01-18 08:55:23 -0800198 rtc::scoped_refptr<Fake> fake_;
nisse72c8d2b2016-04-15 03:49:07 -0700199};
200
deadbeefd99a2002017-01-18 08:55:23 -0800201TEST_F(ProxyTest, WorkerThreadDestructor) {
202 EXPECT_CALL(*fake_, Destroy())
203 .Times(Exactly(1))
204 .WillOnce(InvokeWithoutArgs(this, &ProxyTest::CheckWorkerThread));
205 fake_ = nullptr;
206 fake_proxy_ = nullptr;
207}
208
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000209TEST_F(ProxyTest, VoidMethod0) {
210 EXPECT_CALL(*fake_, VoidMethod0())
nisse72c8d2b2016-04-15 03:49:07 -0700211 .Times(Exactly(1))
212 .WillOnce(InvokeWithoutArgs(this, &ProxyTest::CheckSignalingThread));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000213 fake_proxy_->VoidMethod0();
214}
215
216TEST_F(ProxyTest, Method0) {
217 EXPECT_CALL(*fake_, Method0())
nisse72c8d2b2016-04-15 03:49:07 -0700218 .Times(Exactly(1))
219 .WillOnce(
220 DoAll(InvokeWithoutArgs(this, &ProxyTest::CheckSignalingThread),
221 Return("Method0")));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000222 EXPECT_EQ("Method0",
223 fake_proxy_->Method0());
224}
225
226TEST_F(ProxyTest, ConstMethod0) {
227 EXPECT_CALL(*fake_, ConstMethod0())
nisse72c8d2b2016-04-15 03:49:07 -0700228 .Times(Exactly(1))
229 .WillOnce(
230 DoAll(InvokeWithoutArgs(this, &ProxyTest::CheckSignalingThread),
231 Return("ConstMethod0")));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000232 EXPECT_EQ("ConstMethod0",
233 fake_proxy_->ConstMethod0());
234}
235
nisse72c8d2b2016-04-15 03:49:07 -0700236TEST_F(ProxyTest, WorkerMethod1) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000237 const std::string arg1 = "arg1";
238 EXPECT_CALL(*fake_, Method1(arg1))
nisse72c8d2b2016-04-15 03:49:07 -0700239 .Times(Exactly(1))
240 .WillOnce(DoAll(InvokeWithoutArgs(this, &ProxyTest::CheckWorkerThread),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000241 Return("Method1")));
242 EXPECT_EQ("Method1", fake_proxy_->Method1(arg1));
243}
244
245TEST_F(ProxyTest, ConstMethod1) {
246 const std::string arg1 = "arg1";
247 EXPECT_CALL(*fake_, ConstMethod1(arg1))
nisse72c8d2b2016-04-15 03:49:07 -0700248 .Times(Exactly(1))
249 .WillOnce(
250 DoAll(InvokeWithoutArgs(this, &ProxyTest::CheckSignalingThread),
251 Return("ConstMethod1")));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000252 EXPECT_EQ("ConstMethod1", fake_proxy_->ConstMethod1(arg1));
253}
254
nisse72c8d2b2016-04-15 03:49:07 -0700255TEST_F(ProxyTest, WorkerMethod2) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000256 const std::string arg1 = "arg1";
257 const std::string arg2 = "arg2";
258 EXPECT_CALL(*fake_, Method2(arg1, arg2))
nisse72c8d2b2016-04-15 03:49:07 -0700259 .Times(Exactly(1))
260 .WillOnce(DoAll(InvokeWithoutArgs(this, &ProxyTest::CheckWorkerThread),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000261 Return("Method2")));
262 EXPECT_EQ("Method2", fake_proxy_->Method2(arg1, arg2));
263}
264
deadbeefd99a2002017-01-18 08:55:23 -0800265// Interface for testing OWNED_PROXY_MAP.
266class FooInterface {
267 public:
268 virtual ~FooInterface() {}
269 virtual void Bar() = 0;
270};
271
272class Foo : public FooInterface {
273 public:
274 Foo() {}
275 MOCK_METHOD0(Bar, void());
276};
277
278BEGIN_OWNED_PROXY_MAP(Foo)
279 PROXY_SIGNALING_THREAD_DESTRUCTOR()
280 PROXY_METHOD0(void, Bar)
281END_PROXY_MAP()
282
283class OwnedProxyTest : public testing::Test {
284 public:
285 OwnedProxyTest()
charujaina117b042017-07-13 07:06:39 -0700286 : foo_(new Foo()),
287 foo_proxy_(FooProxy::Create(&signaling_thread_,
288 &worker_thread_,
deadbeefe814a0d2017-02-25 18:15:09 -0800289 std::unique_ptr<FooInterface>(foo_))) {
charujaina117b042017-07-13 07:06:39 -0700290 signaling_thread_.Start();
291 worker_thread_.Start();
deadbeefd99a2002017-01-18 08:55:23 -0800292 }
293
charujaina117b042017-07-13 07:06:39 -0700294 void CheckSignalingThread() { EXPECT_TRUE(signaling_thread_.IsCurrent()); }
295 void CheckWorkerThread() { EXPECT_TRUE(worker_thread_.IsCurrent()); }
deadbeefd99a2002017-01-18 08:55:23 -0800296
297 protected:
charujaina117b042017-07-13 07:06:39 -0700298 rtc::Thread signaling_thread_;
299 rtc::Thread worker_thread_;
deadbeefd99a2002017-01-18 08:55:23 -0800300 Foo* foo_; // Owned by foo_proxy_, not this class.
301 std::unique_ptr<FooInterface> foo_proxy_;
302};
303
304// Just tests that a method can be invoked using an "owned proxy" (as opposed
305// to normal ref-counted version).
306TEST_F(OwnedProxyTest, BasicTest) {
307 EXPECT_CALL(*foo_, Bar())
308 .Times(Exactly(1))
309 .WillOnce(InvokeWithoutArgs(this, &OwnedProxyTest::CheckSignalingThread));
310 foo_proxy_->Bar();
311}
312
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000313} // namespace webrtc