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

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: Addressing Jian Li's CR comments. 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..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

Powered by Google App Engine
This is Rietveld 408576698