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

Unified Diff: chrome/browser/policy/cloud/remote_commands_invalidator_unittest.cc

Issue 1094493003: Initial RemoteCommandsInvalidator (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lkcr
Patch Set: fixes addressing #7 and #8 Created 5 years, 7 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: chrome/browser/policy/cloud/remote_commands_invalidator_unittest.cc
diff --git a/chrome/browser/policy/cloud/remote_commands_invalidator_unittest.cc b/chrome/browser/policy/cloud/remote_commands_invalidator_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..d33a919c6b5dba624ea71f8723a620db1a378c44
--- /dev/null
+++ b/chrome/browser/policy/cloud/remote_commands_invalidator_unittest.cc
@@ -0,0 +1,293 @@
+// Copyright 2015 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/policy/cloud/remote_commands_invalidator.h"
+
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "chrome/browser/invalidation/fake_invalidation_service.h"
+#include "components/invalidation/invalidation.h"
+#include "components/invalidation/invalidation_util.h"
+#include "components/invalidation/invalidator_registrar.h"
+#include "components/invalidation/invalidator_state.h"
+#include "components/invalidation/mock_ack_handler.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace em = enterprise_management;
+
+using ::testing::Mock;
+using ::testing::StrictMock;
+
+namespace policy {
+
+class MockRemoteCommandInvalidator : public RemoteCommandsInvalidator {
+ public:
+ MockRemoteCommandInvalidator() {}
+
+ MOCK_METHOD0(OnInitialize, void());
+ MOCK_METHOD0(OnShutdown, void());
+ MOCK_METHOD0(OnStart, void());
+ MOCK_METHOD0(OnStop, void());
+ MOCK_METHOD0(DoRemoteCommandsFetch, void());
+
+ void SetInvalidationObjectID(const invalidation::ObjectId& object_id) {
+ em::PolicyData policy_data;
+ policy_data.set_command_invalidation_source(object_id.source());
+ policy_data.set_command_invalidation_name(object_id.name());
+ ReloadPolicyData(&policy_data);
+ }
+
+ void ClearInvalidationObjectID() {
+ const em::PolicyData policy_data;
+ ReloadPolicyData(&policy_data);
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockRemoteCommandInvalidator);
+};
+
+class RemoteCommandsInvalidatorTest : public testing::Test {
+ public:
+ RemoteCommandsInvalidatorTest()
+ : kTestingObjectId1(123456, "abcdef"),
+ kTestingObjectId2(654321, "defabc") {
+ }
+
+ void EnableInvalidationService() {
+ invalidation_service_.SetInvalidatorState(syncer::INVALIDATIONS_ENABLED);
+ }
+
+ void DisableInvalidationService() {
+ invalidation_service_.SetInvalidatorState(
+ syncer::TRANSIENT_INVALIDATION_ERROR);
+ }
+
+ syncer::Invalidation FireInvalidation(
+ const invalidation::ObjectId& object_id) {
+ const syncer::Invalidation invalidation =
+ syncer::Invalidation::InitUnknownVersion(object_id);
+ invalidation_service_.EmitInvalidationForTest(invalidation);
+ return invalidation;
+ }
+
+ bool IsInvalidationSent(const syncer::Invalidation& invalidation) {
+ return !invalidation_service_.GetMockAckHandler()->IsUnsent(invalidation);
+ }
+
+ bool IsInvalidationAcknowledged(const syncer::Invalidation& invalidation) {
+ return invalidation_service_.GetMockAckHandler()->IsAcknowledged(
+ invalidation);
+ }
+
+ bool IsInvalidatorRegistered() {
+ return !invalidation_service_.invalidator_registrar()
+ .GetRegisteredIds(&invalidator_)
+ .empty();
+ }
+
+ void VerifyExpectations() {
+ Mock::VerifyAndClearExpectations(&invalidator_);
+ }
+
+ protected:
+ // Initialize and start the invalidator.
+ void InitializeAndStart() {
+ EXPECT_CALL(invalidator_, OnInitialize()).Times(1);
+ invalidator_.Initialize(&invalidation_service_);
+ VerifyExpectations();
+
+ EXPECT_CALL(invalidator_, OnStart()).Times(1);
+ invalidator_.Start();
+
+ VerifyExpectations();
+ }
+
+ // Stop and shutdown the invalidator.
+ void StopAndShutdown() {
+ EXPECT_CALL(invalidator_, OnStop()).Times(1);
+ EXPECT_CALL(invalidator_, OnShutdown()).Times(1);
+ invalidator_.Shutdown();
+
+ VerifyExpectations();
+ }
+
+ // Fire an invalidation to verify that invalidation is not working.
+ void VerifyInvalidationDisabled(const invalidation::ObjectId& object_id) {
+ const syncer::Invalidation invalidation = FireInvalidation(object_id);
+
+ base::RunLoop().RunUntilIdle();
+ EXPECT_FALSE(IsInvalidationSent(invalidation));
+ }
+
+ // Fire an invalidation to verify that invalidation works.
+ void VerifyInvalidationEnabled(const invalidation::ObjectId& object_id) {
+ EXPECT_TRUE(invalidator_.invalidations_enabled());
+
+ EXPECT_CALL(invalidator_, DoRemoteCommandsFetch()).Times(1);
+ const syncer::Invalidation invalidation = FireInvalidation(object_id);
+
+ base::RunLoop().RunUntilIdle();
+ EXPECT_TRUE(IsInvalidationSent(invalidation));
+ EXPECT_TRUE(IsInvalidationAcknowledged(invalidation));
+ VerifyExpectations();
+ }
+
+ const invalidation::ObjectId kTestingObjectId1;
+ const invalidation::ObjectId kTestingObjectId2;
+
+ base::MessageLoop loop_;
+
+ invalidation::FakeInvalidationService invalidation_service_;
+ StrictMock<MockRemoteCommandInvalidator> invalidator_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(RemoteCommandsInvalidatorTest);
+};
+
+// Verifies that only the fired invalidations will be received.
+TEST_F(RemoteCommandsInvalidatorTest, FiredInvalidation) {
+ InitializeAndStart();
+
+ // Invalidator won't work at this point.
+ EXPECT_FALSE(invalidator_.invalidations_enabled());
+
+ // Load the policy data, it should work now.
+ invalidator_.SetInvalidationObjectID(kTestingObjectId1);
+ EXPECT_TRUE(invalidator_.invalidations_enabled());
+
+ base::RunLoop().RunUntilIdle();
+ // No invalidation will be received if no invalidation is fired.
+ VerifyExpectations();
+
+ // Fire an invalidation with different object id, no invalidation will be
+ // received.
+ const syncer::Invalidation invalidation1 =
+ FireInvalidation(kTestingObjectId2);
+
+ base::RunLoop().RunUntilIdle();
+ EXPECT_FALSE(IsInvalidationSent(invalidation1));
+ VerifyExpectations();
+
+ // Fire the invalidation, it should be acknowledged and trigger a remote
+ // commands fetch.
+ EXPECT_CALL(invalidator_, DoRemoteCommandsFetch()).Times(1);
+ const syncer::Invalidation invalidation2 =
+ FireInvalidation(kTestingObjectId1);
+
+ base::RunLoop().RunUntilIdle();
+ EXPECT_TRUE(IsInvalidationSent(invalidation2));
+ EXPECT_TRUE(IsInvalidationAcknowledged(invalidation2));
+ VerifyExpectations();
+
+ StopAndShutdown();
+}
+
+// Verifies that no invalidation will be received when invalidator is shutdown.
+TEST_F(RemoteCommandsInvalidatorTest, ShutDown) {
+ EXPECT_FALSE(invalidator_.invalidations_enabled());
+ FireInvalidation(kTestingObjectId1);
+
+ base::RunLoop().RunUntilIdle();
+ EXPECT_FALSE(invalidator_.invalidations_enabled());
+}
+
+// Verifies that no invalidation will be received when invalidator is stopped.
+TEST_F(RemoteCommandsInvalidatorTest, Stopped) {
+ EXPECT_CALL(invalidator_, OnInitialize()).Times(1);
+ invalidator_.Initialize(&invalidation_service_);
+ VerifyExpectations();
+
+ EXPECT_FALSE(invalidator_.invalidations_enabled());
+ FireInvalidation(kTestingObjectId2);
+
+ base::RunLoop().RunUntilIdle();
+ EXPECT_FALSE(invalidator_.invalidations_enabled());
+
+ EXPECT_CALL(invalidator_, OnShutdown()).Times(1);
+ invalidator_.Shutdown();
+}
+
+// Verifies that stated/stopped state changes work as expected.
+TEST_F(RemoteCommandsInvalidatorTest, StartedStateChange) {
+ InitializeAndStart();
+
+ // Invalidator requires object id to work.
+ VerifyInvalidationDisabled(kTestingObjectId1);
+ EXPECT_FALSE(invalidator_.invalidations_enabled());
+ invalidator_.SetInvalidationObjectID(kTestingObjectId1);
+ VerifyInvalidationEnabled(kTestingObjectId1);
+
+ // Stop and restart invalidator.
+ EXPECT_CALL(invalidator_, OnStop()).Times(1);
+ invalidator_.Stop();
+ VerifyExpectations();
+
+ VerifyInvalidationDisabled(kTestingObjectId1);
+ EXPECT_FALSE(invalidator_.invalidations_enabled());
+
+ EXPECT_CALL(invalidator_, OnStart()).Times(1);
+ invalidator_.Start();
+ VerifyExpectations();
+
+ // Invalidator requires object id to work.
+ invalidator_.SetInvalidationObjectID(kTestingObjectId1);
+ VerifyInvalidationEnabled(kTestingObjectId1);
+
+ StopAndShutdown();
+}
+
+// Verifies that registered state changes work as expected.
+TEST_F(RemoteCommandsInvalidatorTest, RegistedStateChange) {
+ InitializeAndStart();
+
+ invalidator_.SetInvalidationObjectID(kTestingObjectId1);
+ VerifyInvalidationEnabled(kTestingObjectId1);
+
+ invalidator_.SetInvalidationObjectID(kTestingObjectId2);
+ VerifyInvalidationEnabled(kTestingObjectId2);
+ VerifyInvalidationDisabled(kTestingObjectId1);
+
+ invalidator_.SetInvalidationObjectID(kTestingObjectId1);
+ VerifyInvalidationEnabled(kTestingObjectId1);
+ VerifyInvalidationDisabled(kTestingObjectId2);
+
+ invalidator_.ClearInvalidationObjectID();
+ VerifyInvalidationDisabled(kTestingObjectId1);
+ VerifyInvalidationDisabled(kTestingObjectId2);
+ EXPECT_FALSE(invalidator_.invalidations_enabled());
+
+ invalidator_.SetInvalidationObjectID(kTestingObjectId2);
+ VerifyInvalidationEnabled(kTestingObjectId2);
+ VerifyInvalidationDisabled(kTestingObjectId1);
+
+ StopAndShutdown();
+}
+
+// Verifies that invalidation service enabled state changes work as expected.
+TEST_F(RemoteCommandsInvalidatorTest, InvalidationServiceEnabledStateChanged) {
+ InitializeAndStart();
+
+ invalidator_.SetInvalidationObjectID(kTestingObjectId1);
+ VerifyInvalidationEnabled(kTestingObjectId1);
+
+ DisableInvalidationService();
+ EXPECT_FALSE(invalidator_.invalidations_enabled());
+
+ EnableInvalidationService();
+ VerifyInvalidationEnabled(kTestingObjectId1);
+
+ EnableInvalidationService();
+ VerifyInvalidationEnabled(kTestingObjectId1);
+
+ DisableInvalidationService();
+ EXPECT_FALSE(invalidator_.invalidations_enabled());
+
+ DisableInvalidationService();
+ EXPECT_FALSE(invalidator_.invalidations_enabled());
+
+ StopAndShutdown();
+}
+
+} // namespace policy

Powered by Google App Engine
This is Rietveld 408576698