| 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..721ee75ca39be12ce81dfd0792f566d9d2417eec 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,7 @@ enum LastEvent {
|
|
|
| const uint64 kDeviceAndroidId = 54321;
|
| const uint64 kDeviceSecurityToken = 12345;
|
| +const int64 kSettingsCheckinInterval = 3600;
|
| const char kAppId[] = "app_id";
|
| const char kSender[] = "project_id";
|
| const char kSender2[] = "project_id2";
|
| @@ -155,6 +157,25 @@ scoped_ptr<ConnectionFactory> FakeGCMInternalsBuilder::BuildConnectionFactory(
|
| return make_scoped_ptr<ConnectionFactory>(new FakeConnectionFactory());
|
| }
|
|
|
| +class CheckinGCMClientImpl : public GCMClientImpl {
|
| + public:
|
| + CheckinGCMClientImpl(scoped_ptr<GCMInternalsBuilder> internals_builder);
|
| + virtual ~CheckinGCMClientImpl();
|
| +
|
| + virtual base::TimeDelta GetCheckinInterval() OVERRIDE;
|
| +};
|
| +
|
| +CheckinGCMClientImpl::CheckinGCMClientImpl(
|
| + scoped_ptr<GCMInternalsBuilder> internals_builder)
|
| + : GCMClientImpl(internals_builder.Pass()) {
|
| +}
|
| +
|
| +CheckinGCMClientImpl::~CheckinGCMClientImpl() { }
|
| +
|
| +base::TimeDelta CheckinGCMClientImpl::GetCheckinInterval() {
|
| + return base::TimeDelta::FromMilliseconds(10);
|
| +}
|
| +
|
| } // namespace
|
|
|
| class GCMClientImplTest : public testing::Test,
|
| @@ -168,7 +189,10 @@ 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::map<std::string, std::string>& settings);
|
| void CompleteRegistration(const std::string& registration_id);
|
| void CompleteUnregistration(const std::string& app_id);
|
|
|
| @@ -202,6 +226,9 @@ class GCMClientImplTest : public testing::Test,
|
| ConnectionFactory* connection_factory() const {
|
| return gcm_client_->connection_factory_.get();
|
| }
|
| + GServicesSettingsMap& services_settings() {
|
| + return gcm_client_->gservices_settings_;
|
| + }
|
|
|
| void reset_last_event() {
|
| last_event_ = NONE;
|
| @@ -227,16 +254,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_;
|
| + private:
|
| // Variables used for verification.
|
| LastEvent last_event_;
|
| std::string last_app_id_;
|
| @@ -246,7 +278,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 +298,13 @@ 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,
|
| + std::map<std::string, std::string>());
|
| }
|
|
|
| void GCMClientImplTest::PumpLoop() {
|
| @@ -289,18 +322,39 @@ 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::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);
|
|
|
| + std::map<std::string, std::string>::const_iterator it = settings.find("diff");
|
| + response.set_settings_diff(it != settings.end());
|
| +
|
| + for (it = settings.begin(); it != settings.end(); ++it) {
|
| + if (it->first == "diff")
|
| + continue;
|
| + 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 +649,108 @@ 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);
|
| + 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);
|
| + return settings;
|
| +}
|
| +
|
| +void GCMClientImplCheckinTest::BuildGCMClient() {
|
| + gcm_client_.reset(new CheckinGCMClientImpl(
|
| + make_scoped_ptr<GCMInternalsBuilder>(new FakeGCMInternalsBuilder())));
|
| +}
|
| +
|
| +TEST_F(GCMClientImplCheckinTest, GServicesSettingsAfterInitialCheckin) {
|
| + CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken,
|
| + 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, settings);
|
| + PumpLoopUntilIdle();
|
| +
|
| + CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken, settings);
|
| +}
|
| +
|
| +// This test checks that checkin can update GServices settings by diffing them.
|
| +TEST_F(GCMClientImplCheckinTest, GServicesSettingsDiff) {
|
| + std::map<std::string, std::string> settings =
|
| + GenerateSettings(kSettingsCheckinInterval);
|
| + settings["to_be"] = "removed";
|
| + settings["checkin_url"] = "http://checkin.google.com";
|
| + CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken, settings);
|
| + EXPECT_EQ(base::Int64ToString(kSettingsCheckinInterval),
|
| + services_settings()["checkin_interval"]);
|
| + EXPECT_EQ("http://checkin.google.com", services_settings()["checkin_url"]);
|
| + EXPECT_EQ("removed", services_settings()["to_be"]);
|
| + EXPECT_EQ(3U, services_settings().size());
|
| + PumpLoopUntilIdle();
|
| +
|
| + settings.clear();
|
| + settings["diff"] = "";
|
| + settings["checkin_interval"] = "2100";
|
| + settings["delete_to_be"] = "";
|
| + settings["added"] = "on second checkin";
|
| + CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken, settings);
|
| + EXPECT_EQ("2100", services_settings()["checkin_interval"]);
|
| + // this one left untouched
|
| + EXPECT_EQ("http://checkin.google.com", services_settings()["checkin_url"]);
|
| + // this one added just now
|
| + EXPECT_EQ("on second checkin", services_settings()["added"]);
|
| + EXPECT_EQ(3U, services_settings().size());
|
| +}
|
| +
|
| +// Test that checkin can make full replacement of GServices settings.
|
| +TEST_F(GCMClientImplCheckinTest, GServicesSettingsFullUpdate) {
|
| + std::map<std::string, std::string> settings =
|
| + GenerateSettings(kSettingsCheckinInterval);
|
| + settings["to_be"] = "removed";
|
| + settings["checkin_url"] = "http://checkin.google.com";
|
| + CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken, settings);
|
| + EXPECT_EQ(base::Int64ToString(kSettingsCheckinInterval),
|
| + services_settings()["checkin_interval"]);
|
| + EXPECT_EQ("http://checkin.google.com", services_settings()["checkin_url"]);
|
| + EXPECT_EQ("removed", services_settings()["to_be"]);
|
| + EXPECT_EQ(3U, services_settings().size());
|
| + PumpLoopUntilIdle();
|
| +
|
| + settings.clear();
|
| + settings["added"] = "on second checkin";
|
| + settings["checkin_interval"] = "2100";
|
| + settings["checkin_url"] = "http://checkin.google.com";
|
| + CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken, settings);
|
| + EXPECT_EQ("2100", services_settings()["checkin_interval"]);
|
| + EXPECT_EQ("http://checkin.google.com", services_settings()["checkin_url"]);
|
| + EXPECT_EQ("on second checkin", services_settings()["added"]);
|
| + EXPECT_EQ(3U, services_settings().size());
|
| +}
|
| +
|
| } // namespace gcm
|
|
|