#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
-#include "components/os_crypt/os_crypt_switches.h"
+#include "google_apis/gcm/base/fake_encryptor.h"
#include "google_apis/gcm/base/mcs_message.h"
#include "google_apis/gcm/base/mcs_util.h"
#include "google_apis/gcm/protocol/mcs.pb.h"
GCMStoreImplTest();
virtual ~GCMStoreImplTest();
- virtual void SetUp() OVERRIDE;
-
scoped_ptr<GCMStore> BuildGCMStore();
std::string GetNextPersistentId();
GCMStoreImplTest::~GCMStoreImplTest() {}
-void GCMStoreImplTest::SetUp() {
- testing::Test::SetUp();
-#if defined(OS_MACOSX)
- base::CommandLine::ForCurrentProcess()->AppendSwitch(
- os_crypt::switches::kUseMockKeychain);
-#endif // OS_MACOSX
-}
-
scoped_ptr<GCMStore> GCMStoreImplTest::BuildGCMStore() {
return scoped_ptr<GCMStore>(new GCMStoreImpl(
temp_directory_.path(),
- message_loop_.message_loop_proxy()));
+ message_loop_.message_loop_proxy(),
+ make_scoped_ptr<Encryptor>(new FakeEncryptor)));
}
std::string GCMStoreImplTest::GetNextPersistentId() {
ASSERT_EQ(kDeviceToken, load_result->device_security_token);
}
-TEST_F(GCMStoreImplTest, LastCheckinTime) {
+TEST_F(GCMStoreImplTest, LastCheckinInfo) {
scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
scoped_ptr<GCMStore::LoadResult> load_result;
gcm_store->Load(base::Bind(
PumpLoop();
base::Time last_checkin_time = base::Time::Now();
+ std::set<std::string> accounts;
+ accounts.insert("test_user1@gmail.com");
+ accounts.insert("test_user2@gmail.com");
- gcm_store->SetLastCheckinTime(
+ gcm_store->SetLastCheckinInfo(
last_checkin_time,
+ accounts,
base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
PumpLoop();
&GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
PumpLoop();
ASSERT_EQ(last_checkin_time, load_result->last_checkin_time);
+ ASSERT_EQ(accounts, load_result->last_checkin_accounts);
}
TEST_F(GCMStoreImplTest, GServicesSettings_ProtocolV2) {
load_result->registrations["app2"]->sender_ids[0]);
EXPECT_EQ(registration2->sender_ids[1],
load_result->registrations["app2"]->sender_ids[1]);
+
+ gcm_store->RemoveRegistration(
+ "app2",
+ base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
+ PumpLoop();
+
+ gcm_store = BuildGCMStore().Pass();
+ gcm_store->Load(base::Bind(
+ &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
+ PumpLoop();
+
+ ASSERT_EQ(1u, load_result->registrations.size());
+ ASSERT_TRUE(load_result->registrations.find("app1") !=
+ load_result->registrations.end());
+ EXPECT_EQ(registration1->registration_id,
+ load_result->registrations["app1"]->registration_id);
+ ASSERT_EQ(1u, load_result->registrations["app1"]->sender_ids.size());
+ EXPECT_EQ(registration1->sender_ids[0],
+ load_result->registrations["app1"]->sender_ids[0]);
}
// Verify saving some incoming messages, reopening the directory, and then
}
}
+TEST_F(GCMStoreImplTest, AccountMapping) {
+ scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
+ scoped_ptr<GCMStore::LoadResult> load_result;
+ gcm_store->Load(base::Bind(
+ &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
+
+ // Add account mappings.
+ AccountMapping account_mapping1;
+ account_mapping1.account_id = "account_id_1";
+ account_mapping1.email = "account_id_1@gmail.com";
+ account_mapping1.access_token = "account_token1";
+ account_mapping1.status = AccountMapping::ADDING;
+ account_mapping1.status_change_timestamp = base::Time();
+ account_mapping1.last_message_type = AccountMapping::MSG_ADD;
+ account_mapping1.last_message_id = "message_1";
+
+ AccountMapping account_mapping2;
+ account_mapping2.account_id = "account_id_2";
+ account_mapping2.email = "account_id_2@gmail.com";
+ account_mapping2.access_token = "account_token1";
+ account_mapping2.status = AccountMapping::REMOVING;
+ account_mapping2.status_change_timestamp =
+ base::Time::FromInternalValue(1305734521259935LL);
+ account_mapping2.last_message_type = AccountMapping::MSG_REMOVE;
+ account_mapping2.last_message_id = "message_2";
+
+ gcm_store->AddAccountMapping(
+ account_mapping1,
+ base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
+ PumpLoop();
+ gcm_store->AddAccountMapping(
+ account_mapping2,
+ base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
+ PumpLoop();
+
+ gcm_store = BuildGCMStore().Pass();
+ gcm_store->Load(base::Bind(
+ &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
+ PumpLoop();
+
+ EXPECT_EQ(2UL, load_result->account_mappings.size());
+ GCMStore::AccountMappingMap::iterator iter =
+ load_result->account_mappings.begin();
+ EXPECT_EQ("account_id_1", iter->first);
+ EXPECT_EQ(account_mapping1.account_id, iter->second.account_id);
+ EXPECT_EQ(account_mapping1.email, iter->second.email);
+ EXPECT_TRUE(iter->second.access_token.empty());
+ EXPECT_EQ(AccountMapping::ADDING, iter->second.status);
+ EXPECT_EQ(account_mapping1.status_change_timestamp,
+ iter->second.status_change_timestamp);
+ EXPECT_EQ(account_mapping1.last_message_type, iter->second.last_message_type);
+ EXPECT_EQ(account_mapping1.last_message_id, iter->second.last_message_id);
+ ++iter;
+ EXPECT_EQ("account_id_2", iter->first);
+ EXPECT_EQ(account_mapping2.account_id, iter->second.account_id);
+ EXPECT_EQ(account_mapping2.email, iter->second.email);
+ EXPECT_TRUE(iter->second.access_token.empty());
+ EXPECT_EQ(AccountMapping::REMOVING, iter->second.status);
+ EXPECT_EQ(account_mapping2.status_change_timestamp,
+ iter->second.status_change_timestamp);
+ EXPECT_EQ(account_mapping2.last_message_type, iter->second.last_message_type);
+ EXPECT_EQ(account_mapping2.last_message_id, iter->second.last_message_id);
+
+ gcm_store->RemoveAccountMapping(
+ account_mapping1.account_id,
+ base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
+ PumpLoop();
+
+ gcm_store = BuildGCMStore().Pass();
+ gcm_store->Load(base::Bind(
+ &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
+ PumpLoop();
+
+ EXPECT_EQ(1UL, load_result->account_mappings.size());
+ iter = load_result->account_mappings.begin();
+ EXPECT_EQ("account_id_2", iter->first);
+ EXPECT_EQ(account_mapping2.account_id, iter->second.account_id);
+ EXPECT_EQ(account_mapping2.email, iter->second.email);
+ EXPECT_TRUE(iter->second.access_token.empty());
+ EXPECT_EQ(AccountMapping::REMOVING, iter->second.status);
+ EXPECT_EQ(account_mapping2.status_change_timestamp,
+ iter->second.status_change_timestamp);
+ EXPECT_EQ(account_mapping2.last_message_type, iter->second.last_message_type);
+ EXPECT_EQ(account_mapping2.last_message_id, iter->second.last_message_id);
+}
+
// When the database is destroyed, all database updates should fail. At the
// same time, they per-app message counts should not go up, as failures should
// result in decrementing the counts.