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 <string> 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/gcm/engine/checkin_request.h" 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "google_apis/gcm/monitoring/fake_gcm_stats_recorder.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/gcm/protocol/checkin.pb.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/base/backoff_entry.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace gcm { 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const net::BackoffEntry::Policy kDefaultBackoffPolicy = { 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Number of initial errors (in sequence) to ignore before applying 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // exponential back-off rules. 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Explicitly set to 1 to skip the delay of the first Retry, as we are not 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // trying to test the backoff itself, but rather the fact that retry happens. 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Initial delay for exponential back-off in ms. 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15000, // 15 seconds. 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Factor by which the waiting time will be multiplied. 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2, 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fuzzing percentage. ex: 10% will spread requests randomly 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // between 90%-100% of the calculated time. 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0.5, // 50%. 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Maximum amount of time we are willing to delay our request in ms. 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1000 * 60 * 5, // 5 minutes. 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Time to keep an entry from being discarded even when it 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // has no significant state, -1 to never discard. 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) -1, 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Don't use initial delay unless the last request was an error. 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint64 kAndroidId = 42UL; 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint64 kBlankAndroidId = 999999UL; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint64 kBlankSecurityToken = 999999UL; 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kCheckinURL[] = "http://foo.bar/checkin"; 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kChromeVersion[] = "Version String"; 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint64 kSecurityToken = 77; 55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst char kSettingsDigest[] = "settings_digest"; 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CheckinRequestTest : public testing::Test { 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enum ResponseScenario { 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VALID_RESPONSE, // Both android_id and security_token set in response. 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MISSING_ANDROID_ID, // android_id is missing. 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MISSING_SECURITY_TOKEN, // security_token is missing. 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ANDROID_ID_IS_ZER0, // android_id is 0. 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SECURITY_TOKEN_IS_ZERO // security_token is 0. 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CheckinRequestTest(); 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~CheckinRequestTest(); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void FetcherCallback( 71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const checkin_proto::AndroidCheckinResponse& response); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void CreateRequest(uint64 android_id, uint64 security_token); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetResponseStatusAndString( 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HttpStatusCode status_code, 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& response_data); 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void CompleteFetch(); 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetResponse(ResponseScenario response_scenario); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool callback_called_; 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint64 android_id_; 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint64 security_token_; 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int checkin_device_type_; 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoop message_loop_; 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::TestURLFetcherFactory url_fetcher_factory_; 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_; 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) checkin_proto::ChromeBuildProto chrome_build_proto_; 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<CheckinRequest> request_; 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FakeGCMStatsRecorder recorder_; 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CheckinRequestTest::CheckinRequestTest() 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : callback_called_(false), 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) android_id_(kBlankAndroidId), 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) security_token_(kBlankSecurityToken), 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) checkin_device_type_(0), 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url_request_context_getter_(new net::TestURLRequestContextGetter( 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) message_loop_.message_loop_proxy())) { 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CheckinRequestTest::~CheckinRequestTest() {} 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid CheckinRequestTest::FetcherCallback( 108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const checkin_proto::AndroidCheckinResponse& checkin_response) { 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_called_ = true; 110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (checkin_response.has_android_id()) 111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch android_id_ = checkin_response.android_id(); 112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (checkin_response.has_security_token()) 113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch security_token_ = checkin_response.security_token(); 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CheckinRequestTest::CreateRequest(uint64 android_id, 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint64 security_token) { 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First setup a chrome_build protobuf. 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome_build_proto_.set_platform( 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) checkin_proto::ChromeBuildProto::PLATFORM_LINUX); 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome_build_proto_.set_channel( 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) checkin_proto::ChromeBuildProto::CHANNEL_CANARY); 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome_build_proto_.set_chrome_version(kChromeVersion); 124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch CheckinRequest::RequestInfo request_info( 126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch android_id, 127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch security_token, 128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch kSettingsDigest, 129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch chrome_build_proto_); 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Then create a request with that protobuf and specified android_id, 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // security_token. 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_.reset(new CheckinRequest( 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GURL(kCheckinURL), 134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch request_info, 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kDefaultBackoffPolicy, 136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::Bind(&CheckinRequestTest::FetcherCallback, base::Unretained(this)), 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url_request_context_getter_.get(), 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &recorder_)); 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Setting android_id_ and security_token_ to blank value, not used elsewhere 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // in the tests. 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_called_ = false; 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) android_id_ = kBlankAndroidId; 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) security_token_ = kBlankSecurityToken; 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CheckinRequestTest::SetResponseStatusAndString( 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::HttpStatusCode status_code, 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& response_data) { 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::TestURLFetcher* fetcher = 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url_fetcher_factory_.GetFetcherByID(0); 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(fetcher); 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fetcher->set_response_code(status_code); 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fetcher->SetResponseString(response_data); 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CheckinRequestTest::CompleteFetch() { 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::TestURLFetcher* fetcher = 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url_fetcher_factory_.GetFetcherByID(0); 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(fetcher); 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CheckinRequestTest::SetResponse(ResponseScenario response_scenario) { 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) checkin_proto::AndroidCheckinResponse response; 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) response.set_stats_ok(true); 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint64 android_id = response_scenario == ANDROID_ID_IS_ZER0 ? 0 : kAndroidId; 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint64 security_token = 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) response_scenario == SECURITY_TOKEN_IS_ZERO ? 0 : kSecurityToken; 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (response_scenario != MISSING_ANDROID_ID) 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) response.set_android_id(android_id); 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (response_scenario != MISSING_SECURITY_TOKEN) 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) response.set_security_token(security_token); 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string response_string; 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) response.SerializeToString(&response_string); 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_OK, response_string); 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(CheckinRequestTest, FetcherDataAndURL) { 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(kAndroidId, kSecurityToken); 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Get data sent by request. 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(fetcher); 190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GURL(kCheckinURL), fetcher->GetOriginalURL()); 191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) checkin_proto::AndroidCheckinRequest request_proto; 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_proto.ParseFromString(fetcher->upload_data()); 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kAndroidId, static_cast<uint64>(request_proto.id())); 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kSecurityToken, request_proto.security_token()); 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(chrome_build_proto_.platform(), 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_proto.checkin().chrome_build().platform()); 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(chrome_build_proto_.chrome_version(), 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_proto.checkin().chrome_build().chrome_version()); 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(chrome_build_proto_.channel(), 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_proto.checkin().chrome_build().channel()); 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(CHROME_OS) 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(checkin_proto::DEVICE_CHROME_OS, request_proto.checkin().type()); 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(checkin_proto::DEVICE_CHROME_BROWSER, 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_proto.checkin().type()); 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 210a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(kSettingsDigest, request_proto.digest()); 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CheckinRequestTest, ResponseBodyEmpty) { 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(0u, 0u); 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_OK, std::string()); 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(callback_called_); 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponse(VALID_RESPONSE); 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kAndroidId, android_id_); 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kSecurityToken, security_token_); 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CheckinRequestTest, ResponseBodyCorrupted) { 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(0u, 0u); 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_OK, "Corrupted response body"); 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(callback_called_); 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponse(VALID_RESPONSE); 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kAndroidId, android_id_); 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kSecurityToken, security_token_); 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CheckinRequestTest, ResponseHttpStatusUnauthorized) { 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(0u, 0u); 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_UNAUTHORIZED, std::string()); 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 255a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(kBlankAndroidId, android_id_); 256a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(kBlankSecurityToken, security_token_); 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CheckinRequestTest, ResponseHttpStatusBadRequest) { 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(0u, 0u); 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_BAD_REQUEST, std::string()); 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(kBlankAndroidId, android_id_); 268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(kBlankSecurityToken, security_token_); 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CheckinRequestTest, ResponseHttpStatusNotOK) { 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(0u, 0u); 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponseStatusAndString(net::HTTP_INTERNAL_SERVER_ERROR, std::string()); 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(callback_called_); 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponse(VALID_RESPONSE); 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kAndroidId, android_id_); 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kSecurityToken, security_token_); 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CheckinRequestTest, ResponseMissingAndroidId) { 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(0u, 0u); 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponse(MISSING_ANDROID_ID); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(callback_called_); 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponse(VALID_RESPONSE); 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kAndroidId, android_id_); 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kSecurityToken, security_token_); 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CheckinRequestTest, ResponseMissingSecurityToken) { 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(0u, 0u); 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponse(MISSING_SECURITY_TOKEN); 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(callback_called_); 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponse(VALID_RESPONSE); 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kAndroidId, android_id_); 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kSecurityToken, security_token_); 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CheckinRequestTest, AndroidIdEqualsZeroInResponse) { 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(0u, 0u); 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponse(ANDROID_ID_IS_ZER0); 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(callback_called_); 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponse(VALID_RESPONSE); 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kAndroidId, android_id_); 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kSecurityToken, security_token_); 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CheckinRequestTest, SecurityTokenEqualsZeroInResponse) { 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(0u, 0u); 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponse(SECURITY_TOKEN_IS_ZERO); 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(callback_called_); 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponse(VALID_RESPONSE); 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kAndroidId, android_id_); 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kSecurityToken, security_token_); 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CheckinRequestTest, SuccessfulFirstTimeCheckin) { 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(0u, 0u); 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponse(VALID_RESPONSE); 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kAndroidId, android_id_); 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kSecurityToken, security_token_); 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CheckinRequestTest, SuccessfulSubsequentCheckin) { 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateRequest(kAndroidId, kSecurityToken); 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_->Start(); 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetResponse(VALID_RESPONSE); 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteFetch(); 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(callback_called_); 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kAndroidId, android_id_); 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kSecurityToken, security_token_); 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace gcm 381