Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(82)

Unified Diff: google_apis/gcm/gcm_client_impl_unittest.cc

Issue 215363007: [GCM] Adding basic G-services handling (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Adding unit tests and addressing CR feedback Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698