1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_CHROMEOS_CROS_CROS_LIBRARY_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_CHROMEOS_CROS_CROS_LIBRARY_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/command_line.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/chrome_switches.h"
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace base {
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsentemplate <typename T> struct DefaultLazyInstanceTraits;
1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass BrightnessLibrary;
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass BurnLibrary;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CryptohomeLibrary;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InputMethodLibrary;
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass LibCrosServiceLibrary;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass LibraryLoader;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass LoginLibrary;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MountLibrary;
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NetworkLibrary;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PowerLibrary;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ScreenLockLibrary;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SpeechSynthesisLibrary;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SyslogsLibrary;
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TouchpadLibrary;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass UpdateLibrary;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class handles access to sub-parts of ChromeOS library. it provides
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// a level of indirection so individual libraries that it exposes can
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// be mocked for testing.
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CrosLibrary {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This class provides access to internal members of CrosLibrary class for
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // purpose of testing (i.e. replacement of members' implementation with
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // mock objects).
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class TestApi {
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Use the stub implementations of the library. This is mainly for
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // running the chromeos build of chrome on the desktop.
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    void SetUseStubImpl();
5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Reset the stub implementations of the library, called after
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // SetUseStubImp is called.
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    void ResetUseStubImpl();
5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Passing true for own for these setters will cause them to be deleted
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // when the CrosLibrary is deleted (or other mocks are set).
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Setter for LibraryLoader.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void SetLibraryLoader(LibraryLoader* loader, bool own);
5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    void SetBrightnessLibrary(BrightnessLibrary* library, bool own);
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    void SetBurnLibrary(BurnLibrary* library, bool own);
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void SetCryptohomeLibrary(CryptohomeLibrary* library, bool own);
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void SetInputMethodLibrary(InputMethodLibrary* library, bool own);
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    void SetLibCrosServiceLibrary(LibCrosServiceLibrary* library, bool own);
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void SetLoginLibrary(LoginLibrary* library, bool own);
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void SetMountLibrary(MountLibrary* library, bool own);
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void SetNetworkLibrary(NetworkLibrary* library, bool own);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void SetPowerLibrary(PowerLibrary* library, bool own);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void SetScreenLockLibrary(ScreenLockLibrary* library, bool own);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void SetSpeechSynthesisLibrary(SpeechSynthesisLibrary* library, bool own);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void SetSyslogsLibrary(SyslogsLibrary* library, bool own);
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    void SetTouchpadLibrary(TouchpadLibrary* library, bool own);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void SetUpdateLibrary(UpdateLibrary* library, bool own);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    friend class CrosLibrary;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    explicit TestApi(CrosLibrary* library) : library_(library) {}
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CrosLibrary* library_;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This gets the CrosLibrary.
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static CrosLibrary* Get();
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  BrightnessLibrary* GetBrightnessLibrary();
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  BurnLibrary* GetBurnLibrary();
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CryptohomeLibrary* GetCryptohomeLibrary();
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InputMethodLibrary* GetInputMethodLibrary();
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  LibCrosServiceLibrary* GetLibCrosServiceLibrary();
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoginLibrary* GetLoginLibrary();
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MountLibrary* GetMountLibrary();
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NetworkLibrary* GetNetworkLibrary();
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PowerLibrary* GetPowerLibrary();
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScreenLockLibrary* GetScreenLockLibrary();
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SpeechSynthesisLibrary* GetSpeechSynthesisLibrary();
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SyslogsLibrary* GetSyslogsLibrary();
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TouchpadLibrary* GetTouchpadLibrary();
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UpdateLibrary* GetUpdateLibrary();
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Getter for Test API that gives access to internal members of this class.
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestApi* GetTestApi();
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ensures that the library is loaded, loading it if needed. If the library
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // could not be loaded, returns false.
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool EnsureLoaded();
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns an unlocalized string describing the last load error (if any).
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& load_error_string() {
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return load_error_string_;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  friend struct base::DefaultLazyInstanceTraits<chromeos::CrosLibrary>;
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class CrosLibrary::TestApi;
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrosLibrary();
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~CrosLibrary();
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LibraryLoader* library_loader_;
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool own_library_loader_;
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // This template supports the creation, setting and optional deletion of
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // the cros libraries.
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  template <class L>
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  class Library {
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick   public:
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    Library() : library_(NULL), own_(true) {}
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ~Library() {
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (own_)
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        delete library_;
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    L* GetDefaultImpl(bool use_stub_impl) {
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (!library_) {
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        own_ = true;
136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        if (CommandLine::ForCurrentProcess()->HasSwitch(
137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            switches::kForceStubLibcros))
138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          use_stub_impl = true;
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        library_ = L::GetImpl(use_stub_impl);
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      }
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return library_;
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    void SetImpl(L* library, bool own) {
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (library != library_) {
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        if (own_)
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          delete library_;
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        library_ = library;
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        own_ = own;
1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      }
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick   private:
1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    L* library_;
1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool own_;
1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
15821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  Library<BrightnessLibrary> brightness_lib_;
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Library<BurnLibrary> burn_lib_;
1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Library<CryptohomeLibrary> crypto_lib_;
1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Library<InputMethodLibrary> input_method_lib_;
16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Library<LibCrosServiceLibrary> libcros_service_lib_;
1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Library<LoginLibrary> login_lib_;
1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Library<MountLibrary> mount_lib_;
1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Library<NetworkLibrary> network_lib_;
1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Library<PowerLibrary> power_lib_;
1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Library<ScreenLockLibrary> screen_lock_lib_;
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Library<SpeechSynthesisLibrary> speech_synthesis_lib_;
1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Library<SyslogsLibrary> syslogs_lib_;
1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Library<TouchpadLibrary> touchpad_lib_;
1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Library<UpdateLibrary> update_lib_;
1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Stub implementations of the libraries should be used.
1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool use_stub_impl_;
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True if libcros was successfully loaded.
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool loaded_;
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True if the last load attempt had an error.
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool load_error_;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Contains the error string from the last load attempt.
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string load_error_string_;
1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<TestApi> test_api_;
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(CrosLibrary);
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// The class is used for enabling the stub libcros, and cleaning it up at
18721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// the end of the object lifetime. Useful for testing.
18821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass ScopedStubCrosEnabler {
18921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public:
19021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ScopedStubCrosEnabler() {
19121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    chromeos::CrosLibrary::Get()->GetTestApi()->SetUseStubImpl();
19221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
19321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ~ScopedStubCrosEnabler() {
19521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    chromeos::CrosLibrary::Get()->GetTestApi()->ResetUseStubImpl();
19621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
19821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private:
19921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DISALLOW_COPY_AND_ASSIGN(ScopedStubCrosEnabler);
20021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen};
20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_CHROMEOS_CROS_CROS_LIBRARY_H_
205