10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file. 40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/strings/string_number_conversions.h" 60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "google_apis/gcm/engine/gservices_settings.h" 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "google_apis/gcm/engine/registration_info.h" 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace gcm { 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace { 130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst int64 kAlternativeCheckinInterval = 16 * 60 * 60; 150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char kAlternativeCheckinURL[] = "http://alternative.url/checkin"; 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kAlternativeMCSHostname[] = "alternative.gcm.host"; 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kAlternativeMCSSecurePort = 7777; 180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char kAlternativeRegistrationURL[] = 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "http://alternative.url/registration"; 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int64 kDefaultCheckinInterval = 2 * 24 * 60 * 60; // seconds = 2 days. 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char kDefaultCheckinURL[] = "https://android.clients.google.com/checkin"; 230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char kDefaultRegistrationURL[] = 240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "https://android.clients.google.com/c2dm/register3"; 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kDefaultSettingsDigest[] = 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "1-da39a3ee5e6b4b0d3255bfef95601890afd80709"; 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kAlternativeSettingsDigest[] = 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "1-7da4aa4eb38a8bd3e330e3751cc0899924499134"; 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AddSettingsToResponse( 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) checkin_proto::AndroidCheckinResponse& checkin_response, 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GServicesSettings::SettingsMap& settings, 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool settings_diff) { 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (GServicesSettings::SettingsMap::const_iterator iter = settings.begin(); 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iter != settings.end(); 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++iter) { 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) checkin_proto::GservicesSetting* setting = checkin_response.add_setting(); 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) setting->set_name(iter->first); 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) setting->set_value(iter->second); 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) checkin_response.set_settings_diff(settings_diff); 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass GServicesSettingsTest : public testing::Test { 470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public: 480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GServicesSettingsTest(); 490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual ~GServicesSettingsTest(); 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void CheckAllSetToDefault(); 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GServicesSettings& settings() { 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return gservices_settings_; 550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private: 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GServicesSettings gservices_settings_; 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 610529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochGServicesSettingsTest::GServicesSettingsTest() 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : gservices_settings_() { 630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 650529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochGServicesSettingsTest::~GServicesSettingsTest() {} 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid GServicesSettingsTest::CheckAllSetToDefault() { 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval), 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetCheckinInterval()); 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL()); 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://mtalk.google.com:5228"), 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSMainEndpoint()); 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://mtalk.google.com:443"), 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSFallbackEndpoint()); 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL()); 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Verifies default values of the G-services settings and settings digest. 790529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(GServicesSettingsTest, DefaultSettingsAndDigest) { 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CheckAllSetToDefault(); 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(kDefaultSettingsDigest, settings().digest()); 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(kDefaultSettingsDigest, 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GServicesSettings::CalculateDigest(settings().settings_map())); 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies digest calculation for the sample provided by protocol owners. 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, CalculateDigest) { 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GServicesSettings::SettingsMap settings_map; 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings_map["android_id"] = "55XXXXXXXXXXXXXXXX0"; 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings_map["checkin_interval"] = "86400"; 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings_map["checkin_url"] = 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "https://fake.address.google.com/canary/checkin"; 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings_map["chrome_device"] = "1"; 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings_map["device_country"] = "us"; 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings_map["gcm_hostname"] = "fake.address.google.com"; 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings_map["gcm_secure_port"] = "443"; 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ("1-33381ccd1cf5791dc0e6dfa234266fa9f1259197", 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GServicesSettings::CalculateDigest(settings_map)); 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Verifies that settings are not updated when load result is empty. 1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(GServicesSettingsTest, UpdateFromEmptyLoadResult) { 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GCMStore::LoadResult result; 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result.gservices_digest = ""; 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu settings().UpdateFromLoadResult(result); 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CheckAllSetToDefault(); 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(kDefaultSettingsDigest, settings().digest()); 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that settings are not when digest value does not match. 1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(GServicesSettingsTest, UpdateFromLoadResultWithSettingMissing) { 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GCMStore::LoadResult result; 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result.gservices_settings["checkin_internval"] = "100000"; 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result.gservices_digest = "digest_value"; 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu settings().UpdateFromLoadResult(result); 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CheckAllSetToDefault(); 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(kDefaultSettingsDigest, settings().digest()); 1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Verifies that the settings are set correctly based on the load result. 1240529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(GServicesSettingsTest, UpdateFromLoadResult) { 1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GCMStore::LoadResult result; 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result.gservices_settings["checkin_interval"] = 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Int64ToString(kAlternativeCheckinInterval); 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result.gservices_settings["checkin_url"] = kAlternativeCheckinURL; 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result.gservices_settings["gcm_hostname"] = kAlternativeMCSHostname; 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result.gservices_settings["gcm_secure_port"] = 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::IntToString(kAlternativeMCSSecurePort); 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result.gservices_settings["gcm_registration_url"] = 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kAlternativeRegistrationURL; 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result.gservices_digest = kAlternativeSettingsDigest; 1350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch settings().UpdateFromLoadResult(result); 1360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(base::TimeDelta::FromSeconds(kAlternativeCheckinInterval), 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetCheckinInterval()); 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL(kAlternativeCheckinURL), settings().GetCheckinURL()); 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://alternative.gcm.host:7777"), 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSMainEndpoint()); 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://alternative.gcm.host:443"), 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSFallbackEndpoint()); 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL(kAlternativeRegistrationURL), settings().GetRegistrationURL()); 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GServicesSettings::CalculateDigest(result.gservices_settings), 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().digest()); 1470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that the checkin interval is updated to minimum if the original 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// value is less than minimum. 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, CheckinResponseMinimumCheckinInterval) { 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Setting the checkin interval to less than minimum. 1530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch checkin_proto::AndroidCheckinResponse checkin_response; 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GServicesSettings::SettingsMap new_settings; 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_settings["checkin_interval"] = "3600"; 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddSettingsToResponse(checkin_response, new_settings, false); 1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); 1590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GServicesSettings::MinimumCheckinInterval(), 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetCheckinInterval()); 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings), 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().digest()); 1640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that default checkin interval can be selectively overwritten. 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, CheckinResponseUpdateCheckinInterval) { 1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu checkin_proto::AndroidCheckinResponse checkin_response; 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GServicesSettings::SettingsMap new_settings; 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_settings["checkin_interval"] = "86400"; 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddSettingsToResponse(checkin_response, new_settings, false); 1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Only the checkin interval was updated: 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(base::TimeDelta::FromSeconds(86400), 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetCheckinInterval()); 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Other settings still set to default. 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://mtalk.google.com:5228"), 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSMainEndpoint()); 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://mtalk.google.com:443"), 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSFallbackEndpoint()); 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL()); 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL()); 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings), 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().digest()); 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that default registration URL can be selectively overwritten. 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, CheckinResponseUpdateRegistrationURL) { 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) checkin_proto::AndroidCheckinResponse checkin_response; 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GServicesSettings::SettingsMap new_settings; 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_settings["gcm_registration_url"] = "https://new.registration.url"; 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddSettingsToResponse(checkin_response, new_settings, false); 1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); 1995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Only the registration URL was updated: 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://new.registration.url"), 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetRegistrationURL()); 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Other settings still set to default. 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval), 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetCheckinInterval()); 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://mtalk.google.com:5228"), 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSMainEndpoint()); 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://mtalk.google.com:443"), 210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSFallbackEndpoint()); 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL()); 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings), 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().digest()); 2155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that default checkin URL can be selectively overwritten. 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, CheckinResponseUpdateCheckinURL) { 2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu checkin_proto::AndroidCheckinResponse checkin_response; 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GServicesSettings::SettingsMap new_settings; 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_settings["checkin_url"] = "https://new.checkin.url"; 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddSettingsToResponse(checkin_response, new_settings, false); 2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); 2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Only the checkin URL was updated: 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://new.checkin.url"), settings().GetCheckinURL()); 2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Other settings still set to default. 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval), 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetCheckinInterval()); 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://mtalk.google.com:5228"), 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSMainEndpoint()); 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://mtalk.google.com:443"), 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSFallbackEndpoint()); 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL()); 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings), 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().digest()); 2405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that default MCS hostname can be selectively overwritten. 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, CheckinResponseUpdateMCSHostname) { 2440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch checkin_proto::AndroidCheckinResponse checkin_response; 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GServicesSettings::SettingsMap new_settings; 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_settings["gcm_hostname"] = "new.gcm.hostname"; 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddSettingsToResponse(checkin_response, new_settings, false); 2480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); 2500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Only the MCS endpoints were updated: 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://new.gcm.hostname:5228"), 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSMainEndpoint()); 254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://new.gcm.hostname:443"), 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSFallbackEndpoint()); 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Other settings still set to default. 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval), 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetCheckinInterval()); 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL()); 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL()); 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings), 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().digest()); 2650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that default MCS secure port can be selectively overwritten. 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, CheckinResponseUpdateMCSSecurePort) { 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) checkin_proto::AndroidCheckinResponse checkin_response; 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GServicesSettings::SettingsMap new_settings; 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_settings["gcm_secure_port"] = "5229"; 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddSettingsToResponse(checkin_response, new_settings, false); 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Only the main MCS endpoint was updated: 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://mtalk.google.com:5229"), 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSMainEndpoint()); 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Other settings still set to default. 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval), 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetCheckinInterval()); 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL(kDefaultCheckinURL), settings().GetCheckinURL()); 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://mtalk.google.com:443"), 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSFallbackEndpoint()); 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().GetRegistrationURL()); 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GServicesSettings::CalculateDigest(new_settings), 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().digest()); 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Update from checkin response should also do incremental update for both cases 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// where some settings are removed or added. 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseSettingsDiff) { 2950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch checkin_proto::AndroidCheckinResponse checkin_response; 2960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Only the new settings will be included in the response with settings diff. 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GServicesSettings::SettingsMap settings_diff; 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings_diff["new_setting_1"] = "new_setting_1_value"; 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings_diff["new_setting_2"] = "new_setting_2_value"; 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings_diff["gcm_secure_port"] = "5229"; 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Full settings are necessary to calculate digest. 304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GServicesSettings::SettingsMap full_settings(settings_diff); 305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string digest = GServicesSettings::CalculateDigest(full_settings); 306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) checkin_response.Clear(); 308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddSettingsToResponse(checkin_response, settings_diff, true); 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); 310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(full_settings, settings().settings_map()); 311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Default setting overwritten by settings diff. 312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://mtalk.google.com:5229"), 313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSMainEndpoint()); 314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Setting up diff removing some of the values (including default setting). 316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings_diff.clear(); 317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings_diff["delete_new_setting_1"] = ""; 318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings_diff["delete_gcm_secure_port"] = ""; 319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings_diff["new_setting_3"] = "new_setting_3_value"; 320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Updating full settings to calculate digest. 322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) full_settings.erase(full_settings.find("new_setting_1")); 323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) full_settings.erase(full_settings.find("gcm_secure_port")); 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) full_settings["new_setting_3"] = "new_setting_3_value"; 325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) digest = GServicesSettings::CalculateDigest(full_settings); 326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) checkin_response.Clear(); 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddSettingsToResponse(checkin_response, settings_diff, true); 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response)); 330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(full_settings, settings().settings_map()); 331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Default setting back to norm. 332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GURL("https://mtalk.google.com:5228"), 333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) settings().GetMCSMainEndpoint()); 3340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 3350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace gcm 337