blob: 1cce59a6c3a0dc9b6c31bc46191448e3a5374782 [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/invalidation/invalidation_service_android.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/invalidation/invalidation_controller_android.h"
#include "chrome/test/base/testing_profile.h"
#include "components/invalidation/fake_invalidation_handler.h"
#include "components/invalidation/invalidation_service_test_template.h"
#include "content/public/browser/notification_service.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace invalidation {
class MockInvalidationControllerAndroid : public InvalidationControllerAndroid {
public:
MockInvalidationControllerAndroid() {}
virtual ~MockInvalidationControllerAndroid() {}
virtual void SetRegisteredObjectIds(const syncer::ObjectIdSet& ids) OVERRIDE {
registered_ids_ = ids;
}
syncer::ObjectIdSet registered_ids_;
};
class InvalidationServiceAndroidTestDelegate {
public:
InvalidationServiceAndroidTestDelegate() {}
~InvalidationServiceAndroidTestDelegate() {}
void CreateInvalidationService() {
profile_.reset(new TestingProfile());
invalidation_service_android_.reset(
new InvalidationServiceAndroid(
profile_.get(),
new MockInvalidationControllerAndroid()));
}
InvalidationService* GetInvalidationService() {
return invalidation_service_android_.get();
}
void DestroyInvalidationService() {
invalidation_service_android_.reset();
}
void TriggerOnInvalidatorStateChange(syncer::InvalidatorState state) {
invalidation_service_android_->TriggerStateChangeForTest(state);
}
void TriggerOnIncomingInvalidation(
const syncer::ObjectIdInvalidationMap& invalidation_map) {
content::NotificationService::current()->Notify(
chrome::NOTIFICATION_SYNC_REFRESH_REMOTE,
content::Source<Profile>(profile_.get()),
content::Details<const syncer::ObjectIdInvalidationMap>(
&invalidation_map));
}
scoped_ptr<TestingProfile> profile_;
scoped_ptr<InvalidationServiceAndroid> invalidation_service_android_;
};
INSTANTIATE_TYPED_TEST_CASE_P(
AndroidInvalidationServiceTest, InvalidationServiceTest,
InvalidationServiceAndroidTestDelegate);
class InvalidationServiceAndroidRegistrationTest : public testing::Test {
protected:
InvalidationServiceAndroidRegistrationTest()
: invalidation_controller_(new MockInvalidationControllerAndroid()),
invalidation_service_(&profile_, invalidation_controller_) {}
virtual ~InvalidationServiceAndroidRegistrationTest() {}
// Get the invalidation service being tested.
InvalidationService& invalidation_service() {
return invalidation_service_;
}
// Get the number of objects which are registered.
size_t RegisteredObjectCount() {
return registered_ids().size();
}
// Determines if the given object id is registered with the invalidation
// controller.
bool IsRegistered(const invalidation::ObjectId& id) {
return registered_ids().find(id) != registered_ids().end();
}
private:
// Get the set of objects registered with the invalidation controller.
const syncer::ObjectIdSet& registered_ids() {
return invalidation_controller_->registered_ids_;
}
TestingProfile profile_;
MockInvalidationControllerAndroid* invalidation_controller_;
InvalidationServiceAndroid invalidation_service_;
};
TEST_F(InvalidationServiceAndroidRegistrationTest, NoObjectRegistration) {
syncer::FakeInvalidationHandler handler;
invalidation_service().RegisterInvalidationHandler(&handler);
EXPECT_EQ(0U, RegisteredObjectCount());
invalidation_service().UnregisterInvalidationHandler(&handler);
}
TEST_F(InvalidationServiceAndroidRegistrationTest, UpdateObjectRegistration) {
syncer::FakeInvalidationHandler handler;
invalidation::ObjectId id1(1, "A");
invalidation::ObjectId id2(2, "B");
syncer::ObjectIdSet ids;
invalidation_service().RegisterInvalidationHandler(&handler);
// Register for both objects.
ids.insert(id1);
ids.insert(id2);
invalidation_service().UpdateRegisteredInvalidationIds(&handler, ids);
EXPECT_EQ(2U, RegisteredObjectCount());
EXPECT_TRUE(IsRegistered(id1));
EXPECT_TRUE(IsRegistered(id2));
// Unregister for object 2.
ids.erase(id2);
invalidation_service().UpdateRegisteredInvalidationIds(&handler, ids);
EXPECT_EQ(1U, RegisteredObjectCount());
EXPECT_TRUE(IsRegistered(id1));
// Unregister for object 1.
ids.erase(id1);
invalidation_service().UpdateRegisteredInvalidationIds(&handler, ids);
EXPECT_EQ(0U, RegisteredObjectCount());
invalidation_service().UnregisterInvalidationHandler(&handler);
}
#if defined(OS_ANDROID)
class InvalidationServiceAndroidTest : public testing::Test {
public:
InvalidationServiceAndroidTest()
: invalidation_service_(&profile_, new InvalidationControllerAndroid()) {}
virtual ~InvalidationServiceAndroidTest() {}
InvalidationService& invalidation_service() {
return invalidation_service_;
}
private:
TestingProfile profile_;
InvalidationServiceAndroid invalidation_service_;
};
TEST_F(InvalidationServiceAndroidTest, FetchClientId) {
const std::string id1 = invalidation_service().GetInvalidatorClientId();
ASSERT_FALSE(id1.empty());
// If nothing else, the ID should be consistent.
const std::string id2 = invalidation_service().GetInvalidatorClientId();
ASSERT_EQ(id1, id2);
}
#endif
} // namespace invalidation