OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/protocol/pairing_registry.h" | 5 #include "remoting/protocol/pairing_registry.h" |
6 | 6 |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
13 #include "base/memory/scoped_ptr.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" |
14 #include "base/values.h" | 17 #include "base/values.h" |
15 #include "remoting/protocol/protocol_mock_objects.h" | 18 #include "remoting/protocol/protocol_mock_objects.h" |
16 #include "testing/gmock/include/gmock/gmock.h" | 19 #include "testing/gmock/include/gmock/gmock.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
18 | 21 |
| 22 using testing::Sequence; |
| 23 |
19 namespace { | 24 namespace { |
20 | 25 |
21 using remoting::protocol::PairingRegistry; | 26 using remoting::protocol::PairingRegistry; |
22 | 27 |
| 28 class MockPairingRegistryCallbacks { |
| 29 public: |
| 30 MockPairingRegistryCallbacks() {} |
| 31 virtual ~MockPairingRegistryCallbacks() {} |
| 32 |
| 33 MOCK_METHOD1(DoneCallback, void(bool)); |
| 34 MOCK_METHOD1(GetAllPairingsCallbackPtr, void(base::ListValue*)); |
| 35 MOCK_METHOD1(GetPairingCallback, void(PairingRegistry::Pairing)); |
| 36 |
| 37 void GetAllPairingsCallback(scoped_ptr<base::ListValue> pairings) { |
| 38 GetAllPairingsCallbackPtr(pairings.get()); |
| 39 } |
| 40 |
| 41 private: |
| 42 DISALLOW_COPY_AND_ASSIGN(MockPairingRegistryCallbacks); |
| 43 }; |
| 44 |
23 // Verify that a pairing Dictionary has correct entries, but doesn't include | 45 // Verify that a pairing Dictionary has correct entries, but doesn't include |
24 // any shared secret. | 46 // any shared secret. |
25 void VerifyPairing(PairingRegistry::Pairing expected, | 47 void VerifyPairing(PairingRegistry::Pairing expected, |
26 const base::DictionaryValue& actual) { | 48 const base::DictionaryValue& actual) { |
27 std::string value; | 49 std::string value; |
28 EXPECT_TRUE(actual.GetString(PairingRegistry::kClientNameKey, &value)); | 50 EXPECT_TRUE(actual.GetString(PairingRegistry::kClientNameKey, &value)); |
29 EXPECT_EQ(expected.client_name(), value); | 51 EXPECT_EQ(expected.client_name(), value); |
30 EXPECT_TRUE(actual.GetString(PairingRegistry::kClientIdKey, &value)); | 52 EXPECT_TRUE(actual.GetString(PairingRegistry::kClientIdKey, &value)); |
31 EXPECT_EQ(expected.client_id(), value); | 53 EXPECT_EQ(expected.client_id(), value); |
32 | 54 |
(...skipping 19 matching lines...) Expand all Loading... |
52 PairingRegistry::Pairing actual) { | 74 PairingRegistry::Pairing actual) { |
53 EXPECT_EQ(expected, actual.shared_secret()); | 75 EXPECT_EQ(expected, actual.shared_secret()); |
54 ++callback_count_; | 76 ++callback_count_; |
55 } | 77 } |
56 | 78 |
57 void ExpectSaveSuccess(bool success) { | 79 void ExpectSaveSuccess(bool success) { |
58 EXPECT_TRUE(success); | 80 EXPECT_TRUE(success); |
59 ++callback_count_; | 81 ++callback_count_; |
60 } | 82 } |
61 | 83 |
62 void ExpectClientName(const std::string& expected, | |
63 PairingRegistry::Pairing actual) { | |
64 EXPECT_EQ(expected, actual.client_name()); | |
65 ++callback_count_; | |
66 } | |
67 | |
68 void ExpectNoPairings(scoped_ptr<base::ListValue> pairings) { | |
69 EXPECT_TRUE(pairings->empty()); | |
70 ++callback_count_; | |
71 } | |
72 | |
73 protected: | 84 protected: |
| 85 base::MessageLoop message_loop_; |
| 86 base::RunLoop run_loop_; |
| 87 |
74 int callback_count_; | 88 int callback_count_; |
75 scoped_ptr<base::ListValue> pairings_; | 89 scoped_ptr<base::ListValue> pairings_; |
76 }; | 90 }; |
77 | 91 |
78 TEST_F(PairingRegistryTest, CreateAndGetPairings) { | 92 TEST_F(PairingRegistryTest, CreateAndGetPairings) { |
79 MockPairingRegistryDelegate* mock_delegate = | 93 scoped_refptr<PairingRegistry> registry = new SynchronousPairingRegistry( |
80 new MockPairingRegistryDelegate(); | 94 scoped_ptr<PairingRegistry::Delegate>(new MockPairingRegistryDelegate())); |
81 scoped_ptr<PairingRegistry::Delegate> delegate(mock_delegate); | |
82 | |
83 scoped_refptr<PairingRegistry> registry(new PairingRegistry(delegate.Pass())); | |
84 PairingRegistry::Pairing pairing_1 = registry->CreatePairing("my_client"); | 95 PairingRegistry::Pairing pairing_1 = registry->CreatePairing("my_client"); |
85 mock_delegate->RunCallback(); | |
86 PairingRegistry::Pairing pairing_2 = registry->CreatePairing("my_client"); | 96 PairingRegistry::Pairing pairing_2 = registry->CreatePairing("my_client"); |
87 mock_delegate->RunCallback(); | |
88 | 97 |
89 EXPECT_NE(pairing_1.shared_secret(), pairing_2.shared_secret()); | 98 EXPECT_NE(pairing_1.shared_secret(), pairing_2.shared_secret()); |
90 | 99 |
91 registry->GetPairing(pairing_1.client_id(), | 100 registry->GetPairing(pairing_1.client_id(), |
92 base::Bind(&PairingRegistryTest::ExpectSecret, | 101 base::Bind(&PairingRegistryTest::ExpectSecret, |
93 base::Unretained(this), | 102 base::Unretained(this), |
94 pairing_1.shared_secret())); | 103 pairing_1.shared_secret())); |
95 mock_delegate->RunCallback(); | |
96 EXPECT_EQ(1, callback_count_); | 104 EXPECT_EQ(1, callback_count_); |
97 | 105 |
98 // Check that the second client is paired with a different shared secret. | 106 // Check that the second client is paired with a different shared secret. |
99 registry->GetPairing(pairing_2.client_id(), | 107 registry->GetPairing(pairing_2.client_id(), |
100 base::Bind(&PairingRegistryTest::ExpectSecret, | 108 base::Bind(&PairingRegistryTest::ExpectSecret, |
101 base::Unretained(this), | 109 base::Unretained(this), |
102 pairing_2.shared_secret())); | 110 pairing_2.shared_secret())); |
103 mock_delegate->RunCallback(); | |
104 EXPECT_EQ(2, callback_count_); | 111 EXPECT_EQ(2, callback_count_); |
105 } | 112 } |
106 | 113 |
107 TEST_F(PairingRegistryTest, GetAllPairings) { | 114 TEST_F(PairingRegistryTest, GetAllPairings) { |
108 MockPairingRegistryDelegate* mock_delegate = | 115 scoped_refptr<PairingRegistry> registry = new SynchronousPairingRegistry( |
109 new MockPairingRegistryDelegate(); | 116 scoped_ptr<PairingRegistry::Delegate>(new MockPairingRegistryDelegate())); |
110 scoped_ptr<PairingRegistry::Delegate> delegate(mock_delegate); | |
111 | |
112 scoped_refptr<PairingRegistry> registry(new PairingRegistry(delegate.Pass())); | |
113 PairingRegistry::Pairing pairing_1 = registry->CreatePairing("client1"); | 117 PairingRegistry::Pairing pairing_1 = registry->CreatePairing("client1"); |
114 mock_delegate->RunCallback(); | |
115 PairingRegistry::Pairing pairing_2 = registry->CreatePairing("client2"); | 118 PairingRegistry::Pairing pairing_2 = registry->CreatePairing("client2"); |
116 mock_delegate->RunCallback(); | |
117 | 119 |
118 registry->GetAllPairings( | 120 registry->GetAllPairings( |
119 base::Bind(&PairingRegistryTest::set_pairings, | 121 base::Bind(&PairingRegistryTest::set_pairings, |
120 base::Unretained(this))); | 122 base::Unretained(this))); |
121 mock_delegate->RunCallback(); | |
122 | 123 |
123 ASSERT_EQ(2u, pairings_->GetSize()); | 124 ASSERT_EQ(2u, pairings_->GetSize()); |
124 const base::DictionaryValue* actual_pairing_1; | 125 const base::DictionaryValue* actual_pairing_1; |
125 const base::DictionaryValue* actual_pairing_2; | 126 const base::DictionaryValue* actual_pairing_2; |
126 ASSERT_TRUE(pairings_->GetDictionary(0, &actual_pairing_1)); | 127 ASSERT_TRUE(pairings_->GetDictionary(0, &actual_pairing_1)); |
127 ASSERT_TRUE(pairings_->GetDictionary(1, &actual_pairing_2)); | 128 ASSERT_TRUE(pairings_->GetDictionary(1, &actual_pairing_2)); |
128 | 129 |
129 // Ordering is not guaranteed, so swap if necessary. | 130 // Ordering is not guaranteed, so swap if necessary. |
130 std::string actual_client_id; | 131 std::string actual_client_id; |
131 ASSERT_TRUE(actual_pairing_1->GetString(PairingRegistry::kClientIdKey, | 132 ASSERT_TRUE(actual_pairing_1->GetString(PairingRegistry::kClientIdKey, |
132 &actual_client_id)); | 133 &actual_client_id)); |
133 if (actual_client_id != pairing_1.client_id()) { | 134 if (actual_client_id != pairing_1.client_id()) { |
134 std::swap(actual_pairing_1, actual_pairing_2); | 135 std::swap(actual_pairing_1, actual_pairing_2); |
135 } | 136 } |
136 | 137 |
137 VerifyPairing(pairing_1, *actual_pairing_1); | 138 VerifyPairing(pairing_1, *actual_pairing_1); |
138 VerifyPairing(pairing_2, *actual_pairing_2); | 139 VerifyPairing(pairing_2, *actual_pairing_2); |
139 } | 140 } |
140 | 141 |
141 TEST_F(PairingRegistryTest, DeletePairing) { | 142 TEST_F(PairingRegistryTest, DeletePairing) { |
142 MockPairingRegistryDelegate* mock_delegate = | 143 scoped_refptr<PairingRegistry> registry = new SynchronousPairingRegistry( |
143 new MockPairingRegistryDelegate(); | 144 scoped_ptr<PairingRegistry::Delegate>(new MockPairingRegistryDelegate())); |
144 scoped_ptr<PairingRegistry::Delegate> delegate(mock_delegate); | |
145 | |
146 scoped_refptr<PairingRegistry> registry(new PairingRegistry(delegate.Pass())); | |
147 PairingRegistry::Pairing pairing_1 = registry->CreatePairing("client1"); | 145 PairingRegistry::Pairing pairing_1 = registry->CreatePairing("client1"); |
148 mock_delegate->RunCallback(); | |
149 PairingRegistry::Pairing pairing_2 = registry->CreatePairing("client2"); | 146 PairingRegistry::Pairing pairing_2 = registry->CreatePairing("client2"); |
150 mock_delegate->RunCallback(); | |
151 | 147 |
152 registry->DeletePairing( | 148 registry->DeletePairing( |
153 pairing_1.client_id(), | 149 pairing_1.client_id(), |
154 base::Bind(&PairingRegistryTest::ExpectSaveSuccess, | 150 base::Bind(&PairingRegistryTest::ExpectSaveSuccess, |
155 base::Unretained(this))); | 151 base::Unretained(this))); |
156 mock_delegate->RunCallback(); | |
157 | 152 |
158 // Re-read the list, and verify it only has the pairing_2 client. | 153 // Re-read the list, and verify it only has the pairing_2 client. |
159 registry->GetAllPairings( | 154 registry->GetAllPairings( |
160 base::Bind(&PairingRegistryTest::set_pairings, | 155 base::Bind(&PairingRegistryTest::set_pairings, |
161 base::Unretained(this))); | 156 base::Unretained(this))); |
162 mock_delegate->RunCallback(); | |
163 | 157 |
164 ASSERT_EQ(1u, pairings_->GetSize()); | 158 ASSERT_EQ(1u, pairings_->GetSize()); |
165 const base::DictionaryValue* actual_pairing_2; | 159 const base::DictionaryValue* actual_pairing_2; |
166 ASSERT_TRUE(pairings_->GetDictionary(0, &actual_pairing_2)); | 160 ASSERT_TRUE(pairings_->GetDictionary(0, &actual_pairing_2)); |
167 std::string actual_client_id; | 161 std::string actual_client_id; |
168 ASSERT_TRUE(actual_pairing_2->GetString(PairingRegistry::kClientIdKey, | 162 ASSERT_TRUE(actual_pairing_2->GetString(PairingRegistry::kClientIdKey, |
169 &actual_client_id)); | 163 &actual_client_id)); |
170 EXPECT_EQ(pairing_2.client_id(), actual_client_id); | 164 EXPECT_EQ(pairing_2.client_id(), actual_client_id); |
171 } | 165 } |
172 | 166 |
173 TEST_F(PairingRegistryTest, ClearAllPairings) { | 167 TEST_F(PairingRegistryTest, ClearAllPairings) { |
174 MockPairingRegistryDelegate* mock_delegate = | 168 scoped_refptr<PairingRegistry> registry = new SynchronousPairingRegistry( |
175 new MockPairingRegistryDelegate(); | 169 scoped_ptr<PairingRegistry::Delegate>(new MockPairingRegistryDelegate())); |
176 scoped_ptr<PairingRegistry::Delegate> delegate(mock_delegate); | |
177 | |
178 scoped_refptr<PairingRegistry> registry(new PairingRegistry(delegate.Pass())); | |
179 PairingRegistry::Pairing pairing_1 = registry->CreatePairing("client1"); | 170 PairingRegistry::Pairing pairing_1 = registry->CreatePairing("client1"); |
180 mock_delegate->RunCallback(); | |
181 PairingRegistry::Pairing pairing_2 = registry->CreatePairing("client2"); | 171 PairingRegistry::Pairing pairing_2 = registry->CreatePairing("client2"); |
182 mock_delegate->RunCallback(); | |
183 | 172 |
184 registry->ClearAllPairings( | 173 registry->ClearAllPairings( |
185 base::Bind(&PairingRegistryTest::ExpectSaveSuccess, | 174 base::Bind(&PairingRegistryTest::ExpectSaveSuccess, |
186 base::Unretained(this))); | 175 base::Unretained(this))); |
187 | 176 |
188 // Re-read the list, and verify it is empty. | 177 // Re-read the list, and verify it is empty. |
189 registry->GetAllPairings( | 178 registry->GetAllPairings( |
190 base::Bind(&PairingRegistryTest::set_pairings, | 179 base::Bind(&PairingRegistryTest::set_pairings, |
191 base::Unretained(this))); | 180 base::Unretained(this))); |
192 mock_delegate->RunCallback(); | |
193 | 181 |
194 EXPECT_TRUE(pairings_->empty()); | 182 EXPECT_TRUE(pairings_->empty()); |
195 } | 183 } |
196 | 184 |
| 185 ACTION_P(QuitMessageLoop, callback) { |
| 186 callback.Run(); |
| 187 } |
| 188 |
| 189 MATCHER_P(EqualsClientName, client_name, "") { |
| 190 return arg.client_name() == client_name; |
| 191 } |
| 192 |
| 193 MATCHER(NoPairings, "") { |
| 194 return arg->empty(); |
| 195 } |
| 196 |
197 TEST_F(PairingRegistryTest, SerializedRequests) { | 197 TEST_F(PairingRegistryTest, SerializedRequests) { |
198 MockPairingRegistryDelegate* mock_delegate = | 198 MockPairingRegistryCallbacks callbacks; |
199 new MockPairingRegistryDelegate(); | 199 Sequence s; |
200 scoped_ptr<PairingRegistry::Delegate> delegate(mock_delegate); | 200 EXPECT_CALL(callbacks, GetPairingCallback(EqualsClientName("client1"))) |
201 mock_delegate->set_run_save_callback_automatically(false); | 201 .InSequence(s); |
| 202 EXPECT_CALL(callbacks, GetPairingCallback(EqualsClientName("client2"))) |
| 203 .InSequence(s); |
| 204 EXPECT_CALL(callbacks, DoneCallback(true)) |
| 205 .InSequence(s); |
| 206 EXPECT_CALL(callbacks, GetPairingCallback(EqualsClientName("client1"))) |
| 207 .InSequence(s); |
| 208 EXPECT_CALL(callbacks, GetPairingCallback(EqualsClientName(""))) |
| 209 .InSequence(s); |
| 210 EXPECT_CALL(callbacks, DoneCallback(true)) |
| 211 .InSequence(s); |
| 212 EXPECT_CALL(callbacks, GetAllPairingsCallbackPtr(NoPairings())) |
| 213 .InSequence(s); |
| 214 EXPECT_CALL(callbacks, GetPairingCallback(EqualsClientName("client3"))) |
| 215 .InSequence(s) |
| 216 .WillOnce(QuitMessageLoop(run_loop_.QuitClosure())); |
202 | 217 |
203 scoped_refptr<PairingRegistry> registry(new PairingRegistry(delegate.Pass())); | 218 scoped_refptr<PairingRegistry> registry = new PairingRegistry( |
| 219 base::ThreadTaskRunnerHandle::Get(), |
| 220 scoped_ptr<PairingRegistry::Delegate>(new MockPairingRegistryDelegate())); |
204 PairingRegistry::Pairing pairing_1 = registry->CreatePairing("client1"); | 221 PairingRegistry::Pairing pairing_1 = registry->CreatePairing("client1"); |
205 PairingRegistry::Pairing pairing_2 = registry->CreatePairing("client2"); | 222 PairingRegistry::Pairing pairing_2 = registry->CreatePairing("client2"); |
206 registry->GetPairing( | 223 registry->GetPairing( |
207 pairing_1.client_id(), | 224 pairing_1.client_id(), |
208 base::Bind(&PairingRegistryTest::ExpectClientName, | 225 base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback, |
209 base::Unretained(this), "client1")); | 226 base::Unretained(&callbacks))); |
210 registry->GetPairing( | 227 registry->GetPairing( |
211 pairing_2.client_id(), | 228 pairing_2.client_id(), |
212 base::Bind(&PairingRegistryTest::ExpectClientName, | 229 base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback, |
213 base::Unretained(this), "client2")); | 230 base::Unretained(&callbacks))); |
214 registry->DeletePairing( | 231 registry->DeletePairing( |
215 pairing_2.client_id(), | 232 pairing_2.client_id(), |
216 base::Bind(&PairingRegistryTest::ExpectSaveSuccess, | 233 base::Bind(&MockPairingRegistryCallbacks::DoneCallback, |
217 base::Unretained(this))); | 234 base::Unretained(&callbacks))); |
218 registry->GetPairing( | 235 registry->GetPairing( |
219 pairing_1.client_id(), | 236 pairing_1.client_id(), |
220 base::Bind(&PairingRegistryTest::ExpectClientName, | 237 base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback, |
221 base::Unretained(this), "client1")); | 238 base::Unretained(&callbacks))); |
222 registry->GetPairing( | 239 registry->GetPairing( |
223 pairing_2.client_id(), | 240 pairing_2.client_id(), |
224 base::Bind(&PairingRegistryTest::ExpectClientName, | 241 base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback, |
225 base::Unretained(this), "")); | 242 base::Unretained(&callbacks))); |
226 registry->ClearAllPairings( | 243 registry->ClearAllPairings( |
227 base::Bind(&PairingRegistryTest::ExpectSaveSuccess, | 244 base::Bind(&MockPairingRegistryCallbacks::DoneCallback, |
228 base::Unretained(this))); | 245 base::Unretained(&callbacks))); |
229 registry->GetAllPairings( | 246 registry->GetAllPairings( |
230 base::Bind(&PairingRegistryTest::ExpectNoPairings, | 247 base::Bind(&MockPairingRegistryCallbacks::GetAllPairingsCallback, |
231 base::Unretained(this))); | 248 base::Unretained(&callbacks))); |
232 PairingRegistry::Pairing pairing_3 = registry->CreatePairing("client3"); | 249 PairingRegistry::Pairing pairing_3 = registry->CreatePairing("client3"); |
233 registry->GetPairing( | 250 registry->GetPairing( |
234 pairing_3.client_id(), | 251 pairing_3.client_id(), |
235 base::Bind(&PairingRegistryTest::ExpectClientName, | 252 base::Bind(&MockPairingRegistryCallbacks::GetPairingCallback, |
236 base::Unretained(this), "client3")); | 253 base::Unretained(&callbacks))); |
237 | 254 |
238 while (mock_delegate->HasCallback()) { | 255 run_loop_.Run(); |
239 mock_delegate->RunCallback(); | |
240 } | |
241 | |
242 EXPECT_EQ(8, callback_count_); | |
243 } | 256 } |
244 | 257 |
245 } // namespace protocol | 258 } // namespace protocol |
246 } // namespace remoting | 259 } // namespace remoting |
OLD | NEW |