1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/strings/string_number_conversions.h"
6 #include "google_apis/gcm/engine/gservices_settings.h"
7 #include "google_apis/gcm/engine/registration_info.h"
8 #include "google_apis/gcm/gcm_client.h"
9 #include "testing/gtest/include/gtest/gtest.h"
15 const int64 kAlternativeCheckinInterval = 16 * 60 * 60;
16 const char kAlternativeCheckinURL[] = "http://alternative.url/checkin";
17 const char kAlternativeMCSHostname[] = "http://alternative.gcm.host";
18 const int kAlternativeMCSSecurePort = 443;
19 const char kAlternativeRegistrationURL[] =
20 "http://alternative.url/registration";
22 const int64 kDefaultCheckinInterval = 2 * 24 * 60 * 60; // seconds = 2 days.
23 const char kDefaultCheckinURL[] = "https://android.clients.google.com/checkin";
24 const char kDefaultMCSHostname[] = "https://mtalk.google.com";
25 const int kDefaultMCSSecurePort = 5228;
26 const char kDefaultRegistrationURL[] =
27 "https://android.clients.google.com/c2dm/register3";
31 class GServicesSettingsTest : public testing::Test {
33 GServicesSettingsTest();
34 virtual ~GServicesSettingsTest();
36 virtual void SetUp() OVERRIDE;
38 void CheckAllSetToDefault();
39 void CheckAllSetToAlternative();
40 void SetWithAlternativeSettings(
41 checkin_proto::AndroidCheckinResponse& checkin_response);
43 GServicesSettings& settings() {
44 return gserivces_settings_;
47 const std::map<std::string, std::string>& alternative_settings() {
48 return alternative_settings_;
51 std::map<std::string, std::string> alternative_settings_;
54 GServicesSettings gserivces_settings_;
57 GServicesSettingsTest::GServicesSettingsTest()
58 : gserivces_settings_() {
61 GServicesSettingsTest::~GServicesSettingsTest() {}
63 void GServicesSettingsTest::SetUp() {
64 alternative_settings_["checkin_interval"] =
65 base::Int64ToString(kAlternativeCheckinInterval);
66 alternative_settings_["checkin_url"] = kAlternativeCheckinURL;
67 alternative_settings_["gcm_hostname"] = kAlternativeMCSHostname;
68 alternative_settings_["gcm_secure_port"] =
69 base::IntToString(kAlternativeMCSSecurePort);
70 alternative_settings_["gcm_registration_url"] = kAlternativeRegistrationURL;
73 void GServicesSettingsTest::CheckAllSetToDefault() {
74 EXPECT_EQ(base::TimeDelta::FromSeconds(kDefaultCheckinInterval),
75 settings().checkin_interval());
76 EXPECT_EQ(GURL(kDefaultCheckinURL), settings().checkin_url());
77 EXPECT_EQ(kDefaultMCSHostname, settings().mcs_hostname());
78 EXPECT_EQ(kDefaultMCSSecurePort, settings().mcs_secure_port());
79 EXPECT_EQ(GURL(kDefaultRegistrationURL), settings().registration_url());
82 void GServicesSettingsTest::CheckAllSetToAlternative() {
83 EXPECT_EQ(base::TimeDelta::FromSeconds(kAlternativeCheckinInterval),
84 settings().checkin_interval());
85 EXPECT_EQ(GURL(kAlternativeCheckinURL), settings().checkin_url());
86 EXPECT_EQ(kAlternativeMCSHostname, settings().mcs_hostname());
87 EXPECT_EQ(kAlternativeMCSSecurePort, settings().mcs_secure_port());
88 EXPECT_EQ(GURL(kAlternativeRegistrationURL), settings().registration_url());
91 void GServicesSettingsTest::SetWithAlternativeSettings(
92 checkin_proto::AndroidCheckinResponse& checkin_response) {
93 for (std::map<std::string, std::string>::const_iterator iter =
94 alternative_settings_.begin();
95 iter != alternative_settings_.end(); ++iter) {
96 checkin_proto::GservicesSetting* setting = checkin_response.add_setting();
97 setting->set_name(iter->first);
98 setting->set_value(iter->second);
102 // Verifies default values of the G-services settings and settings digest.
103 TEST_F(GServicesSettingsTest, DefaultSettingsAndDigest) {
104 CheckAllSetToDefault();
105 EXPECT_EQ(std::string(), settings().digest());
108 // Verifies that settings are not updated when load result is empty.
109 TEST_F(GServicesSettingsTest, UpdateFromEmptyLoadResult) {
110 GCMStore::LoadResult result;
111 result.gservices_digest = "digest_value";
112 settings().UpdateFromLoadResult(result);
114 CheckAllSetToDefault();
115 EXPECT_EQ(std::string(), settings().digest());
118 // Verifies that settings are not updated when one of them is missing.
119 TEST_F(GServicesSettingsTest, UpdateFromLoadResultWithSettingMissing) {
120 GCMStore::LoadResult result;
121 result.gservices_settings = alternative_settings();
122 result.gservices_digest = "digest_value";
123 result.gservices_settings.erase("gcm_hostname");
124 settings().UpdateFromLoadResult(result);
126 CheckAllSetToDefault();
127 EXPECT_EQ(std::string(), settings().digest());
130 // Verifies that the settings are set correctly based on the load result.
131 TEST_F(GServicesSettingsTest, UpdateFromLoadResult) {
132 GCMStore::LoadResult result;
133 result.gservices_settings = alternative_settings();
134 result.gservices_digest = "digest_value";
135 settings().UpdateFromLoadResult(result);
137 CheckAllSetToAlternative();
138 EXPECT_EQ("digest_value", settings().digest());
141 // Verifies that the settings are set correctly after parsing a checkin
143 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponse) {
144 checkin_proto::AndroidCheckinResponse checkin_response;
146 checkin_response.set_digest("digest_value");
147 SetWithAlternativeSettings(checkin_response);
149 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
151 CheckAllSetToAlternative();
152 EXPECT_EQ(alternative_settings_, settings().GetSettingsMap());
153 EXPECT_EQ("digest_value", settings().digest());
156 // Verifies that the checkin interval is updated to minimum if the original
157 // value is less than minimum.
158 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseMinimumCheckinInterval) {
159 checkin_proto::AndroidCheckinResponse checkin_response;
161 checkin_response.set_digest("digest_value");
162 // Setting the checkin interval to less than minimum.
163 alternative_settings_["checkin_interval"] = base::IntToString(3600);
164 SetWithAlternativeSettings(checkin_response);
166 EXPECT_TRUE(settings().UpdateFromCheckinResponse(checkin_response));
168 EXPECT_EQ(GServicesSettings::MinimumCheckinInterval(),
169 settings().checkin_interval());
170 EXPECT_EQ("digest_value", settings().digest());
173 // Verifies that settings are not updated when one of them is missing.
174 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseWithSettingMissing) {
175 checkin_proto::AndroidCheckinResponse checkin_response;
177 checkin_response.set_digest("digest_value");
178 alternative_settings_.erase("gcm_hostname");
179 SetWithAlternativeSettings(checkin_response);
181 EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response));
183 CheckAllSetToDefault();
184 EXPECT_EQ(std::string(), settings().digest());
187 // Verifies that no update is done, when a checkin response misses digest.
188 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseNoDigest) {
189 checkin_proto::AndroidCheckinResponse checkin_response;
191 SetWithAlternativeSettings(checkin_response);
192 EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response));
194 CheckAllSetToDefault();
195 EXPECT_EQ(std::string(), settings().digest());
198 // Verifies that no update is done, when a checkin response digest is the same.
199 TEST_F(GServicesSettingsTest, UpdateFromCheckinResponseSameDigest) {
200 GCMStore::LoadResult load_result;
201 load_result.gservices_digest = "old_digest";
202 load_result.gservices_settings = alternative_settings();
203 settings().UpdateFromLoadResult(load_result);
205 checkin_proto::AndroidCheckinResponse checkin_response;
206 checkin_response.set_digest("old_digest");
207 SetWithAlternativeSettings(checkin_response);
208 EXPECT_FALSE(settings().UpdateFromCheckinResponse(checkin_response));
210 CheckAllSetToAlternative();
211 EXPECT_EQ("old_digest", settings().digest());