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