OLD | NEW |
| (Empty) |
1 // Copyright 2014 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 "components/proximity_auth/cryptauth/cryptauth_client_impl.h" | |
6 | |
7 #include "base/command_line.h" | |
8 #include "base/macros.h" | |
9 #include "base/memory/ptr_util.h" | |
10 #include "base/test/null_task_runner.h" | |
11 #include "components/proximity_auth/cryptauth/cryptauth_access_token_fetcher.h" | |
12 #include "components/proximity_auth/cryptauth/cryptauth_api_call_flow.h" | |
13 #include "components/proximity_auth/cryptauth/proto/cryptauth_api.pb.h" | |
14 #include "components/proximity_auth/cryptauth/switches.h" | |
15 #include "google_apis/gaia/fake_oauth2_token_service.h" | |
16 #include "net/url_request/test_url_fetcher_factory.h" | |
17 #include "net/url_request/url_request_test_util.h" | |
18 #include "testing/gmock/include/gmock/gmock.h" | |
19 #include "testing/gtest/include/gtest/gtest.h" | |
20 #include "url/gurl.h" | |
21 | |
22 using testing::_; | |
23 using testing::DoAll; | |
24 using testing::Return; | |
25 using testing::SaveArg; | |
26 using testing::StrictMock; | |
27 | |
28 namespace proximity_auth { | |
29 | |
30 namespace { | |
31 | |
32 const char kTestGoogleApisUrl[] = "https://www.testgoogleapis.com"; | |
33 const char kAccessToken[] = "access_token"; | |
34 const char kPublicKey1[] = "public_key1"; | |
35 const char kPublicKey2[] = "public_key2"; | |
36 const char kBluetoothAddress1[] = "AA:AA:AA:AA:AA:AA"; | |
37 const char kBluetoothAddress2[] = "BB:BB:BB:BB:BB:BB"; | |
38 | |
39 // Values for the DeviceClassifier field. | |
40 const int kDeviceOsVersionCode = 100; | |
41 const int kDeviceSoftwareVersionCode = 200; | |
42 const char kDeviceSoftwarePackage[] = "cryptauth_client_unittest"; | |
43 const cryptauth::DeviceType kDeviceType = cryptauth::CHROME; | |
44 | |
45 // CryptAuthAccessTokenFetcher implementation simply returning a predetermined | |
46 // access token. | |
47 class FakeCryptAuthAccessTokenFetcher : public CryptAuthAccessTokenFetcher { | |
48 public: | |
49 FakeCryptAuthAccessTokenFetcher() : access_token_(kAccessToken) {} | |
50 | |
51 void FetchAccessToken(const AccessTokenCallback& callback) override { | |
52 callback.Run(access_token_); | |
53 } | |
54 | |
55 void set_access_token(const std::string& access_token) { | |
56 access_token_ = access_token; | |
57 }; | |
58 | |
59 private: | |
60 std::string access_token_; | |
61 }; | |
62 | |
63 // Mock CryptAuthApiCallFlow, which handles the HTTP requests to CryptAuth. | |
64 class MockCryptAuthApiCallFlow : public CryptAuthApiCallFlow { | |
65 public: | |
66 MockCryptAuthApiCallFlow() : CryptAuthApiCallFlow() {} | |
67 virtual ~MockCryptAuthApiCallFlow() {} | |
68 | |
69 MOCK_METHOD6(Start, | |
70 void(const GURL&, | |
71 net::URLRequestContextGetter* context, | |
72 const std::string& access_token, | |
73 const std::string& serialized_request, | |
74 const ResultCallback& result_callback, | |
75 const ErrorCallback& error_callback)); | |
76 | |
77 private: | |
78 DISALLOW_COPY_AND_ASSIGN(MockCryptAuthApiCallFlow); | |
79 }; | |
80 | |
81 // Callback that should never be invoked. | |
82 template <class T> | |
83 void NotCalled(const T& type) { | |
84 EXPECT_TRUE(false); | |
85 } | |
86 | |
87 // Callback that saves the result returned by CryptAuthClient. | |
88 template <class T> | |
89 void SaveResult(T* out, const T& result) { | |
90 *out = result; | |
91 } | |
92 | |
93 } // namespace | |
94 | |
95 class ProximityAuthCryptAuthClientTest : public testing::Test { | |
96 protected: | |
97 ProximityAuthCryptAuthClientTest() | |
98 : access_token_fetcher_(new FakeCryptAuthAccessTokenFetcher()), | |
99 api_call_flow_(new StrictMock<MockCryptAuthApiCallFlow>()), | |
100 url_request_context_( | |
101 new net::TestURLRequestContextGetter(new base::NullTaskRunner())), | |
102 serialized_request_(std::string()) {} | |
103 | |
104 void SetUp() override { | |
105 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( | |
106 switches::kCryptAuthHTTPHost, kTestGoogleApisUrl); | |
107 | |
108 cryptauth::DeviceClassifier device_classifier; | |
109 device_classifier.set_device_os_version_code(kDeviceOsVersionCode); | |
110 device_classifier.set_device_software_version_code( | |
111 kDeviceSoftwareVersionCode); | |
112 device_classifier.set_device_software_package(kDeviceSoftwarePackage); | |
113 device_classifier.set_device_type(kDeviceType); | |
114 | |
115 client_.reset( | |
116 new CryptAuthClientImpl(base::WrapUnique(api_call_flow_), | |
117 base::WrapUnique(access_token_fetcher_), | |
118 url_request_context_, device_classifier)); | |
119 } | |
120 | |
121 // Sets up an expectation and captures a CryptAuth API request to | |
122 // |request_url|. | |
123 void ExpectRequest(const std::string& request_url) { | |
124 GURL url(request_url); | |
125 EXPECT_CALL(*api_call_flow_, | |
126 Start(url, url_request_context_.get(), kAccessToken, _, _, _)) | |
127 .WillOnce(DoAll(SaveArg<3>(&serialized_request_), | |
128 SaveArg<4>(&flow_result_callback_), | |
129 SaveArg<5>(&flow_error_callback_))); | |
130 } | |
131 | |
132 // Returns |response_proto| as the result to the current API request. | |
133 // ExpectResult() must have been called first. | |
134 void FinishApiCallFlow(const google::protobuf::MessageLite* response_proto) { | |
135 flow_result_callback_.Run(response_proto->SerializeAsString()); | |
136 } | |
137 | |
138 // Ends the current API request with |error_message|. ExpectResult() must have | |
139 // been called first. | |
140 void FailApiCallFlow(const std::string& error_message) { | |
141 flow_error_callback_.Run(error_message); | |
142 } | |
143 | |
144 protected: | |
145 // Owned by |client_|. | |
146 FakeCryptAuthAccessTokenFetcher* access_token_fetcher_; | |
147 // Owned by |client_|. | |
148 StrictMock<MockCryptAuthApiCallFlow>* api_call_flow_; | |
149 | |
150 scoped_refptr<net::URLRequestContextGetter> url_request_context_; | |
151 std::unique_ptr<CryptAuthClient> client_; | |
152 | |
153 std::string serialized_request_; | |
154 CryptAuthApiCallFlow::ResultCallback flow_result_callback_; | |
155 CryptAuthApiCallFlow::ErrorCallback flow_error_callback_; | |
156 }; | |
157 | |
158 TEST_F(ProximityAuthCryptAuthClientTest, GetMyDevicesSuccess) { | |
159 ExpectRequest( | |
160 "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/" | |
161 "getmydevices?alt=proto"); | |
162 | |
163 cryptauth::GetMyDevicesResponse result_proto; | |
164 cryptauth::GetMyDevicesRequest request_proto; | |
165 request_proto.set_allow_stale_read(true); | |
166 client_->GetMyDevices( | |
167 request_proto, | |
168 base::Bind(&SaveResult<cryptauth::GetMyDevicesResponse>, &result_proto), | |
169 base::Bind(&NotCalled<std::string>)); | |
170 | |
171 cryptauth::GetMyDevicesRequest expected_request; | |
172 EXPECT_TRUE(expected_request.ParseFromString(serialized_request_)); | |
173 EXPECT_TRUE(expected_request.allow_stale_read()); | |
174 | |
175 // Return two devices, one unlock key and one unlockable device. | |
176 { | |
177 cryptauth::GetMyDevicesResponse response_proto; | |
178 response_proto.add_devices(); | |
179 response_proto.mutable_devices(0)->set_public_key(kPublicKey1); | |
180 response_proto.mutable_devices(0)->set_unlock_key(true); | |
181 response_proto.mutable_devices(0) | |
182 ->set_bluetooth_address(kBluetoothAddress1); | |
183 response_proto.add_devices(); | |
184 response_proto.mutable_devices(1)->set_public_key(kPublicKey2); | |
185 response_proto.mutable_devices(1)->set_unlockable(true); | |
186 FinishApiCallFlow(&response_proto); | |
187 } | |
188 | |
189 // Check that the result received in callback is the same as the response. | |
190 ASSERT_EQ(2, result_proto.devices_size()); | |
191 EXPECT_EQ(kPublicKey1, result_proto.devices(0).public_key()); | |
192 EXPECT_TRUE(result_proto.devices(0).unlock_key()); | |
193 EXPECT_EQ(kBluetoothAddress1, result_proto.devices(0).bluetooth_address()); | |
194 EXPECT_EQ(kPublicKey2, result_proto.devices(1).public_key()); | |
195 EXPECT_TRUE(result_proto.devices(1).unlockable()); | |
196 } | |
197 | |
198 TEST_F(ProximityAuthCryptAuthClientTest, GetMyDevicesFailure) { | |
199 ExpectRequest( | |
200 "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/" | |
201 "getmydevices?alt=proto"); | |
202 | |
203 std::string error_message; | |
204 client_->GetMyDevices(cryptauth::GetMyDevicesRequest(), | |
205 base::Bind(&NotCalled<cryptauth::GetMyDevicesResponse>), | |
206 base::Bind(&SaveResult<std::string>, &error_message)); | |
207 | |
208 std::string kStatus500Error("HTTP status: 500"); | |
209 FailApiCallFlow(kStatus500Error); | |
210 EXPECT_EQ(kStatus500Error, error_message); | |
211 } | |
212 | |
213 TEST_F(ProximityAuthCryptAuthClientTest, FindEligibleUnlockDevicesSuccess) { | |
214 ExpectRequest( | |
215 "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/" | |
216 "findeligibleunlockdevices?alt=proto"); | |
217 | |
218 cryptauth::FindEligibleUnlockDevicesResponse result_proto; | |
219 cryptauth::FindEligibleUnlockDevicesRequest request_proto; | |
220 request_proto.set_callback_bluetooth_address(kBluetoothAddress2); | |
221 client_->FindEligibleUnlockDevices( | |
222 request_proto, | |
223 base::Bind(&SaveResult<cryptauth::FindEligibleUnlockDevicesResponse>, | |
224 &result_proto), | |
225 base::Bind(&NotCalled<std::string>)); | |
226 | |
227 cryptauth::FindEligibleUnlockDevicesRequest expected_request; | |
228 EXPECT_TRUE(expected_request.ParseFromString(serialized_request_)); | |
229 EXPECT_EQ(kBluetoothAddress2, expected_request.callback_bluetooth_address()); | |
230 | |
231 // Return a response proto with one eligible and one ineligible device. | |
232 cryptauth::FindEligibleUnlockDevicesResponse response_proto; | |
233 response_proto.add_eligible_devices(); | |
234 response_proto.mutable_eligible_devices(0)->set_public_key(kPublicKey1); | |
235 | |
236 const std::string kIneligibilityReason = "You require more vespine gas."; | |
237 response_proto.add_ineligible_devices(); | |
238 response_proto.mutable_ineligible_devices(0) | |
239 ->mutable_device() | |
240 ->set_public_key(kPublicKey2); | |
241 response_proto.mutable_ineligible_devices(0) | |
242 ->add_reasons(kIneligibilityReason); | |
243 FinishApiCallFlow(&response_proto); | |
244 | |
245 // Check that the result received in callback is the same as the response. | |
246 ASSERT_EQ(1, result_proto.eligible_devices_size()); | |
247 EXPECT_EQ(kPublicKey1, result_proto.eligible_devices(0).public_key()); | |
248 ASSERT_EQ(1, result_proto.ineligible_devices_size()); | |
249 EXPECT_EQ(kPublicKey2, | |
250 result_proto.ineligible_devices(0).device().public_key()); | |
251 ASSERT_EQ(1, result_proto.ineligible_devices(0).reasons_size()); | |
252 EXPECT_EQ(kIneligibilityReason, | |
253 result_proto.ineligible_devices(0).reasons(0)); | |
254 } | |
255 | |
256 TEST_F(ProximityAuthCryptAuthClientTest, FindEligibleUnlockDevicesFailure) { | |
257 ExpectRequest( | |
258 "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/" | |
259 "findeligibleunlockdevices?alt=proto"); | |
260 | |
261 std::string error_message; | |
262 cryptauth::FindEligibleUnlockDevicesRequest request_proto; | |
263 request_proto.set_callback_bluetooth_address(kBluetoothAddress1); | |
264 client_->FindEligibleUnlockDevices( | |
265 request_proto, | |
266 base::Bind(&NotCalled<cryptauth::FindEligibleUnlockDevicesResponse>), | |
267 base::Bind(&SaveResult<std::string>, &error_message)); | |
268 | |
269 std::string kStatus403Error("HTTP status: 403"); | |
270 FailApiCallFlow(kStatus403Error); | |
271 EXPECT_EQ(kStatus403Error, error_message); | |
272 } | |
273 | |
274 TEST_F(ProximityAuthCryptAuthClientTest, SendDeviceSyncTickleSuccess) { | |
275 ExpectRequest( | |
276 "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/" | |
277 "senddevicesynctickle?alt=proto"); | |
278 | |
279 cryptauth::SendDeviceSyncTickleResponse result_proto; | |
280 client_->SendDeviceSyncTickle( | |
281 cryptauth::SendDeviceSyncTickleRequest(), | |
282 base::Bind(&SaveResult<cryptauth::SendDeviceSyncTickleResponse>, | |
283 &result_proto), | |
284 base::Bind(&NotCalled<std::string>)); | |
285 | |
286 cryptauth::SendDeviceSyncTickleRequest expected_request; | |
287 EXPECT_TRUE(expected_request.ParseFromString(serialized_request_)); | |
288 | |
289 cryptauth::SendDeviceSyncTickleResponse response_proto; | |
290 FinishApiCallFlow(&response_proto); | |
291 } | |
292 | |
293 TEST_F(ProximityAuthCryptAuthClientTest, ToggleEasyUnlockSuccess) { | |
294 ExpectRequest( | |
295 "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/" | |
296 "toggleeasyunlock?alt=proto"); | |
297 | |
298 cryptauth::ToggleEasyUnlockResponse result_proto; | |
299 cryptauth::ToggleEasyUnlockRequest request_proto; | |
300 request_proto.set_enable(true); | |
301 request_proto.set_apply_to_all(false); | |
302 request_proto.set_public_key(kPublicKey1); | |
303 client_->ToggleEasyUnlock( | |
304 request_proto, | |
305 base::Bind(&SaveResult<cryptauth::ToggleEasyUnlockResponse>, | |
306 &result_proto), | |
307 base::Bind(&NotCalled<std::string>)); | |
308 | |
309 cryptauth::ToggleEasyUnlockRequest expected_request; | |
310 EXPECT_TRUE(expected_request.ParseFromString(serialized_request_)); | |
311 EXPECT_TRUE(expected_request.enable()); | |
312 EXPECT_EQ(kPublicKey1, expected_request.public_key()); | |
313 EXPECT_FALSE(expected_request.apply_to_all()); | |
314 | |
315 cryptauth::ToggleEasyUnlockResponse response_proto; | |
316 FinishApiCallFlow(&response_proto); | |
317 } | |
318 | |
319 TEST_F(ProximityAuthCryptAuthClientTest, SetupEnrollmentSuccess) { | |
320 ExpectRequest( | |
321 "https://www.testgoogleapis.com/cryptauth/v1/enrollment/" | |
322 "setup?alt=proto"); | |
323 | |
324 std::string kApplicationId = "mkaes"; | |
325 std::vector<std::string> supported_protocols; | |
326 supported_protocols.push_back("gcmV1"); | |
327 supported_protocols.push_back("testProtocol"); | |
328 | |
329 cryptauth::SetupEnrollmentResponse result_proto; | |
330 cryptauth::SetupEnrollmentRequest request_proto; | |
331 request_proto.set_application_id(kApplicationId); | |
332 request_proto.add_types("gcmV1"); | |
333 request_proto.add_types("testProtocol"); | |
334 client_->SetupEnrollment( | |
335 request_proto, base::Bind(&SaveResult<cryptauth::SetupEnrollmentResponse>, | |
336 &result_proto), | |
337 base::Bind(&NotCalled<std::string>)); | |
338 | |
339 cryptauth::SetupEnrollmentRequest expected_request; | |
340 EXPECT_TRUE(expected_request.ParseFromString(serialized_request_)); | |
341 EXPECT_EQ(kApplicationId, expected_request.application_id()); | |
342 ASSERT_EQ(2, expected_request.types_size()); | |
343 EXPECT_EQ("gcmV1", expected_request.types(0)); | |
344 EXPECT_EQ("testProtocol", expected_request.types(1)); | |
345 | |
346 // Return a fake enrollment session. | |
347 { | |
348 cryptauth::SetupEnrollmentResponse response_proto; | |
349 response_proto.set_status("OK"); | |
350 response_proto.add_infos(); | |
351 response_proto.mutable_infos(0)->set_type("gcmV1"); | |
352 response_proto.mutable_infos(0)->set_enrollment_session_id("session_id"); | |
353 response_proto.mutable_infos(0)->set_server_ephemeral_key("ephemeral_key"); | |
354 FinishApiCallFlow(&response_proto); | |
355 } | |
356 | |
357 // Check that the returned proto is the same as the one just created. | |
358 EXPECT_EQ("OK", result_proto.status()); | |
359 ASSERT_EQ(1, result_proto.infos_size()); | |
360 EXPECT_EQ("gcmV1", result_proto.infos(0).type()); | |
361 EXPECT_EQ("session_id", result_proto.infos(0).enrollment_session_id()); | |
362 EXPECT_EQ("ephemeral_key", result_proto.infos(0).server_ephemeral_key()); | |
363 } | |
364 | |
365 TEST_F(ProximityAuthCryptAuthClientTest, FinishEnrollmentSuccess) { | |
366 ExpectRequest( | |
367 "https://www.testgoogleapis.com/cryptauth/v1/enrollment/" | |
368 "finish?alt=proto"); | |
369 | |
370 const char kEnrollmentSessionId[] = "enrollment_session_id"; | |
371 const char kEnrollmentMessage[] = "enrollment_message"; | |
372 const char kDeviceEphemeralKey[] = "device_ephermal_key"; | |
373 cryptauth::FinishEnrollmentResponse result_proto; | |
374 cryptauth::FinishEnrollmentRequest request_proto; | |
375 request_proto.set_enrollment_session_id(kEnrollmentSessionId); | |
376 request_proto.set_enrollment_message(kEnrollmentMessage); | |
377 request_proto.set_device_ephemeral_key(kDeviceEphemeralKey); | |
378 client_->FinishEnrollment( | |
379 request_proto, | |
380 base::Bind(&SaveResult<cryptauth::FinishEnrollmentResponse>, | |
381 &result_proto), | |
382 base::Bind(&NotCalled<const std::string&>)); | |
383 | |
384 cryptauth::FinishEnrollmentRequest expected_request; | |
385 EXPECT_TRUE(expected_request.ParseFromString(serialized_request_)); | |
386 EXPECT_EQ(kEnrollmentSessionId, expected_request.enrollment_session_id()); | |
387 EXPECT_EQ(kEnrollmentMessage, expected_request.enrollment_message()); | |
388 EXPECT_EQ(kDeviceEphemeralKey, expected_request.device_ephemeral_key()); | |
389 | |
390 { | |
391 cryptauth::FinishEnrollmentResponse response_proto; | |
392 response_proto.set_status("OK"); | |
393 FinishApiCallFlow(&response_proto); | |
394 } | |
395 EXPECT_EQ("OK", result_proto.status()); | |
396 } | |
397 | |
398 TEST_F(ProximityAuthCryptAuthClientTest, FetchAccessTokenFailure) { | |
399 access_token_fetcher_->set_access_token(""); | |
400 | |
401 std::string error_message; | |
402 client_->GetMyDevices(cryptauth::GetMyDevicesRequest(), | |
403 base::Bind(&NotCalled<cryptauth::GetMyDevicesResponse>), | |
404 base::Bind(&SaveResult<std::string>, &error_message)); | |
405 | |
406 EXPECT_EQ("Failed to get a valid access token.", error_message); | |
407 } | |
408 | |
409 TEST_F(ProximityAuthCryptAuthClientTest, ParseResponseProtoFailure) { | |
410 ExpectRequest( | |
411 "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/" | |
412 "getmydevices?alt=proto"); | |
413 | |
414 std::string error_message; | |
415 client_->GetMyDevices(cryptauth::GetMyDevicesRequest(), | |
416 base::Bind(&NotCalled<cryptauth::GetMyDevicesResponse>), | |
417 base::Bind(&SaveResult<std::string>, &error_message)); | |
418 | |
419 flow_result_callback_.Run("Not a valid serialized response message."); | |
420 EXPECT_EQ("Failed to parse response proto.", error_message); | |
421 } | |
422 | |
423 TEST_F(ProximityAuthCryptAuthClientTest, | |
424 MakeSecondRequestBeforeFirstRequestSucceeds) { | |
425 ExpectRequest( | |
426 "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/" | |
427 "getmydevices?alt=proto"); | |
428 | |
429 // Make first request. | |
430 cryptauth::GetMyDevicesResponse result_proto; | |
431 client_->GetMyDevices( | |
432 cryptauth::GetMyDevicesRequest(), | |
433 base::Bind(&SaveResult<cryptauth::GetMyDevicesResponse>, &result_proto), | |
434 base::Bind(&NotCalled<std::string>)); | |
435 | |
436 // With request pending, make second request. | |
437 { | |
438 std::string error_message; | |
439 client_->FindEligibleUnlockDevices( | |
440 cryptauth::FindEligibleUnlockDevicesRequest(), | |
441 base::Bind(&NotCalled<cryptauth::FindEligibleUnlockDevicesResponse>), | |
442 base::Bind(&SaveResult<std::string>, &error_message)); | |
443 EXPECT_EQ("Client has been used for another request. Do not reuse.", | |
444 error_message); | |
445 } | |
446 | |
447 // Complete first request. | |
448 { | |
449 cryptauth::GetMyDevicesResponse response_proto; | |
450 response_proto.add_devices(); | |
451 response_proto.mutable_devices(0)->set_public_key(kPublicKey1); | |
452 FinishApiCallFlow(&response_proto); | |
453 } | |
454 | |
455 ASSERT_EQ(1, result_proto.devices_size()); | |
456 EXPECT_EQ(kPublicKey1, result_proto.devices(0).public_key()); | |
457 } | |
458 | |
459 TEST_F(ProximityAuthCryptAuthClientTest, | |
460 MakeSecondRequestBeforeFirstRequestFails) { | |
461 ExpectRequest( | |
462 "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/" | |
463 "getmydevices?alt=proto"); | |
464 | |
465 // Make first request. | |
466 std::string error_message; | |
467 client_->GetMyDevices(cryptauth::GetMyDevicesRequest(), | |
468 base::Bind(&NotCalled<cryptauth::GetMyDevicesResponse>), | |
469 base::Bind(&SaveResult<std::string>, &error_message)); | |
470 | |
471 // With request pending, make second request. | |
472 { | |
473 std::string error_message; | |
474 client_->FindEligibleUnlockDevices( | |
475 cryptauth::FindEligibleUnlockDevicesRequest(), | |
476 base::Bind(&NotCalled<cryptauth::FindEligibleUnlockDevicesResponse>), | |
477 base::Bind(&SaveResult<std::string>, &error_message)); | |
478 EXPECT_EQ("Client has been used for another request. Do not reuse.", | |
479 error_message); | |
480 } | |
481 | |
482 // Fail first request. | |
483 std::string kStatus429Error = "HTTP status: 429"; | |
484 FailApiCallFlow(kStatus429Error); | |
485 EXPECT_EQ(kStatus429Error, error_message); | |
486 } | |
487 | |
488 TEST_F(ProximityAuthCryptAuthClientTest, | |
489 MakeSecondRequestAfterFirstRequestSucceeds) { | |
490 // Make first request successfully. | |
491 { | |
492 ExpectRequest( | |
493 "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/" | |
494 "getmydevices?alt=proto"); | |
495 cryptauth::GetMyDevicesResponse result_proto; | |
496 client_->GetMyDevices( | |
497 cryptauth::GetMyDevicesRequest(), | |
498 base::Bind(&SaveResult<cryptauth::GetMyDevicesResponse>, &result_proto), | |
499 base::Bind(&NotCalled<std::string>)); | |
500 | |
501 cryptauth::GetMyDevicesResponse response_proto; | |
502 response_proto.add_devices(); | |
503 response_proto.mutable_devices(0)->set_public_key(kPublicKey1); | |
504 FinishApiCallFlow(&response_proto); | |
505 ASSERT_EQ(1, result_proto.devices_size()); | |
506 EXPECT_EQ(kPublicKey1, result_proto.devices(0).public_key()); | |
507 } | |
508 | |
509 // Second request fails. | |
510 { | |
511 std::string error_message; | |
512 client_->FindEligibleUnlockDevices( | |
513 cryptauth::FindEligibleUnlockDevicesRequest(), | |
514 base::Bind(&NotCalled<cryptauth::FindEligibleUnlockDevicesResponse>), | |
515 base::Bind(&SaveResult<std::string>, &error_message)); | |
516 EXPECT_EQ("Client has been used for another request. Do not reuse.", | |
517 error_message); | |
518 } | |
519 } | |
520 | |
521 TEST_F(ProximityAuthCryptAuthClientTest, DeviceClassifierIsSet) { | |
522 ExpectRequest( | |
523 "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/" | |
524 "getmydevices?alt=proto"); | |
525 | |
526 cryptauth::GetMyDevicesResponse result_proto; | |
527 cryptauth::GetMyDevicesRequest request_proto; | |
528 request_proto.set_allow_stale_read(true); | |
529 client_->GetMyDevices( | |
530 request_proto, | |
531 base::Bind(&SaveResult<cryptauth::GetMyDevicesResponse>, &result_proto), | |
532 base::Bind(&NotCalled<std::string>)); | |
533 cryptauth::GetMyDevicesRequest expected_request; | |
534 EXPECT_TRUE(expected_request.ParseFromString(serialized_request_)); | |
535 | |
536 const cryptauth::DeviceClassifier& device_classifier = | |
537 expected_request.device_classifier(); | |
538 EXPECT_EQ(kDeviceOsVersionCode, device_classifier.device_os_version_code()); | |
539 EXPECT_EQ(kDeviceSoftwareVersionCode, | |
540 device_classifier.device_software_version_code()); | |
541 EXPECT_EQ(kDeviceSoftwarePackage, | |
542 device_classifier.device_software_package()); | |
543 EXPECT_EQ(kDeviceType, device_classifier.device_type()); | |
544 } | |
545 | |
546 TEST_F(ProximityAuthCryptAuthClientTest, GetAccessTokenUsed) { | |
547 EXPECT_TRUE(client_->GetAccessTokenUsed().empty()); | |
548 ExpectRequest( | |
549 "https://www.testgoogleapis.com/cryptauth/v1/deviceSync/" | |
550 "getmydevices?alt=proto"); | |
551 | |
552 cryptauth::GetMyDevicesResponse result_proto; | |
553 cryptauth::GetMyDevicesRequest request_proto; | |
554 request_proto.set_allow_stale_read(true); | |
555 client_->GetMyDevices( | |
556 request_proto, | |
557 base::Bind(&SaveResult<cryptauth::GetMyDevicesResponse>, &result_proto), | |
558 base::Bind(&NotCalled<std::string>)); | |
559 EXPECT_EQ(kAccessToken, client_->GetAccessTokenUsed()); | |
560 } | |
561 | |
562 } // namespace proximity_auth | |
OLD | NEW |