diff options
Diffstat (limited to 'chrome/browser/chromeos/settings/signed_settings_helper_unittest.cc')
-rw-r--r-- | chrome/browser/chromeos/settings/signed_settings_helper_unittest.cc | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/chrome/browser/chromeos/settings/signed_settings_helper_unittest.cc b/chrome/browser/chromeos/settings/signed_settings_helper_unittest.cc new file mode 100644 index 0000000..5a01f0d --- /dev/null +++ b/chrome/browser/chromeos/settings/signed_settings_helper_unittest.cc @@ -0,0 +1,209 @@ +// Copyright (c) 2012 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/chromeos/settings/signed_settings_helper.h" + +#include "base/bind.h" +#include "base/message_loop.h" +#include "chrome/browser/chromeos/cros/cros_library.h" +#include "chrome/browser/chromeos/settings/cros_settings_names.h" +#include "chrome/browser/chromeos/settings/mock_owner_key_utils.h" +#include "chrome/browser/chromeos/settings/mock_ownership_service.h" +#include "chrome/browser/chromeos/settings/owner_manager.h" +#include "chrome/browser/chromeos/settings/signed_settings.h" +#include "chrome/browser/policy/proto/chrome_device_policy.pb.h" +#include "chrome/browser/policy/proto/device_management_backend.pb.h" +#include "chromeos/dbus/dbus_thread_manager.h" +#include "chromeos/dbus/mock_dbus_thread_manager.h" +#include "chromeos/dbus/mock_session_manager_client.h" +#include "content/public/test/test_browser_thread.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using ::testing::_; +using ::testing::A; +using ::testing::InSequence; +using ::testing::Invoke; +using ::testing::WithArg; + +namespace em = enterprise_management; +namespace chromeos { + +ACTION_P(Retrieve, policy_blob) { arg0.Run(policy_blob); } +ACTION_P(Store, success) { arg1.Run(success); } + +class SignedSettingsHelperTest : public testing::Test, + public SignedSettingsHelper::TestDelegate { + public: + SignedSettingsHelperTest() + : message_loop_(MessageLoop::TYPE_UI), + ui_thread_(content::BrowserThread::UI, &message_loop_), + file_thread_(content::BrowserThread::FILE, &message_loop_), + pending_ops_(0), + mock_dbus_thread_manager_(new MockDBusThreadManager) { + } + + virtual void SetUp() { + SignedSettingsHelper::Get()->set_test_delegate(this); + DBusThreadManager::InitializeForTesting(mock_dbus_thread_manager_); + + fake_policy_data_ = BuildPolicyData(); + std::string data_serialized = fake_policy_data_.SerializeAsString(); + std::string serialized_policy_; + fake_policy_ = BuildProto(data_serialized, + std::string("false"), + &serialized_policy_); + + MockSessionManagerClient* client = + mock_dbus_thread_manager_->mock_session_manager_client(); + // Make sure the mocked out class calls back to notify success on store and + // retrieve ops. + EXPECT_CALL(*client, StoreDevicePolicy(_, _)) + .WillRepeatedly(Store(true)); + EXPECT_CALL(*client, RetrieveDevicePolicy(_)) + .WillRepeatedly(Retrieve(serialized_policy_)); + + EXPECT_CALL(m_, StartSigningAttempt(_, A<OwnerManager::Delegate*>())) + .WillRepeatedly(WithArg<1>( + Invoke(&SignedSettingsHelperTest::OnKeyOpComplete))); + EXPECT_CALL(m_, StartVerifyAttempt(_, _, A<OwnerManager::Delegate*>())) + .WillRepeatedly(WithArg<2>( + Invoke(&SignedSettingsHelperTest::OnKeyOpComplete))); + } + + virtual void TearDown() { + DBusThreadManager::Shutdown(); + SignedSettingsHelper::Get()->set_test_delegate(NULL); + } + + virtual void OnOpCreated(SignedSettings* op) { + // Use MockOwnershipService for all SignedSettings op. + op->set_service(&m_); + } + + virtual void OnOpStarted(SignedSettings* op) { + } + + virtual void OnOpCompleted(SignedSettings* op) { + --pending_ops_; + } + + static void OnKeyOpComplete(OwnerManager::Delegate* op) { + op->OnKeyOpComplete(OwnerManager::SUCCESS, std::vector<uint8>()); + } + + em::PolicyData BuildPolicyData() { + em::PolicyData to_return; + em::ChromeDeviceSettingsProto pol; + to_return.set_policy_type(chromeos::kDevicePolicyType); + to_return.set_policy_value(pol.SerializeAsString()); + return to_return; + } + + em::PolicyFetchResponse BuildProto(const std::string& data, + const std::string& sig, + std::string* out_serialized) { + em::PolicyFetchResponse fake_policy; + if (!data.empty()) + fake_policy.set_policy_data(data); + if (!sig.empty()) + fake_policy.set_policy_data_signature(sig); + EXPECT_TRUE(fake_policy.SerializeToString(out_serialized)); + return fake_policy; + } + + em::PolicyData fake_policy_data_; + em::PolicyFetchResponse fake_policy_; + std::string serialized_policy_; + MockOwnershipService m_; + + MessageLoop message_loop_; + content::TestBrowserThread ui_thread_; + content::TestBrowserThread file_thread_; + + int pending_ops_; + + MockDBusThreadManager* mock_dbus_thread_manager_; + + ScopedStubCrosEnabler stub_cros_enabler_; +}; + +class SignedSettingsCallbacks { + public: + virtual ~SignedSettingsCallbacks() {} + // Callback of StorePolicyOp. + virtual void OnStorePolicyCompleted(SignedSettings::ReturnCode code) = 0; + // Callback of RetrievePolicyOp. + virtual void OnRetrievePolicyCompleted( + SignedSettings::ReturnCode code, + const em::PolicyFetchResponse& policy) = 0; +}; + +class MockSignedSettingsCallbacks + : public SignedSettingsCallbacks, + public base::SupportsWeakPtr<MockSignedSettingsCallbacks> { +public: + virtual ~MockSignedSettingsCallbacks() {} + + MOCK_METHOD1(OnStorePolicyCompleted, void(SignedSettings::ReturnCode)); + MOCK_METHOD2(OnRetrievePolicyCompleted, void(SignedSettings::ReturnCode, + const em::PolicyFetchResponse&)); +}; + +TEST_F(SignedSettingsHelperTest, SerializedOps) { + MockSignedSettingsCallbacks cb; + + InSequence s; + EXPECT_CALL(cb, OnStorePolicyCompleted(SignedSettings::SUCCESS)) + .Times(1); + EXPECT_CALL(cb, OnRetrievePolicyCompleted(SignedSettings::SUCCESS, _)) + .Times(1); + + + pending_ops_ = 2; + SignedSettingsHelper::Get()->StartStorePolicyOp( + fake_policy_, + base::Bind(&MockSignedSettingsCallbacks::OnStorePolicyCompleted, + base::Unretained(&cb))); + SignedSettingsHelper::Get()->StartRetrievePolicyOp( + base::Bind(&MockSignedSettingsCallbacks::OnRetrievePolicyCompleted, + base::Unretained(&cb))); + + message_loop_.RunAllPending(); + ASSERT_EQ(0, pending_ops_); +} + +TEST_F(SignedSettingsHelperTest, CanceledOps) { + MockSignedSettingsCallbacks cb; + + InSequence s; + EXPECT_CALL(cb, OnStorePolicyCompleted(SignedSettings::SUCCESS)) + .Times(1); + EXPECT_CALL(cb, OnRetrievePolicyCompleted(SignedSettings::SUCCESS, _)) + .Times(1); + + pending_ops_ = 3; + + { + // This op will be deleted and never will be executed (expect only one call + // to OnRetrievePolicyCompleted above). However the OpComplete callback will + // be still called, therefore we expect three pending ops. + MockSignedSettingsCallbacks cb_to_be_deleted; + SignedSettingsHelper::Get()->StartRetrievePolicyOp( + base::Bind(&MockSignedSettingsCallbacks::OnRetrievePolicyCompleted, + cb_to_be_deleted.AsWeakPtr())); + } + SignedSettingsHelper::Get()->StartStorePolicyOp( + fake_policy_, + base::Bind(&MockSignedSettingsCallbacks::OnStorePolicyCompleted, + base::Unretained(&cb))); + SignedSettingsHelper::Get()->StartRetrievePolicyOp( + base::Bind(&MockSignedSettingsCallbacks::OnRetrievePolicyCompleted, + base::Unretained(&cb))); + + message_loop_.RunAllPending(); + ASSERT_EQ(0, pending_ops_); +} + +} // namespace chromeos |