blob: 87bf532007f16aef7d5ec1e6c4126ae1f6875cb6 [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.
#ifndef CHROME_BROWSER_CHROMEOS_CROS_CROS_LIBRARY_H_
#define CHROME_BROWSER_CHROMEOS_CROS_CROS_LIBRARY_H_
#include <string>
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
namespace base {
template <typename T> struct DefaultLazyInstanceTraits;
}
namespace chromeos {
class BurnLibrary;
class CertLibrary;
class CryptohomeLibrary;
class NetworkLibrary;
// This class handles access to sub-parts of ChromeOS library. it provides
// a level of indirection so individual libraries that it exposes can
// be mocked for testing.
class CrosLibrary {
public:
// This class provides access to internal members of CrosLibrary class for
// purpose of testing (i.e. replacement of members' implementation with
// mock objects).
class TestApi {
public:
// Passing true for own for these setters will cause them to be deleted
// when the CrosLibrary is deleted (or other mocks are set).
void SetCertLibrary(CertLibrary* library, bool own);
void SetBurnLibrary(BurnLibrary* library, bool own);
void SetCryptohomeLibrary(CryptohomeLibrary* library, bool own);
void SetNetworkLibrary(NetworkLibrary* library, bool own);
private:
friend class CrosLibrary;
explicit TestApi(CrosLibrary* library) : library_(library) {}
CrosLibrary* library_;
};
// Sets the global instance. Must be called before any calls to Get().
static void Initialize(bool use_stub);
// Destroys the global instance. Must be called before AtExitManager is
// destroyed to ensure a clean shutdown.
static void Shutdown();
// Gets the global instance. Returns NULL if Initialize() has not been
// called (or Shutdown() has been called).
static CrosLibrary* Get();
BurnLibrary* GetBurnLibrary();
CertLibrary* GetCertLibrary();
CryptohomeLibrary* GetCryptohomeLibrary();
NetworkLibrary* GetNetworkLibrary();
// Getter for Test API that gives access to internal members of this class.
TestApi* GetTestApi();
// Note: Since we are no longer loading Libcros, we can return true here
// whenever the used libraries are not stub.
// TODO(hashimoto): Remove this method.
bool libcros_loaded() { return !use_stub_impl_; }
private:
friend struct base::DefaultLazyInstanceTraits<chromeos::CrosLibrary>;
friend class CrosLibrary::TestApi;
explicit CrosLibrary(bool use_stub);
virtual ~CrosLibrary();
// This template supports the creation, setting and optional deletion of
// the cros libraries.
template <class L>
class Library {
public:
Library() : library_(NULL), own_(true) {}
~Library() {
if (own_)
delete library_;
}
L* GetDefaultImpl(bool use_stub_impl) {
if (!library_) {
own_ = true;
library_ = L::GetImpl(use_stub_impl);
}
return library_;
}
void SetImpl(L* library, bool own) {
if (library != library_) {
if (own_)
delete library_;
library_ = library;
own_ = own;
}
}
private:
L* library_;
bool own_;
};
Library<BurnLibrary> burn_lib_;
Library<CertLibrary> cert_lib_;
Library<CryptohomeLibrary> crypto_lib_;
Library<NetworkLibrary> network_lib_;
// Stub implementations of the libraries should be used.
bool use_stub_impl_;
scoped_ptr<TestApi> test_api_;
DISALLOW_COPY_AND_ASSIGN(CrosLibrary);
};
// The class is used for enabling the stub libcros, and cleaning it up at
// the end of the object lifetime. Useful for testing.
class ScopedStubCrosEnabler {
public:
ScopedStubCrosEnabler() {
chromeos::CrosLibrary::Initialize(true);
}
~ScopedStubCrosEnabler() {
chromeos::CrosLibrary::Shutdown();
}
private:
DISALLOW_COPY_AND_ASSIGN(ScopedStubCrosEnabler);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_CROS_CROS_LIBRARY_H_