Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(129)

Side by Side Diff: google_apis/gcm/engine/unregistration_request_unittest.cc

Issue 2111973002: Add support for GCM subtypes to desktop Instance ID implementation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@iid9push
Patch Set: Remove channel from product_category_for_subtypes, and address nits Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 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 <stdint.h> 5 #include <stdint.h>
6 #include <map> 6 #include <map>
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/strings/string_number_conversions.h" 11 #include "base/strings/string_number_conversions.h"
12 #include "base/strings/string_tokenizer.h" 12 #include "base/strings/string_tokenizer.h"
13 #include "google_apis/gcm/engine/gcm_request_test_base.h" 13 #include "google_apis/gcm/engine/gcm_request_test_base.h"
14 #include "google_apis/gcm/engine/gcm_unregistration_request_handler.h" 14 #include "google_apis/gcm/engine/gcm_unregistration_request_handler.h"
15 #include "google_apis/gcm/engine/instance_id_delete_token_request_handler.h" 15 #include "google_apis/gcm/engine/instance_id_delete_token_request_handler.h"
16 #include "google_apis/gcm/monitoring/fake_gcm_stats_recorder.h" 16 #include "google_apis/gcm/monitoring/fake_gcm_stats_recorder.h"
17 #include "net/base/load_flags.h" 17 #include "net/base/load_flags.h"
18 18
19 namespace gcm { 19 namespace gcm {
20 20
21 namespace { 21 namespace {
22 const int kMaxRetries = 2; 22 const int kMaxRetries = 2;
23 const uint64_t kAndroidId = 42UL; 23 const uint64_t kAndroidId = 42UL;
24 const char kLoginHeader[] = "AidLogin"; 24 const char kLoginHeader[] = "AidLogin";
25 const char kAppId[] = "TestAppId"; 25 const char kAppId[] = "TestAppId";
26 const char kDeletedAppId[] = "deleted=TestAppId"; 26 const char kDeletedAppId[] = "deleted=TestAppId";
27 const char kDeletedToken[] = "token=SomeToken"; 27 const char kDeletedToken[] = "token=SomeToken";
28 const char kProductCategoryForSubtypes[] = "com.chrome.macosx";
28 const char kRegistrationURL[] = "http://foo.bar/register"; 29 const char kRegistrationURL[] = "http://foo.bar/register";
29 const uint64_t kSecurityToken = 77UL; 30 const uint64_t kSecurityToken = 77UL;
30 const int kGCMVersion = 40; 31 const int kGCMVersion = 40;
31 const char kInstanceId[] = "IID1"; 32 const char kInstanceId[] = "IID1";
32 const char kDeveloperId[] = "Project1"; 33 const char kDeveloperId[] = "Project1";
33 const char kScope[] = "GCM"; 34 const char kScope[] = "GCM";
34 35
35 } // namespace 36 } // namespace
36 37
37 class UnregistrationRequestTest : public GCMRequestTestBase { 38 class UnregistrationRequestTest : public GCMRequestTestBase {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 void CreateRequest(); 85 void CreateRequest();
85 }; 86 };
86 87
87 GCMUnregistrationRequestTest::GCMUnregistrationRequestTest() { 88 GCMUnregistrationRequestTest::GCMUnregistrationRequestTest() {
88 } 89 }
89 90
90 GCMUnregistrationRequestTest::~GCMUnregistrationRequestTest() { 91 GCMUnregistrationRequestTest::~GCMUnregistrationRequestTest() {
91 } 92 }
92 93
93 void GCMUnregistrationRequestTest::CreateRequest() { 94 void GCMUnregistrationRequestTest::CreateRequest() {
94 UnregistrationRequest::RequestInfo request_info( 95 UnregistrationRequest::RequestInfo request_info(kAndroidId, kSecurityToken,
95 kAndroidId, kSecurityToken, kAppId); 96 kAppId /* category */,
97 std::string() /* subtype */);
96 std::unique_ptr<GCMUnregistrationRequestHandler> request_handler( 98 std::unique_ptr<GCMUnregistrationRequestHandler> request_handler(
97 new GCMUnregistrationRequestHandler(kAppId)); 99 new GCMUnregistrationRequestHandler(kAppId));
98 request_.reset(new UnregistrationRequest( 100 request_.reset(new UnregistrationRequest(
99 GURL(kRegistrationURL), request_info, std::move(request_handler), 101 GURL(kRegistrationURL), request_info, std::move(request_handler),
100 GetBackoffPolicy(), 102 GetBackoffPolicy(),
101 base::Bind(&UnregistrationRequestTest::UnregistrationCallback, 103 base::Bind(&UnregistrationRequestTest::UnregistrationCallback,
102 base::Unretained(this)), 104 base::Unretained(this)),
103 max_retry_count_, url_request_context_getter(), &recorder_, 105 max_retry_count_, url_request_context_getter(), &recorder_,
104 std::string())); 106 std::string()));
105 } 107 }
(...skipping 17 matching lines...) Expand all
123 fetcher->GetExtraRequestHeaders(&headers); 125 fetcher->GetExtraRequestHeaders(&headers);
124 std::string auth_header; 126 std::string auth_header;
125 headers.GetHeader(net::HttpRequestHeaders::kAuthorization, &auth_header); 127 headers.GetHeader(net::HttpRequestHeaders::kAuthorization, &auth_header);
126 base::StringTokenizer auth_tokenizer(auth_header, " :"); 128 base::StringTokenizer auth_tokenizer(auth_header, " :");
127 ASSERT_TRUE(auth_tokenizer.GetNext()); 129 ASSERT_TRUE(auth_tokenizer.GetNext());
128 EXPECT_EQ(kLoginHeader, auth_tokenizer.token()); 130 EXPECT_EQ(kLoginHeader, auth_tokenizer.token());
129 ASSERT_TRUE(auth_tokenizer.GetNext()); 131 ASSERT_TRUE(auth_tokenizer.GetNext());
130 EXPECT_EQ(base::Uint64ToString(kAndroidId), auth_tokenizer.token()); 132 EXPECT_EQ(base::Uint64ToString(kAndroidId), auth_tokenizer.token());
131 ASSERT_TRUE(auth_tokenizer.GetNext()); 133 ASSERT_TRUE(auth_tokenizer.GetNext());
132 EXPECT_EQ(base::Uint64ToString(kSecurityToken), auth_tokenizer.token()); 134 EXPECT_EQ(base::Uint64ToString(kSecurityToken), auth_tokenizer.token());
133 std::string app_id_header;
134 headers.GetHeader("app", &app_id_header);
135 EXPECT_EQ(kAppId, app_id_header);
136 135
137 std::map<std::string, std::string> expected_pairs; 136 std::map<std::string, std::string> expected_pairs;
138 expected_pairs["app"] = kAppId; 137 expected_pairs["app"] = kAppId;
139 expected_pairs["device"] = base::Uint64ToString(kAndroidId); 138 expected_pairs["device"] = base::Uint64ToString(kAndroidId);
140 expected_pairs["delete"] = "true"; 139 expected_pairs["delete"] = "true";
141 expected_pairs["gcm_unreg_caller"] = "false"; 140 expected_pairs["gcm_unreg_caller"] = "false";
142 141
143 // Verify data was formatted properly. 142 ASSERT_NO_FATAL_FAILURE(VerifyFetcherUploadData(&expected_pairs));
144 std::string upload_data = fetcher->upload_data();
145 base::StringTokenizer data_tokenizer(upload_data, "&=");
146 while (data_tokenizer.GetNext()) {
147 std::map<std::string, std::string>::iterator iter =
148 expected_pairs.find(data_tokenizer.token());
149 ASSERT_TRUE(iter != expected_pairs.end()) << data_tokenizer.token();
150 ASSERT_TRUE(data_tokenizer.GetNext()) << data_tokenizer.token();
151 EXPECT_EQ(iter->second, data_tokenizer.token());
152 // Ensure that none of the keys appears twice.
153 expected_pairs.erase(iter);
154 }
155
156 EXPECT_EQ(0UL, expected_pairs.size());
157 } 143 }
158 144
159 TEST_F(GCMUnregistrationRequestTest, SuccessfulUnregistration) { 145 TEST_F(GCMUnregistrationRequestTest, SuccessfulUnregistration) {
160 set_max_retry_count(0); 146 set_max_retry_count(0);
161 CreateRequest(); 147 CreateRequest();
162 request_->Start(); 148 request_->Start();
163 149
164 SetResponse(net::HTTP_OK, kDeletedAppId); 150 SetResponse(net::HTTP_OK, kDeletedAppId);
165 CompleteFetch(); 151 CompleteFetch();
166 152
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 303
318 EXPECT_TRUE(callback_called_); 304 EXPECT_TRUE(callback_called_);
319 EXPECT_EQ(UnregistrationRequest::REACHED_MAX_RETRIES, status_); 305 EXPECT_EQ(UnregistrationRequest::REACHED_MAX_RETRIES, status_);
320 } 306 }
321 307
322 class InstaceIDDeleteTokenRequestTest : public UnregistrationRequestTest { 308 class InstaceIDDeleteTokenRequestTest : public UnregistrationRequestTest {
323 public: 309 public:
324 InstaceIDDeleteTokenRequestTest(); 310 InstaceIDDeleteTokenRequestTest();
325 ~InstaceIDDeleteTokenRequestTest() override; 311 ~InstaceIDDeleteTokenRequestTest() override;
326 312
327 void CreateRequest(const std::string& instance_id, 313 void CreateRequest(bool use_subtype,
314 const std::string& instance_id,
328 const std::string& authorized_entity, 315 const std::string& authorized_entity,
329 const std::string& scope); 316 const std::string& scope);
330 }; 317 };
331 318
332 InstaceIDDeleteTokenRequestTest::InstaceIDDeleteTokenRequestTest() { 319 InstaceIDDeleteTokenRequestTest::InstaceIDDeleteTokenRequestTest() {
333 } 320 }
334 321
335 InstaceIDDeleteTokenRequestTest::~InstaceIDDeleteTokenRequestTest() { 322 InstaceIDDeleteTokenRequestTest::~InstaceIDDeleteTokenRequestTest() {
336 } 323 }
337 324
338 void InstaceIDDeleteTokenRequestTest::CreateRequest( 325 void InstaceIDDeleteTokenRequestTest::CreateRequest(
326 bool use_subtype,
339 const std::string& instance_id, 327 const std::string& instance_id,
340 const std::string& authorized_entity, 328 const std::string& authorized_entity,
341 const std::string& scope) { 329 const std::string& scope) {
342 UnregistrationRequest::RequestInfo request_info( 330 std::string category = use_subtype ? kProductCategoryForSubtypes : kAppId;
343 kAndroidId, kSecurityToken, kAppId); 331 std::string subtype = use_subtype ? kAppId : std::string();
332 UnregistrationRequest::RequestInfo request_info(kAndroidId, kSecurityToken,
333 category, subtype);
344 std::unique_ptr<InstanceIDDeleteTokenRequestHandler> request_handler( 334 std::unique_ptr<InstanceIDDeleteTokenRequestHandler> request_handler(
345 new InstanceIDDeleteTokenRequestHandler(instance_id, authorized_entity, 335 new InstanceIDDeleteTokenRequestHandler(instance_id, authorized_entity,
346 scope, kGCMVersion)); 336 scope, kGCMVersion));
347 request_.reset(new UnregistrationRequest( 337 request_.reset(new UnregistrationRequest(
348 GURL(kRegistrationURL), request_info, std::move(request_handler), 338 GURL(kRegistrationURL), request_info, std::move(request_handler),
349 GetBackoffPolicy(), 339 GetBackoffPolicy(),
350 base::Bind(&UnregistrationRequestTest::UnregistrationCallback, 340 base::Bind(&UnregistrationRequestTest::UnregistrationCallback,
351 base::Unretained(this)), 341 base::Unretained(this)),
352 max_retry_count(), url_request_context_getter(), &recorder_, 342 max_retry_count(), url_request_context_getter(), &recorder_,
353 std::string())); 343 std::string()));
354 } 344 }
355 345
356 TEST_F(InstaceIDDeleteTokenRequestTest, RequestDataPassedToFetcher) { 346 TEST_F(InstaceIDDeleteTokenRequestTest, RequestDataPassedToFetcher) {
357 CreateRequest(kInstanceId, kDeveloperId, kScope); 347 CreateRequest(false /* use_subtype */, kInstanceId, kDeveloperId, kScope);
358 request_->Start(); 348 request_->Start();
359 349
360 // Get data sent by request. 350 // Get data sent by request.
361 net::TestURLFetcher* fetcher = GetFetcher(); 351 net::TestURLFetcher* fetcher = GetFetcher();
362 ASSERT_TRUE(fetcher); 352 ASSERT_TRUE(fetcher);
363 353
364 EXPECT_EQ(GURL(kRegistrationURL), fetcher->GetOriginalURL()); 354 EXPECT_EQ(GURL(kRegistrationURL), fetcher->GetOriginalURL());
365 355
366 // Verify that authorization header was put together properly. 356 // Verify that authorization header was put together properly.
367 net::HttpRequestHeaders headers; 357 net::HttpRequestHeaders headers;
368 fetcher->GetExtraRequestHeaders(&headers); 358 fetcher->GetExtraRequestHeaders(&headers);
369 std::string auth_header; 359 std::string auth_header;
370 headers.GetHeader(net::HttpRequestHeaders::kAuthorization, &auth_header); 360 headers.GetHeader(net::HttpRequestHeaders::kAuthorization, &auth_header);
371 base::StringTokenizer auth_tokenizer(auth_header, " :"); 361 base::StringTokenizer auth_tokenizer(auth_header, " :");
372 ASSERT_TRUE(auth_tokenizer.GetNext()); 362 ASSERT_TRUE(auth_tokenizer.GetNext());
373 EXPECT_EQ(kLoginHeader, auth_tokenizer.token()); 363 EXPECT_EQ(kLoginHeader, auth_tokenizer.token());
374 ASSERT_TRUE(auth_tokenizer.GetNext()); 364 ASSERT_TRUE(auth_tokenizer.GetNext());
375 EXPECT_EQ(base::Uint64ToString(kAndroidId), auth_tokenizer.token()); 365 EXPECT_EQ(base::Uint64ToString(kAndroidId), auth_tokenizer.token());
376 ASSERT_TRUE(auth_tokenizer.GetNext()); 366 ASSERT_TRUE(auth_tokenizer.GetNext());
377 EXPECT_EQ(base::Uint64ToString(kSecurityToken), auth_tokenizer.token()); 367 EXPECT_EQ(base::Uint64ToString(kSecurityToken), auth_tokenizer.token());
378 std::string app_id_header;
379 headers.GetHeader("app", &app_id_header);
380 EXPECT_EQ(kAppId, app_id_header);
381 368
382 std::map<std::string, std::string> expected_pairs; 369 std::map<std::string, std::string> expected_pairs;
383 expected_pairs["gmsv"] = base::IntToString(kGCMVersion); 370 expected_pairs["gmsv"] = base::IntToString(kGCMVersion);
384 expected_pairs["app"] = kAppId; 371 expected_pairs["app"] = kAppId;
385 expected_pairs["device"] = base::Uint64ToString(kAndroidId); 372 expected_pairs["device"] = base::Uint64ToString(kAndroidId);
386 expected_pairs["delete"] = "true"; 373 expected_pairs["delete"] = "true";
387 expected_pairs["appid"] = kInstanceId; 374 expected_pairs["appid"] = kInstanceId;
388 expected_pairs["sender"] = kDeveloperId; 375 expected_pairs["sender"] = kDeveloperId;
389 expected_pairs["X-subtype"] = kDeveloperId;
390 expected_pairs["scope"] = kScope; 376 expected_pairs["scope"] = kScope;
391 expected_pairs["X-scope"] = kScope; 377 expected_pairs["X-scope"] = kScope;
392 378
393 // Verify data was formatted properly. 379 ASSERT_NO_FATAL_FAILURE(VerifyFetcherUploadData(&expected_pairs));
394 std::string upload_data = fetcher->upload_data(); 380 }
395 base::StringTokenizer data_tokenizer(upload_data, "&=");
396 while (data_tokenizer.GetNext()) {
397 std::map<std::string, std::string>::iterator iter =
398 expected_pairs.find(data_tokenizer.token());
399 ASSERT_TRUE(iter != expected_pairs.end()) << data_tokenizer.token();
400 ASSERT_TRUE(data_tokenizer.GetNext()) << data_tokenizer.token();
401 EXPECT_EQ(iter->second, data_tokenizer.token());
402 // Ensure that none of the keys appears twice.
403 expected_pairs.erase(iter);
404 }
405 381
406 EXPECT_EQ(0UL, expected_pairs.size()); 382 TEST_F(InstaceIDDeleteTokenRequestTest, RequestDataWithSubtype) {
383 CreateRequest(true /* use_subtype */, kInstanceId, kDeveloperId, kScope);
384 request_->Start();
385
386 // Get data sent by request.
387 net::TestURLFetcher* fetcher = GetFetcher();
388 ASSERT_TRUE(fetcher);
389
390 // Same as RequestDataPassedToFetcher except "app" and "X-subtype".
391 std::map<std::string, std::string> expected_pairs;
392 expected_pairs["gmsv"] = base::IntToString(kGCMVersion);
393 expected_pairs["app"] = kProductCategoryForSubtypes;
394 expected_pairs["X-subtype"] = kAppId;
395 expected_pairs["device"] = base::Uint64ToString(kAndroidId);
396 expected_pairs["delete"] = "true";
397 expected_pairs["appid"] = kInstanceId;
398 expected_pairs["sender"] = kDeveloperId;
399 expected_pairs["scope"] = kScope;
400 expected_pairs["X-scope"] = kScope;
401
402 ASSERT_NO_FATAL_FAILURE(VerifyFetcherUploadData(&expected_pairs));
407 } 403 }
408 404
409 TEST_F(InstaceIDDeleteTokenRequestTest, SuccessfulUnregistration) { 405 TEST_F(InstaceIDDeleteTokenRequestTest, SuccessfulUnregistration) {
410 CreateRequest(kInstanceId, kDeveloperId, kScope); 406 CreateRequest(false /* use_subtype */, kInstanceId, kDeveloperId, kScope);
411 request_->Start(); 407 request_->Start();
412 408
413 SetResponse(net::HTTP_OK, kDeletedToken); 409 SetResponse(net::HTTP_OK, kDeletedToken);
414 CompleteFetch(); 410 CompleteFetch();
415 411
416 EXPECT_TRUE(callback_called_); 412 EXPECT_TRUE(callback_called_);
417 EXPECT_EQ(UnregistrationRequest::SUCCESS, status_); 413 EXPECT_EQ(UnregistrationRequest::SUCCESS, status_);
418 } 414 }
419 415
420 TEST_F(InstaceIDDeleteTokenRequestTest, ResponseHttpStatusNotOK) { 416 TEST_F(InstaceIDDeleteTokenRequestTest, ResponseHttpStatusNotOK) {
421 CreateRequest(kInstanceId, kDeveloperId, kScope); 417 CreateRequest(false /* use_subtype */, kInstanceId, kDeveloperId, kScope);
422 request_->Start(); 418 request_->Start();
423 419
424 SetResponse(net::HTTP_UNAUTHORIZED, ""); 420 SetResponse(net::HTTP_UNAUTHORIZED, "");
425 CompleteFetch(); 421 CompleteFetch();
426 422
427 EXPECT_FALSE(callback_called_); 423 EXPECT_FALSE(callback_called_);
428 424
429 SetResponse(net::HTTP_OK, kDeletedToken); 425 SetResponse(net::HTTP_OK, kDeletedToken);
430 CompleteFetch(); 426 CompleteFetch();
431 427
432 EXPECT_TRUE(callback_called_); 428 EXPECT_TRUE(callback_called_);
433 EXPECT_EQ(UnregistrationRequest::SUCCESS, status_); 429 EXPECT_EQ(UnregistrationRequest::SUCCESS, status_);
434 } 430 }
435 431
436 TEST_F(InstaceIDDeleteTokenRequestTest, InvalidParametersError) { 432 TEST_F(InstaceIDDeleteTokenRequestTest, InvalidParametersError) {
437 CreateRequest(kInstanceId, kDeveloperId, kScope); 433 CreateRequest(false /* use_subtype */, kInstanceId, kDeveloperId, kScope);
438 request_->Start(); 434 request_->Start();
439 435
440 SetResponse(net::HTTP_OK, "Error=INVALID_PARAMETERS"); 436 SetResponse(net::HTTP_OK, "Error=INVALID_PARAMETERS");
441 CompleteFetch(); 437 CompleteFetch();
442 438
443 EXPECT_TRUE(callback_called_); 439 EXPECT_TRUE(callback_called_);
444 EXPECT_EQ(UnregistrationRequest::INVALID_PARAMETERS, status_); 440 EXPECT_EQ(UnregistrationRequest::INVALID_PARAMETERS, status_);
445 } 441 }
446 442
447 TEST_F(InstaceIDDeleteTokenRequestTest, UnkwnownError) { 443 TEST_F(InstaceIDDeleteTokenRequestTest, UnkwnownError) {
448 CreateRequest(kInstanceId, kDeveloperId, kScope); 444 CreateRequest(false /* use_subtype */, kInstanceId, kDeveloperId, kScope);
449 request_->Start(); 445 request_->Start();
450 446
451 SetResponse(net::HTTP_OK, "Error=XXX"); 447 SetResponse(net::HTTP_OK, "Error=XXX");
452 CompleteFetch(); 448 CompleteFetch();
453 449
454 EXPECT_TRUE(callback_called_); 450 EXPECT_TRUE(callback_called_);
455 EXPECT_EQ(UnregistrationRequest::UNKNOWN_ERROR, status_); 451 EXPECT_EQ(UnregistrationRequest::UNKNOWN_ERROR, status_);
456 } 452 }
457 453
458 } // namespace gcm 454 } // namespace gcm
OLDNEW
« no previous file with comments | « google_apis/gcm/engine/unregistration_request.cc ('k') | ios/chrome/browser/application_context_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698