15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <map> 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string> 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_tokenizer.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/gcm/engine/unregistration_request.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "google_apis/gcm/monitoring/fake_gcm_stats_recorder.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace gcm { 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint64 kAndroidId = 42UL; 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kLoginHeader[] = "AidLogin"; 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kAppId[] = "TestAppId"; 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kDeletedAppId[] = "deleted=TestAppId"; 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kRegistrationURL[] = "http://foo.bar/register"; 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint64 kSecurityToken = 77UL; 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Backoff policy for testing registration request. 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const net::BackoffEntry::Policy kDefaultBackoffPolicy = { 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Number of initial errors (in sequence) to ignore before applying 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // exponential back-off rules. 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Explicitly set to 2 to skip the delay on the first retry, as we are not 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // trying to test the backoff itself, but rather the fact that retry happens. 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Initial delay for exponential back-off in ms. 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15000, // 15 seconds. 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Factor by which the waiting time will be multiplied. 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2, 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fuzzing percentage. ex: 10% will spread requests randomly 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // between 90%-100% of the calculated time. 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0.5, // 50%. 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Maximum amount of time we are willing to delay our request in ms. 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1000 * 60 * 5, // 5 minutes. 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Time to keep an entry from being discarded even when it 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // has no significant state, -1 to never discard. 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) -1, 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Don't use initial delay unless the last request was an error. 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UnregistrationRequestTest : public testing::Test { 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UnregistrationRequestTest(); 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~UnregistrationRequestTest(); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void UnregistrationCallback(UnregistrationRequest::Status status); 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void CreateRequest(); 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetResponseStatusAndString(net::HttpStatusCode status_code, 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& response_body); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void CompleteFetch(); 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool callback_called_; 7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) UnregistrationRequest::Status status_; 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<UnregistrationRequest> request_; 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoop message_loop_; 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::TestURLFetcherFactory url_fetcher_factory_; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_; 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FakeGCMStatsRecorder recorder_; 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UnregistrationRequestTest::UnregistrationRequestTest() 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : callback_called_(false), 8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) status_(UnregistrationRequest::UNREGISTRATION_STATUS_COUNT), 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url_request_context_getter_(new net::TestURLRequestContextGetter( 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_loop_.message_loop_proxy())) {} 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UnregistrationRequestTest::~UnregistrationRequestTest() {} 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void UnregistrationRequestTest::UnregistrationCallback( 8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) UnregistrationRequest::Status status) { 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_called_ = true; 9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) status_ = status; 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UnregistrationRequestTest::CreateRequest() { 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_.reset(new UnregistrationRequest( 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GURL(kRegistrationURL), 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UnregistrationRequest::RequestInfo(kAndroidId, 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kSecurityToken, 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kAppId), 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kDefaultBackoffPolicy, 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&UnregistrationRequestTest::UnregistrationCallback, 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this)), 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_request_context_getter_.get(), 1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &recorder_)); 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UnregistrationRequestTest::SetResponseStatusAndString( 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HttpStatusCode status_code, 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& response_body) { 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(fetcher); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fetcher->set_response_code(status_code); 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fetcher->SetResponseString(response_body); 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UnregistrationRequestTest::CompleteFetch() { 11623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) status_ = UnregistrationRequest::UNREGISTRATION_STATUS_COUNT; 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_called_ = false; 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(fetcher); 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(UnregistrationRequestTest, RequestDataPassedToFetcher) { 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(); 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Get data sent by request. 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(fetcher); 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GURL(kRegistrationURL), fetcher->GetOriginalURL()); 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Verify that authorization header was put together properly. 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HttpRequestHeaders headers; 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fetcher->GetExtraRequestHeaders(&headers); 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string auth_header; 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) headers.GetHeader(net::HttpRequestHeaders::kAuthorization, &auth_header); 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::StringTokenizer auth_tokenizer(auth_header, " :"); 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(auth_tokenizer.GetNext()); 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kLoginHeader, auth_tokenizer.token()); 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(auth_tokenizer.GetNext()); 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::Uint64ToString(kAndroidId), auth_tokenizer.token()); 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(auth_tokenizer.GetNext()); 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::Uint64ToString(kSecurityToken), auth_tokenizer.token()); 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string app_id_header; 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) headers.GetHeader("app", &app_id_header); 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kAppId, app_id_header); 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<std::string, std::string> expected_pairs; 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_pairs["app"] = kAppId; 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_pairs["device"] = base::Uint64ToString(kAndroidId); 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_pairs["delete"] = "true"; 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_pairs["gcm_unreg_caller"] = "false"; 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Verify data was formatted properly. 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string upload_data = fetcher->upload_data(); 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::StringTokenizer data_tokenizer(upload_data, "&="); 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) while (data_tokenizer.GetNext()) { 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<std::string, std::string>::iterator iter = 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_pairs.find(data_tokenizer.token()); 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(iter != expected_pairs.end()) << data_tokenizer.token(); 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(data_tokenizer.GetNext()) << data_tokenizer.token(); 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(iter->second, data_tokenizer.token()); 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Ensure that none of the keys appears twice. 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_pairs.erase(iter); 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0UL, expected_pairs.size()); 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(UnregistrationRequestTest, SuccessfulUnregistration) { 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(); 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_OK, kDeletedAppId); 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 17923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(UnregistrationRequest::SUCCESS, status_); 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(UnregistrationRequestTest, ResponseHttpStatusNotOK) { 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(); 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_UNAUTHORIZED, ""); 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 19023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(UnregistrationRequest::HTTP_NOT_OK, status_); 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(UnregistrationRequestTest, ResponseEmpty) { 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(); 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_OK, ""); 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(callback_called_); 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_OK, kDeletedAppId); 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 20623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(UnregistrationRequest::SUCCESS, status_); 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(UnregistrationRequestTest, InvalidParametersError) { 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(); 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_OK, "Error=INVALID_PARAMETERS"); 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 21723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(UnregistrationRequest::INVALID_PARAMETERS, status_); 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(UnregistrationRequestTest, UnkwnownError) { 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(); 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_OK, "Error=XXX"); 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 22823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(UnregistrationRequest::UNKNOWN_ERROR, status_); 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(UnregistrationRequestTest, ServiceUnavailable) { 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(); 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_SERVICE_UNAVAILABLE, ""); 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(callback_called_); 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_OK, kDeletedAppId); 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 24423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(UnregistrationRequest::SUCCESS, status_); 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(UnregistrationRequestTest, InternalServerError) { 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(); 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_INTERNAL_SERVER_ERROR, ""); 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(callback_called_); 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_OK, kDeletedAppId); 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 26023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(UnregistrationRequest::SUCCESS, status_); 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(UnregistrationRequestTest, IncorrectAppId) { 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(); 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_OK, "deleted=OtherTestAppId"); 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(callback_called_); 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_OK, kDeletedAppId); 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 27623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(UnregistrationRequest::SUCCESS, status_); 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(UnregistrationRequestTest, ResponseParsingFailed) { 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(); 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_OK, "some malformed response"); 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(callback_called_); 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_OK, kDeletedAppId); 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 29223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(UnregistrationRequest::SUCCESS, status_); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace gcm 296