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 |