1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_SERVICE_TEST_BASE_H_ 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_EXTENSION_SERVICE_TEST_BASE_H_ 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/at_exit.h" 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/files/file_path.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/files/scoped_temp_dir.h" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/public/test/test_utils.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_CHROMEOS) 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/user_manager.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h" 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ExtensionService; 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class Profile; 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class TestingProfile; 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace content { 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class BrowserContext; 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace extensions { 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ExtensionRegistry; 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ManagementPolicy; 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// A unittest infrastructure which creates an ExtensionService. Whenever 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// possible, use this instead of creating a browsertest. 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Note: Before adding methods to this class, please, please, please think about 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// whether they should go here or in a more specific subclass. Lots of things 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// need an ExtensionService, but they don't all need to know how you want yours 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// to be initialized. 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ExtensionServiceTestBase : public testing::Test { 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) struct ExtensionServiceInitParams { 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath profile_path; 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath pref_file; 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath extensions_install_dir; 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool autoupdate_enabled; // defaults to false. 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool is_first_run; // defaults to true. 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool profile_is_supervised; // defaults to false. 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Though you could use this constructor, you probably want to use 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // CreateDefaultInitParams(), and then make a change or two. 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionServiceInitParams(); 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) }; 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected: 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionServiceTestBase(); 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~ExtensionServiceTestBase(); 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // testing::Test implementation. 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void SetUp() OVERRIDE; 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static void SetUpTestCase(); // faux-verride (static override). 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Create a set of InitParams to install an ExtensionService into |temp_dir_|. 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionServiceInitParams CreateDefaultInitParams(); 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Initialize an ExtensionService according to the given |params|. 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void InitializeExtensionService(const ExtensionServiceInitParams& params); 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Initialize an empty ExtensionService using the default init params. 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void InitializeEmptyExtensionService(); 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Initialize an ExtensionService with the associated |prefs_file| and 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |source_install_dir|. 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void InitializeInstalledExtensionService( 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath& prefs_file, 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath& source_install_dir); 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Initialize an ExtensionService with a few already-installed extensions. 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void InitializeGoodInstalledExtensionService(); 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Initialize an ExtensionService with autoupdate enabled. 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void InitializeExtensionServiceWithUpdater(); 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Initialize the associated ProcessManager. 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void InitializeProcessManager(); 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(rdevlin.cronin): Pull out more methods from ExtensionServiceTest that 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // are commonly used and/or reimplemented. For instance, methods to install 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // extensions from various locations, etc. 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::BrowserContext* browser_context(); 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Profile* profile(); 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionService* service() { return service_; } 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionRegistry* registry() { return registry_; } 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath& extensions_install_dir() const { 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return extensions_install_dir_; 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath& data_dir() const { return data_dir_; } 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::ScopedTempDir& temp_dir() const { return temp_dir_; } 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // It's unfortunate that these are exposed to subclasses (rather than used 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // through the accessor methods above), but too many tests already use them 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // directly. 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The associated testing profile. 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<TestingProfile> profile_; 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The ExtensionService, whose lifetime is managed by |profile|'s 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // ExtensionSystem. 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionService* service_; 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void CreateExtensionService(const ExtensionServiceInitParams& params); 115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Destroy temp_dir_ after thread_bundle_ so clean-up tasks can still use the 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // directory. 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::ScopedTempDir temp_dir_; 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Destroying at_exit_manager_ will delete all LazyInstances, so it must come 121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // after thread_bundle_ in the destruction order. 122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::ShadowingAtExitManager at_exit_manager_; 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The directory into which extensions are installed. 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath extensions_install_dir_; 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // chrome/test/data/extensions/ 129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath data_dir_; 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::InProcessUtilityThreadHelper in_process_utility_thread_helper_; 132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The associated ExtensionRegistry, for convenience. 134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::ExtensionRegistry* registry_; 135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined OS_CHROMEOS 137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) chromeos::ScopedTestDeviceSettingsService test_device_settings_service_; 138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) chromeos::ScopedTestCrosSettings test_cros_settings_; 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) chromeos::ScopedTestUserManager test_user_manager_; 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace extensions 144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_SERVICE_TEST_BASE_H_ 146