Index: google_apis/gcm/gcm_client_impl_unittest.cc |
diff --git a/google_apis/gcm/gcm_client_impl_unittest.cc b/google_apis/gcm/gcm_client_impl_unittest.cc |
index 229feab49888790de8203e40bd22f7a01b41abb1..d1eb54637d90ab113c4c1205f29511261e2c993d 100644 |
--- a/google_apis/gcm/gcm_client_impl_unittest.cc |
+++ b/google_apis/gcm/gcm_client_impl_unittest.cc |
@@ -7,6 +7,7 @@ |
#include "base/files/scoped_temp_dir.h" |
#include "base/message_loop/message_loop.h" |
#include "base/run_loop.h" |
+#include "base/strings/string_number_conversions.h" |
#include "base/test/simple_test_clock.h" |
#include "components/os_crypt/os_crypt.h" |
#include "google_apis/gcm/base/mcs_message.h" |
@@ -37,6 +38,8 @@ enum LastEvent { |
const uint64 kDeviceAndroidId = 54321; |
const uint64 kDeviceSecurityToken = 12345; |
+const int64 kSettingsCheckinInterval = 3600; |
+const char kSettingsDefaultDigest[] = "default_digest"; |
const char kAppId[] = "app_id"; |
const char kSender[] = "project_id"; |
const char kSender2[] = "project_id2"; |
@@ -155,6 +158,25 @@ scoped_ptr<ConnectionFactory> FakeGCMInternalsBuilder::BuildConnectionFactory( |
return make_scoped_ptr<ConnectionFactory>(new FakeConnectionFactory()); |
} |
+class CheckinGCMClientImpl : public GCMClientImpl { |
+ public: |
+ CheckinGCMClientImpl(scoped_ptr<GCMInternalsBuilder> internals_builder); |
Nicolas Zea
2014/04/01 21:42:14
explicit
fgorski
2014/04/02 18:23:00
Done.
|
+ virtual ~CheckinGCMClientImpl(); |
+ |
+ virtual base::TimeDelta GetCheckinInterval() const OVERRIDE; |
Nicolas Zea
2014/04/01 21:42:14
How important is it to override this? I think I'd
fgorski
2014/04/02 18:23:00
Done.
|
+}; |
+ |
+CheckinGCMClientImpl::CheckinGCMClientImpl( |
+ scoped_ptr<GCMInternalsBuilder> internals_builder) |
+ : GCMClientImpl(internals_builder.Pass()) { |
+} |
+ |
+CheckinGCMClientImpl::~CheckinGCMClientImpl() { } |
+ |
+base::TimeDelta CheckinGCMClientImpl::GetCheckinInterval() const { |
+ return base::TimeDelta::FromMilliseconds(10); |
+} |
+ |
} // namespace |
class GCMClientImplTest : public testing::Test, |
@@ -168,7 +190,11 @@ class GCMClientImplTest : public testing::Test, |
void BuildGCMClient(); |
void InitializeGCMClient(); |
void ReceiveMessageFromMCS(const MCSMessage& message); |
- void CompleteCheckin(uint64 android_id, uint64 security_token); |
+ void CompleteCheckin( |
+ uint64 android_id, |
+ uint64 security_token, |
+ const std::string& digest, |
+ const std::map<std::string, std::string>& settings); |
void CompleteRegistration(const std::string& registration_id); |
void CompleteUnregistration(const std::string& app_id); |
@@ -202,6 +228,12 @@ class GCMClientImplTest : public testing::Test, |
ConnectionFactory* connection_factory() const { |
return gcm_client_->connection_factory_.get(); |
} |
+ GServicesSettingsMap& services_settings() { |
+ return gcm_client_->gservices_settings_; |
+ } |
+ const std::string& services_digest() { |
+ return gcm_client_->gservices_digest_; |
+ } |
void reset_last_event() { |
last_event_ = NONE; |
@@ -227,16 +259,21 @@ class GCMClientImplTest : public testing::Test, |
int64 CurrentTime(); |
- private: |
+ protected: |
// Tooling. |
void PumpLoop(); |
void PumpLoopUntilIdle(); |
void QuitLoop(); |
+ void ResetLoop(); |
+ |
+ bool CreateUniqueTempDir(); |
base::SimpleTestClock* clock() const { |
return reinterpret_cast<base::SimpleTestClock*>(gcm_client_->clock_.get()); |
} |
+ scoped_ptr<GCMClientImpl> gcm_client_; |
Nicolas Zea
2014/04/01 21:42:14
this is already exposed via gcm_client(). Is is ne
fgorski
2014/04/02 18:23:00
Done.
|
+ private: |
// Variables used for verification. |
LastEvent last_event_; |
std::string last_app_id_; |
@@ -246,7 +283,6 @@ class GCMClientImplTest : public testing::Test, |
GCMClient::IncomingMessage last_message_; |
GCMClient::SendErrorDetails last_error_details_; |
- scoped_ptr<GCMClientImpl> gcm_client_; |
base::MessageLoop message_loop_; |
scoped_ptr<base::RunLoop> run_loop_; |
@@ -267,11 +303,14 @@ GCMClientImplTest::GCMClientImplTest() |
GCMClientImplTest::~GCMClientImplTest() {} |
void GCMClientImplTest::SetUp() { |
- ASSERT_TRUE(temp_directory_.CreateUniqueTempDir()); |
- run_loop_.reset(new base::RunLoop); |
+ ASSERT_TRUE(CreateUniqueTempDir()); |
+ ResetLoop(); |
BuildGCMClient(); |
InitializeGCMClient(); |
- CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken); |
+ CompleteCheckin(kDeviceAndroidId, |
+ kDeviceSecurityToken, |
+ kSettingsDefaultDigest, |
+ std::map<std::string, std::string>()); |
} |
void GCMClientImplTest::PumpLoop() { |
@@ -289,18 +328,38 @@ void GCMClientImplTest::QuitLoop() { |
run_loop_->Quit(); |
} |
+void GCMClientImplTest::ResetLoop() { |
+ run_loop_.reset(new base::RunLoop); |
+} |
+ |
+bool GCMClientImplTest::CreateUniqueTempDir() { |
+ return temp_directory_.CreateUniqueTempDir(); |
+} |
+ |
void GCMClientImplTest::BuildGCMClient() { |
gcm_client_.reset(new GCMClientImpl( |
make_scoped_ptr<GCMInternalsBuilder>(new FakeGCMInternalsBuilder()))); |
} |
-void GCMClientImplTest::CompleteCheckin(uint64 android_id, |
- uint64 security_token) { |
+void GCMClientImplTest::CompleteCheckin( |
+ uint64 android_id, |
+ uint64 security_token, |
+ const std::string& digest, |
+ const std::map<std::string, std::string>& settings) { |
checkin_proto::AndroidCheckinResponse response; |
response.set_stats_ok(true); |
response.set_android_id(android_id); |
response.set_security_token(security_token); |
+ // For testing GServices settings. |
+ response.set_digest(digest); |
+ for (std::map<std::string, std::string>::const_iterator it = settings.begin(); |
+ it != settings.end(); ++it) { |
+ checkin_proto::GservicesSetting* setting = response.add_setting(); |
+ setting->set_name(it->first); |
+ setting->set_value(it->second); |
+ } |
+ |
std::string response_string; |
response.SerializeToString(&response_string); |
@@ -595,4 +654,94 @@ TEST_F(GCMClientImplTest, SendMessage) { |
mcs_client()->last_data_message_stanza().app_data(0).value()); |
} |
+class GCMClientImplCheckinTest : public GCMClientImplTest { |
+ public: |
+ GCMClientImplCheckinTest(); |
+ virtual ~GCMClientImplCheckinTest(); |
+ |
+ virtual void SetUp() OVERRIDE; |
+ |
+ std::map<std::string, std::string> GenerateSettings(int64 checkin_interval); |
Nicolas Zea
2014/04/01 21:42:14
you're always passing in kSettingsCheckinInterval
fgorski
2014/04/02 18:23:00
Done.
|
+ void BuildGCMClient(); |
+}; |
+ |
+GCMClientImplCheckinTest::GCMClientImplCheckinTest() {} |
+ |
+GCMClientImplCheckinTest::~GCMClientImplCheckinTest() {} |
+ |
+void GCMClientImplCheckinTest::SetUp() { |
+ ASSERT_TRUE(CreateUniqueTempDir()); |
+ ResetLoop(); |
+ BuildGCMClient(); |
+ InitializeGCMClient(); |
+} |
+ |
+std::map<std::string, std::string> GCMClientImplCheckinTest::GenerateSettings( |
+ int64 checkin_interval) { |
+ std::map<std::string, std::string> settings; |
+ settings["checkin_interval"] = base::Int64ToString(checkin_interval); |
Nicolas Zea
2014/04/01 21:42:14
nit: pull "checkin_interval" into a const and reus
fgorski
2014/04/02 18:23:00
Done.
|
+ return settings; |
+} |
+ |
+void GCMClientImplCheckinTest::BuildGCMClient() { |
+ gcm_client_.reset(new CheckinGCMClientImpl( |
+ make_scoped_ptr<GCMInternalsBuilder>(new FakeGCMInternalsBuilder()))); |
+} |
+ |
+TEST_F(GCMClientImplCheckinTest, GServicesSettingsAfterInitialCheckin) { |
+ CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken, |
+ kSettingsDefaultDigest, GenerateSettings(kSettingsCheckinInterval)); |
+ EXPECT_EQ(base::Int64ToString(kSettingsCheckinInterval), |
+ services_settings()["checkin_interval"]); |
+} |
+ |
+// This test only checks that periodic checkin happens. |
+TEST_F(GCMClientImplCheckinTest, PeriodicCheckin) { |
+ std::map<std::string, std::string> settings = |
+ GenerateSettings(kSettingsCheckinInterval); |
+ CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken, |
+ kSettingsDefaultDigest, settings); |
+ PumpLoopUntilIdle(); |
+ |
+ CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken, |
+ kSettingsDefaultDigest, settings); |
+ } |
+ |
+// This test checks that checkin can update GServices settings by diffing them. |
+TEST_F(GCMClientImplCheckinTest, GServicesSettingsSameDigest) { |
+ std::map<std::string, std::string> settings = |
+ GenerateSettings(kSettingsCheckinInterval); |
+ settings["checkin_url"] = "http://checkin.google.com"; |
+ CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken, |
+ kSettingsDefaultDigest, settings); |
+ EXPECT_EQ(settings, services_settings()); |
+ PumpLoopUntilIdle(); |
+ |
+ CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken, |
+ kSettingsDefaultDigest, settings); |
+ EXPECT_EQ(settings, services_settings()); |
+} |
+ |
+// Test that checkin can make full replacement of GServices settings. |
+TEST_F(GCMClientImplCheckinTest, GServicesSettingsFullUpdate) { |
+ std::map<std::string, std::string> settings = |
+ GenerateSettings(kSettingsCheckinInterval); |
+ settings["checkin_url"] = "http://checkin.google.com"; |
+ CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken, |
+ kSettingsDefaultDigest, settings); |
+ EXPECT_EQ(settings, services_settings()); |
+ EXPECT_EQ(kSettingsDefaultDigest, services_digest()); |
+ PumpLoopUntilIdle(); |
+ |
+ settings.clear(); |
+ settings["some_settings"] = "on second checkin"; |
+ settings["checkin_interval"] = "2100"; |
+ settings["checkin_url"] = "http://checkin.google.com"; |
+ std::string new_digest = "some_other_digest"; |
+ |
+ CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken, new_digest, settings); |
+ EXPECT_EQ(settings, services_settings()); |
+ EXPECT_EQ(new_digest, services_digest()); |
+} |
+ |
} // namespace gcm |