| Index: chrome/browser/chromeos/login/owner_manager_unittest.cc
|
| diff --git a/chrome/browser/chromeos/login/owner_manager_unittest.cc b/chrome/browser/chromeos/login/owner_manager_unittest.cc
|
| deleted file mode 100644
|
| index f28f029f190a98c9e7d9ed7bdd8311ee479a0d1e..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/chromeos/login/owner_manager_unittest.cc
|
| +++ /dev/null
|
| @@ -1,347 +0,0 @@
|
| -// Copyright (c) 2011 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/login/owner_manager.h"
|
| -#include "chrome/browser/chromeos/login/owner_manager_unittest.h"
|
| -
|
| -#include <string>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/file_path.h"
|
| -#include "base/file_util.h"
|
| -#include "base/logging.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/scoped_temp_dir.h"
|
| -#include "chrome/browser/chromeos/login/mock_owner_key_utils.h"
|
| -#include "chrome/common/chrome_notification_types.h"
|
| -#include "content/public/browser/notification_service.h"
|
| -#include "content/public/test/test_browser_thread.h"
|
| -#include "crypto/nss_util.h"
|
| -#include "crypto/rsa_private_key.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using content::BrowserThread;
|
| -using ::crypto::RSAPrivateKey;
|
| -using ::testing::DoAll;
|
| -using ::testing::Eq;
|
| -using ::testing::Invoke;
|
| -using ::testing::Return;
|
| -using ::testing::SetArgumentPointee;
|
| -using ::testing::_;
|
| -
|
| -namespace chromeos {
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// MockKeyLoadObserver
|
| -MockKeyLoadObserver::MockKeyLoadObserver(base::WaitableEvent* e)
|
| - : success_expected_(false),
|
| - event_(e),
|
| - observed_(false) {
|
| - registrar_.Add(
|
| - this,
|
| - chrome::NOTIFICATION_OWNER_KEY_FETCH_ATTEMPT_FAILED,
|
| - content::NotificationService::AllSources());
|
| - registrar_.Add(
|
| - this,
|
| - chrome::NOTIFICATION_OWNER_KEY_FETCH_ATTEMPT_SUCCEEDED,
|
| - content::NotificationService::AllSources());
|
| -}
|
| -
|
| -MockKeyLoadObserver::~MockKeyLoadObserver() {
|
| - DCHECK(observed_);
|
| -}
|
| -
|
| -void MockKeyLoadObserver::Observe(int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - LOG(INFO) << "Observed key fetch event";
|
| - if (type == chrome::NOTIFICATION_OWNER_KEY_FETCH_ATTEMPT_SUCCEEDED) {
|
| - DCHECK(success_expected_);
|
| - observed_ = true;
|
| - if (event_)
|
| - event_->Signal();
|
| - } else if (type == chrome::NOTIFICATION_OWNER_KEY_FETCH_ATTEMPT_FAILED) {
|
| - DCHECK(!success_expected_);
|
| - observed_ = true;
|
| - if (event_)
|
| - event_->Signal();
|
| - }
|
| -}
|
| -
|
| -void MockKeyLoadObserver::ExpectKeyFetchSuccess(bool should_succeed) {
|
| - success_expected_ = should_succeed;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// MockKeyUser
|
| -MockKeyUser::MockKeyUser(const OwnerManager::KeyOpCode expected,
|
| - base::WaitableEvent* e)
|
| - : expected_(expected),
|
| - event_(e) {
|
| -}
|
| -
|
| -void MockKeyUser::OnKeyOpComplete(const OwnerManager::KeyOpCode return_code,
|
| - const std::vector<uint8>& payload) {
|
| - DCHECK_EQ(expected_, return_code);
|
| - if (event_)
|
| - event_->Signal();
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// MockKeyUpdateUser
|
| -
|
| -void MockKeyUpdateUser::OnKeyUpdated() {
|
| - if (event_)
|
| - event_->Signal();
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// MockSigner
|
| -
|
| -MockSigner::MockSigner(const OwnerManager::KeyOpCode expected,
|
| - const std::vector<uint8>& sig,
|
| - base::WaitableEvent* e)
|
| - : expected_code_(expected),
|
| - expected_sig_(sig),
|
| - event_(e) {
|
| -}
|
| -
|
| -MockSigner::~MockSigner() {}
|
| -
|
| -void MockSigner::OnKeyOpComplete(const OwnerManager::KeyOpCode return_code,
|
| - const std::vector<uint8>& payload) {
|
| - DCHECK_EQ(expected_code_, return_code);
|
| - for (uint32 i = 0; i < payload.size(); ++i)
|
| - DCHECK_EQ(expected_sig_[i], payload[i]);
|
| - if (event_)
|
| - event_->Signal();
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// OwnerManagerTest
|
| -
|
| -class OwnerManagerTest : public testing::Test {
|
| - public:
|
| - OwnerManagerTest()
|
| - : message_loop_(MessageLoop::TYPE_UI),
|
| - ui_thread_(BrowserThread::UI, &message_loop_),
|
| - file_thread_(BrowserThread::FILE),
|
| - mock_(new MockKeyUtils),
|
| - injector_(mock_) /* injector_ takes ownership of mock_ */ {
|
| - }
|
| - virtual ~OwnerManagerTest() {}
|
| -
|
| - virtual void SetUp() {
|
| - crypto::OpenPersistentNSSDB(); // TODO(cmasone): use test DB instead
|
| - fake_private_key_.reset(RSAPrivateKey::Create(256));
|
| - ASSERT_TRUE(fake_private_key_->ExportPublicKey(&fake_public_key_));
|
| -
|
| - // Mimic ownership.
|
| - ASSERT_TRUE(tmpdir_.CreateUniqueTempDir());
|
| - ASSERT_TRUE(file_util::CreateTemporaryFileInDir(tmpdir_.path(), &tmpfile_));
|
| -
|
| - file_thread_.Start();
|
| - OwnerKeyUtils::set_factory(&injector_);
|
| - }
|
| -
|
| - virtual void TearDown() {
|
| - OwnerKeyUtils::set_factory(NULL);
|
| - }
|
| -
|
| - void StartUnowned() {
|
| - file_util::Delete(tmpfile_, false);
|
| - }
|
| -
|
| - void InjectKeys(OwnerManager* manager) {
|
| - manager->public_key_ = fake_public_key_;
|
| - manager->private_key_.reset(fake_private_key_.release());
|
| - }
|
| -
|
| - ScopedTempDir tmpdir_;
|
| - FilePath tmpfile_;
|
| -
|
| - MessageLoop message_loop_;
|
| - content::TestBrowserThread ui_thread_;
|
| - content::TestBrowserThread file_thread_;
|
| -
|
| - std::vector<uint8> fake_public_key_;
|
| - scoped_ptr<RSAPrivateKey> fake_private_key_;
|
| -
|
| - MockKeyUtils* mock_;
|
| - MockInjector injector_;
|
| -};
|
| -
|
| -TEST_F(OwnerManagerTest, UpdateOwnerKey) {
|
| - scoped_refptr<OwnerManager> manager(new OwnerManager);
|
| -
|
| - base::WaitableEvent event(true, false);
|
| - MockKeyUpdateUser delegate(&event);
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&OwnerManager::UpdateOwnerKey, manager.get(),
|
| - BrowserThread::UI, std::vector<uint8>(), &delegate));
|
| - while (!event.IsSignaled())
|
| - message_loop_.RunAllPending();
|
| -}
|
| -
|
| -TEST_F(OwnerManagerTest, LoadOwnerKeyFail) {
|
| - StartUnowned();
|
| - base::WaitableEvent event(true, false);
|
| - MockKeyLoadObserver loader(&event);
|
| - scoped_refptr<OwnerManager> manager(new OwnerManager);
|
| -
|
| - EXPECT_CALL(*mock_, GetOwnerKeyFilePath())
|
| - .WillRepeatedly(Return(tmpfile_));
|
| - EXPECT_CALL(*mock_, ImportPublicKey(tmpfile_, _))
|
| - .WillOnce(Return(false))
|
| - .RetiresOnSaturation();
|
| -
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&OwnerManager::LoadOwnerKey, manager.get()));
|
| - while (!event.IsSignaled())
|
| - message_loop_.RunAllPending();
|
| -}
|
| -
|
| -TEST_F(OwnerManagerTest, AlreadyLoadedOwnerKey) {
|
| - base::WaitableEvent event(true, false);
|
| - MockKeyLoadObserver loader(&event);
|
| - loader.ExpectKeyFetchSuccess(true);
|
| - scoped_refptr<OwnerManager> manager(new OwnerManager);
|
| -
|
| - EXPECT_CALL(*mock_, GetOwnerKeyFilePath())
|
| - .WillRepeatedly(Return(tmpfile_));
|
| -
|
| - InjectKeys(manager.get());
|
| -
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&OwnerManager::LoadOwnerKey, manager.get()));
|
| - while (!event.IsSignaled())
|
| - message_loop_.RunAllPending();
|
| -}
|
| -
|
| -TEST_F(OwnerManagerTest, LoadOwnerKey) {
|
| - base::WaitableEvent event(true, false);
|
| - MockKeyLoadObserver loader(&event);
|
| - loader.ExpectKeyFetchSuccess(true);
|
| - scoped_refptr<OwnerManager> manager(new OwnerManager);
|
| -
|
| - EXPECT_CALL(*mock_, GetOwnerKeyFilePath())
|
| - .WillRepeatedly(Return(tmpfile_));
|
| - EXPECT_CALL(*mock_, ImportPublicKey(tmpfile_, _))
|
| - .WillOnce(DoAll(SetArgumentPointee<1>(fake_public_key_),
|
| - Return(true)))
|
| - .RetiresOnSaturation();
|
| -
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&OwnerManager::LoadOwnerKey, manager.get()));
|
| - while (!event.IsSignaled())
|
| - message_loop_.RunAllPending();
|
| -}
|
| -
|
| -TEST_F(OwnerManagerTest, GetKeyFailDuringVerify) {
|
| - StartUnowned();
|
| - MockKeyLoadObserver loader(NULL);
|
| - loader.ExpectKeyFetchSuccess(false);
|
| - scoped_refptr<OwnerManager> manager(new OwnerManager);
|
| -
|
| - EXPECT_CALL(*mock_, GetOwnerKeyFilePath())
|
| - .WillRepeatedly(Return(tmpfile_));
|
| - EXPECT_CALL(*mock_, ImportPublicKey(tmpfile_, _))
|
| - .WillOnce(Return(false))
|
| - .RetiresOnSaturation();
|
| -
|
| - base::WaitableEvent event(true, false);
|
| - MockKeyUser delegate(OwnerManager::KEY_UNAVAILABLE, &event);
|
| -
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&OwnerManager::Verify, manager.get(), BrowserThread::UI,
|
| - std::string(), std::vector<uint8>(), &delegate));
|
| - while (!event.IsSignaled())
|
| - message_loop_.RunAllPending();
|
| -}
|
| -
|
| -TEST_F(OwnerManagerTest, AlreadyHaveKeysVerify) {
|
| - scoped_refptr<OwnerManager> manager(new OwnerManager);
|
| -
|
| - std::string data;
|
| - std::vector<uint8> sig(0, 2);
|
| -
|
| - EXPECT_CALL(*mock_, GetOwnerKeyFilePath())
|
| - .WillRepeatedly(Return(tmpfile_));
|
| - EXPECT_CALL(*mock_, Verify(Eq(data), Eq(sig), Eq(fake_public_key_)))
|
| - .WillOnce(Return(true))
|
| - .RetiresOnSaturation();
|
| -
|
| - InjectKeys(manager.get());
|
| - base::WaitableEvent event(true, false);
|
| - MockKeyUser delegate(OwnerManager::SUCCESS, &event);
|
| -
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&OwnerManager::Verify, manager.get(), BrowserThread::UI, data,
|
| - sig, &delegate));
|
| - while (!event.IsSignaled())
|
| - message_loop_.RunAllPending();
|
| -}
|
| -
|
| -TEST_F(OwnerManagerTest, GetKeyAndVerify) {
|
| - MockKeyLoadObserver loader(NULL);
|
| - loader.ExpectKeyFetchSuccess(true);
|
| - scoped_refptr<OwnerManager> manager(new OwnerManager);
|
| -
|
| - std::string data;
|
| - std::vector<uint8> sig(0, 2);
|
| -
|
| - EXPECT_CALL(*mock_, GetOwnerKeyFilePath())
|
| - .WillRepeatedly(Return(tmpfile_));
|
| - EXPECT_CALL(*mock_, ImportPublicKey(tmpfile_, _))
|
| - .WillOnce(DoAll(SetArgumentPointee<1>(fake_public_key_),
|
| - Return(true)))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*mock_, Verify(Eq(data), Eq(sig), Eq(fake_public_key_)))
|
| - .WillOnce(Return(true))
|
| - .RetiresOnSaturation();
|
| -
|
| - base::WaitableEvent event(true, false);
|
| - MockKeyUser delegate(OwnerManager::SUCCESS, &event);
|
| -
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&OwnerManager::Verify, manager.get(), BrowserThread::UI, data,
|
| - sig, &delegate));
|
| - while (!event.IsSignaled())
|
| - message_loop_.RunAllPending();
|
| -}
|
| -
|
| -TEST_F(OwnerManagerTest, AlreadyHaveKeysSign) {
|
| - scoped_refptr<OwnerManager> manager(new OwnerManager);
|
| -
|
| - std::string data;
|
| - std::vector<uint8> sig(0, 2);
|
| -
|
| - EXPECT_CALL(*mock_, GetOwnerKeyFilePath())
|
| - .WillRepeatedly(Return(tmpfile_));
|
| - EXPECT_CALL(*mock_, Sign(Eq(data), _, Eq(fake_private_key_.get())))
|
| - .WillOnce(DoAll(SetArgumentPointee<1>(sig),
|
| - Return(true)))
|
| - .RetiresOnSaturation();
|
| -
|
| - InjectKeys(manager.get());
|
| - base::WaitableEvent event(true, false);
|
| - MockSigner delegate(OwnerManager::SUCCESS, sig, &event);
|
| -
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&OwnerManager::Sign, manager.get(), BrowserThread::UI, data,
|
| - &delegate));
|
| - while (!event.IsSignaled())
|
| - message_loop_.RunAllPending();
|
| -}
|
| -
|
| -} // namespace chromeos
|
|
|