blob: acdf6d10bf2d09a0218c416356d56721d8c463ae [file] [log] [blame]
// 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/device_settings_service.h"
#include "base/basictypes.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/compiler_specific.h"
#include "chrome/browser/chromeos/settings/device_settings_test_helper.h"
#include "chrome/browser/policy/proto/chromeos/chrome_device_policy.pb.h"
#include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace em = enterprise_management;
using ::testing::Mock;
namespace chromeos {
namespace {
class MockDeviceSettingsObserver : public DeviceSettingsService::Observer {
public:
virtual ~MockDeviceSettingsObserver() {}
MOCK_METHOD0(OwnershipStatusChanged, void());
MOCK_METHOD0(DeviceSettingsUpdated, void());
};
} // namespace
class DeviceSettingsServiceTest : public DeviceSettingsTestBase {
public:
void SetOperationCompleted() {
operation_completed_ = true;
}
void SetOwnershipStatus(
DeviceSettingsService::OwnershipStatus ownership_status) {
ownership_status_ = ownership_status;
}
void OnIsOwner(bool is_owner) {
is_owner_ = is_owner;
is_owner_set_ = true;
}
protected:
DeviceSettingsServiceTest()
: operation_completed_(false),
is_owner_(true),
is_owner_set_(false),
ownership_status_(DeviceSettingsService::OWNERSHIP_UNKNOWN) {}
virtual void SetUp() OVERRIDE {
device_policy_.payload().mutable_device_policy_refresh_rate()->
set_device_policy_refresh_rate(120);
DeviceSettingsTestBase::SetUp();
}
void CheckPolicy() {
ASSERT_TRUE(device_settings_service_.policy_data());
EXPECT_EQ(device_policy_.policy_data().SerializeAsString(),
device_settings_service_.policy_data()->SerializeAsString());
ASSERT_TRUE(device_settings_service_.device_settings());
EXPECT_EQ(device_policy_.payload().SerializeAsString(),
device_settings_service_.device_settings()->SerializeAsString());
}
bool operation_completed_;
bool is_owner_;
bool is_owner_set_;
DeviceSettingsService::OwnershipStatus ownership_status_;
private:
DISALLOW_COPY_AND_ASSIGN(DeviceSettingsServiceTest);
};
TEST_F(DeviceSettingsServiceTest, LoadNoKey) {
owner_key_util_->Clear();
ReloadDeviceSettings();
EXPECT_EQ(DeviceSettingsService::STORE_KEY_UNAVAILABLE,
device_settings_service_.status());
EXPECT_FALSE(device_settings_service_.policy_data());
EXPECT_FALSE(device_settings_service_.device_settings());
}
TEST_F(DeviceSettingsServiceTest, LoadNoPolicy) {
device_settings_test_helper_.set_policy_blob(std::string());
ReloadDeviceSettings();
EXPECT_EQ(DeviceSettingsService::STORE_NO_POLICY,
device_settings_service_.status());
EXPECT_FALSE(device_settings_service_.policy_data());
EXPECT_FALSE(device_settings_service_.device_settings());
}
TEST_F(DeviceSettingsServiceTest, LoadValidationError) {
device_policy_.policy().set_policy_data_signature("bad");
device_settings_test_helper_.set_policy_blob(device_policy_.GetBlob());
owner_key_util_->SetPublicKeyFromPrivateKey(*device_policy_.GetSigningKey());
ReloadDeviceSettings();
EXPECT_EQ(DeviceSettingsService::STORE_VALIDATION_ERROR,
device_settings_service_.status());
EXPECT_FALSE(device_settings_service_.policy_data());
EXPECT_FALSE(device_settings_service_.device_settings());
}
TEST_F(DeviceSettingsServiceTest, LoadValidationErrorFutureTimestamp) {
base::Time timestamp(base::Time::NowFromSystemTime() +
base::TimeDelta::FromDays(5000));
device_policy_.policy_data().set_timestamp(
(timestamp - base::Time::UnixEpoch()).InMilliseconds());
device_policy_.Build();
device_settings_test_helper_.set_policy_blob(device_policy_.GetBlob());
owner_key_util_->SetPublicKeyFromPrivateKey(*device_policy_.GetSigningKey());
ReloadDeviceSettings();
EXPECT_EQ(DeviceSettingsService::STORE_TEMP_VALIDATION_ERROR,
device_settings_service_.status());
EXPECT_FALSE(device_settings_service_.policy_data());
EXPECT_FALSE(device_settings_service_.device_settings());
}
TEST_F(DeviceSettingsServiceTest, LoadSuccess) {
ReloadDeviceSettings();
EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS,
device_settings_service_.status());
CheckPolicy();
}
TEST_F(DeviceSettingsServiceTest, SignAndStoreNoKey) {
ReloadDeviceSettings();
EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS,
device_settings_service_.status());
scoped_ptr<em::ChromeDeviceSettingsProto> new_device_settings(
new em::ChromeDeviceSettingsProto(device_policy_.payload()));
new_device_settings->mutable_device_policy_refresh_rate()->
set_device_policy_refresh_rate(300);
device_settings_service_.SignAndStore(
new_device_settings.Pass(),
base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted,
base::Unretained(this)));
FlushDeviceSettings();
EXPECT_TRUE(operation_completed_);
EXPECT_EQ(DeviceSettingsService::STORE_KEY_UNAVAILABLE,
device_settings_service_.status());
CheckPolicy();
}
TEST_F(DeviceSettingsServiceTest, SignAndStoreFailure) {
ReloadDeviceSettings();
EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS,
device_settings_service_.status());
owner_key_util_->SetPrivateKey(device_policy_.GetSigningKey());
device_settings_service_.SetUsername(device_policy_.policy_data().username());
FlushDeviceSettings();
scoped_ptr<em::ChromeDeviceSettingsProto> new_device_settings(
new em::ChromeDeviceSettingsProto(device_policy_.payload()));
new_device_settings->mutable_device_policy_refresh_rate()->
set_device_policy_refresh_rate(300);
device_settings_test_helper_.set_store_result(false);
device_settings_service_.SignAndStore(
new_device_settings.Pass(),
base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted,
base::Unretained(this)));
FlushDeviceSettings();
EXPECT_TRUE(operation_completed_);
EXPECT_EQ(DeviceSettingsService::STORE_OPERATION_FAILED,
device_settings_service_.status());
CheckPolicy();
}
TEST_F(DeviceSettingsServiceTest, SignAndStoreSuccess) {
ReloadDeviceSettings();
EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS,
device_settings_service_.status());
owner_key_util_->SetPrivateKey(device_policy_.GetSigningKey());
device_settings_service_.SetUsername(device_policy_.policy_data().username());
FlushDeviceSettings();
device_policy_.payload().mutable_device_policy_refresh_rate()->
set_device_policy_refresh_rate(300);
device_policy_.Build();
device_settings_service_.SignAndStore(
scoped_ptr<em::ChromeDeviceSettingsProto>(
new em::ChromeDeviceSettingsProto(device_policy_.payload())),
base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted,
base::Unretained(this)));
FlushDeviceSettings();
EXPECT_TRUE(operation_completed_);
EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS,
device_settings_service_.status());
ASSERT_TRUE(device_settings_service_.device_settings());
EXPECT_EQ(device_policy_.payload().SerializeAsString(),
device_settings_service_.device_settings()->SerializeAsString());
}
TEST_F(DeviceSettingsServiceTest, StoreFailure) {
owner_key_util_->Clear();
device_settings_test_helper_.set_policy_blob(std::string());
ReloadDeviceSettings();
EXPECT_EQ(DeviceSettingsService::STORE_KEY_UNAVAILABLE,
device_settings_service_.status());
device_settings_test_helper_.set_store_result(false);
device_settings_service_.Store(
device_policy_.GetCopy(),
base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted,
base::Unretained(this)));
FlushDeviceSettings();
EXPECT_TRUE(operation_completed_);
EXPECT_EQ(DeviceSettingsService::STORE_OPERATION_FAILED,
device_settings_service_.status());
}
TEST_F(DeviceSettingsServiceTest, StoreSuccess) {
owner_key_util_->Clear();
device_settings_test_helper_.set_policy_blob(std::string());
ReloadDeviceSettings();
EXPECT_EQ(DeviceSettingsService::STORE_KEY_UNAVAILABLE,
device_settings_service_.status());
owner_key_util_->SetPublicKeyFromPrivateKey(*device_policy_.GetSigningKey());
device_settings_service_.Store(
device_policy_.GetCopy(),
base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted,
base::Unretained(this)));
FlushDeviceSettings();
EXPECT_TRUE(operation_completed_);
EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS,
device_settings_service_.status());
CheckPolicy();
}
TEST_F(DeviceSettingsServiceTest, StoreRotation) {
ReloadDeviceSettings();
EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS,
device_settings_service_.status());
device_policy_.payload().mutable_device_policy_refresh_rate()->
set_device_policy_refresh_rate(300);
device_policy_.SetDefaultNewSigningKey();
device_policy_.Build();
device_settings_service_.Store(device_policy_.GetCopy(), base::Closure());
FlushDeviceSettings();
owner_key_util_->SetPublicKeyFromPrivateKey(
*device_policy_.GetNewSigningKey());
device_settings_service_.OwnerKeySet(true);
FlushDeviceSettings();
EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS,
device_settings_service_.status());
CheckPolicy();
// Check the new key has been loaded.
std::vector<uint8> key;
ASSERT_TRUE(device_policy_.GetNewSigningKey()->ExportPublicKey(&key));
EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key);
}
TEST_F(DeviceSettingsServiceTest, OwnershipStatus) {
owner_key_util_->Clear();
EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey());
EXPECT_FALSE(device_settings_service_.GetOwnerKey().get());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_UNKNOWN,
device_settings_service_.GetOwnershipStatus());
device_settings_service_.GetOwnershipStatusAsync(
base::Bind(&DeviceSettingsServiceTest::SetOwnershipStatus,
base::Unretained(this)));
FlushDeviceSettings();
EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey());
ASSERT_TRUE(device_settings_service_.GetOwnerKey().get());
EXPECT_FALSE(device_settings_service_.GetOwnerKey()->public_key());
EXPECT_FALSE(device_settings_service_.GetOwnerKey()->private_key());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_NONE,
device_settings_service_.GetOwnershipStatus());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_NONE, ownership_status_);
owner_key_util_->SetPublicKeyFromPrivateKey(*device_policy_.GetSigningKey());
ReloadDeviceSettings();
device_settings_service_.GetOwnershipStatusAsync(
base::Bind(&DeviceSettingsServiceTest::SetOwnershipStatus,
base::Unretained(this)));
FlushDeviceSettings();
EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey());
ASSERT_TRUE(device_settings_service_.GetOwnerKey().get());
ASSERT_TRUE(device_settings_service_.GetOwnerKey()->public_key());
std::vector<uint8> key;
ASSERT_TRUE(device_policy_.GetSigningKey()->ExportPublicKey(&key));
EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key);
EXPECT_FALSE(device_settings_service_.GetOwnerKey()->private_key());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN,
device_settings_service_.GetOwnershipStatus());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN, ownership_status_);
owner_key_util_->SetPrivateKey(device_policy_.GetSigningKey());
device_settings_service_.SetUsername(device_policy_.policy_data().username());
device_settings_service_.GetOwnershipStatusAsync(
base::Bind(&DeviceSettingsServiceTest::SetOwnershipStatus,
base::Unretained(this)));
FlushDeviceSettings();
EXPECT_TRUE(device_settings_service_.HasPrivateOwnerKey());
ASSERT_TRUE(device_settings_service_.GetOwnerKey().get());
ASSERT_TRUE(device_settings_service_.GetOwnerKey()->public_key());
ASSERT_TRUE(device_policy_.GetSigningKey()->ExportPublicKey(&key));
EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key);
EXPECT_TRUE(device_settings_service_.GetOwnerKey()->private_key());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN,
device_settings_service_.GetOwnershipStatus());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN, ownership_status_);
}
TEST_F(DeviceSettingsServiceTest, OnCertificatesLoadedForNonOwner) {
owner_key_util_->Clear();
EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey());
EXPECT_FALSE(device_settings_service_.GetOwnerKey().get());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_UNKNOWN,
device_settings_service_.GetOwnershipStatus());
device_settings_service_.IsCurrentUserOwnerAsync(
base::Bind(&DeviceSettingsServiceTest::OnIsOwner,
base::Unretained(this)));
owner_key_util_->SetPublicKeyFromPrivateKey(*device_policy_.GetSigningKey());
ReloadDeviceSettings();
EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey());
ASSERT_TRUE(device_settings_service_.GetOwnerKey().get());
ASSERT_TRUE(device_settings_service_.GetOwnerKey()->public_key());
std::vector<uint8> key;
ASSERT_TRUE(device_policy_.GetSigningKey()->ExportPublicKey(&key));
EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key);
EXPECT_FALSE(device_settings_service_.GetOwnerKey()->private_key());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN,
device_settings_service_.GetOwnershipStatus());
EXPECT_FALSE(is_owner_set_);
// Simulate CertLoader reporting a new set of certificates. The passed
// certificates are ignored.
device_settings_service_.OnCertificatesLoaded(net::CertificateList(), true);
FlushDeviceSettings();
EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey());
ASSERT_TRUE(device_settings_service_.GetOwnerKey().get());
ASSERT_TRUE(device_settings_service_.GetOwnerKey()->public_key());
ASSERT_TRUE(device_policy_.GetSigningKey()->ExportPublicKey(&key));
EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key);
EXPECT_FALSE(device_settings_service_.GetOwnerKey()->private_key());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN,
device_settings_service_.GetOwnershipStatus());
EXPECT_TRUE(is_owner_set_);
EXPECT_FALSE(is_owner_);
}
TEST_F(DeviceSettingsServiceTest, OnCertificatesLoadedForOwner) {
owner_key_util_->Clear();
EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey());
EXPECT_FALSE(device_settings_service_.GetOwnerKey().get());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_UNKNOWN,
device_settings_service_.GetOwnershipStatus());
device_settings_service_.IsCurrentUserOwnerAsync(
base::Bind(&DeviceSettingsServiceTest::OnIsOwner,
base::Unretained(this)));
owner_key_util_->SetPublicKeyFromPrivateKey(*device_policy_.GetSigningKey());
ReloadDeviceSettings();
EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey());
ASSERT_TRUE(device_settings_service_.GetOwnerKey().get());
ASSERT_TRUE(device_settings_service_.GetOwnerKey()->public_key());
std::vector<uint8> key;
ASSERT_TRUE(device_policy_.GetSigningKey()->ExportPublicKey(&key));
EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key);
EXPECT_FALSE(device_settings_service_.GetOwnerKey()->private_key());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN,
device_settings_service_.GetOwnershipStatus());
EXPECT_FALSE(is_owner_set_);
owner_key_util_->SetPrivateKey(device_policy_.GetSigningKey());
device_settings_service_.SetUsername(device_policy_.policy_data().username());
// Simulate CertLoader reporting a new set of certificates. The passed
// certificates are ignored.
device_settings_service_.OnCertificatesLoaded(net::CertificateList(), true);
FlushDeviceSettings();
EXPECT_TRUE(device_settings_service_.HasPrivateOwnerKey());
ASSERT_TRUE(device_settings_service_.GetOwnerKey().get());
ASSERT_TRUE(device_settings_service_.GetOwnerKey()->public_key());
ASSERT_TRUE(device_policy_.GetSigningKey()->ExportPublicKey(&key));
EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key);
EXPECT_TRUE(device_settings_service_.GetOwnerKey()->private_key());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN,
device_settings_service_.GetOwnershipStatus());
EXPECT_TRUE(is_owner_set_);
EXPECT_TRUE(is_owner_);
}
TEST_F(DeviceSettingsServiceTest, IsCurrentUserOwnerAsyncWithLoadedCerts) {
owner_key_util_->Clear();
EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey());
EXPECT_FALSE(device_settings_service_.GetOwnerKey().get());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_UNKNOWN,
device_settings_service_.GetOwnershipStatus());
owner_key_util_->SetPublicKeyFromPrivateKey(*device_policy_.GetSigningKey());
owner_key_util_->SetPrivateKey(device_policy_.GetSigningKey());
device_settings_service_.SetUsername(device_policy_.policy_data().username());
ReloadDeviceSettings();
// Simulate CertLoader reporting a new set of certificates. The passed
// certificates are ignored.
device_settings_service_.OnCertificatesLoaded(net::CertificateList(), true);
FlushDeviceSettings();
EXPECT_TRUE(device_settings_service_.HasPrivateOwnerKey());
ASSERT_TRUE(device_settings_service_.GetOwnerKey().get());
ASSERT_TRUE(device_settings_service_.GetOwnerKey()->public_key());
std::vector<uint8> key;
ASSERT_TRUE(device_policy_.GetSigningKey()->ExportPublicKey(&key));
EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key);
EXPECT_TRUE(device_settings_service_.GetOwnerKey()->private_key());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN,
device_settings_service_.GetOwnershipStatus());
EXPECT_FALSE(is_owner_set_);
device_settings_service_.IsCurrentUserOwnerAsync(
base::Bind(&DeviceSettingsServiceTest::OnIsOwner,
base::Unretained(this)));
// The callback should be called immediately.
base::MessageLoop::current()->RunUntilIdle();
EXPECT_TRUE(device_settings_service_.HasPrivateOwnerKey());
ASSERT_TRUE(device_settings_service_.GetOwnerKey().get());
ASSERT_TRUE(device_settings_service_.GetOwnerKey()->public_key());
ASSERT_TRUE(device_policy_.GetSigningKey()->ExportPublicKey(&key));
EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key);
EXPECT_TRUE(device_settings_service_.GetOwnerKey()->private_key());
EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN,
device_settings_service_.GetOwnershipStatus());
EXPECT_TRUE(is_owner_set_);
EXPECT_TRUE(is_owner_);
}
TEST_F(DeviceSettingsServiceTest, Observer) {
owner_key_util_->Clear();
MockDeviceSettingsObserver observer_;
device_settings_service_.AddObserver(&observer_);
EXPECT_CALL(observer_, OwnershipStatusChanged()).Times(1);
EXPECT_CALL(observer_, DeviceSettingsUpdated()).Times(1);
ReloadDeviceSettings();
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_CALL(observer_, OwnershipStatusChanged()).Times(1);
EXPECT_CALL(observer_, DeviceSettingsUpdated()).Times(1);
owner_key_util_->SetPublicKeyFromPrivateKey(*device_policy_.GetSigningKey());
ReloadDeviceSettings();
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_CALL(observer_, OwnershipStatusChanged()).Times(0);
EXPECT_CALL(observer_, DeviceSettingsUpdated()).Times(1);
device_settings_service_.Store(device_policy_.GetCopy(), base::Closure());
FlushDeviceSettings();
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_CALL(observer_, OwnershipStatusChanged()).Times(0);
EXPECT_CALL(observer_, DeviceSettingsUpdated()).Times(1);
device_settings_service_.PropertyChangeComplete(true);
FlushDeviceSettings();
Mock::VerifyAndClearExpectations(&observer_);
device_settings_service_.RemoveObserver(&observer_);
}
} // namespace chromeos