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.
5 #include "remoting/protocol/pairing_registry.h"
11 #include "base/bind.h"
12 #include "base/compiler_specific.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/message_loop/message_loop.h"
15 #include "base/run_loop.h"
16 #include "base/thread_task_runner_handle.h"
17 #include "base/values.h"
18 #include "remoting/protocol/protocol_mock_objects.h"
19 #include "testing/gmock/include/gmock/gmock.h"
20 #include "testing/gtest/include/gtest/gtest.h"
22 using testing::Sequence
;
26 using remoting::protocol::PairingRegistry
;
28 class MockPairingRegistryCallbacks
{
30 MockPairingRegistryCallbacks() {}
31 virtual ~MockPairingRegistryCallbacks() {}
33 MOCK_METHOD1(DoneCallback
, void(bool));
34 MOCK_METHOD1(GetAllPairingsCallbackPtr
, void(base::ListValue
*));
35 MOCK_METHOD1(GetPairingCallback
, void(PairingRegistry::Pairing
));
37 void GetAllPairingsCallback(scoped_ptr
<base::ListValue
> pairings
) {
38 GetAllPairingsCallbackPtr(pairings
.get());
42 DISALLOW_COPY_AND_ASSIGN(MockPairingRegistryCallbacks
);
45 // Verify that a pairing Dictionary has correct entries, but doesn't include
47 void VerifyPairing(PairingRegistry::Pairing expected
,
48 const base::DictionaryValue
& actual
) {
50 EXPECT_TRUE(actual
.GetString(PairingRegistry::kClientNameKey
, &value
));
51 EXPECT_EQ(expected
.client_name(), value
);
52 EXPECT_TRUE(actual
.GetString(PairingRegistry::kClientIdKey
, &value
));
53 EXPECT_EQ(expected
.client_id(), value
);
55 EXPECT_FALSE(actual
.HasKey(PairingRegistry::kSharedSecretKey
));
63 class PairingRegistryTest
: public testing::Test
{
65 virtual void SetUp() OVERRIDE
{
69 void set_pairings(scoped_ptr
<base::ListValue
> pairings
) {
70 pairings_
= pairings
.Pass();
73 void ExpectSecret(const std::string
& expected
,
74 PairingRegistry::Pairing actual
) {
75 EXPECT_EQ(expected
, actual
.shared_secret());
79 void ExpectSaveSuccess(bool success
) {
85 base::MessageLoop message_loop_
;
86 base::RunLoop run_loop_
;
89 scoped_ptr
<base::ListValue
> pairings_
;
92 TEST_F(PairingRegistryTest
, CreateAndGetPairings
) {
93 scoped_refptr
<PairingRegistry
> registry
= new SynchronousPairingRegistry(
94 scoped_ptr
<PairingRegistry::Delegate
>(new MockPairingRegistryDelegate()));
95 PairingRegistry::Pairing pairing_1
= registry
->CreatePairing("my_client");
96 PairingRegistry::Pairing pairing_2
= registry
->CreatePairing("my_client");
98 EXPECT_NE(pairing_1
.shared_secret(), pairing_2
.shared_secret());
100 registry
->GetPairing(pairing_1
.client_id(),
101 base::Bind(&PairingRegistryTest::ExpectSecret
,
102 base::Unretained(this),
103 pairing_1
.shared_secret()));
104 EXPECT_EQ(1, callback_count_
);
106 // Check that the second client is paired with a different shared secret.
107 registry
->GetPairing(pairing_2
.client_id(),
108 base::Bind(&PairingRegistryTest::ExpectSecret
,
109 base::Unretained(this),
110 pairing_2
.shared_secret()));
111 EXPECT_EQ(2, callback_count_
);
114 TEST_F(PairingRegistryTest
, GetAllPairings
) {
115 scoped_refptr
<PairingRegistry
> registry
= new SynchronousPairingRegistry(
116 scoped_ptr
<PairingRegistry::Delegate
>(new MockPairingRegistryDelegate()));
117 PairingRegistry::Pairing pairing_1
= registry
->CreatePairing("client1");
118 PairingRegistry::Pairing pairing_2
= registry
->CreatePairing("client2");
120 registry
->GetAllPairings(
121 base::Bind(&PairingRegistryTest::set_pairings
,
122 base::Unretained(this)));
124 ASSERT_EQ(2u, pairings_
->GetSize());
125 const base::DictionaryValue
* actual_pairing_1
;
126 const base::DictionaryValue
* actual_pairing_2
;
127 ASSERT_TRUE(pairings_
->GetDictionary(0, &actual_pairing_1
));
128 ASSERT_TRUE(pairings_
->GetDictionary(1, &actual_pairing_2
));
130 // Ordering is not guaranteed, so swap if necessary.
131 std::string actual_client_id
;
132 ASSERT_TRUE(actual_pairing_1
->GetString(PairingRegistry::kClientIdKey
,
134 if (actual_client_id
!= pairing_1
.client_id()) {
135 std::swap(actual_pairing_1
, actual_pairing_2
);
138 VerifyPairing(pairing_1
, *actual_pairing_1
);
139 VerifyPairing(pairing_2
, *actual_pairing_2
);
142 TEST_F(PairingRegistryTest
, DeletePairing
) {
143 scoped_refptr
<PairingRegistry
> registry
= new SynchronousPairingRegistry(
144 scoped_ptr
<PairingRegistry::Delegate
>(new MockPairingRegistryDelegate()));
145 PairingRegistry::Pairing pairing_1
= registry
->CreatePairing("client1");
146 PairingRegistry::Pairing pairing_2
= registry
->CreatePairing("client2");
148 registry
->DeletePairing(
149 pairing_1
.client_id(),
150 base::Bind(&PairingRegistryTest::ExpectSaveSuccess
,
151 base::Unretained(this)));
153 // Re-read the list, and verify it only has the pairing_2 client.
154 registry
->GetAllPairings(
155 base::Bind(&PairingRegistryTest::set_pairings
,
156 base::Unretained(this)));
158 ASSERT_EQ(1u, pairings_
->GetSize());
159 const base::DictionaryValue
* actual_pairing_2
;
160 ASSERT_TRUE(pairings_
->GetDictionary(0, &actual_pairing_2
));
161 std::string actual_client_id
;
162 ASSERT_TRUE(actual_pairing_2
->GetString(PairingRegistry::kClientIdKey
,
164 EXPECT_EQ(pairing_2
.client_id(), actual_client_id
);
167 TEST_F(PairingRegistryTest
, ClearAllPairings
) {
168 scoped_refptr
<PairingRegistry
> registry
= new SynchronousPairingRegistry(
169 scoped_ptr
<PairingRegistry::Delegate
>(new MockPairingRegistryDelegate()));
170 PairingRegistry::Pairing pairing_1
= registry
->CreatePairing("client1");
171 PairingRegistry::Pairing pairing_2
= registry
->CreatePairing("client2");
173 registry
->ClearAllPairings(
174 base::Bind(&PairingRegistryTest::ExpectSaveSuccess
,
175 base::Unretained(this)));
177 // Re-read the list, and verify it is empty.
178 registry
->GetAllPairings(
179 base::Bind(&PairingRegistryTest::set_pairings
,
180 base::Unretained(this)));
182 EXPECT_TRUE(pairings_
->empty());
185 ACTION_P(QuitMessageLoop
, callback
) {
189 MATCHER_P(EqualsClientName
, client_name
, "") {
190 return arg
.client_name() == client_name
;
193 MATCHER(NoPairings
, "") {
197 TEST_F(PairingRegistryTest
, SerializedRequests
) {
198 MockPairingRegistryCallbacks callbacks
;
200 EXPECT_CALL(callbacks
, GetPairingCallback(EqualsClientName("client1")))
202 EXPECT_CALL(callbacks
, GetPairingCallback(EqualsClientName("client2")))
204 EXPECT_CALL(callbacks
, DoneCallback(true))
206 EXPECT_CALL(callbacks
, GetPairingCallback(EqualsClientName("client1")))
208 EXPECT_CALL(callbacks
, GetPairingCallback(EqualsClientName("")))
210 EXPECT_CALL(callbacks
, DoneCallback(true))
212 EXPECT_CALL(callbacks
, GetAllPairingsCallbackPtr(NoPairings()))
214 EXPECT_CALL(callbacks
, GetPairingCallback(EqualsClientName("client3")))
216 .WillOnce(QuitMessageLoop(run_loop_
.QuitClosure()));
218 scoped_refptr
<PairingRegistry
> registry
= new PairingRegistry(
219 base::ThreadTaskRunnerHandle::Get(),
220 scoped_ptr
<PairingRegistry::Delegate
>(new MockPairingRegistryDelegate()));
221 PairingRegistry::Pairing pairing_1
= registry
->CreatePairing("client1");
222 PairingRegistry::Pairing pairing_2
= registry
->CreatePairing("client2");
223 registry
->GetPairing(
224 pairing_1
.client_id(),
225 base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback
,
226 base::Unretained(&callbacks
)));
227 registry
->GetPairing(
228 pairing_2
.client_id(),
229 base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback
,
230 base::Unretained(&callbacks
)));
231 registry
->DeletePairing(
232 pairing_2
.client_id(),
233 base::Bind(&MockPairingRegistryCallbacks::DoneCallback
,
234 base::Unretained(&callbacks
)));
235 registry
->GetPairing(
236 pairing_1
.client_id(),
237 base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback
,
238 base::Unretained(&callbacks
)));
239 registry
->GetPairing(
240 pairing_2
.client_id(),
241 base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback
,
242 base::Unretained(&callbacks
)));
243 registry
->ClearAllPairings(
244 base::Bind(&MockPairingRegistryCallbacks::DoneCallback
,
245 base::Unretained(&callbacks
)));
246 registry
->GetAllPairings(
247 base::Bind(&MockPairingRegistryCallbacks::GetAllPairingsCallback
,
248 base::Unretained(&callbacks
)));
249 PairingRegistry::Pairing pairing_3
= registry
->CreatePairing("client3");
250 registry
->GetPairing(
251 pairing_3
.client_id(),
252 base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback
,
253 base::Unretained(&callbacks
)));
258 } // namespace protocol
259 } // namespace remoting