12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/at_exit.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_enumerator.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_file_value_serializer.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_string_value_serializer.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/version.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/app_sync_data.h"
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/extensions/blacklist.h"
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/extensions/chrome_app_sorting.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/component_loader.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/crx_installer.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/default_apps.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_creator.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_error_reporter.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_error_ui.h"
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_management_test_util.h"
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/extensions/extension_notification_observer.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/extensions/extension_service_test_base.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_special_storage_policy.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_sync_data.h"
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/extension_sync_service.h"
478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/extension_util.h"
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/external_install_error.h"
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/external_install_manager.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/external_policy_loader.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/external_pref_loader.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/external_provider_impl.h"
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/extensions/fake_safe_browsing_database_manager.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/installed_loader.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/pack_extension_job.h"
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/pending_extension_info.h"
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/pending_extension_manager.h"
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/test_blacklist.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/test_extension_system.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/unpacked_installer.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/updater/extension_updater.h"
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable.h"
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service.h"
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/api/plugins/plugins_handler.h"
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h"
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest_url_handler.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/scoped_browser_locale.h"
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/test/base/testing_pref_service_syncable.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/crx_file/id_util.h"
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/dom_storage_context.h"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/gpu_data_manager.h"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/indexed_db_context.h"
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service.h"
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/render_process_host.h"
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h"
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/test/test_utils.h"
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_registry.h"
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/external_provider_interface.h"
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "extensions/browser/install_flag.h"
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/management_policy.h"
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/test_management_policy.h"
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/uninstall_reason.h"
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h"
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension_builder.h"
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension_l10n_util.h"
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h"
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "extensions/common/feature_switch.h"
103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "extensions/common/manifest_constants.h"
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/manifest_handlers/background_info.h"
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "extensions/common/permissions/permission_set.h"
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/common/switches.h"
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern.h"
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/value_builder.h"
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_info.h"
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/browser_resources.h"
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h"
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h"
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_options.h"
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h"
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/database/database_tracker.h"
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_manager.h"
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/database/database_identifier.h"
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "sync/api/fake_sync_change_processor.h"
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/string_ordinal.h"
12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "sync/api/sync_data.h"
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error_factory.h"
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error_factory_mock.h"
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "sync/api/syncable_service.h"
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/app_specifics.pb.h"
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/extension_specifics.pb.h"
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync.pb.h"
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h"
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// The blacklist tests rely on safe browsing.
14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING)
14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define ENABLE_BLACKLIST_TESTS
14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif
14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::DictionaryValue;
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::ListValue;
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::Value;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DOMStorageContext;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::IndexedDBContext;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::PluginService;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::APIPermission;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::APIPermissionSet;
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using extensions::AppSorting;
15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)using extensions::Blacklist;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::CrxInstaller;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::ExtensionCreator;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::ExtensionPrefs;
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using extensions::ExtensionRegistry;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::ExtensionResource;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::ExtensionSystem;
16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)using extensions::FakeSafeBrowsingDatabaseManager;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::FeatureSwitch;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Manifest;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::PermissionSet;
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using extensions::TestExtensionSystem;
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using extensions::UnloadedExtensionInfo;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::URLPatternSet;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace keys = extensions::manifest_keys;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extension ids used during testing.
17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char good0[] = "behllobkkfkfnphdnhnkndlbkcpglgmj";
17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char good1[] = "hpiknbiabeeppbpihjehijgoemciehgk";
17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char good2[] = "bjafgdebaacbbbecmhlhpofkepfkgcpa";
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char all_zero[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char good2048[] = "nmgjhmhbleinmjpbdhgajfjkbijcmgbh";
18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char good_crx[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf";
18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char hosted_app[] = "kbmnembihfiondgfjekmnmcbddelicoi";
18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char page_action[] = "obcimlgaoabeegjmmpldobjndiealpln";
18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char theme_crx[] = "iamefpfkojoapidjnbafmgkgncegbkad";
18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char theme2_crx[] = "pjpgmfcmabopnnfonnhmdjglfpjjfkbf";
18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char permissions_crx[] = "eagpmdpfmaekmmcejjbmjoecnejeiiin";
18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char unpacked[] = "cbcdidchbppangcjoddlpdjlenngjldk";
18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char updates_from_webstore[] = "akjooamlhcgeopfifcmlggaebeocgokj";
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ExtensionsOrder {
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool operator()(const scoped_refptr<const Extension>& a,
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                  const scoped_refptr<const Extension>& b) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return a->name() < b->name();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static std::vector<base::string16> GetErrors() {
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::vector<base::string16>* errors =
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionErrorReporter::GetInstance()->GetErrors();
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<base::string16> ret_val;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (std::vector<base::string16>::const_iterator iter = errors->begin();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != errors->end(); ++iter) {
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string utf8_error = base::UTF16ToUTF8(*iter);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (utf8_error.find(".svn") == std::string::npos) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret_val.push_back(*iter);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tests rely on the errors being in a certain order, which can vary
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // depending on how filesystem iteration works.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::stable_sort(ret_val.begin(), ret_val.end());
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ret_val;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void AddPattern(URLPatternSet* extent, const std::string& pattern) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int schemes = URLPattern::SCHEME_ALL;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extent->AddPattern(URLPattern(schemes, pattern));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetTemporaryFile() {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath temp_file;
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CHECK(base::CreateTemporaryFile(&temp_file));
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return temp_file;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool WaitForCountNotificationsCallback(int *count) {
2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return --(*count) == 0;
2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockExtensionProvider : public extensions::ExternalProviderInterface {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockExtensionProvider(
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VisitorInterface* visitor,
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Manifest::Location location)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : location_(location), visitor_(visitor), visit_count_(0) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockExtensionProvider() {}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateOrAddExtension(const std::string& id,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& version,
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const base::FilePath& path) {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_map_[id] = std::make_pair(version, path);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveExtension(const std::string& id) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_map_.erase(id);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExternalProvider implementation:
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void VisitRegisteredExtension() OVERRIDE {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    visit_count_++;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (DataMap::const_iterator i = extension_map_.begin();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         i != extension_map_.end(); ++i) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Version version(i->second.first);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      visitor_->OnExternalExtensionFileFound(
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          i->first, &version, i->second.second, location_,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Extension::NO_FLAGS, false);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    visitor_->OnExternalProviderReady(this);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HasExtension(const std::string& id) const OVERRIDE {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extension_map_.find(id) != extension_map_.end();
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetExtensionDetails(
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& id,
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Manifest::Location* location,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<Version>* version) const OVERRIDE {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DataMap::const_iterator it = extension_map_.find(id);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it == extension_map_.end())
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (version)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      version->reset(new Version(it->second.first));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (location)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *location = location_;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsReady() const OVERRIDE {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ServiceShutdown() OVERRIDE {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int visit_count() const { return visit_count_; }
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_visit_count(int visit_count) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    visit_count_ = visit_count;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map< std::string, std::pair<std::string, base::FilePath> >
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DataMap;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataMap extension_map_;
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Manifest::Location location_;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitorInterface* visitor_;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // visit_count_ tracks the number of calls to VisitRegisteredExtension().
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mutable because it must be incremented on each call to
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // VisitRegisteredExtension(), which must be a const method to inherit
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from the class being mocked.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mutable int visit_count_;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockExtensionProvider);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockProviderVisitor
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public extensions::ExternalProviderInterface::VisitorInterface {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The provider will return |fake_base_path| from
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetBaseCrxFilePath().  User can test the behavior with
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and without an empty path using this parameter.
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit MockProviderVisitor(base::FilePath fake_base_path)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ids_found_(0),
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fake_base_path_(fake_base_path),
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        expected_creation_flags_(Extension::NO_FLAGS) {
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    profile_.reset(new TestingProfile);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockProviderVisitor(base::FilePath fake_base_path,
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      int expected_creation_flags)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ids_found_(0),
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fake_base_path_(fake_base_path),
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        expected_creation_flags_(expected_creation_flags) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int Visit(const std::string& json_data) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Give the test json file to the provider for parsing.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider_.reset(new extensions::ExternalProviderImpl(
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new extensions::ExternalTestingLoader(json_data, fake_base_path_),
342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        profile_.get(),
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Manifest::EXTERNAL_PREF,
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Manifest::EXTERNAL_PREF_DOWNLOAD,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Extension::NO_FLAGS));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We also parse the file into a dictionary to compare what we get back
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // from the provider.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JSONStringValueSerializer serializer(json_data);
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::Value* json_value = serializer.Deserialize(NULL, NULL);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!json_value || !json_value->IsType(base::Value::TYPE_DICTIONARY)) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Unable to deserialize json data";
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return -1;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::DictionaryValue* external_extensions =
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          static_cast<base::DictionaryValue*>(json_value);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs_.reset(external_extensions);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Reset our counter.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ids_found_ = 0;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ask the provider to look up all extensions and return them.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider_->VisitRegisteredExtension();
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ids_found_;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnExternalExtensionFileFound(const std::string& id,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const Version* version,
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            const base::FilePath& path,
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            Manifest::Location unused,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int creation_flags,
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            bool mark_acknowledged) OVERRIDE {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_creation_flags_, creation_flags);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++ids_found_;
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* pref;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This tests is to make sure that the provider only notifies us of the
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // values we gave it. So if the id we doesn't exist in our internal
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // dictionary then something is wrong.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(prefs_->GetDictionary(id, &pref))
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       << "Got back ID (" << id.c_str() << ") we weren't expecting";
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(path.IsAbsolute());
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!fake_base_path_.empty())
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(fake_base_path_.IsParent(path));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pref) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(provider_->HasExtension(id));
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Ask provider if the extension we got back is registered.
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Manifest::Location location = Manifest::INVALID_LOCATION;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<Version> v1;
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath crx_path;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(provider_->GetExtensionDetails(id, NULL, &v1));
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_STREQ(version->GetString().c_str(), v1->GetString().c_str());
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<Version> v2;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(provider_->GetExtensionDetails(id, &location, &v2));
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_STREQ(version->GetString().c_str(), v1->GetString().c_str());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_STREQ(version->GetString().c_str(), v2->GetString().c_str());
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(Manifest::EXTERNAL_PREF, location);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Remove it so we won't count it ever again.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs_->Remove(id, NULL);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnExternalExtensionUpdateUrlFound(
413effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const std::string& id,
414effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const std::string& install_parameter,
415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const GURL& update_url,
4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Manifest::Location location,
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      int creation_flags,
4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      bool mark_acknowledged) OVERRIDE {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++ids_found_;
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* pref;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This tests is to make sure that the provider only notifies us of the
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // values we gave it. So if the id we doesn't exist in our internal
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // dictionary then something is wrong.
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(prefs_->GetDictionary(id, &pref))
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       << L"Got back ID (" << id.c_str() << ") we weren't expecting";
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, location);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pref) {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(provider_->HasExtension(id));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // External extensions with update URLs do not have versions.
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<Version> v1;
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Manifest::Location location1 = Manifest::INVALID_LOCATION;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(provider_->GetExtensionDetails(id, &location1, &v1));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(v1.get());
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, location1);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
438effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      std::string parsed_install_parameter;
439effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      pref->GetString("install_parameter", &parsed_install_parameter);
440effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      EXPECT_EQ(parsed_install_parameter, install_parameter);
441effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Remove it so we won't count it again.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs_->Remove(id, NULL);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnExternalProviderReady(
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const extensions::ExternalProviderInterface* provider) OVERRIDE {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(provider, provider_.get());
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(provider->IsReady());
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ids_found_;
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath fake_base_path_;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_creation_flags_;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<extensions::ExternalProviderImpl> provider_;
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> prefs_;
460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockProviderVisitor);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ExtensionServiceTest : public extensions::ExtensionServiceTestBase,
466f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             public content::NotificationObserver {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionServiceTest()
469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : unloaded_reason_(UnloadedExtensionInfo::REASON_UNDEFINED),
470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        installed_(NULL),
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        was_update_(false),
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        override_external_install_prompt_(
473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            FeatureSwitch::prompt_for_external_extensions(),
474f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            false),
475f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        expected_extensions_count_(0) {
4760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    registrar_.Add(this,
4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   content::NotificationService::AllSources());
479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    registrar_.Add(this,
4805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED,
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   content::NotificationService::AllSources());
4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    registrar_.Add(
4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        this,
4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED,
4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        content::NotificationService::AllSources());
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      case extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const Extension* extension =
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            content::Details<const Extension>(details).ptr();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loaded_.push_back(make_scoped_refptr(extension));
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // The tests rely on the errors being in a certain order, which can vary
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // depending on how filesystem iteration works.
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::stable_sort(loaded_.begin(), loaded_.end(), ExtensionsOrder());
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      case extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED: {
503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        UnloadedExtensionInfo* unloaded_info =
504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            content::Details<UnloadedExtensionInfo>(details).ptr();
505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        const Extension* e = unloaded_info->extension;
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unloaded_id_ = e->id();
507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        unloaded_reason_ = unloaded_info->reason;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extensions::ExtensionList::iterator i =
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            std::find(loaded_.begin(), loaded_.end(), e);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // TODO(erikkay) fix so this can be an assert.  Right now the tests
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // are manually calling clear() on loaded_, so this isn't doable.
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (i == loaded_.end())
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return;
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loaded_.erase(i);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      case extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED: {
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        const extensions::InstalledExtensionInfo* installed_info =
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            content::Details<const extensions::InstalledExtensionInfo>(details)
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                .ptr();
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        installed_ = installed_info->extension;
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        was_update_ = installed_info->is_update;
52390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        old_name_ = installed_info->old_name;
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DCHECK(false);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddMockExternalProvider(
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::ExternalProviderInterface* provider) {
534f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    service()->AddProviderForTesting(provider);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void MockSyncStartFlare(bool* was_called,
5387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          syncer::ModelType* model_type_passed_in,
5397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          syncer::ModelType model_type) {
5407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    *was_called = true;
5417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    *model_type_passed_in = model_type;
5427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
5437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
54568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Paths to some of the fake extensions.
54668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::FilePath good0_path() {
547f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return data_dir()
548f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        .AppendASCII("good")
549f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        .AppendASCII("Extensions")
550f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        .AppendASCII(good0)
551f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        .AppendASCII("1.0.0.0");
55268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
55368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
55468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::FilePath good1_path() {
555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return data_dir()
556f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        .AppendASCII("good")
557f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        .AppendASCII("Extensions")
558f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        .AppendASCII(good1)
559f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        .AppendASCII("2");
56068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
56168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
56268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::FilePath good2_path() {
563f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return data_dir()
564f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        .AppendASCII("good")
565f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        .AppendASCII("Extensions")
566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        .AppendASCII(good2)
567f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        .AppendASCII("1.0");
56868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
56968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestExternalProvider(MockExtensionProvider* provider,
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            Manifest::Location location);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PackCRX(const base::FilePath& dir_path,
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               const base::FilePath& pem_path,
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               const base::FilePath& crx_path) {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use the existing pem key, if provided.
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath pem_output_path;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pem_path.value().empty()) {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pem_output_path = crx_path.DirName().AppendASCII("temp.pem");
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
5817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ASSERT_TRUE(base::PathExists(pem_path));
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_TRUE(base::DeleteFile(crx_path, false));
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<ExtensionCreator> creator(new ExtensionCreator());
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(creator->Run(dir_path,
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             crx_path,
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             pem_path,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             pem_output_path,
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ExtensionCreator::kOverwriteCRX));
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_TRUE(base::PathExists(crx_path));
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum InstallState {
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_FAILED,
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UPDATED,
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    INSTALL_NEW,
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    INSTALL_WITHOUT_LOAD,
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* PackAndInstallCRX(const base::FilePath& dir_path,
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const base::FilePath& pem_path,
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     InstallState install_state,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     int creation_flags) {
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath crx_path;
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir;
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    crx_path = temp_dir.path().AppendASCII("temp.crx");
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PackCRX(dir_path, pem_path, crx_path);
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InstallCRX(crx_path, install_state, creation_flags);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* PackAndInstallCRX(const base::FilePath& dir_path,
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const base::FilePath& pem_path,
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     InstallState install_state) {
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PackAndInstallCRX(dir_path, pem_path, install_state,
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Extension::NO_FLAGS);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* PackAndInstallCRX(const base::FilePath& dir_path,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     InstallState install_state) {
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PackAndInstallCRX(dir_path, base::FilePath(), install_state,
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Extension::NO_FLAGS);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Attempts to install an extension. Use INSTALL_FAILED if the installation
63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // is expected to fail.
63190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // If |install_state| is INSTALL_UPDATED, and |expected_old_name| is
63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // non-empty, expects that the existing extension's title was
63390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // |expected_old_name|.
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* InstallCRX(const base::FilePath& path,
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              InstallState install_state,
63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                              int creation_flags,
63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                              const std::string& expected_old_name) {
638f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    InstallCRXInternal(path, creation_flags);
639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return VerifyCrxInstall(path, install_state, expected_old_name);
64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
64190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
64290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Attempts to install an extension. Use INSTALL_FAILED if the installation
64390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // is expected to fail.
64490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const Extension* InstallCRX(const base::FilePath& path,
64590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                              InstallState install_state,
64690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                              int creation_flags) {
647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return InstallCRX(path, install_state, creation_flags, std::string());
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempts to install an extension. Use INSTALL_FAILED if the installation
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is expected to fail.
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* InstallCRX(const base::FilePath& path,
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              InstallState install_state) {
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InstallCRX(path, install_state, Extension::NO_FLAGS);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* InstallCRXFromWebStore(const base::FilePath& path,
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          InstallState install_state) {
659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    InstallCRXInternal(path, Extension::FROM_WEBSTORE);
660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return VerifyCrxInstall(path, install_state);
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* InstallCRXWithLocation(const base::FilePath& crx_path,
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          Manifest::Location install_location,
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          InstallState install_state) {
6667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(base::PathExists(crx_path))
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "Path does not exist: "<< crx_path.value().c_str();
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // no client (silent install)
669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<CrxInstaller> installer(
670f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        CrxInstaller::CreateSilent(service()));
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer->set_install_source(install_location);
672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::WindowedNotificationObserver observer(
6745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions::NOTIFICATION_CRX_INSTALLER_DONE,
675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::NotificationService::AllSources());
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer->InstallCrx(crx_path);
677f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    observer.Wait();
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
679f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return VerifyCrxInstall(crx_path, install_state);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
682f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Verifies the result of a CRX installation. Used by InstallCRX. Set the
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |install_state| to INSTALL_FAILED if the installation is expected to fail.
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns an Extension pointer if the install succeeded, NULL otherwise.
685f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const Extension* VerifyCrxInstall(const base::FilePath& path,
686f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    InstallState install_state) {
687f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return VerifyCrxInstall(path, install_state, std::string());
68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
68990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Verifies the result of a CRX installation. Used by InstallCRX. Set the
69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // |install_state| to INSTALL_FAILED if the installation is expected to fail.
69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // If |install_state| is INSTALL_UPDATED, and |expected_old_name| is
69390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // non-empty, expects that the existing extension's title was
69490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // |expected_old_name|.
69590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Returns an Extension pointer if the install succeeded, NULL otherwise.
696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const Extension* VerifyCrxInstall(const base::FilePath& path,
697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    InstallState install_state,
698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    const std::string& expected_old_name) {
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<base::string16> errors = GetErrors();
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension = NULL;
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (install_state != INSTALL_FAILED) {
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (install_state == INSTALL_NEW)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ++expected_extensions_count_;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(installed_) << path.value();
706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // If and only if INSTALL_UPDATED, it should have the is_update flag.
707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(install_state == INSTALL_UPDATED, was_update_)
708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          << path.value();
70990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // If INSTALL_UPDATED, old_name_ should match the given string.
71090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (install_state == INSTALL_UPDATED && !expected_old_name.empty())
71190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        EXPECT_EQ(expected_old_name, old_name_);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(0u, errors.size()) << path.value();
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (install_state == INSTALL_WITHOUT_LOAD) {
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, loaded_.size()) << path.value();
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else {
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, loaded_.size()) << path.value();
718f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        size_t actual_extension_count =
719f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            registry()->enabled_extensions().size() +
720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            registry()->disabled_extensions().size();
7213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        EXPECT_EQ(expected_extensions_count_, actual_extension_count) <<
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            path.value();
723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        extension = loaded_[0].get();
724f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        EXPECT_TRUE(service()->GetExtensionById(extension->id(), false))
725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            << path.value();
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      for (std::vector<base::string16>::iterator err = errors.begin();
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err != errors.end(); ++err) {
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(ERROR) << *err;
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(installed_) << path.value();
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(0u, loaded_.size()) << path.value();
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(1u, errors.size()) << path.value();
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installed_ = NULL;
739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    was_update_ = false;
74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    old_name_ = "";
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loaded_.clear();
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionErrorReporter::GetInstance()->ClearErrors();
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extension;
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum UpdateState {
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAILED_SILENTLY,
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAILED,
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UPDATED,
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALLED,
7515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    DISABLED,
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ENABLED
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BlackListWebGL() {
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const std::string json_blacklist =
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "{\n"
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"name\": \"gpu blacklist\",\n"
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"version\": \"1.0\",\n"
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"entries\": [\n"
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    {\n"
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      \"id\": 1,\n"
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "      \"features\": [\"webgl\"]\n"
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    }\n"
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  ]\n"
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}";
76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    gpu::GPUInfo gpu_info;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::GpuDataManager::GetInstance()->InitializeForTesting(
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        json_blacklist, gpu_info);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Helper method to set up a WindowedNotificationObserver to wait for a
773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // specific CrxInstaller to finish if we don't know the value of the
774f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |installer| yet.
775f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static bool IsCrxInstallerDone(extensions::CrxInstaller** installer,
776f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                 const content::NotificationSource& source,
777f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                 const content::NotificationDetails& details) {
778f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return content::Source<extensions::CrxInstaller>(source).ptr() ==
779f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           *installer;
780f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
781f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void PackCRXAndUpdateExtension(const std::string& id,
7835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 const base::FilePath& dir_path,
7845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 const base::FilePath& pem_path,
7855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 UpdateState expected_state) {
7865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::ScopedTempDir temp_dir;
7875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
7885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::FilePath crx_path = temp_dir.path().AppendASCII("temp.crx");
7895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PackCRX(dir_path, pem_path, crx_path);
7915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    UpdateExtension(id, crx_path, expected_state);
7925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
7935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void UpdateExtension(const std::string& id,
795f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       const base::FilePath& in_path,
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       UpdateState expected_state) {
7977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_TRUE(base::PathExists(in_path));
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We need to copy this to a temporary location because Update() will delete
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // it.
801f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::FilePath path = temp_dir().path();
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(in_path.BaseName());
8037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_TRUE(base::CopyFile(in_path, path));
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int previous_enabled_extension_count =
806f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        registry()->enabled_extensions().size();
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int previous_installed_extension_count =
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        previous_enabled_extension_count +
809f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        registry()->disabled_extensions().size();
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    extensions::CrxInstaller* installer = NULL;
812f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::WindowedNotificationObserver observer(
8135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions::NOTIFICATION_CRX_INSTALLER_DONE,
814f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::Bind(&IsCrxInstallerDone, &installer));
815f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    service()->UpdateExtension(id, path, true, &installer);
8167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
817f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (installer)
818f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      observer.Wait();
819f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    else
820ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::RunLoop().RunUntilIdle();
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<base::string16> errors = GetErrors();
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int error_count = errors.size();
824f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    int enabled_extension_count = registry()->enabled_extensions().size();
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int installed_extension_count =
826f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        enabled_extension_count + registry()->disabled_extensions().size();
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_error_count = (expected_state == FAILED) ? 1 : 0;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_error_count, error_count) << path.value();
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (expected_state <= FAILED) {
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(previous_enabled_extension_count,
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                enabled_extension_count);
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(previous_installed_extension_count,
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                installed_extension_count);
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_installed_extension_count =
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (expected_state >= INSTALLED) ? 1 : 0;
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_enabled_extension_count =
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (expected_state >= ENABLED) ? 1 : 0;
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(expected_installed_extension_count,
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                installed_extension_count);
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(expected_enabled_extension_count,
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                enabled_extension_count);
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Update() should the temporary input file.
8487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(base::PathExists(path));
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TerminateExtension(const std::string& id) {
852f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const Extension* extension = service()->GetInstalledExtension(id);
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!extension) {
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ADD_FAILURE();
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
857f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    service()->TrackTerminatedExtensionForTest(extension);
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t GetPrefKeyCount() {
8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* dict =
862f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        profile()->GetPrefs()->GetDictionary("extensions.settings");
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!dict) {
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ADD_FAILURE();
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return dict->size();
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UninstallExtension(const std::string& id, bool use_helper) {
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify that the extension is installed.
872f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::FilePath extension_path = extensions_install_dir().AppendASCII(id);
8737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(base::PathExists(extension_path));
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t pref_key_count = GetPrefKeyCount();
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_GT(pref_key_count, 0u);
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValidateIntegerPref(id, "state", Extension::ENABLED);
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Uninstall it.
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (use_helper) {
880116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      EXPECT_TRUE(ExtensionService::UninstallExtensionHelper(
8815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          service(), id, extensions::UNINSTALL_REASON_FOR_TESTING));
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
883116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      EXPECT_TRUE(service()->UninstallExtension(
8845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          id,
8855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          extensions::UNINSTALL_REASON_FOR_TESTING,
8865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          base::Bind(&base::DoNothing),
8875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          NULL));
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    --expected_extensions_count_;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should get an unload notification.
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(unloaded_id_.empty());
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(id, unloaded_id_);
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify uninstalled state.
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t new_pref_key_count = GetPrefKeyCount();
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (new_pref_key_count == pref_key_count) {
8981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ValidateIntegerPref(id, "state",
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          Extension::EXTERNAL_EXTENSION_UNINSTALLED);
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(new_pref_key_count, pref_key_count - 1);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The extension should not be in the service anymore.
905f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_FALSE(service()->GetInstalledExtension(id));
906ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::RunLoop().RunUntilIdle();
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The directory should be gone.
9097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(base::PathExists(extension_path));
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ValidatePrefKeyCount(size_t count) {
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(count, GetPrefKeyCount());
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  testing::AssertionResult ValidateBooleanPref(
91768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const std::string& extension_id,
91868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const std::string& pref_path,
91968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      bool expected_val) {
92068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    std::string msg = "while checking: ";
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += extension_id;
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += " ";
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += pref_path;
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += " == ";
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += expected_val ? "true" : "false";
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
927f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PrefService* prefs = profile()->GetPrefs();
9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* dict =
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs->GetDictionary("extensions.settings");
93068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (!dict) {
93168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return testing::AssertionFailure()
93268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          << "extension.settings does not exist " << msg;
93368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
93468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
9355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* pref = NULL;
93668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (!dict->GetDictionary(extension_id, &pref)) {
93768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return testing::AssertionFailure()
93868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          << "extension pref does not exist " << msg;
93968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
94068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool val;
94268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (!pref->GetBoolean(pref_path, &val)) {
94368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return testing::AssertionFailure()
94468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          << pref_path << " pref not found " << msg;
94568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
94668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
94768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return expected_val == val
94868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        ? testing::AssertionSuccess()
9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        : testing::AssertionFailure() << "base::Value is incorrect " << msg;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsPrefExist(const std::string& extension_id,
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& pref_path) {
9545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* dict =
955f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        profile()->GetPrefs()->GetDictionary("extensions.settings");
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dict == NULL) return false;
9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* pref = NULL;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!dict->GetDictionary(extension_id, &pref)) {
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pref == NULL) {
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool val;
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!pref->GetBoolean(pref_path, &val)) {
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ValidateIntegerPref(const std::string& extension_id,
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& pref_path,
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int expected_val) {
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string msg = " while checking: ";
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += extension_id;
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += " ";
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += pref_path;
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += " == ";
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += base::IntToString(expected_val);
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
981f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PrefService* prefs = profile()->GetPrefs();
9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* dict =
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs->GetDictionary("extensions.settings");
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(dict != NULL) << msg;
9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* pref = NULL;
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(dict->GetDictionary(extension_id, &pref)) << msg;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(pref != NULL) << msg;
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int val;
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(pref->GetInteger(pref_path, &val)) << msg;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_val, val) << msg;
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ValidateStringPref(const std::string& extension_id,
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::string& pref_path,
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::string& expected_val) {
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string msg = " while checking: ";
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += extension_id;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += ".manifest.";
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += pref_path;
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += " == ";
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += expected_val;
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* dict =
1004f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        profile()->GetPrefs()->GetDictionary("extensions.settings");
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(dict != NULL) << msg;
10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* pref = NULL;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string manifest_path = extension_id + ".manifest";
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(dict->GetDictionary(manifest_path, &pref)) << msg;
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(pref != NULL) << msg;
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string val;
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(pref->GetString(pref_path, &val)) << msg;
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_val, val) << msg;
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetPref(const std::string& extension_id,
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const std::string& pref_path,
10175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               base::Value* value,
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const std::string& msg) {
1019f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DictionaryPrefUpdate update(profile()->GetPrefs(), "extensions.settings");
10205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* dict = update.Get();
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(dict != NULL) << msg;
10225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* pref = NULL;
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(dict->GetDictionary(extension_id, &pref)) << msg;
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(pref != NULL) << msg;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref->Set(pref_path, value);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetPrefInteg(const std::string& extension_id,
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const std::string& pref_path,
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    int value) {
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string msg = " while setting: ";
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += extension_id;
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += " ";
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += pref_path;
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += " = ";
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += base::IntToString(value);
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    SetPref(extension_id, pref_path, new base::FundamentalValue(value), msg);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetPrefBool(const std::string& extension_id,
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& pref_path,
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   bool value) {
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string msg = " while setting: ";
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += extension_id + " " + pref_path;
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += " = ";
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += (value ? "true" : "false");
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    SetPref(extension_id, pref_path, new base::FundamentalValue(value), msg);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearPref(const std::string& extension_id,
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const std::string& pref_path) {
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string msg = " while clearing: ";
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += extension_id + " " + pref_path;
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1057f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DictionaryPrefUpdate update(profile()->GetPrefs(), "extensions.settings");
10585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* dict = update.Get();
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(dict != NULL) << msg;
10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* pref = NULL;
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(dict->GetDictionary(extension_id, &pref)) << msg;
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(pref != NULL) << msg;
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref->Remove(pref_path, NULL);
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetPrefStringSet(const std::string& extension_id,
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::string& pref_path,
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::set<std::string>& value) {
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string msg = " while setting: ";
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg += extension_id + " " + pref_path;
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::ListValue* list_value = new base::ListValue();
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::set<std::string>::const_iterator iter = value.begin();
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         iter != value.end(); ++iter)
10753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      list_value->Append(new base::StringValue(*iter));
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetPref(extension_id, pref_path, list_value, msg);
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void InitPluginService() {
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS)
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PluginService::GetInstance()->Init();
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1086f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void InitializeExtensionSyncService() {
1087f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    extension_sync_service_.reset(new ExtensionSyncService(
1088f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        profile(), ExtensionPrefs::Get(browser_context()), service()));
1089f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
1090f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
10911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void InitializeEmptyExtensionServiceWithTestingPrefs() {
10921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ExtensionServiceTestBase::ExtensionServiceInitParams params =
10931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        CreateDefaultInitParams();
10941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    params.pref_file = base::FilePath();
10951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    InitializeExtensionService(params);
10961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
10971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1098f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::ManagementPolicy* GetManagementPolicy() {
1099f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return ExtensionSystem::Get(browser_context())->management_policy();
1100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
1101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionSyncService* extension_sync_service() {
1103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return extension_sync_service_.get();
1104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
1105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
11071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef extensions::ExtensionManagementPrefUpdater<TestingPrefServiceSyncable>
11081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ManagementPrefUpdater;
1109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<ExtensionSyncService> extension_sync_service_;
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionList loaded_;
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string unloaded_id_;
1112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  UnloadedExtensionInfo::Reason unloaded_reason_;
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* installed_;
1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool was_update_;
111590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string old_name_;
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FeatureSwitch::ScopedOverride override_external_install_prompt_;
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Create a CrxInstaller and install the CRX file.
1120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Instead of calling this method yourself, use InstallCRX(), which does extra
1121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // error checking.
1122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void InstallCRXInternal(const base::FilePath& crx_path) {
1123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    InstallCRXInternal(crx_path, Extension::NO_FLAGS);
1124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void InstallCRXInternal(const base::FilePath& crx_path, int creation_flags) {
1127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_TRUE(base::PathExists(crx_path))
1128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        << "Path does not exist: "<< crx_path.value().c_str();
1129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<CrxInstaller> installer(
1130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        CrxInstaller::CreateSilent(service()));
1131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    installer->set_creation_flags(creation_flags);
1132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!(creation_flags & Extension::WAS_INSTALLED_BY_DEFAULT))
1133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      installer->set_allow_silent_install(true);
1134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::WindowedNotificationObserver observer(
11365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions::NOTIFICATION_CRX_INSTALLER_DONE,
11371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        content::Source<extensions::CrxInstaller>(installer.get()));
1138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    installer->InstallCrx(crx_path);
1140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    observer.Wait();
1142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  size_t expected_extensions_count_;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Receives notifications from a PackExtensionJob, indicating either that
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// packing succeeded or that there was some error.
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PackExtensionTestClient : public extensions::PackExtensionJob::Client {
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PackExtensionTestClient(const base::FilePath& expected_crx_path,
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const base::FilePath& expected_private_key_path);
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPackSuccess(const base::FilePath& crx_path,
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const base::FilePath& private_key_path) OVERRIDE;
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPackFailure(const std::string& error_message,
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             ExtensionCreator::ErrorType type) OVERRIDE;
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath expected_crx_path_;
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath expected_private_key_path_;
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PackExtensionTestClient);
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PackExtensionTestClient::PackExtensionTestClient(
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& expected_crx_path,
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& expected_private_key_path)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : expected_crx_path_(expected_crx_path),
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_private_key_path_(expected_private_key_path) {}
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If packing succeeded, we make sure that the package names match our
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expectations.
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PackExtensionTestClient::OnPackSuccess(
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& crx_path,
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& private_key_path) {
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We got the notification and processed it; we don't expect any further tasks
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to be posted to the current thread, so we should stop blocking and continue
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on with the rest of the test.
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This call to |Quit()| matches the call to |Run()| in the
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |PackPunctuatedExtension| test.
118190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Quit();
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_crx_path_.value(), crx_path.value());
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_private_key_path_.value(), private_key_path.value());
11847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(private_key_path));
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The tests are designed so that we never expect to see a packing error.
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PackExtensionTestClient::OnPackFailure(const std::string& error_message,
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            ExtensionCreator::ErrorType type) {
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == ExtensionCreator::kCRXExists)
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     FAIL() << "Packing should not fail.";
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     FAIL() << "Existing CRX should have been overwritten.";
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test loading good extensions from the profile directory.
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, LoadAllExtensionsFromDirectorySuccess) {
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitPluginService();
119968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  InitializeGoodInstalledExtensionService();
1200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 expected_num_extensions = 3u;
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_num_extensions, loaded_.size());
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(good0), loaded_[0]->id());
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("My extension 1"),
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loaded_[0]->name());
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("The first extension that I made."),
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loaded_[0]->description());
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::INTERNAL, loaded_[0]->location());
1211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(loaded_[0]->id(), false));
1212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(expected_num_extensions, registry()->enabled_extensions().size());
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(3);
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good0, "state", Extension::ENABLED);
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValidateIntegerPref(good0, "location", Manifest::INTERNAL);
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good1, "state", Extension::ENABLED);
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValidateIntegerPref(good1, "location", Manifest::INTERNAL);
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good2, "state", Extension::ENABLED);
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValidateIntegerPref(good2, "location", Manifest::INTERNAL);
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet expected_patterns;
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_patterns, "file:///*");
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_patterns, "http://*.google.com/*");
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_patterns, "https://*.google.com/*");
1226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const Extension* extension = loaded_[0].get();
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::UserScriptList& scripts =
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::ContentScriptsInfo::GetContentScripts(extension);
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, scripts.size());
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_patterns, scripts[0].url_patterns());
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, scripts[0].js_scripts().size());
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionResource resource00(extension->id(),
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               scripts[0].js_scripts()[0].extension_root(),
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               scripts[0].js_scripts()[0].relative_path());
1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath expected_path =
1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::MakeAbsoluteFilePath(extension->path().AppendASCII("script1.js"));
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(resource00.ComparePathWithDefault(expected_path));
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionResource resource01(extension->id(),
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               scripts[0].js_scripts()[1].extension_root(),
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               scripts[0].js_scripts()[1].relative_path());
1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected_path =
1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::MakeAbsoluteFilePath(extension->path().AppendASCII("script2.js"));
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(resource01.ComparePathWithDefault(expected_path));
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(!extensions::PluginInfo::HasPlugins(extension));
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, scripts[1].url_patterns().patterns().size());
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://*.news.com/*",
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            scripts[1].url_patterns().begin()->GetAsString());
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionResource resource10(extension->id(),
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               scripts[1].js_scripts()[0].extension_root(),
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               scripts[1].js_scripts()[0].relative_path());
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_path =
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension->path().AppendASCII("js_files").AppendASCII("script3.js");
1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected_path = base::MakeAbsoluteFilePath(expected_path);
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(resource10.ComparePathWithDefault(expected_path));
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_patterns.ClearPatterns();
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_patterns, "http://*.google.com/*");
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_patterns, "https://*.google.com/*");
125946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(
126046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      expected_patterns,
126146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->active_permissions()->explicit_hosts());
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(good1), loaded_[1]->id());
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("My extension 2"), loaded_[1]->name());
1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(std::string(), loaded_[1]->description());
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(loaded_[1]->GetResourceURL("background.html"),
1267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            extensions::BackgroundInfo::GetBackgroundURL(loaded_[1].get()));
1268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0u,
1269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            extensions::ContentScriptsInfo::GetContentScripts(loaded_[1].get())
1270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                .size());
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't parse the plugins section on Chrome OS.
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
12747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(!extensions::PluginInfo::HasPlugins(loaded_[1].get()));
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(extensions::PluginInfo::HasPlugins(loaded_[1].get()));
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::vector<extensions::PluginInfo>* plugins =
1278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extensions::PluginInfo::GetPlugins(loaded_[1].get());
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(plugins);
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, plugins->size());
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(loaded_[1]->path().AppendASCII("content_plugin.dll").value(),
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            plugins->at(0).path.value());
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(plugins->at(0).is_public);
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(loaded_[1]->path().AppendASCII("extension_plugin.dll").value(),
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            plugins->at(1).path.value());
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(plugins->at(1).is_public);
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::INTERNAL, loaded_[1]->location());
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = expected_num_extensions - 1;
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(good2), loaded_[index]->id());
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("My extension 3"), loaded_[index]->name());
1294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(std::string(), loaded_[index]->description());
1295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0u,
1296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            extensions::ContentScriptsInfo::GetContentScripts(
1297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                loaded_[index].get()).size());
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::INTERNAL, loaded_[index]->location());
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test loading bad extensions from the profile directory.
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, LoadAllExtensionsFromDirectoryFail) {
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the test dir with a bad Preferences/extensions.
1304f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath source_install_dir =
1305f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("bad").AppendASCII("Extensions");
13065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FilePath pref_path =
13075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_install_dir.DirName().Append(chrome::kPreferencesFilename);
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeInstalledExtensionService(pref_path, source_install_dir);
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4u, GetErrors().size());
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, loaded_.size());
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[0]),
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("Could not load extension from '*'. ") +
1318d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      extensions::manifest_errors::kManifestUnreadable)) <<
13195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UTF16ToUTF8(GetErrors()[0]);
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[1]),
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("Could not load extension from '*'. ") +
1323d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      extensions::manifest_errors::kManifestUnreadable)) <<
13245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UTF16ToUTF8(GetErrors()[1]);
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[2]),
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("Could not load extension from '*'. ") +
1328d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      extensions::manifest_errors::kMissingFile)) <<
13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UTF16ToUTF8(GetErrors()[2]);
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[3]),
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("Could not load extension from '*'. ") +
1333d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      extensions::manifest_errors::kManifestUnreadable)) <<
13345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UTF16ToUTF8(GetErrors()[3]);
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Test various cases for delayed install because of missing imports.
1338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ExtensionServiceTest, PendingImports) {
1339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  InitPluginService();
1340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1341f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath source_install_dir =
1342f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("pending_updates_with_imports").AppendASCII(
1343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          "Extensions");
13445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FilePath pref_path =
13455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_install_dir.DirName().Append(chrome::kPreferencesFilename);
1346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  InitializeInstalledExtensionService(pref_path, source_install_dir);
1348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Verify there are no pending extensions initially.
1350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->pending_extension_manager()->HasPendingExtensions());
1351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1352f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
1353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Wait for GarbageCollectExtensions task to complete.
1354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
1355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // These extensions are used by the extensions we test below, they must be
1357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // installed.
1358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(base::PathExists(extensions_install_dir().AppendASCII(
1359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "bjafgdebaacbbbecmhlhpofkepfkgcpa/1.0")));
1360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(base::PathExists(extensions_install_dir().AppendASCII(
1361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "hpiknbiabeeppbpihjehijgoemciehgk/2")));
1362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Each of these extensions should have been rejected because of dependencies
1364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // that cannot be satisfied.
1365f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
1366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(
1367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      prefs->GetDelayedInstallInfo("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(
1369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      prefs->GetInstalledExtensionInfo("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(
1371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      prefs->GetDelayedInstallInfo("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"));
1372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(
1373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      prefs->GetInstalledExtensionInfo("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"));
1374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(
1375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      prefs->GetDelayedInstallInfo("cccccccccccccccccccccccccccccccc"));
1376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(
1377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      prefs->GetInstalledExtensionInfo("cccccccccccccccccccccccccccccccc"));
1378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Make sure the import started for the extension with a dependency.
1380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(
1381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      prefs->GetDelayedInstallInfo("behllobkkfkfnphdnhnkndlbkcpglgmj"));
1382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ExtensionPrefs::DELAY_REASON_WAIT_FOR_IMPORTS,
1383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      prefs->GetDelayedInstallReason("behllobkkfkfnphdnhnkndlbkcpglgmj"));
1384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1385f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(base::PathExists(extensions_install_dir().AppendASCII(
1386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0")));
1387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->pending_extension_manager()->HasPendingExtensions());
1389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string pending_id("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
1390f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(pending_id));
1391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Remove it because we are not testing the pending extension manager's
1392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // ability to download and install extensions.
1393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->pending_extension_manager()->Remove(pending_id));
1394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test installing extensions. This test tries to install few extensions using
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// crx files. If you need to change those crx files, feel free to repackage
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// them, throw away the key used and change the id's above.
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallExtension) {
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extensions not enabled.
1403f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(false);
1404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_FAILED);
1406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(true);
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(0);
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A simple extension that should install without error.
1411f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("good.crx");
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_NEW);
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erikkay): verify the contents of the installed extension.
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pref_count = 0;
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(++pref_count);
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL);
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An extension with page actions.
1421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("page_action.crx");
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_NEW);
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(++pref_count);
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(page_action, "state", Extension::ENABLED);
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValidateIntegerPref(page_action, "location", Manifest::INTERNAL);
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bad signature.
1428f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("bad_signature.crx");
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_FAILED);
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(pref_count);
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 0-length extension file.
1433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("not_an_extension.crx");
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_FAILED);
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(pref_count);
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bad magic number.
1438f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("bad_magic.crx");
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_FAILED);
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(pref_count);
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Packed extensions may have folders or files that have underscores.
14433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // This will only cause a warning, rather than a fatal error.
1444f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("bad_underscore.crx");
14453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  InstallCRX(path, INSTALL_NEW);
14463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ValidatePrefKeyCount(++pref_count);
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
144868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // A test for an extension with a 2048-bit public key.
1449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("good2048.crx");
145068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  InstallCRX(path, INSTALL_NEW);
145168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ValidatePrefKeyCount(++pref_count);
145268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ValidateIntegerPref(good2048, "state", Extension::ENABLED);
145368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ValidateIntegerPref(good2048, "location", Manifest::INTERNAL);
145468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erikkay): add more tests for many of the failure cases.
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erikkay): add tests for upgrade cases.
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1459f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct MockExtensionRegistryObserver
1460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : public extensions::ExtensionRegistryObserver {
1461f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnExtensionWillBeInstalled(
1462f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      content::BrowserContext* browser_context,
1463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const Extension* extension,
1464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      bool is_update,
1465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      bool from_ephemeral,
1466f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::string& old_name) OVERRIDE {
1467ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    last_extension_installed = extension->id();
1468ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
1469ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
14705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnExtensionUninstalled(
14715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::BrowserContext* browser_context,
14725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const Extension* extension,
14735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::UninstallReason reason) OVERRIDE {
1474ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    last_extension_uninstalled = extension->id();
1475ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
1476ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1477ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::string last_extension_installed;
1478ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::string last_extension_uninstalled;
1479ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
1480ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Test that correct notifications are sent to ExtensionRegistryObserver on
1482ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// extension install and uninstall.
1483ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ExtensionServiceTest, InstallObserverNotified) {
1484ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  InitializeEmptyExtensionService();
1485ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::ExtensionRegistry* registry(
1487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      extensions::ExtensionRegistry::Get(profile()));
1488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  MockExtensionRegistryObserver observer;
1489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  registry->AddObserver(&observer);
1490ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1491ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // A simple extension that should install without error.
1492ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ASSERT_TRUE(observer.last_extension_installed.empty());
1493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
1494ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  InstallCRX(path, INSTALL_NEW);
1495ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ASSERT_EQ(good_crx, observer.last_extension_installed);
1496ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1497ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Uninstall the extension.
1498ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ASSERT_TRUE(observer.last_extension_uninstalled.empty());
1499ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  UninstallExtension(good_crx, false);
1500ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ASSERT_EQ(good_crx, observer.last_extension_uninstalled);
1501ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  registry->RemoveObserver(&observer);
1503ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1504ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that flags passed to OnExternalExtensionFileFound() make it to the
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extension object.
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallingExternalExtensionWithFlags) {
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kPrefFromBookmark[] = "from_bookmark";
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1512f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
1513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(true);
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register and install an external extension.
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version version("1.0.0.0");
1517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
15185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
1519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
1520f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (service()->OnExternalExtensionFileFound(good_crx,
1521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              &version,
1522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              path,
1523f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              Manifest::EXTERNAL_PREF,
1524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              Extension::FROM_BOOKMARK,
1525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              false /* mark_acknowledged */)) {
1526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    observer.Wait();
15277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1529f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetExtensionById(good_crx, false);
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension->from_bookmark());
153268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(ValidateBooleanPref(good_crx, kPrefFromBookmark, true));
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Upgrade to version 2.0, the flag should be preserved.
1535f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("good2.crx");
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(good_crx, path, ENABLED);
153768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(ValidateBooleanPref(good_crx, kPrefFromBookmark, true));
1538f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension = service()->GetExtensionById(good_crx, false);
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension->from_bookmark());
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the handling of Extension::EXTERNAL_EXTENSION_UNINSTALLED
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UninstallingExternalExtensions) {
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1547f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
1548f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(true);
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install an external extension.
1551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Version version("1.0.0.0");
1552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
15535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
1554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
1555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (service()->OnExternalExtensionFileFound(good_crx,
1556f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              &version,
1557f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              path,
1558f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              Manifest::EXTERNAL_PREF,
1559f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              Extension::NO_FLAGS,
1560f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              false)) {
1561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    observer.Wait();
15627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
15637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1564f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(service()->GetExtensionById(good_crx, false));
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstall it and check that its killbit gets set.
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(good_crx, false);
15681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ValidateIntegerPref(good_crx, "state",
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      Extension::EXTERNAL_EXTENSION_UNINSTALLED);
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to re-install it externally. This should fail because of the killbit.
1572f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->OnExternalExtensionFileFound(good_crx,
1573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          &version,
1574f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          path,
1575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          Manifest::EXTERNAL_PREF,
1576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          Extension::NO_FLAGS,
1577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          false);
1578ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
1579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(NULL == service()->GetExtensionById(good_crx, false));
15801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ValidateIntegerPref(good_crx, "state",
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      Extension::EXTERNAL_EXTENSION_UNINSTALLED);
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  version = Version("1.0.0.1");
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Repeat the same thing with a newer version of the extension.
1585f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("good2.crx");
1586f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->OnExternalExtensionFileFound(good_crx,
1587f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          &version,
1588f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          path,
1589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          Manifest::EXTERNAL_PREF,
1590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          Extension::NO_FLAGS,
1591f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          false);
1592ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
1593f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(NULL == service()->GetExtensionById(good_crx, false));
15941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ValidateIntegerPref(good_crx, "state",
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      Extension::EXTERNAL_EXTENSION_UNINSTALLED);
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try adding the same extension from an external update URL.
1598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(service()->pending_extension_manager()->AddFromExternalUpdateUrl(
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      good_crx,
1600effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      std::string(),
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http:://fake.update/url"),
16024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Manifest::EXTERNAL_PREF_DOWNLOAD,
16034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Extension::NO_FLAGS,
16044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      false));
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1606f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx));
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that uninstalling an external extension does not crash when
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the extension could not be loaded.
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This extension shown in preferences file requires an experimental permission.
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It could not be loaded without such permission.
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UninstallingNotLoadedExtension) {
1614f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath source_install_dir =
1615f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("good").AppendASCII("Extensions");
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The preference contains an external extension
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that requires 'experimental' permission.
16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath pref_path = source_install_dir
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .DirName()
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .AppendASCII("PreferencesExperimental");
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Aforementioned extension will not be loaded if
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // there is no '--enable-experimental-extension-apis' command line flag.
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeInstalledExtensionService(pref_path, source_install_dir);
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1626f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check and try to uninstall it.
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we don't check whether the extension is loaded before we uninstall it
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in CheckExternalUninstall, a crash will happen here because we will get or
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dereference a NULL pointer (extension) inside UninstallExtension.
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockExtensionProvider provider(NULL, Manifest::EXTERNAL_REGISTRY);
1633f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->OnExternalProviderReady(&provider);
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that external extensions with incorrect IDs are not installed.
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, FailOnWrongId) {
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
1639f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
1640f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(true);
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version version("1.0.0.0");
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string wrong_id = all_zero;
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string correct_id = good_crx;
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(correct_id, wrong_id);
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install an external extension with an ID from the external
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // source that is not equal to the ID in the extension manifest.
1650f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
16515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
1652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
1653f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->OnExternalExtensionFileFound(wrong_id,
1654f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          &version,
1655f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          path,
1656f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          Manifest::EXTERNAL_PREF,
1657f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          Extension::NO_FLAGS,
1658f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          false);
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
1661f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(service()->GetExtensionById(good_crx, false));
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try again with the right ID. Expect success.
1664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer2(
16655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
1666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
1667f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (service()->OnExternalExtensionFileFound(correct_id,
1668f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              &version,
1669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              path,
1670f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              Manifest::EXTERNAL_PREF,
1671f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              Extension::NO_FLAGS,
1672f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              false)) {
1673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    observer2.Wait();
16747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1675f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(service()->GetExtensionById(good_crx, false));
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that external extensions with incorrect versions are not installed.
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, FailOnWrongVersion) {
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
1681f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
1682f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(true);
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install an external extension with a version from the external
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // source that is not equal to the version in the extension manifest.
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version wrong_version("1.2.3.4");
1687f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
16885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
1689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
1690f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->OnExternalExtensionFileFound(good_crx,
1691f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          &wrong_version,
1692f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          path,
1693f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          Manifest::EXTERNAL_PREF,
1694f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          Extension::NO_FLAGS,
1695f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          false);
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
1698f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(service()->GetExtensionById(good_crx, false));
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try again with the right version. Expect success.
1701f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->pending_extension_manager()->Remove(good_crx);
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version correct_version("1.0.0.0");
1703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer2(
17045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
1705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
1706f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (service()->OnExternalExtensionFileFound(good_crx,
1707f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              &correct_version,
1708f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              path,
1709f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              Manifest::EXTERNAL_PREF,
1710f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              Extension::NO_FLAGS,
1711f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              false)) {
1712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    observer2.Wait();
17137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1714f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(service()->GetExtensionById(good_crx, false));
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Install a user script (they get converted automatically to an extension)
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallUserScript) {
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The details of script conversion are tested elsewhere, this just tests
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // integration with ExtensionService.
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1723f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("user_script_basic.user.js");
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(path));
1726f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_refptr<CrxInstaller> installer(CrxInstaller::CreateSilent(service()));
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer->set_allow_silent_install(true);
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer->InstallUserScript(
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      path,
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.aaronboodman.com/scripts/user_script_basic.user.js"));
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1732ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
17335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<base::string16> errors = GetErrors();
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(installed_) << "Nothing was installed.";
1735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(was_update_) << path.value();
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size()) << "Nothing was loaded.";
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, errors.size()) << "There were errors: "
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               << JoinString(errors, ',');
1739f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(loaded_[0]->id(), false))
1740f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      << path.value();
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installed_ = NULL;
1743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  was_update_ = false;
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loaded_.clear();
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionErrorReporter::GetInstance()->ClearErrors();
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extensions don't install during shutdown.
17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallExtensionDuringShutdown) {
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate shutdown.
1753f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_browser_terminating_for_test(true);
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
1756f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_refptr<CrxInstaller> installer(CrxInstaller::CreateSilent(service()));
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer->set_allow_silent_install(true);
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  installer->InstallCrx(path);
1759ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(installed_) << "Extension installed during shutdown.";
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, loaded_.size()) << "Extension loaded during shutdown.";
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that the granted permissions preferences are correctly set when
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// installing an extension.
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GrantedPermissions) {
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
1769f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("permissions");
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath pem_path = path.AppendASCII("unknown.pem");
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.AppendASCII("unknown");
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(pem_path));
17757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(path));
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1777f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet expected_api_perms;
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet expected_host_perms;
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure there aren't any granted permissions before the
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension is installed.
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> known_perms(
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs->GetGrantedPermissions(permissions_crx));
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(known_perms.get());
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = PackAndInstallCRX(path, pem_path, INSTALL_NEW);
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
1791f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(permissions_crx, extension->id());
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the valid API permissions have been recognized.
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_api_perms.insert(APIPermission::kTab);
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_host_perms, "http://*.google.com/*");
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_host_perms, "https://*.google.com/*");
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_host_perms, "http://*.google.com.hk/*");
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_host_perms, "http://www.example.com/*");
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  known_perms = prefs->GetGrantedPermissions(extension->id());
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(known_perms.get());
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(known_perms->IsEmpty());
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_api_perms, known_perms->apis());
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(known_perms->HasEffectiveFullAccess());
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_host_perms, known_perms->effective_hosts());
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS)
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that the granted permissions preferences are correctly set for
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// default apps.
18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, DefaultAppsGrantedPermissions) {
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
1816f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("permissions");
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath pem_path = path.AppendASCII("unknown.pem");
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.AppendASCII("unknown");
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(pem_path));
18227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(path));
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1824f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet expected_api_perms;
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet expected_host_perms;
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure there aren't any granted permissions before the
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension is installed.
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> known_perms(
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs->GetGrantedPermissions(permissions_crx));
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(known_perms.get());
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = PackAndInstallCRX(
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      path, pem_path, INSTALL_NEW, Extension::WAS_INSTALLED_BY_DEFAULT);
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
1839f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(permissions_crx, extension->id());
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the valid API permissions have been recognized.
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_api_perms.insert(APIPermission::kTab);
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  known_perms = prefs->GetGrantedPermissions(extension->id());
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(known_perms.get());
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(known_perms->IsEmpty());
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_api_perms, known_perms->apis());
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(known_perms->HasEffectiveFullAccess());
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1853cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(OS_POSIX) || defined(OS_MACOSX)
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the granted permissions full_access bit gets set correctly when
1855cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// an extension contains an NPAPI plugin.
1856cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Only run this on platforms that support NPAPI plugins.
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GrantedFullAccessPermissions) {
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitPluginService();
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
186268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(base::PathExists(good1_path()));
186368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const Extension* extension = PackAndInstallCRX(good1_path(), INSTALL_NEW);
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
1865f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
1866f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> permissions(
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs->GetGrantedPermissions(extension->id()));
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(permissions->IsEmpty());
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveFullAccess());
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(permissions->apis().empty());
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kPlugin));
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Full access implies full host access too...
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToAllHosts());
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the extension is disabled when permissions are missing from
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the extension's granted permissions preferences. (This simulates updating
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the browser to a version which recognizes more permissions).
18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GrantedAPIAndHostPermissions) {
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1886f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path =
1887f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("permissions").AppendASCII("unknown");
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(path));
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = PackAndInstallCRX(path, INSTALL_NEW);
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
1894f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string extension_id = extension->id();
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1897f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet expected_api_permissions;
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet expected_host_permissions;
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_api_permissions.insert(APIPermission::kTab);
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_host_permissions, "http://*.google.com/*");
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_host_permissions, "https://*.google.com/*");
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_host_permissions, "http://*.google.com.hk/*");
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_host_permissions, "http://www.example.com/*");
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> host_permissions;
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that the extension is disabled when an API permission is missing from
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the extension's granted api permissions preference. (This simulates
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updating the browser to a version which recognizes a new API permission).
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPref(extension_id, "granted_permissions.api",
19145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          new base::ListValue(), "granted_permissions.api");
1915f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtensionsForTest();
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1917f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->disabled_extensions().size());
1918f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension = registry()->disabled_extensions().begin()->get();
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(prefs->IsExtensionDisabled(extension_id));
1921f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(service()->IsExtensionEnabled(extension_id));
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(prefs->DidExtensionEscalatePermissions(extension_id));
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now grant and re-enable the extension, making sure the prefs are updated.
1925f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->GrantPermissionsAndEnableExtension(extension);
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(prefs->IsExtensionDisabled(extension_id));
1928f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(service()->IsExtensionEnabled(extension_id));
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(prefs->DidExtensionEscalatePermissions(extension_id));
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> current_perms(
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs->GetGrantedPermissions(extension_id));
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(current_perms.get());
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(current_perms->IsEmpty());
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(current_perms->HasEffectiveFullAccess());
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_api_permissions, current_perms->apis());
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_host_permissions, current_perms->effective_hosts());
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests that the extension is disabled when a host permission is missing from
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the extension's granted host permissions preference. (This simulates
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updating the browser to a version which recognizes additional host
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // permissions).
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_permissions.clear();
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_perms = NULL;
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_permissions.insert("http://*.google.com/*");
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_permissions.insert("https://*.google.com/*");
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_permissions.insert("http://*.google.com.hk/*");
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* api_permissions = new base::ListValue();
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  api_permissions->Append(
19523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new base::StringValue("tabs"));
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPref(extension_id, "granted_permissions.api",
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          api_permissions, "granted_permissions.api");
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPrefStringSet(
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_id, "granted_permissions.scriptable_host", host_permissions);
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1958f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtensionsForTest();
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1960f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->disabled_extensions().size());
1961f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension = registry()->disabled_extensions().begin()->get();
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(prefs->IsExtensionDisabled(extension_id));
1964f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(service()->IsExtensionEnabled(extension_id));
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(prefs->DidExtensionEscalatePermissions(extension_id));
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now grant and re-enable the extension, making sure the prefs are updated.
1968f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->GrantPermissionsAndEnableExtension(extension);
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1970f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(service()->IsExtensionEnabled(extension_id));
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(prefs->DidExtensionEscalatePermissions(extension_id));
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_perms = prefs->GetGrantedPermissions(extension_id);
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(current_perms.get());
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(current_perms->IsEmpty());
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(current_perms->HasEffectiveFullAccess());
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_api_permissions, current_perms->apis());
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_host_permissions, current_perms->effective_hosts());
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test Packaging and installing an extension.
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, PackExtension) {
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
1984f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath input_directory =
1985f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir()
1986f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          .AppendASCII("good")
1987f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          .AppendASCII("Extensions")
1988f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
1989f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          .AppendASCII("1.0.0.0");
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir;
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath output_directory = temp_dir.path();
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath crx_path(output_directory.AppendASCII("ex1.crx"));
19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath privkey_path(output_directory.AppendASCII("privkey.pem"));
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionCreator> creator(new ExtensionCreator());
19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(),
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      privkey_path, ExtensionCreator::kNoRunFlags));
20017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(crx_path));
20027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(privkey_path));
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Repeat the run with the pem file gone, and no special flags
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should refuse to overwrite the existing crx.
20067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DeleteFile(privkey_path, false);
20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(creator->Run(input_directory, crx_path, base::FilePath(),
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      privkey_path, ExtensionCreator::kNoRunFlags));
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OK, now try it with a flag to overwrite existing crx.  Should work.
20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(),
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      privkey_path, ExtensionCreator::kOverwriteCRX));
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Repeat the run allowing existing crx, but the existing pem is still
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an error.  Should fail.
20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(creator->Run(input_directory, crx_path, base::FilePath(),
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      privkey_path, ExtensionCreator::kOverwriteCRX));
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(privkey_path));
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(crx_path, INSTALL_NEW);
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try packing with invalid paths.
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creator.reset(new ExtensionCreator());
20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(
20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      creator->Run(base::FilePath(), base::FilePath(), base::FilePath(),
20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   base::FilePath(), ExtensionCreator::kOverwriteCRX));
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try packing an empty directory. Should fail because an empty directory is
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not a valid extension.
20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir2;
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp_dir2.CreateUniqueTempDir());
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creator.reset(new ExtensionCreator());
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(creator->Run(temp_dir2.path(), crx_path, privkey_path,
20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            base::FilePath(), ExtensionCreator::kOverwriteCRX));
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try packing with an invalid manifest.
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string invalid_manifest_content = "I am not a manifest.";
2038a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(base::WriteFile(
20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      temp_dir2.path().Append(extensions::kManifestFilename),
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      invalid_manifest_content.c_str(), invalid_manifest_content.size()));
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creator.reset(new ExtensionCreator());
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(creator->Run(temp_dir2.path(), crx_path, privkey_path,
20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            base::FilePath(), ExtensionCreator::kOverwriteCRX));
2044a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2045a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Try packing with a private key that is a valid key, but invalid for the
2046a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // extension.
2047f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath bad_private_key_dir =
2048f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("bad_private_key");
2049a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  crx_path = output_directory.AppendASCII("bad_private_key.crx");
2050f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  privkey_path = data_dir().AppendASCII("bad_private_key.pem");
2051a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_FALSE(creator->Run(bad_private_key_dir, crx_path, base::FilePath(),
2052a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      privkey_path, ExtensionCreator::kOverwriteCRX));
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test Packaging and installing an extension whose name contains punctuation.
20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, PackPunctuatedExtension) {
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2058f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath input_directory = data_dir()
2059f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                       .AppendASCII("good")
2060f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                       .AppendASCII("Extensions")
2061f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                       .AppendASCII(good0)
2062f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                       .AppendASCII("1.0.0.0");
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir;
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension names containing punctuation, and the expected names for the
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // packed extensions.
20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath punctuated_names[] = {
20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath(FILE_PATH_LITERAL("this.extensions.name.has.periods")),
20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath(FILE_PATH_LITERAL(".thisextensionsnamestartswithaperiod")),
20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath(FILE_PATH_LITERAL("thisextensionhasaslashinitsname/")).
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NormalizePathSeparators(),
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath expected_crx_names[] = {
20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath(FILE_PATH_LITERAL("this.extensions.name.has.periods.crx")),
20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath(
20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FILE_PATH_LITERAL(".thisextensionsnamestartswithaperiod.crx")),
20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath(FILE_PATH_LITERAL("thisextensionhasaslashinitsname.crx")),
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath expected_private_key_names[] = {
20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath(FILE_PATH_LITERAL("this.extensions.name.has.periods.pem")),
20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath(
20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FILE_PATH_LITERAL(".thisextensionsnamestartswithaperiod.pem")),
20852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath(FILE_PATH_LITERAL("thisextensionhasaslashinitsname.pem")),
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(punctuated_names); ++i) {
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(punctuated_names[i].value().c_str());
20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath output_dir = temp_dir.path().Append(punctuated_names[i]);
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Copy the extension into the output directory, as PackExtensionJob doesn't
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // let us choose where to output the packed extension.
20947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_TRUE(base::CopyDirectory(input_directory, output_dir, true));
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath expected_crx_path =
20972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        temp_dir.path().Append(expected_crx_names[i]);
20982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath expected_private_key_path =
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        temp_dir.path().Append(expected_private_key_names[i]);
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PackExtensionTestClient pack_client(expected_crx_path,
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        expected_private_key_path);
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<extensions::PackExtensionJob> packer(
21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new extensions::PackExtensionJob(&pack_client, output_dir,
21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         base::FilePath(),
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         ExtensionCreator::kOverwriteCRX));
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    packer->Start();
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The packer will post a notification task to the current thread's message
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // loop when it is finished.  We manually run the loop here so that we
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // block and catch the notification; otherwise, the process would exit.
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This call to |Run()| is matched by a call to |Quit()| in the
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |PackExtensionTestClient|'s notification handling code.
211390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (HasFatalFailure())
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallCRX(expected_crx_path, INSTALL_NEW);
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, PackExtensionContainingKeyFails) {
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir extension_temp_dir;
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension_temp_dir.CreateUniqueTempDir());
21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath input_directory = extension_temp_dir.path().AppendASCII("ext");
2128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(
2129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::CopyDirectory(data_dir()
2130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              .AppendASCII("good")
2131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              .AppendASCII("Extensions")
2132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
2133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              .AppendASCII("1.0.0.0"),
2134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          input_directory,
2135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          /*recursive=*/true));
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir output_temp_dir;
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(output_temp_dir.CreateUniqueTempDir());
21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath output_directory = output_temp_dir.path();
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath crx_path(output_directory.AppendASCII("ex1.crx"));
21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath privkey_path(output_directory.AppendASCII("privkey.pem"));
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pack the extension once to get a private key.
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionCreator> creator(new ExtensionCreator());
21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(),
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      privkey_path, ExtensionCreator::kNoRunFlags))
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << creator->error_message();
21497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(crx_path));
21507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(privkey_path));
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DeleteFile(crx_path, false);
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move the pem file into the extension.
2154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::Move(privkey_path,
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  input_directory.AppendASCII("privkey.pem"));
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This pack should fail because of the contained private key.
21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(creator->Run(input_directory, crx_path, base::FilePath(),
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      privkey_path, ExtensionCreator::kNoRunFlags));
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(creator->error_message(),
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              testing::ContainsRegex(
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "extension includes the key file.*privkey.pem"));
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test Packaging and installing an extension using an openssl generated key.
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The openssl is generated with the following:
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// > openssl genrsa -out privkey.pem 1024
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// > openssl pkcs8 -topk8 -nocrypt -in privkey.pem -out privkey_asn1.pem
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The privkey.pem is a PrivateKey, and the pcks8 -topk8 creates a
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrivateKeyInfo ASN.1 structure, we our RSAPrivateKey expects.
21712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, PackExtensionOpenSSLKey) {
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath input_directory =
2174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir()
2175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          .AppendASCII("good")
2176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          .AppendASCII("Extensions")
2177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
2178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          .AppendASCII("1.0.0.0");
2179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath privkey_path(
2180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("openssl_privkey_asn1.pem"));
21817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(privkey_path));
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir;
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath output_directory = temp_dir.path();
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath crx_path(output_directory.AppendASCII("ex1.crx"));
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionCreator> creator(new ExtensionCreator());
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(creator->Run(input_directory, crx_path, privkey_path,
21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(), ExtensionCreator::kOverwriteCRX));
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(crx_path, INSTALL_NEW);
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(THREAD_SANITIZER)
2197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Flaky under Tsan. http://crbug.com/377702
2198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define MAYBE_InstallTheme DISABLED_InstallTheme
2199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else
2200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define MAYBE_InstallTheme InstallTheme
2201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
2202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ExtensionServiceTest, MAYBE_InstallTheme) {
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A theme.
2208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("theme.crx");
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_NEW);
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pref_count = 0;
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(++pref_count);
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(theme_crx, "state", Extension::ENABLED);
22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValidateIntegerPref(theme_crx, "location", Manifest::INTERNAL);
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A theme when extensions are disabled. Themes can be installed, even when
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extensions are disabled.
2217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(false);
2218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("theme2.crx");
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_NEW);
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(++pref_count);
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(theme2_crx, "state", Extension::ENABLED);
22222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValidateIntegerPref(theme2_crx, "location", Manifest::INTERNAL);
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A theme with extension elements. Themes cannot have extension elements,
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so any such elements (like content scripts) should be ignored.
2226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(true);
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    path = data_dir().AppendASCII("theme_with_extension.crx");
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension = InstallCRX(path, INSTALL_NEW);
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValidatePrefKeyCount(++pref_count);
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(extension->is_theme());
22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(
22342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        0u,
22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        extensions::ContentScriptsInfo::GetContentScripts(extension).size());
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A theme with image resources missing (misspelt path).
2239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("theme_missing_image.crx");
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_FAILED);
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(pref_count);
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, LoadLocalizedTheme) {
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load.
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
22483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath extension_path = data_dir().AppendASCII("theme_i18n");
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(extension_path);
2252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
2255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
2256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* theme = registry()->enabled_extensions().begin()->get();
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("name", theme->name());
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("description", theme->description());
22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Cleanup the "Cached Theme.pak" file. Ideally, this would be installed in a
22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // temporary directory, but it automatically installs to the extension's
22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // directory, and we don't want to copy the whole extension for a unittest.
22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath theme_file = extension_path.Append(chrome::kThemePackFilename);
22647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(theme_file));
22657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::DeleteFile(theme_file, false));  // Not recursive.
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can change the ID of an unpacked extension by adding a key
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to its manifest.
22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UnpackedExtensionCanChangeID) {
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp;
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp.CreateUniqueTempDir());
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath extension_path = temp.path();
22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath manifest_path =
22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_path.Append(extensions::kManifestFilename);
2279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath manifest_no_key =
2280f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("unpacked").AppendASCII("manifest_no_key.json");
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath manifest_with_key =
2283f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("unpacked").AppendASCII("manifest_with_key.json");
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(manifest_no_key));
22867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(manifest_with_key));
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load the unpacked extension with no key.
22897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::CopyFile(manifest_no_key, manifest_path);
2290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(extension_path);
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
2295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add the key to the manifest.
22987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::CopyFile(manifest_with_key, manifest_path);
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loaded_.clear();
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reload the extensions.
2302f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtensionsForTest();
2303f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetExtensionById(unpacked, false);
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(unpacked, extension->id());
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jstritar): Right now this just makes sure we don't crash and burn, but
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we should also test that preferences are preserved.
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UnpackedExtensionMayContainSymlinkedFiles) {
2313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath source_data_dir =
2314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("unpacked").AppendASCII("symlinks_allowed");
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paths to test data files.
23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath source_manifest = source_data_dir.AppendASCII("manifest.json");
23187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(source_manifest));
23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath source_icon = source_data_dir.AppendASCII("icon.png");
23207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(source_icon));
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up the temporary extension directory.
23232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp;
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp.CreateUniqueTempDir());
23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath extension_path = temp.path();
23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath manifest = extension_path.Append(
23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::kManifestFilename);
23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath icon_symlink = extension_path.AppendASCII("icon.png");
23297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::CopyFile(source_manifest, manifest);
2330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::CreateSymbolicLink(source_icon, icon_symlink);
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load extension.
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(extension_path);
2335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetErrors().empty());
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
2339f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(ExtensionServiceTest, UnpackedExtensionMayNotHaveUnderscore) {
23443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  InitializeEmptyExtensionService();
2345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath extension_path = data_dir().AppendASCII("underscore_name");
2346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(extension_path);
23473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
23483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1u, GetErrors().size());
2349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
23503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
23513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
23522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallLocalizedTheme) {
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
23553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath theme_path = data_dir().AppendASCII("theme_i18n");
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* theme = PackAndInstallCRX(theme_path, INSTALL_NEW);
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
2361f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("name", theme->name());
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("description", theme->description());
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallApps) {
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An empty app.
2370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* app =
2371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW);
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pref_count = 0;
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(++pref_count);
2374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(app->id(), "state", Extension::ENABLED);
23762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValidateIntegerPref(app->id(), "location", Manifest::INTERNAL);
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Another app with non-overlapping extent. Should succeed.
2379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW);
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(++pref_count);
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A third app whose extent overlaps the first. Should fail.
2383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PackAndInstallCRX(data_dir().AppendASCII("app3"), INSTALL_FAILED);
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(pref_count);
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that file access is OFF by default.
23882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, DefaultFileAccess) {
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2390f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = PackAndInstallCRX(
2391f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("permissions").AppendASCII("files"), INSTALL_NEW);
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
2393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
2394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(
2395f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ExtensionPrefs::Get(profile())->AllowFileAccess(extension->id()));
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateApps) {
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2400f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath extensions_path = data_dir().AppendASCII("app_update");
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First install v1 of a hosted app.
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension =
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallCRX(extensions_path.AppendASCII("v1.crx"), INSTALL_NEW);
2405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id = extension->id();
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("1"), extension->version()->GetString());
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try updating to v2.
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(id,
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  extensions_path.AppendASCII("v2.crx"),
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  ENABLED);
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("2"),
2414f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            service()->GetExtensionById(id, false)->version()->GetString());
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that the NTP page and launch ordinals are kept when updating apps.
24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateAppsRetainOrdinals) {
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AppSorting* sorting = ExtensionPrefs::Get(profile())->app_sorting();
2421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath extensions_path = data_dir().AppendASCII("app_update");
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First install v1 of a hosted app.
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension =
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallCRX(extensions_path.AppendASCII("v1.crx"), INSTALL_NEW);
2426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id = extension->id();
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("1"), extension->version()->GetString());
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Modify the ordinals so we can distinguish them from the defaults.
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::StringOrdinal new_page_ordinal =
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sorting->GetPageOrdinal(id).CreateAfter();
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::StringOrdinal new_launch_ordinal =
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sorting->GetAppLaunchOrdinal(id).CreateBefore();
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sorting->SetPageOrdinal(id, new_page_ordinal);
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sorting->SetAppLaunchOrdinal(id, new_launch_ordinal);
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try updating to v2.
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(id, extensions_path.AppendASCII("v2.crx"), ENABLED);
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("2"),
2442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            service()->GetExtensionById(id, false)->version()->GetString());
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the ordinals match.
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_page_ordinal.Equals(sorting->GetPageOrdinal(id)));
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_launch_ordinal.Equals(sorting->GetAppLaunchOrdinal(id)));
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that the CWS has properly initialized ordinals.
24502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, EnsureCWSOrdinalsInitialized) {
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2452f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->component_loader()->Add(
24532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDR_WEBSTORE_MANIFEST, base::FilePath(FILE_PATH_LITERAL("web_store")));
2454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2456f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AppSorting* sorting = ExtensionPrefs::Get(profile())->app_sorting();
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
24581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      sorting->GetPageOrdinal(extensions::kWebStoreAppId).IsValid());
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
24601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      sorting->GetAppLaunchOrdinal(extensions::kWebStoreAppId).IsValid());
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallAppsWithUnlimitedStorage) {
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry()->enabled_extensions().is_empty());
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pref_count = 0;
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install app1 with unlimited storage.
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension =
2471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW);
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(++pref_count);
2473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string id1 = extension->id();
247546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      APIPermission::kUnlimitedStorage));
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->web_extent().MatchesURL(
2478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extensions::AppLaunchInfo::GetFullLaunchURL(extension)));
2479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const GURL origin1(
2480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin());
2481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
2482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      origin1));
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install app2 from the same origin with unlimited storage.
2485f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension = PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW);
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(++pref_count);
2487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(2u, registry()->enabled_extensions().size());
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string id2 = extension->id();
248946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      APIPermission::kUnlimitedStorage));
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->web_extent().MatchesURL(
2492868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extensions::AppLaunchInfo::GetFullLaunchURL(extension)));
2493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const GURL origin2(
2494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin());
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(origin1, origin2);
2496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
2497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      origin2));
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstall one of them, unlimited storage should still be granted
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the origin.
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(id1, false);
2502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
2503f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
2504f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      origin1));
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstall the other, unlimited storage should be revoked.
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(id2, false);
2508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
2509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(
2510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
2511f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          origin2));
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallAppsAndCheckStorageProtection) {
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry()->enabled_extensions().is_empty());
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pref_count = 0;
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension =
2521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW);
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(++pref_count);
2523f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->is_app());
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string id1 = extension->id();
2526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const GURL origin1(
2527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin());
2528f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected(
2529f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      origin1));
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // App 4 has a different origin (maps.google.com).
2532f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension = PackAndInstallCRX(data_dir().AppendASCII("app4"), INSTALL_NEW);
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(++pref_count);
2534f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(2u, registry()->enabled_extensions().size());
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string id2 = extension->id();
2536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const GURL origin2(
2537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin());
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(origin1, origin2);
2539f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected(
2540f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      origin2));
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(id1, false);
2543f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(id2, false);
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2547f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry()->enabled_extensions().is_empty());
2548f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(
2549f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected(
2550f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          origin1));
2551f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(
2552f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected(
2553f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          origin2));
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when an extension version is reinstalled, nothing happens.
25572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, Reinstall) {
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A simple extension that should install without error.
2561f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_NEW);
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(1);
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
25662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL);
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reinstall the same version, it should overwrite the previous one.
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_UPDATED);
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(1);
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
25732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL);
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can determine if extensions came from the
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Chrome web store.
25782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, FromWebStore) {
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A simple extension that should install without error.
2582f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not from web store.
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = InstallCRX(path, INSTALL_NEW);
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id = extension->id();
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(1);
258868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(ValidateBooleanPref(good_crx, "from_webstore", false));
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(extension->from_webstore());
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test install from web store.
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRXFromWebStore(path, INSTALL_UPDATED);  // From web store.
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(1);
259568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(ValidateBooleanPref(good_crx, "from_webstore", true));
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reload so extension gets reinitialized with new value.
2598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtensionsForTest();
2599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension = service()->GetExtensionById(id, false);
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension->from_webstore());
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Upgrade to version 2.0
2603f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("good2.crx");
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(good_crx, path, ENABLED);
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(1);
260668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(ValidateBooleanPref(good_crx, "from_webstore", true));
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test upgrading a signed extension.
26102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpgradeSignedGood) {
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2613f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = InstallCRX(path, INSTALL_NEW);
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id = extension->id();
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0.0.0", extension->version()->GetString());
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, GetErrors().size());
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
262090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Upgrade to version 1.0.0.1.
262190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Also test that the extension's old and new title are correctly retrieved.
2622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("good2.crx");
262390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  InstallCRX(path, INSTALL_UPDATED, Extension::NO_FLAGS, "My extension 1");
2624f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension = service()->GetExtensionById(id, false);
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0.0.1", extension->version()->GetString());
262790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ("My updated extension 1", extension->name());
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, GetErrors().size());
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test upgrading a signed extension with a bad signature.
26322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpgradeSignedBad) {
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_NEW);
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try upgrading with a bad signature. This should fail during the unpack,
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because the key will not match the signature.
2640f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("bad_signature.crx");
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_FAILED);
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test a normal update via the UpdateExtension API
26452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateExtension) {
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2648f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* good = InstallCRX(path, INSTALL_NEW);
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0.0.0", good->VersionString());
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(good_crx, good->id());
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2654f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("good2.crx");
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(good_crx, path, ENABLED);
2656f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(
2657f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "1.0.0.1",
2658f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->GetExtensionById(good_crx, false)->version()->GetString());
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extensions should not be updated during browser shutdown.
26622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateExtensionDuringShutdown) {
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install an extension.
2666f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* good = InstallCRX(path, INSTALL_NEW);
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(good_crx, good->id());
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate shutdown.
2671f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_browser_terminating_for_test(true);
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update should fail and extension should not be updated.
2674f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("good2.crx");
2675f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool updated = service()->UpdateExtension(good_crx, path, true, NULL);
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(updated);
2677f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(
2678f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "1.0.0.0",
2679f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->GetExtensionById(good_crx, false)->version()->GetString());
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a not-already-installed extension - this should fail
26832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateNotInstalledExtension) {
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2686f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(good_crx, path, UPDATED);
2688ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2690f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(0u, registry()->enabled_extensions().size());
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(installed_);
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, loaded_.size());
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure you can't downgrade an extension via UpdateExtension
26962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateWillNotDowngrade) {
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2699f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good2.crx");
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* good = InstallCRX(path, INSTALL_NEW);
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0.0.1", good->VersionString());
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(good_crx, good->id());
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change path from good2.crx -> good.crx
2706f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("good.crx");
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(good_crx, path, FAILED);
2708f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(
2709f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "1.0.0.1",
2710f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->GetExtensionById(good_crx, false)->version()->GetString());
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure calling update with an identical version does nothing
27142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateToSameVersionIsNoop) {
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2717f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* good = InstallCRX(path, INSTALL_NEW);
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(good_crx, good->id());
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(good_crx, path, FAILED_SILENTLY);
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that updating an extension does not clobber old state.
27252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateExtensionPreservesState) {
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2728f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* good = InstallCRX(path, INSTALL_NEW);
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0.0.0", good->VersionString());
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(good_crx, good->id());
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable it and allow it to run in incognito. These settings should carry
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // over to the updated version.
2736f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->DisableExtension(good->id(), Extension::DISABLE_USER_ACTION);
2737f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::util::SetIsIncognitoEnabled(good->id(), profile(), true);
2738f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionPrefs::Get(profile())
2739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ->SetDidExtensionEscalatePermissions(good, true);
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2741f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("good2.crx");
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(good_crx, path, INSTALLED);
2743f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->disabled_extensions().size());
2744f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* good2 = service()->GetExtensionById(good_crx, true);
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0.0.1", good2->version()->GetString());
2746f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good2->id(), profile()));
2747f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(ExtensionPrefs::Get(profile())
2748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  ->DidExtensionEscalatePermissions(good2->id()));
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that updating preserves extension location.
27522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateExtensionPreservesLocation) {
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* good =
27582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InstallCRXWithLocation(path, Manifest::EXTERNAL_PREF, INSTALL_NEW);
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0.0.0", good->VersionString());
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(good_crx, good->id());
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2763f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("good2.crx");
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(good_crx, path, ENABLED);
2765f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* good2 = service()->GetExtensionById(good_crx, false);
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0.0.1", good2->version()->GetString());
27672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(good2->location(), Manifest::EXTERNAL_PREF);
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure that LOAD extension types can downgrade.
27712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, LoadExtensionsCanDowngrade) {
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp;
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp.CreateUniqueTempDir());
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We'll write the extension manifest dynamically to a temporary path
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to make it easier to change the version number.
27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath extension_path = temp.path();
27802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath manifest_path =
27812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_path.Append(extensions::kManifestFilename);
27827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_FALSE(base::PathExists(manifest_path));
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start with version 2.0.
27855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue manifest;
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString("version", "2.0");
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString("name", "LOAD Downgrade Test");
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetInteger("manifest_version", 2);
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JSONFileValueSerializer serializer(manifest_path);
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(serializer.Serialize(manifest));
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2793f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(extension_path);
2794ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
27982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::UNPACKED, loaded_[0]->location());
2799f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("2.0", loaded_[0]->VersionString());
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now set the version number to 1.0, reload the extensions and verify that
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the downgrade was accepted.
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString("version", "1.0");
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(serializer.Serialize(manifest));
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2807f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(extension_path);
2808ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
28122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::UNPACKED, loaded_[0]->location());
2813f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1.0", loaded_[0]->VersionString());
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2817cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(OS_POSIX) || defined(OS_MACOSX)
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LOAD extensions with plugins require approval.
2819cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Only run this on platforms that support NPAPI plugins.
28202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, LoadExtensionsWithPlugins) {
282168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::FilePath extension_with_plugin_path = good1_path();
282268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::FilePath extension_no_plugin_path = good2_path();
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitPluginService();
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2826f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InitializeProcessManager();
2827f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_show_extensions_prompts(true);
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start by canceling any install prompts.
28305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExtensionInstallPrompt::g_auto_confirm_for_tests =
28315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ExtensionInstallPrompt::CANCEL;
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The extension that has a plugin should not install.
2834f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())
2835f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ->Load(extension_with_plugin_path);
2836ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, loaded_.size());
2839f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
2840f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But the extension with no plugin should since there's no prompt.
2843ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ExtensionErrorReporter::GetInstance()->ClearErrors();
2844f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())
2845f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ->Load(extension_no_plugin_path);
2846ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, loaded_.size());
2849f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
2850f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
2851f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry()->enabled_extensions().Contains(good2));
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The plugin extension should install if we accept the dialog.
28545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExtensionInstallPrompt::g_auto_confirm_for_tests =
28555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ExtensionInstallPrompt::ACCEPT;
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2857ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ExtensionErrorReporter::GetInstance()->ClearErrors();
2858f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())
2859f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ->Load(extension_with_plugin_path);
2860ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, loaded_.size());
2863f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(2u, registry()->enabled_extensions().size());
2864f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
2865f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry()->enabled_extensions().Contains(good1));
2866f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry()->enabled_extensions().Contains(good2));
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the granted permissions have been setup.
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> permissions(
2870f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ExtensionPrefs::Get(profile())->GetGrantedPermissions(good1));
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(permissions->IsEmpty());
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveFullAccess());
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(permissions->apis().empty());
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kPlugin));
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should be able to reload the extension without getting another prompt.
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loaded_.clear();
28785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExtensionInstallPrompt::g_auto_confirm_for_tests =
28795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ExtensionInstallPrompt::CANCEL;
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2881f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtension(good1);
2882ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, loaded_.size());
2884f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(2u, registry()->enabled_extensions().size());
2885f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2887cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // !defined(OS_POSIX) || defined(OS_MACOSX)
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2891868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool IsExtension(const Extension* extension) {
2892868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return extension->GetType() == Manifest::TYPE_EXTENSION;
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS)
2896cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::set<std::string> StringSet(const std::string& s) {
2897cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::set<std::string> set;
2898cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  set.insert(s);
2899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return set;
2900cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2901cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::set<std::string> StringSet(const std::string& s1, const std::string& s2) {
2902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::set<std::string> set = StringSet(s1);
2903cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  set.insert(s2);
2904cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return set;
2905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // defined(ENABLE_BLACKLIST_TESTS)
2907cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test adding a pending extension.
29112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, AddPendingExtensionFromSync) {
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kFakeId(all_zero);
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL kFakeUpdateURL("http:://fake.update/url");
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool kFakeInstallSilently(true);
2917cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const bool kFakeRemoteInstall(false);
2918116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const bool kFakeInstalledByCustodian(false);
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2920cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(
2921116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service()->pending_extension_manager()->AddFromSync(
2922116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kFakeId,
2923116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kFakeUpdateURL,
2924116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          &IsExtension,
2925116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kFakeInstallSilently,
2926116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kFakeRemoteInstall,
2927116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kFakeInstalledByCustodian));
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::PendingExtensionInfo* pending_extension_info;
2930f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE((pending_extension_info =
2931f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   service()->pending_extension_manager()->GetById(kFakeId)));
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kFakeUpdateURL, pending_extension_info->update_url());
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(&IsExtension, pending_extension_info->should_allow_install_);
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kFakeInstallSilently, pending_extension_info->install_silently());
2935cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Use
2936cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // EXPECT_TRUE(kFakeRemoteInstall == pending_extension_info->remote_install())
2937cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // instead of
2938cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // EXPECT_EQ(kFakeRemoteInstall, pending_extension_info->remote_install())
2939cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // as gcc 4.7 issues the following warning on EXPECT_EQ(false, x), which is
2940cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // turned into an error with -Werror=conversion-null:
2941cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   converting 'false' to pointer type for argument 1 of
2942cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   'char testing::internal::IsNullLiteralHelper(testing::internal::Secret*)'
2943cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // https://code.google.com/p/googletest/issues/detail?id=458
2944cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(kFakeRemoteInstall == pending_extension_info->remote_install());
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGoodId[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf";
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGoodUpdateURL[] = "http://good.update/url";
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const bool kGoodIsFromSync = true;
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const bool kGoodInstallSilently = true;
2952cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const bool kGoodRemoteInstall = false;
2953116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst bool kGoodInstalledByCustodian = false;
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a pending extension.
29572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdatePendingExtension) {
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2959cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(
2960116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service()->pending_extension_manager()->AddFromSync(
2961116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodId,
2962116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          GURL(kGoodUpdateURL),
2963116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          &IsExtension,
2964116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodInstallSilently,
2965116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodRemoteInstall,
2966116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodInstalledByCustodian));
2967f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(kGoodId));
2968f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2969f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(kGoodId, path, ENABLED);
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2972f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId));
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2974f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetExtensionById(kGoodId, true);
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2980868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool IsTheme(const Extension* extension) {
2981868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return extension->is_theme();
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a pending theme.
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled due to ASAN failure. http://crbug.com/108320
29882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, DISABLED_UpdatePendingTheme) {
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
2990f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->pending_extension_manager()->AddFromSync(
2991116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      theme_crx, GURL(), &IsTheme, false, false, false));
2992f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(theme_crx));
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2994f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("theme.crx");
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(theme_crx, path, ENABLED);
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2997f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(theme_crx));
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2999f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetExtensionById(theme_crx, true);
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3002f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(
3003f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ExtensionPrefs::Get(profile())->IsExtensionDisabled(extension->id()));
3004f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->IsExtensionEnabled(theme_crx));
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Always fails on ChromeOS: http://crbug.com/79737
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_UpdatePendingExternalCrx DISABLED_UpdatePendingExternalCrx
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_UpdatePendingExternalCrx UpdatePendingExternalCrx
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a pending CRX as if the source is an external extension
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with an update URL.  In this case we don't know if the CRX is a theme
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or not.
30162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, MAYBE_UpdatePendingExternalCrx) {
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
3018f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->pending_extension_manager()->AddFromExternalUpdateUrl(
3019effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      theme_crx,
3020effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      std::string(),
3021effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GURL(),
3022effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Manifest::EXTERNAL_PREF_DOWNLOAD,
3023effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Extension::NO_FLAGS,
30244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      false));
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3026f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(theme_crx));
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3028f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("theme.crx");
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(theme_crx, path, ENABLED);
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3031f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(theme_crx));
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3033f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetExtensionById(theme_crx, true);
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3036f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(
3037f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ExtensionPrefs::Get(profile())->IsExtensionDisabled(extension->id()));
3038f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->IsExtensionEnabled(extension->id()));
3039f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(
3040f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      extensions::util::IsIncognitoEnabled(extension->id(), profile()));
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a pending CRX as if the source is an external extension
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with an update URL.  The external update should overwrite a sync update,
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but a sync update should not overwrite a non-sync update.
30462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdatePendingExternalCrxWinsOverSync) {
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a crx to be installed from the update mechanism.
3050cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(
3051116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service()->pending_extension_manager()->AddFromSync(
3052116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodId,
3053116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          GURL(kGoodUpdateURL),
3054116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          &IsExtension,
3055116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodInstallSilently,
3056116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodRemoteInstall,
3057116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodInstalledByCustodian));
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that there is a pending crx, with is_from_sync set to true.
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::PendingExtensionInfo* pending_extension_info;
3061f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE((pending_extension_info =
3062f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   service()->pending_extension_manager()->GetById(kGoodId)));
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pending_extension_info->is_from_sync());
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a crx to be updated, with the same ID, from a non-sync source.
3066f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->pending_extension_manager()->AddFromExternalUpdateUrl(
3067effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      kGoodId,
3068effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      std::string(),
3069effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GURL(kGoodUpdateURL),
3070effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Manifest::EXTERNAL_PREF_DOWNLOAD,
3071effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Extension::NO_FLAGS,
3072effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      false));
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that there is a pending crx, with is_from_sync set to false.
3075f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE((pending_extension_info =
3076f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   service()->pending_extension_manager()->GetById(kGoodId)));
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pending_extension_info->is_from_sync());
30782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD,
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pending_extension_info->install_source());
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a crx to be installed from the update mechanism.
3082cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(
3083116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service()->pending_extension_manager()->AddFromSync(
3084116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodId,
3085116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          GURL(kGoodUpdateURL),
3086116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          &IsExtension,
3087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodInstallSilently,
3088116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodRemoteInstall,
3089116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodInstalledByCustodian));
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the external, non-sync update was not overridden.
3092f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE((pending_extension_info =
3093f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   service()->pending_extension_manager()->GetById(kGoodId)));
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pending_extension_info->is_from_sync());
30952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD,
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pending_extension_info->install_source());
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Updating a theme should fail if the updater is explicitly told that
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the CRX is not a theme.
31012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdatePendingCrxThemeMismatch) {
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
3103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->pending_extension_manager()->AddFromSync(
3104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      theme_crx, GURL(), &IsExtension, true, false, false));
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(theme_crx));
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("theme.crx");
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(theme_crx, path, FAILED_SILENTLY);
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(theme_crx));
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetExtensionById(theme_crx, true);
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(extension);
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(akalin): Test updating a pending extension non-silently once
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we can mock out ExtensionInstallUI and inject our version into
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UpdateExtension().
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a pending extension which fails the should-install test.
31222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdatePendingExtensionFailedShouldInstallTest) {
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add pending extension with a flipped is_theme.
3125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(
3126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service()->pending_extension_manager()->AddFromSync(
3127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodId,
3128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          GURL(kGoodUpdateURL),
3129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          &IsTheme,
3130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodInstallSilently,
3131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodRemoteInstall,
3132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          kGoodInstalledByCustodian));
3133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(kGoodId));
3134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(kGoodId, path, UPDATED);
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(akalin): Figure out how to check that the extensions
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // directory is cleaned up properly in OnExtensionInstalled().
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId));
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(akalin): Figure out how to test that installs of pending
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unsyncable extensions are blocked.
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a pending extension for one that is not pending.
31482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdatePendingExtensionNotPending) {
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(kGoodId, path, UPDATED);
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId));
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a pending extension for one that is already
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// installed.
31592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdatePendingExtensionAlreadyInstalled) {
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* good = InstallCRX(path, INSTALL_NEW);
3164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(good->is_theme());
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use AddExtensionImpl() as AddFrom*() would balk.
3169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->pending_extension_manager()->AddExtensionImpl(
3170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      good->id(),
3171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      std::string(),
3172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      extensions::ManifestURL::GetUpdateURL(good),
3173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Version(),
3174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      &IsExtension,
3175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      kGoodIsFromSync,
3176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      kGoodInstallSilently,
3177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Manifest::INTERNAL,
3178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Extension::NO_FLAGS,
3179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      false,
3180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kGoodRemoteInstall);
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(good->id(), path, ENABLED);
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId));
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
318668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS)
318768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Tests blacklisting then unblacklisting extensions after the service has been
318868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// initialized.
31892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, SetUnsetBlacklistInPrefs) {
31905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::TestBlacklist test_blacklist;
319168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // A profile with 3 extensions installed: good0, good1, and good2.
319268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  InitializeGoodInstalledExtensionService();
3193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  test_blacklist.Attach(service()->blacklist_);
3194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
319568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
31965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const extensions::ExtensionSet& enabled_extensions =
3197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      registry()->enabled_extensions();
31985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const extensions::ExtensionSet& blacklisted_extensions =
3199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      registry()->blacklisted_extensions();
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good0) &&
32025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              !blacklisted_extensions.Contains(good0));
32035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good1) &&
32045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              !blacklisted_extensions.Contains(good1));
32055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good2) &&
32065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              !blacklisted_extensions.Contains(good2));
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
320868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(IsPrefExist(good0, "blacklist"));
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsPrefExist(good1, "blacklist"));
321068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(IsPrefExist(good2, "blacklist"));
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsPrefExist("invalid_id", "blacklist"));
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
321368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Blacklist good0 and good1 (and an invalid extension ID).
32145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
32155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good0, extensions::BLACKLISTED_MALWARE, true);
32165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
32175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good1, extensions::BLACKLISTED_MALWARE, true);
32185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
32195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "invalid_id", extensions::BLACKLISTED_MALWARE, true);
322068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(!enabled_extensions.Contains(good0) &&
32235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              blacklisted_extensions.Contains(good0));
32245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(!enabled_extensions.Contains(good1) &&
32255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              blacklisted_extensions.Contains(good1));
32265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good2) &&
32275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              !blacklisted_extensions.Contains(good2));
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(ValidateBooleanPref(good0, "blacklist", true));
323068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(ValidateBooleanPref(good1, "blacklist", true));
323168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(IsPrefExist(good2, "blacklist"));
323268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(IsPrefExist("invalid_id", "blacklist"));
32332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
323468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Un-blacklist good1 and blacklist good2.
32355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.Clear(false);
32365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
32375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good0, extensions::BLACKLISTED_MALWARE, true);
32385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
32395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good2, extensions::BLACKLISTED_MALWARE, true);
32405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
32415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "invalid_id", extensions::BLACKLISTED_MALWARE, true);
3242ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(!enabled_extensions.Contains(good0) &&
32455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              blacklisted_extensions.Contains(good0));
32465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good1) &&
32475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              !blacklisted_extensions.Contains(good1));
32485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(!enabled_extensions.Contains(good2) &&
32495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              blacklisted_extensions.Contains(good2));
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(ValidateBooleanPref(good0, "blacklist", true));
325268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(IsPrefExist(good1, "blacklist"));
325368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(ValidateBooleanPref(good2, "blacklist", true));
325468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(IsPrefExist("invalid_id", "blacklist"));
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif  // defined(ENABLE_BLACKLIST_TESTS)
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS)
325968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Tests trying to install a blacklisted extension.
32602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, BlacklistedExtensionWillNotInstall) {
326168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_refptr<FakeSafeBrowsingDatabaseManager> blacklist_db(
326268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      new FakeSafeBrowsingDatabaseManager(true));
326368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  Blacklist::ScopedDatabaseManagerForTest scoped_blacklist_db(blacklist_db);
32642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
326568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  InitializeEmptyExtensionService();
3266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
326868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // After blacklisting good_crx, we cannot install it.
326968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  blacklist_db->SetUnsafe(good_crx).NotifyUpdate();
327068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
3273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // HACK: specify WAS_INSTALLED_BY_DEFAULT so that test machinery doesn't
3274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // decide to install this silently. Somebody should fix these tests, all
3275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // 6,000 lines of them. Hah!
3276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  InstallCRX(path, INSTALL_FAILED, Extension::WAS_INSTALLED_BY_DEFAULT);
3277f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
327968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif  // defined(ENABLE_BLACKLIST_TESTS)
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
328168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS)
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unload blacklisted extension on policy change.
32832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UnloadBlacklistedExtensionPolicy) {
32845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::TestBlacklist test_blacklist;
328568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
328668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // A profile with no extensions installed.
32871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitializeEmptyExtensionServiceWithTestingPrefs();
3288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  test_blacklist.Attach(service()->blacklist_);
328968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* good = InstallCRX(path, INSTALL_NEW);
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(good_crx, good->id());
32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExtension(good_crx, path, FAILED_SILENTLY);
3295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
32981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ManagementPrefUpdater pref(profile_->GetTestingPrefService());
32991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pref.SetIndividualExtensionInstallationAllowed(good_crx, true);
33001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
33035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good_crx, extensions::BLACKLISTED_MALWARE, true);
3304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The good_crx is blacklisted and the whitelist doesn't negate it.
330768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(ValidateBooleanPref(good_crx, "blacklist", true));
3308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
331068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif  // defined(ENABLE_BLACKLIST_TESTS)
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
331268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS)
331368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Tests that a blacklisted extension is eventually unloaded on startup, if it
331468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// wasn't already.
33152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, WillNotLoadBlacklistedExtensionsFromDirectory) {
33165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::TestBlacklist test_blacklist;
331768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
331868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // A profile with 3 extensions installed: good0, good1, and good2.
331968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  InitializeGoodInstalledExtensionService();
3320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  test_blacklist.Attach(service()->blacklist_);
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
332268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Blacklist good1 before the service initializes.
33235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
33245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good1, extensions::BLACKLISTED_MALWARE, false);
332568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
332668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Load extensions.
3327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
332868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_EQ(3u, loaded_.size());  // hasn't had time to blacklist yet
33292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3332f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->blacklisted_extensions().size());
3333f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(2u, registry()->enabled_extensions().size());
33345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(registry()->enabled_extensions().Contains(good0));
3336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(registry()->blacklisted_extensions().Contains(good1));
3337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(registry()->enabled_extensions().Contains(good2));
333868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
333968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif  // defined(ENABLE_BLACKLIST_TESTS)
334068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
334168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS)
334268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Tests extensions blacklisted in prefs on startup; one still blacklisted by
334368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// safe browsing, the other not. The not-blacklisted one should recover.
334468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(ExtensionServiceTest, BlacklistedInPrefsFromStartup) {
33455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::TestBlacklist test_blacklist;
334668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
334768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  InitializeGoodInstalledExtensionService();
3348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  test_blacklist.Attach(service()->blacklist_);
3349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionPrefs::Get(profile())->SetExtensionBlacklisted(good0, true);
3350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionPrefs::Get(profile())->SetExtensionBlacklisted(good1, true);
335168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
33525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
33535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good1, extensions::BLACKLISTED_MALWARE, false);
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Extension service hasn't loaded yet, but IsExtensionEnabled reads out of
3356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // prefs. Ensure it takes into account the blacklist state (crbug.com/373842).
3357f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(good0));
3358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(good1));
3359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->IsExtensionEnabled(good2));
3360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3361f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(2u, registry()->blacklisted_extensions().size());
3364f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
336568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry()->blacklisted_extensions().Contains(good0));
3367f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry()->blacklisted_extensions().Contains(good1));
3368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry()->enabled_extensions().Contains(good2));
336968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
337068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Give time for the blacklist to update.
337168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
337268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3373f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->blacklisted_extensions().size());
3374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(2u, registry()->enabled_extensions().size());
33755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry()->enabled_extensions().Contains(good0));
3377f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry()->blacklisted_extensions().Contains(good1));
3378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry()->enabled_extensions().Contains(good2));
33795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
33805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(ENABLE_BLACKLIST_TESTS)
33815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS)
33835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Extension is added to blacklist with BLACKLISTED_POTENTIALLY_UNWANTED state
33845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// after it is installed. It is then successfully re-enabled by the user.
33855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ExtensionServiceTest, GreylistedExtensionDisabled) {
33865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::TestBlacklist test_blacklist;
33875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A profile with 3 extensions installed: good0, good1, and good2.
33885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InitializeGoodInstalledExtensionService();
3389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  test_blacklist.Attach(service()->blacklist_);
3390f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
33915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const extensions::ExtensionSet& enabled_extensions =
3393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      registry()->enabled_extensions();
33945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const extensions::ExtensionSet& disabled_extensions =
3395f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      registry()->disabled_extensions();
33965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good0));
33985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good1));
33995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good2));
34005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Blacklist good0 and good1 (and an invalid extension ID).
34025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
34035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good0, extensions::BLACKLISTED_CWS_POLICY_VIOLATION, true);
34045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
34055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good1, extensions::BLACKLISTED_POTENTIALLY_UNWANTED, true);
34065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
34075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "invalid_id", extensions::BLACKLISTED_MALWARE, true);
34085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
34095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(enabled_extensions.Contains(good0));
34115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(disabled_extensions.Contains(good0));
34125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(enabled_extensions.Contains(good1));
34135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(disabled_extensions.Contains(good1));
34145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good2));
34155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(disabled_extensions.Contains(good2));
34165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ValidateIntegerPref(
34185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good0, "blacklist_state", extensions::BLACKLISTED_CWS_POLICY_VIOLATION);
34195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ValidateIntegerPref(
34205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good1, "blacklist_state", extensions::BLACKLISTED_POTENTIALLY_UNWANTED);
34215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Now user enables good0.
3423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->EnableExtension(good0);
34245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good0));
34265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(disabled_extensions.Contains(good0));
34275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(enabled_extensions.Contains(good1));
34285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(disabled_extensions.Contains(good1));
34295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Remove extensions from blacklist.
34315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
34325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good0, extensions::NOT_BLACKLISTED, true);
34335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
34345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good1, extensions::NOT_BLACKLISTED, true);
34355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // All extensions are enabled.
34385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good0));
34395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(disabled_extensions.Contains(good0));
34405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good1));
34415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(disabled_extensions.Contains(good1));
34425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good2));
34435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(disabled_extensions.Contains(good2));
34445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
34455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(ENABLE_BLACKLIST_TESTS)
34465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS)
34485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// When extension is removed from greylist, do not re-enable it if it is
34495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// disabled by user.
34505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ExtensionServiceTest, GreylistDontEnableManuallyDisabled) {
34515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::TestBlacklist test_blacklist;
34525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A profile with 3 extensions installed: good0, good1, and good2.
34535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InitializeGoodInstalledExtensionService();
3454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  test_blacklist.Attach(service()->blacklist_);
3455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
34565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const extensions::ExtensionSet& enabled_extensions =
3458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      registry()->enabled_extensions();
34595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const extensions::ExtensionSet& disabled_extensions =
3460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      registry()->disabled_extensions();
34615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Manually disable.
3463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->DisableExtension(good0,
3464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              extensions::Extension::DISABLE_USER_ACTION);
34655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
34675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good0, extensions::BLACKLISTED_CWS_POLICY_VIOLATION, true);
34685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
34695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good1, extensions::BLACKLISTED_POTENTIALLY_UNWANTED, true);
34705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
34715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good2, extensions::BLACKLISTED_SECURITY_VULNERABILITY, true);
34725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
34735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // All extensions disabled.
34755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(enabled_extensions.Contains(good0));
34765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(disabled_extensions.Contains(good0));
34775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(enabled_extensions.Contains(good1));
34785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(disabled_extensions.Contains(good1));
34795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(enabled_extensions.Contains(good2));
34805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(disabled_extensions.Contains(good2));
34815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Greylisted extension can be enabled.
3483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->EnableExtension(good1);
34845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good1));
34855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(disabled_extensions.Contains(good1));
34865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // good1 is now manually disabled.
3488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->DisableExtension(good1,
3489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              extensions::Extension::DISABLE_USER_ACTION);
34905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(enabled_extensions.Contains(good1));
34915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(disabled_extensions.Contains(good1));
34925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Remove extensions from blacklist.
34945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
34955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good0, extensions::NOT_BLACKLISTED, true);
34965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
34975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good1, extensions::NOT_BLACKLISTED, true);
34985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
34995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good2, extensions::NOT_BLACKLISTED, true);
35005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
35015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // good0 and good1 remain disabled.
35035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(enabled_extensions.Contains(good0));
35045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(disabled_extensions.Contains(good0));
35055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(enabled_extensions.Contains(good1));
35065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(disabled_extensions.Contains(good1));
35075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good2));
35085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(disabled_extensions.Contains(good2));
35095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
35105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(ENABLE_BLACKLIST_TESTS)
35115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS)
35135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Blacklisted extension with unknown state are not enabled/disabled.
35145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ExtensionServiceTest, GreylistUnknownDontChange) {
35155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::TestBlacklist test_blacklist;
35165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A profile with 3 extensions installed: good0, good1, and good2.
35175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InitializeGoodInstalledExtensionService();
3518f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  test_blacklist.Attach(service()->blacklist_);
3519f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
35205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const extensions::ExtensionSet& enabled_extensions =
3522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      registry()->enabled_extensions();
35235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const extensions::ExtensionSet& disabled_extensions =
3524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      registry()->disabled_extensions();
35255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
35275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good0, extensions::BLACKLISTED_CWS_POLICY_VIOLATION, true);
35285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
35295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good1, extensions::BLACKLISTED_POTENTIALLY_UNWANTED, true);
35305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
35315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(enabled_extensions.Contains(good0));
35335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(disabled_extensions.Contains(good0));
35345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(enabled_extensions.Contains(good1));
35355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(disabled_extensions.Contains(good1));
35365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good2));
35375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(disabled_extensions.Contains(good2));
35385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
35405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good0, extensions::NOT_BLACKLISTED, true);
35415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
35425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good1, extensions::BLACKLISTED_UNKNOWN, true);
35435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_blacklist.SetBlacklistState(
35445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      good2, extensions::BLACKLISTED_UNKNOWN, true);
35455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
35465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // good0 re-enabled, other remain as they were.
35485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good0));
35495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(disabled_extensions.Contains(good0));
35505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(enabled_extensions.Contains(good1));
35515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(disabled_extensions.Contains(good1));
35525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(enabled_extensions.Contains(good2));
35535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(disabled_extensions.Contains(good2));
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests that blacklisted extensions cannot be reloaded, both those loaded
3557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// before and after extension service startup.
3558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ExtensionServiceTest, ReloadBlacklistedExtension) {
3559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  extensions::TestBlacklist test_blacklist;
3560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  InitializeGoodInstalledExtensionService();
3562f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  test_blacklist.Attach(service()->blacklist_);
3563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_blacklist.SetBlacklistState(
3565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      good1, extensions::BLACKLISTED_MALWARE, false);
3566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
3567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_blacklist.SetBlacklistState(
3568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      good2, extensions::BLACKLISTED_MALWARE, false);
3569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
3570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3571f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(StringSet(good0), registry()->enabled_extensions().GetIDs());
3572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(StringSet(good1, good2),
3573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            registry()->blacklisted_extensions().GetIDs());
3574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtension(good1);
3576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtension(good2);
3577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
3578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(StringSet(good0), registry()->enabled_extensions().GetIDs());
3580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(StringSet(good1, good2),
3581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            registry()->blacklisted_extensions().GetIDs());
3582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
3583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
358468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif  // defined(ENABLE_BLACKLIST_TESTS)
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Will not install extension blacklisted by policy.
35872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, BlacklistedByPolicyWillNotInstall) {
35881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitializeEmptyExtensionServiceWithTestingPrefs();
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blacklist everything.
35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
35921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ManagementPrefUpdater pref(profile_->GetTestingPrefService());
35931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pref.SetBlacklistedByDefault(true);
35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blacklist prevents us from installing good_crx.
3597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_FAILED);
3599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now whitelist this particular extension.
36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
36031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ManagementPrefUpdater pref(profile_->GetTestingPrefService());
36041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pref.SetIndividualExtensionInstallationAllowed(good_crx, true);
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure we can now install good_crx.
36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_NEW);
3609f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extension blacklisted by policy get unloaded after installing.
36132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, BlacklistedByPolicyRemovedIfRunning) {
36141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitializeEmptyExtensionServiceWithTestingPrefs();
36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install good_crx.
3617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_NEW);
3619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
36221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ManagementPrefUpdater pref(profile_->GetTestingPrefService());
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Blacklist this extension.
36241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pref.SetIndividualExtensionInstallationAllowed(good_crx, false);
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension should not be running now.
3628ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
3629f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that component extensions are not blacklisted by policy.
36332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ComponentExtensionWhitelisted) {
36341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitializeEmptyExtensionServiceWithTestingPrefs();
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blacklist everything.
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
36381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ManagementPrefUpdater pref(profile_->GetTestingPrefService());
36391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pref.SetBlacklistedByDefault(true);
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install a component extension.
3643f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir()
3644f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            .AppendASCII("good")
3645f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            .AppendASCII("Extensions")
3646f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            .AppendASCII(good0)
3647f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            .AppendASCII("1.0.0.0");
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string manifest;
364958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(base::ReadFileToString(
36502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      path.Append(extensions::kManifestFilename), &manifest));
3651f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->component_loader()->Add(manifest, path);
3652f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension should be installed despite blacklist.
3655f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
3656f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good0, false));
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Poke external providers and make sure the extension is still present.
3659f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
3660f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
3661f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good0, false));
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension should not be uninstalled on blacklist changes.
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
36651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ManagementPrefUpdater pref(profile_->GetTestingPrefService());
36661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pref.SetIndividualExtensionInstallationAllowed(good0, false);
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3668ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
3669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
3670f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good0, false));
36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that policy-installed extensions are not blacklisted by policy.
36742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, PolicyInstalledExtensionsWhitelisted) {
36751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitializeEmptyExtensionServiceWithTestingPrefs();
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
36781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ManagementPrefUpdater pref(profile_->GetTestingPrefService());
36792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Blacklist everything.
36801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pref.SetBlacklistedByDefault(true);
36812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Mark good.crx for force-installation.
36821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pref.SetIndividualExtensionAutoInstalled(
36831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        good_crx, "http://example.com/update_url", true);
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Have policy force-install an extension.
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockExtensionProvider* provider =
3688f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new MockExtensionProvider(service(), Manifest::EXTERNAL_POLICY_DOWNLOAD);
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMockExternalProvider(provider);
3690f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  provider->UpdateOrAddExtension(
3691f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      good_crx, "1.0.0.0", data_dir().AppendASCII("good.crx"));
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reloading extensions should find our externally registered extension
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and install it.
3695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
36965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
3697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
3698f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
3699f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension should be installed despite blacklist.
3702f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
3703f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blacklist update should not uninstall the extension.
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
37071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ManagementPrefUpdater pref(profile_->GetTestingPrefService());
37081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pref.SetIndividualExtensionInstallationAllowed(good0, false);
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3710ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
3711f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
3712f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that extensions cannot be installed if the policy provider prohibits
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it. This functionality is implemented in CrxInstaller::ConfirmInstall().
37172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsInstall) {
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetManagementPolicy()->UnregisterAllProviders();
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::TestManagementPolicyProvider provider_(
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::TestManagementPolicyProvider::PROHIBIT_LOAD);
3723f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetManagementPolicy()->RegisterProvider(&provider_);
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_FAILED);
3726f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that extensions cannot be loaded from prefs if the policy provider
37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prohibits it. This functionality is implemented in InstalledLoader::Load().
37312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsLoadFromPrefs) {
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a fake extension to be loaded as though it were read from prefs.
3735f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path =
3736f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("management").AppendASCII("simple_extension");
37375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue manifest;
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kName, "simple_extension");
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kVersion, "1");
37402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // UNPACKED is for extensions loaded from a directory. We use it here, even
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // though we're testing loading from prefs, so that we don't need to provide
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an extension key.
3743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  extensions::ExtensionInfo extension_info(
3744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &manifest, std::string(), path, Manifest::UNPACKED);
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure we can load it with no management policy in place.
3747f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetManagementPolicy()->UnregisterAllProviders();
3748f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
3749f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::InstalledLoader(service()).Load(extension_info, false);
3750f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3752f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension =
3753f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      (registry()->enabled_extensions().begin())->get();
37545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(
37555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      service()->UninstallExtension(extension->id(),
37565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    extensions::UNINSTALL_REASON_FOR_TESTING,
37575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    base::Bind(&base::DoNothing),
37585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    NULL));
3759f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure we cannot load it if management policy prohibits installation.
37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::TestManagementPolicyProvider provider_(
37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::TestManagementPolicyProvider::PROHIBIT_LOAD);
3764f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetManagementPolicy()->RegisterProvider(&provider_);
37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3766f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::InstalledLoader(service()).Load(extension_info, false);
3767f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests disabling an extension when prohibited by the ManagementPolicy.
37712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsDisable) {
37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3774f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
3775f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
3776f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3778f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetManagementPolicy()->UnregisterAllProviders();
37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::TestManagementPolicyProvider provider(
37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS);
3781f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetManagementPolicy()->RegisterProvider(&provider);
37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt to disable it.
3784f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION);
37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3786f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
3787f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
3788f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests uninstalling an extension when prohibited by the ManagementPolicy.
37922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsUninstall) {
37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
3796f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
3797f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3799f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetManagementPolicy()->UnregisterAllProviders();
38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::TestManagementPolicyProvider provider(
38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS);
3802f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetManagementPolicy()->RegisterProvider(&provider);
38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt to uninstall it.
38055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(
38065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      service()->UninstallExtension(good_crx,
38075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    extensions::UNINSTALL_REASON_FOR_TESTING,
38085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    base::Bind(&base::DoNothing),
38095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    NULL));
38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3811f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
3812f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that previously installed extensions that are now prohibited from
38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// being installed are removed.
38172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ManagementPolicyUnloadsAllProhibited) {
38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3820f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
3821f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("page_action.crx"), INSTALL_NEW);
3822f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(2u, registry()->enabled_extensions().size());
3823f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetManagementPolicy()->UnregisterAllProviders();
38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::TestManagementPolicyProvider provider(
38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::TestManagementPolicyProvider::PROHIBIT_LOAD);
3828f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetManagementPolicy()->RegisterProvider(&provider);
38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the policy check.
3831f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckManagementPolicy();
3832f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
3833f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that previously disabled extensions that are now required to be
38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// enabled are re-enabled on reinstall.
38382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ManagementPolicyRequiresEnable) {
38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install, then disable, an extension.
3842f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
3843f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
3844f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION);
3845f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->disabled_extensions().size());
38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register an ExtensionMnagementPolicy that requires the extension to remain
38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // enabled.
3849f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetManagementPolicy()->UnregisterAllProviders();
38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::TestManagementPolicyProvider provider(
38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::TestManagementPolicyProvider::MUST_REMAIN_ENABLED);
3852f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetManagementPolicy()->RegisterProvider(&provider);
38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reinstall the extension.
3855f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_UPDATED);
3856f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
3857f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Flaky on windows; http://crbug.com/309833
38618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_WIN)
38628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#define MAYBE_ExternalExtensionAutoAcknowledgement DISABLED_ExternalExtensionAutoAcknowledgement
38638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#else
38648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#define MAYBE_ExternalExtensionAutoAcknowledgement ExternalExtensionAutoAcknowledgement
38658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
38665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ExtensionServiceTest, MAYBE_ExternalExtensionAutoAcknowledgement) {
38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
3868f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(true);
38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Register and install an external extension.
38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockExtensionProvider* provider =
3873f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddMockExternalProvider(provider);
3875f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    provider->UpdateOrAddExtension(
3876f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        good_crx, "1.0.0.0", data_dir().AppendASCII("good.crx"));
38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Have policy force-install an extension.
3880f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MockExtensionProvider* provider = new MockExtensionProvider(
3881f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        service(), Manifest::EXTERNAL_POLICY_DOWNLOAD);
38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddMockExternalProvider(provider);
3883f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    provider->UpdateOrAddExtension(
3884f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx"));
38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Providers are set up. Let them run.
38887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int count = 2;
3889f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
38905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
3891f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&WaitForCountNotificationsCallback, &count));
3892f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
3893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3894f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3896f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(2u, registry()->enabled_extensions().size());
3897f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
3898f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(page_action, false));
3899f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(!prefs->IsExternalExtensionAcknowledged(good_crx));
39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(prefs->IsExternalExtensionAcknowledged(page_action));
39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS)
39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests if default apps are installed correctly.
39062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, DefaultAppsInstall) {
39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
3908f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(true);
39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string json_data =
39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "{"
39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "  \"ldnnhddmnhbkjipkidpdiheffobcpfmf\" : {"
39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "    \"external_crx\": \"good.crx\","
39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "    \"external_version\": \"1.0.0.0\","
39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "    \"is_bookmark_app\": false"
39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "  }"
39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "}";
3919f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    default_apps::Provider* provider = new default_apps::Provider(
3920f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        profile(),
3921f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        service(),
3922f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        new extensions::ExternalTestingLoader(json_data, data_dir()),
3923f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        Manifest::INTERNAL,
3924f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        Manifest::INVALID_LOCATION,
3925f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT);
39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddMockExternalProvider(provider);
39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3930f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(0u, registry()->enabled_extensions().size());
3931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
39325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
3933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
3934f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
3935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3937f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
3938f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
3939f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetExtensionById(good_crx, false);
39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->from_webstore());
39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->was_installed_by_default());
39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests disabling extensions
39462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, DisableExtension) {
39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3949f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
3950f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good_crx, true));
3951f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
39525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3953f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
3954f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
3955f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->terminated_extensions().size());
3956f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->blacklisted_extensions().size());
39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable it.
3959f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION);
39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3961f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good_crx, true));
3962f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->GetExtensionById(good_crx, false));
3963f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
3964f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->disabled_extensions().size());
3965f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->terminated_extensions().size());
3966f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->blacklisted_extensions().size());
39675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
39685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
39695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ExtensionServiceTest, TerminateExtension) {
39705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InitializeEmptyExtensionService();
39715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3972f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
3973f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
3974f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
3975f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->terminated_extensions().size());
3976f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->blacklisted_extensions().size());
39775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
39785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TerminateExtension(good_crx);
39795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3980f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
3981f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
3982f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->terminated_extensions().size());
3983f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->blacklisted_extensions().size());
39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, DisableTerminatedExtension) {
39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3989f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TerminateExtension(good_crx);
3991f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry()->GetExtensionById(
3992effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      good_crx, extensions::ExtensionRegistry::TERMINATED));
39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable it.
3995f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION);
39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3997f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(registry()->GetExtensionById(
3998effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      good_crx, extensions::ExtensionRegistry::TERMINATED));
3999f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good_crx, true));
40005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4001f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
4002f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->disabled_extensions().size());
4003f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->terminated_extensions().size());
4004f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->blacklisted_extensions().size());
40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests disabling all extensions (simulating --disable-extensions flag).
40082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, DisableAllExtensions) {
40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4011f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_NEW);
40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4014f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
4015f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable extensions.
4018f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(false);
4019f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtensionsForTest();
40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There shouldn't be extensions in either list.
4022f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
4023f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This shouldn't do anything when all extensions are disabled.
4026f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->EnableExtension(good_crx);
4027f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtensionsForTest();
40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There still shouldn't be extensions in either list.
4030f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
4031f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And then re-enable the extensions.
4034f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(true);
4035f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtensionsForTest();
40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4037f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
4038f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests reloading extensions.
40422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ReloadExtensions) {
40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
40445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simple extension that should install without error.
4046f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_NEW,
40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT);
40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* extension_id = good_crx;
4050f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->DisableExtension(extension_id, Extension::DISABLE_USER_ACTION);
40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4052f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
4053f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->disabled_extensions().size());
40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtensionsForTest();
40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The creation flags should not change when reloading the extension.
4058f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetExtensionById(good_crx, true);
40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->from_webstore());
40605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->was_installed_by_default());
40615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(extension->from_bookmark());
40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension counts shouldn't change.
4064f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
4065f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->disabled_extensions().size());
40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4067f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->EnableExtension(extension_id);
40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4069f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
4070f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Need to clear |loaded_| manually before reloading as the
40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // EnableExtension() call above inserted into it and
40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UnloadAllExtensions() doesn't send out notifications.
40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loaded_.clear();
4076f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtensionsForTest();
40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension counts shouldn't change.
4079f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
4080f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests reloading an extension.
40842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ReloadExtension) {
40852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitializeEmptyExtensionService();
4086f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InitializeProcessManager();
40872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
40882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simple extension that should install without error.
40892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* extension_id = "behllobkkfkfnphdnhnkndlbkcpglgmj";
4090f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath ext = data_dir()
4091f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           .AppendASCII("good")
4092f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           .AppendASCII("Extensions")
4093f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           .AppendASCII(extension_id)
4094f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           .AppendASCII("1.0.0.0");
4095f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(ext);
4096ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
40972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4098f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
4099f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
41002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtension(extension_id);
41022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Extension should be disabled now, waiting to be reloaded.
4104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
4105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->disabled_extensions().size());
4106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(Extension::DISABLE_RELOAD,
4107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            ExtensionPrefs::Get(profile())->GetDisableReasons(extension_id));
41082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Reloading again should not crash.
4110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtension(extension_id);
41112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Finish reloading
4113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
41142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Extension should be enabled again.
4116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
4117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
41182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
41192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UninstallExtension) {
41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
4122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
4123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(good_crx, false);
4125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
4126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(UnloadedExtensionInfo::REASON_UNINSTALL, unloaded_reason_);
41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UninstallTerminatedExtension) {
41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
4131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TerminateExtension(good_crx);
41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(good_crx, false);
4134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(UnloadedExtensionInfo::REASON_TERMINATE, unloaded_reason_);
41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests the uninstaller helper.
41382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UninstallExtensionHelper) {
41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
4140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(good_crx, true);
4142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(UnloadedExtensionInfo::REASON_UNINSTALL, unloaded_reason_);
41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UninstallExtensionHelperTerminated) {
41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
4147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TerminateExtension(good_crx);
41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(good_crx, true);
4150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(UnloadedExtensionInfo::REASON_TERMINATE, unloaded_reason_);
41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An extension disabled because of unsupported requirements should re-enabled
41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if updated to a version with supported requirements as long as there are no
41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// other disable reasons.
41562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpgradingRequirementsEnabled) {
41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlackListWebGL();
41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("requirements");
4161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath pem_path =
4162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("requirements").AppendASCII("v1_good.pem");
41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"),
41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    pem_path,
41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    INSTALL_NEW);
41665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id = extension_v1->id();
4167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->IsExtensionEnabled(id));
41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath v2_bad_requirements_crx = GetTemporaryFile();
41702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PackCRX(path.AppendASCII("v2_bad_requirements"),
41722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          pem_path,
41732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          v2_bad_requirements_crx);
41742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateExtension(id, v2_bad_requirements_crx, INSTALLED);
4175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(id));
41765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath v3_good_crx = GetTemporaryFile();
41782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PackCRX(path.AppendASCII("v3_good"), pem_path, v3_good_crx);
41802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateExtension(id, v3_good_crx, ENABLED);
4181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->IsExtensionEnabled(id));
41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extensions disabled through user action should stay disabled.
41852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpgradingRequirementsDisabled) {
41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
41875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlackListWebGL();
41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("requirements");
4190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath pem_path =
4191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("requirements").AppendASCII("v1_good.pem");
41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"),
41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    pem_path,
41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    INSTALL_NEW);
41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id = extension_v1->id();
4196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->DisableExtension(id, Extension::DISABLE_USER_ACTION);
4197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(id));
41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath v2_bad_requirements_crx = GetTemporaryFile();
42002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
42012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PackCRX(path.AppendASCII("v2_bad_requirements"),
42022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          pem_path,
42032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          v2_bad_requirements_crx);
42042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateExtension(id, v2_bad_requirements_crx, INSTALLED);
4205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(id));
42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath v3_good_crx = GetTemporaryFile();
42082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
42092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PackCRX(path.AppendASCII("v3_good"), pem_path, v3_good_crx);
42102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateExtension(id, v3_good_crx, INSTALLED);
4211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(id));
42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The extension should not re-enabled because it was disabled from a
42155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permission increase.
42162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpgradingRequirementsPermissions) {
42175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
42185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlackListWebGL();
42195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("requirements");
4221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath pem_path =
4222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("requirements").AppendASCII("v1_good.pem");
42235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"),
42245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    pem_path,
42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    INSTALL_NEW);
42265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id = extension_v1->id();
4227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->IsExtensionEnabled(id));
42285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath v2_bad_requirements_and_permissions_crx = GetTemporaryFile();
42302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
42312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PackCRX(path.AppendASCII("v2_bad_requirements_and_permissions"),
42322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          pem_path,
42332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          v2_bad_requirements_and_permissions_crx);
42342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateExtension(id, v2_bad_requirements_and_permissions_crx, INSTALLED);
4235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(id));
42365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath v3_bad_permissions_crx = GetTemporaryFile();
42382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
42392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PackCRX(path.AppendASCII("v3_bad_permissions"),
42402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          pem_path,
42412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          v3_bad_permissions_crx);
42422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateExtension(id, v3_bad_permissions_crx, INSTALLED);
4243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(id));
42445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unpacked extensions are not allowed to be installed if they have unsupported
42475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// requirements.
42482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UnpackedRequirements) {
42495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlackListWebGL();
42515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path =
4253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("requirements").AppendASCII("v2_bad_requirements");
4254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(path);
4255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, GetErrors().size());
4257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionCookieCallback {
42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionCookieCallback()
42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : result_(false),
426490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      weak_factory_(base::MessageLoop::current()) {}
42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCookieCallback(bool result) {
426790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
426890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::Bind(&base::MessageLoop::Quit, weak_factory_.GetWeakPtr()));
42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result_ = result;
42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetAllCookiesCallback(const net::CookieList& list) {
427390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
427490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::Bind(&base::MessageLoop::Quit, weak_factory_.GetWeakPtr()));
42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list_ = list;
42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CookieList list_;
42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result_;
427990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::WeakPtrFactory<base::MessageLoop> weak_factory_;
42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies extension state is removed upon uninstall.
42832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ClearExtensionData) {
42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionCookieCallback callback;
42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a test extension.
4288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir();
42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.AppendASCII("good.crx");
42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = InstallCRX(path, INSTALL_NEW);
42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL ext_url(extension->url());
429303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string origin_id = storage::GetIdentifierFromOrigin(ext_url);
42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a cookie for the extension.
4296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  net::CookieMonster* cookie_monster = profile()
4297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                           ->GetRequestContextForExtensions()
4298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                           ->GetURLRequestContext()
4299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                           ->cookie_store()
4300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                           ->GetCookieMonster();
43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(cookie_monster);
43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CookieOptions options;
43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->SetCookieWithOptionsAsync(
43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ext_url, "dummy=value", options,
43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       base::Bind(&ExtensionCookieCallback::SetCookieCallback,
43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::Unretained(&callback)));
4307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(callback.result_);
43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->GetAllCookiesForURLAsync(
43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ext_url,
43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback,
43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&callback)));
4314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, callback.list_.size());
43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a database.
431803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::DatabaseTracker* db_tracker =
4319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      BrowserContext::GetDefaultStoragePartition(profile())
4320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          ->GetDatabaseTracker();
43215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 db_name = base::UTF8ToUTF16("db");
43225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 description = base::UTF8ToUTF16("db_description");
43235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 size;
43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_tracker->DatabaseOpened(origin_id, db_name, description, 1, &size);
43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_tracker->DatabaseClosed(origin_id, db_name);
432603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::vector<storage::OriginInfo> origins;
43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_tracker->GetAllOriginsInfo(&origins);
43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, origins.size());
43297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(origin_id, origins[0].GetOriginIdentifier());
43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create local storage. We only simulate this by creating the backing files.
43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This test depends on details of how the dom_storage library
43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stores data in the host file system.
43342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath lso_dir_path =
4335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      profile()->GetPath().AppendASCII("Local Storage");
43367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath lso_file_path = lso_dir_path.AppendASCII(origin_id)
43377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      .AddExtension(FILE_PATH_LITERAL(".localstorage"));
4338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(base::CreateDirectory(lso_dir_path));
4339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, base::WriteFile(lso_file_path, NULL, 0));
43407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(lso_file_path));
43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create indexed db. Similarly, it is enough to only simulate this by
43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // creating the directory on the disk.
4344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  IndexedDBContext* idb_context = BrowserContext::GetDefaultStoragePartition(
4345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                      profile())->GetIndexedDBContext();
4346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  idb_context->SetTaskRunnerForTesting(
4347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::MessageLoop::current()->message_loop_proxy().get());
43482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath idb_path = idb_context->GetFilePathForTesting(origin_id);
4349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(base::CreateDirectory(idb_path));
43507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::DirectoryExists(idb_path));
43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstall the extension.
43535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::RunLoop run_loop;
43545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(
43555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      service()->UninstallExtension(good_crx,
43565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    extensions::UNINSTALL_REASON_FOR_TESTING,
43575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    run_loop.QuitClosure(),
43585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    NULL));
43595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The data deletion happens on the IO thread.
43605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  run_loop.Run();
43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the cookie is gone.
43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->GetAllCookiesForURLAsync(
43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ext_url,
43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback,
43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::Unretained(&callback)));
4367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, callback.list_.size());
43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The database should have vanished as well.
43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  origins.clear();
43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_tracker->GetAllOriginsInfo(&origins);
43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, origins.size());
43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the LSO file has been removed.
43767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(lso_file_path));
43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if the indexed db has disappeared too.
43797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::DirectoryExists(idb_path));
43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies app state is removed upon uninstall.
43832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ClearAppData) {
43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionCookieCallback callback;
43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pref_count = 0;
43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install app1 with unlimited storage.
43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension =
4391f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW);
43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(++pref_count);
4393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string id1 = extension->id();
439546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      APIPermission::kUnlimitedStorage));
4397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const GURL origin1(
4398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin());
4399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
4400f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      origin1));
440103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string origin_id = storage::GetIdentifierFromOrigin(origin1);
44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install app2 from the same origin with unlimited storage.
4404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension = PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW);
44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(++pref_count);
4406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(2u, registry()->enabled_extensions().size());
44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string id2 = extension->id();
440846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      APIPermission::kUnlimitedStorage));
44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->web_extent().MatchesURL(
4411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extensions::AppLaunchInfo::GetFullLaunchURL(extension)));
4412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const GURL origin2(
4413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin());
44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(origin1, origin2);
4415f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
4416f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      origin2));
44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a cookie for the extension.
4419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  net::CookieMonster* cookie_monster = profile()
4420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                           ->GetRequestContext()
4421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                           ->GetURLRequestContext()
4422f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                           ->cookie_store()
4423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                           ->GetCookieMonster();
44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(cookie_monster);
44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CookieOptions options;
44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->SetCookieWithOptionsAsync(
44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       origin1, "dummy=value", options,
44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       base::Bind(&ExtensionCookieCallback::SetCookieCallback,
44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::Unretained(&callback)));
4430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(callback.result_);
44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->GetAllCookiesForURLAsync(
44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin1,
44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback,
44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&callback)));
4437ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, callback.list_.size());
44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a database.
444103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::DatabaseTracker* db_tracker =
4442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      BrowserContext::GetDefaultStoragePartition(profile())
4443f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          ->GetDatabaseTracker();
44445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 db_name = base::UTF8ToUTF16("db");
44455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 description = base::UTF8ToUTF16("db_description");
44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 size;
44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_tracker->DatabaseOpened(origin_id, db_name, description, 1, &size);
44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_tracker->DatabaseClosed(origin_id, db_name);
444903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::vector<storage::OriginInfo> origins;
44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_tracker->GetAllOriginsInfo(&origins);
44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, origins.size());
44527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(origin_id, origins[0].GetOriginIdentifier());
44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create local storage. We only simulate this by creating the backing files.
44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This test depends on details of how the dom_storage library
44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stores data in the host file system.
44572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath lso_dir_path =
4458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      profile()->GetPath().AppendASCII("Local Storage");
44597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath lso_file_path = lso_dir_path.AppendASCII(origin_id)
44607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      .AddExtension(FILE_PATH_LITERAL(".localstorage"));
4461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(base::CreateDirectory(lso_dir_path));
4462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, base::WriteFile(lso_file_path, NULL, 0));
44637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(lso_file_path));
44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create indexed db. Similarly, it is enough to only simulate this by
44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // creating the directory on the disk.
4467f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  IndexedDBContext* idb_context = BrowserContext::GetDefaultStoragePartition(
4468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                      profile())->GetIndexedDBContext();
4469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  idb_context->SetTaskRunnerForTesting(
4470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::MessageLoop::current()->message_loop_proxy().get());
44712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath idb_path = idb_context->GetFilePathForTesting(origin_id);
4472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(base::CreateDirectory(idb_path));
44737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::DirectoryExists(idb_path));
44745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstall one of them, unlimited storage should still be granted
44765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the origin.
44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(id1, false);
4478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
4479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
4480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      origin1));
44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the cookie is still there.
44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->GetAllCookiesForURLAsync(
44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       origin1,
44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback,
44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::Unretained(&callback)));
4487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, callback.list_.size());
44895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now uninstall the other. Storage should be cleared for the apps.
44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(id2, false);
4492f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
4493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(
4494f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
4495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          origin1));
44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the cookie is gone.
44985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_monster->GetAllCookiesForURLAsync(
44995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       origin1,
45005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback,
45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::Unretained(&callback)));
4502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, callback.list_.size());
45045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The database should have vanished as well.
45065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  origins.clear();
45075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_tracker->GetAllOriginsInfo(&origins);
45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, origins.size());
45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the LSO file has been removed.
45117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(lso_file_path));
45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if the indexed db has disappeared too.
45147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::DirectoryExists(idb_path));
45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests loading single extensions (like --load-extension)
4518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Flaky crashes. http://crbug.com/231806
4519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionServiceTest, DISABLED_LoadExtension) {
45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath ext1 = data_dir()
4523f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            .AppendASCII("good")
4524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            .AppendASCII("Extensions")
4525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
4526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            .AppendASCII("1.0.0.0");
4527f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(ext1);
4528ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
45312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::UNPACKED, loaded_[0]->location());
4532f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(1);
45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4536f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath no_manifest =
4537f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir()
4538f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          .AppendASCII("bad")
4539f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          // .AppendASCII("Extensions")
4540f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          .AppendASCII("cccccccccccccccccccccccccccccccc")
4541f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          .AppendASCII("1");
4542f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(no_manifest);
4543ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, GetErrors().size());
45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
4546f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test uninstall.
45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id = loaded_[0]->id();
45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(unloaded_id_.length());
45515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  service()->UninstallExtension(id,
45525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                extensions::UNINSTALL_REASON_FOR_TESTING,
45535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                base::Bind(&base::DoNothing),
45545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                NULL);
4555ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(id, unloaded_id_);
45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, loaded_.size());
4558f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we generate IDs when they are not specified in the manifest for
45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --load-extension.
45632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GenerateID) {
45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath no_id_ext = data_dir().AppendASCII("no_id");
4567f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(no_id_ext);
4568ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
457103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_TRUE(crx_file::id_util::IdIsValid(loaded_[0]->id()));
45722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(loaded_[0]->location(), Manifest::UNPACKED);
45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(1);
45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string previous_id = loaded_[0]->id();
45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we reload the same path, we should get the same extension ID.
4579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(no_id_ext);
4580ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(previous_id, loaded_[0]->id());
45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(ExtensionServiceTest, UnpackedValidatesLocales) {
4586d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  InitializeEmptyExtensionService();
4587d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
4588f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath bad_locale =
4589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("unpacked").AppendASCII("bad_messages_file");
4590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(bad_locale);
4591d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
4592d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1u, GetErrors().size());
4593d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::FilePath ms_messages_file = bad_locale.AppendASCII("_locales")
4594d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                              .AppendASCII("ms")
4595d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                              .AppendASCII("messages.json");
45965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_THAT(base::UTF16ToUTF8(GetErrors()[0]), testing::AllOf(
45975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       testing::HasSubstr(
45985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           base::UTF16ToUTF8(ms_messages_file.LossyDisplayName())),
4599d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)       testing::HasSubstr("Dictionary keys must be quoted.")));
4600d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_EQ(0u, loaded_.size());
4601d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
4602d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionServiceTest::TestExternalProvider(
46042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockExtensionProvider* provider, Manifest::Location location) {
46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that starting with no providers loads no extensions.
4606f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, loaded_.size());
46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider->set_visit_count(0);
46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register a test extension externally using the mock registry provider.
4612f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath source_path = data_dir().AppendASCII("good.crx");
46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add the extension.
46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider->UpdateOrAddExtension(good_crx, "1.0.0.0", source_path);
46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reloading extensions should find our externally registered extension
46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and install it.
4619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
46205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
4621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
4622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
4623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, GetErrors().size());
46265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(location, loaded_[0]->location());
46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0.0.0", loaded_[0]->version()->GetString());
46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(1);
46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good_crx, "location", location);
46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reload extensions without changing anything. The extension should be
46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loaded again.
46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loaded_.clear();
4636f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtensionsForTest();
4637ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, GetErrors().size());
46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(1);
46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good_crx, "location", location);
46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now update the extension with a new version. We should get upgraded.
46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source_path = source_path.DirName().AppendASCII("good2.crx");
46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider->UpdateOrAddExtension(good_crx, "1.0.0.1", source_path);
46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loaded_.clear();
4649f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer_2(
46505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
4651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
4652f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
4653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer_2.Wait();
46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, GetErrors().size());
46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0.0.1", loaded_[0]->version()->GetString());
46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(1);
46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good_crx, "location", location);
46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstall the extension and reload. Nothing should happen because the
46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preference should prevent us from reinstalling.
46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id = loaded_[0]->id();
4664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool no_uninstall =
4665f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GetManagementPolicy()->MustRemainEnabled(loaded_[0].get(), NULL);
46665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  service()->UninstallExtension(id,
46675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                extensions::UNINSTALL_REASON_FOR_TESTING,
46685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                base::Bind(&base::DoNothing),
46695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                NULL);
4670ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4672f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath install_path = extensions_install_dir().AppendASCII(id);
46732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (no_uninstall) {
46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Policy controlled extensions should not have been touched by uninstall.
46757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_TRUE(base::PathExists(install_path));
46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The extension should also be gone from the install directory.
46787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_FALSE(base::PathExists(install_path));
46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loaded_.clear();
4680f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    service()->CheckForExternalUpdates();
4681ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::RunLoop().RunUntilIdle();
46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(0u, loaded_.size());
46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValidatePrefKeyCount(1);
46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValidateIntegerPref(good_crx, "state",
46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        Extension::EXTERNAL_EXTENSION_UNINSTALLED);
46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValidateIntegerPref(good_crx, "location", location);
46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now clear the preference and reinstall.
46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetPrefInteg(good_crx, "state", Extension::ENABLED);
46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loaded_.clear();
4692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::WindowedNotificationObserver observer(
46935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions::NOTIFICATION_CRX_INSTALLER_DONE,
4694f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::NotificationService::AllSources());
4695f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    service()->CheckForExternalUpdates();
4696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    observer.Wait();
46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u, loaded_.size());
46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(1);
47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good_crx, "location", location);
47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4703f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (GetManagementPolicy()->MustRemainEnabled(loaded_[0].get(), NULL)) {
47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, provider->visit_count());
47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now test an externally triggered uninstall (deleting the registry key or
47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the pref entry).
47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->RemoveExtension(good_crx);
47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loaded_.clear();
4711f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    service()->OnExternalProviderReady(provider);
4712ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::RunLoop().RunUntilIdle();
47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(0u, loaded_.size());
47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValidatePrefKeyCount(0);
47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The extension should also be gone from the install directory.
47177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_FALSE(base::PathExists(install_path));
47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now test the case where user uninstalls and then the extension is removed
47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // from the external provider.
4721f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::WindowedNotificationObserver observer(
47225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions::NOTIFICATION_CRX_INSTALLER_DONE,
4723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::NotificationService::AllSources());
47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->UpdateOrAddExtension(good_crx, "1.0.0.1", source_path);
4725f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    service()->CheckForExternalUpdates();
4726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    observer.Wait();
47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u, loaded_.size());
47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(0u, GetErrors().size());
47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // User uninstalls.
47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loaded_.clear();
47335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    service()->UninstallExtension(id,
47345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  extensions::UNINSTALL_REASON_FOR_TESTING,
47355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  base::Bind(&base::DoNothing),
47365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  NULL);
4737ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::RunLoop().RunUntilIdle();
47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(0u, loaded_.size());
47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Then remove the extension from the extension provider.
47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->RemoveExtension(good_crx);
47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should still be at 0.
47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loaded_.clear();
4745f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    extensions::InstalledLoader(service()).LoadAllExtensions();
4746ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::RunLoop().RunUntilIdle();
47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(0u, loaded_.size());
47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValidatePrefKeyCount(1);
47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(5, provider->visit_count());
47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests the external installation feature
47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
47562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallRegistry) {
47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should all work, even when normal extension installation is disabled.
47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
4759f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(false);
47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now add providers. Extension system takes ownership of the objects.
47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockExtensionProvider* reg_provider =
4763f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new MockExtensionProvider(service(), Manifest::EXTERNAL_REGISTRY);
47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMockExternalProvider(reg_provider);
47652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestExternalProvider(reg_provider, Manifest::EXTERNAL_REGISTRY);
47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallPref) {
47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now add providers. Extension system takes ownership of the objects.
47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockExtensionProvider* pref_provider =
4774f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMockExternalProvider(pref_provider);
47772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestExternalProvider(pref_provider, Manifest::EXTERNAL_PREF);
47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallPrefUpdateUrl) {
47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should all work, even when normal extension installation is disabled.
47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
4783f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(false);
47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(skerner): The mock provider is not a good model of a provider
47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that works with update URLs, because it adds file and version info.
47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extend the mock to work with update URLs.  This test checks the
47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // behavior that is common to all external extension visitors.  The
47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser test ExtensionManagementTest.ExternalUrlUpdate tests that
47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // what the visitor does results in an extension being downloaded and
47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // installed.
47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockExtensionProvider* pref_provider =
4793f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF_DOWNLOAD);
47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMockExternalProvider(pref_provider);
47952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestExternalProvider(pref_provider, Manifest::EXTERNAL_PREF_DOWNLOAD);
47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallPolicyUpdateUrl) {
47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should all work, even when normal extension installation is disabled.
48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
4801f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(false);
48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(skerner): The mock provider is not a good model of a provider
48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that works with update URLs, because it adds file and version info.
48055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extend the mock to work with update URLs. This test checks the
48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // behavior that is common to all external extension visitors. The
48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser test ExtensionManagementTest.ExternalUrlUpdate tests that
48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // what the visitor does results in an extension being downloaded and
48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // installed.
48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockExtensionProvider* pref_provider =
4811f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new MockExtensionProvider(service(), Manifest::EXTERNAL_POLICY_DOWNLOAD);
48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMockExternalProvider(pref_provider);
48132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestExternalProvider(pref_provider, Manifest::EXTERNAL_POLICY_DOWNLOAD);
48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that external extensions get uninstalled when the external extension
48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// providers can't account for them.
48182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalUninstall) {
48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start the extensions service with one external extension already installed.
4820f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath source_install_dir =
4821f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("good").AppendASCII("Extensions");
48222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath pref_path = source_install_dir
48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .DirName()
48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .AppendASCII("PreferencesExternal");
48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This initializes the extensions service with no ExternalProviders.
48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeInstalledExtensionService(pref_path, source_install_dir);
4828f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(false);
48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4830f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
48315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, GetErrors().size());
48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, loaded_.size());
48345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that it's not the disabled extensions flag causing it not to load.
4836f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(true);
4837f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtensionsForTest();
4838ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, GetErrors().size());
48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, loaded_.size());
48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that running multiple update checks simultaneously does not
48455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// keep the update from succeeding.
48462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, MultipleExternalUpdateCheck) {
48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockExtensionProvider* provider =
4850f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
48515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMockExternalProvider(provider);
48525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that starting with no providers loads no extensions.
4854f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
48555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, loaded_.size());
48565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start two checks for updates.
48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider->set_visit_count(0);
4859f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
4860f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
4861ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Two calls should cause two checks for external extensions.
48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, provider->visit_count());
48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, loaded_.size());
48675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register a test extension externally using the mock registry provider.
4869f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath source_path = data_dir().AppendASCII("good.crx");
48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider->UpdateOrAddExtension(good_crx, "1.0.0.0", source_path);
48715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Two checks for external updates should find the extension, and install it
48735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // once.
4874f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
48755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
4876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider->set_visit_count(0);
4878f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
4879f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
4880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, provider->visit_count());
48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, GetErrors().size());
48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
48842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(Manifest::EXTERNAL_PREF, loaded_[0]->location());
48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0.0.0", loaded_[0]->version()->GetString());
48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(1);
48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
48882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValidateIntegerPref(good_crx, "location", Manifest::EXTERNAL_PREF);
48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider->RemoveExtension(good_crx);
48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider->set_visit_count(0);
4892f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
4893f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
4894ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Two calls should cause two checks for external extensions.
48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Because the external source no longer includes good_crx,
48985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // good_crx will be uninstalled.  So, expect that no extensions
48995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are loaded.
49005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, provider->visit_count());
49015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
49025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, loaded_.size());
49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalPrefProvider) {
49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test some valid extension records.
49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a base path to avoid erroring out on relative paths.
49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paths starting with // are absolute on every platform we support.
49112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath base_path(FILE_PATH_LITERAL("//base/path"));
49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(base_path.IsAbsolute());
49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockProviderVisitor visitor(base_path);
49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string json_data =
49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "{"
49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"RandomExtension.crx\","
49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": \"1.0\""
49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  },"
49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {"
49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"RandomExtension2.crx\","
49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": \"2.0\""
49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  },"
49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"cccccccccccccccccccccccccccccccc\": {"
4925effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "    \"external_update_url\": \"http:\\\\foo.com/update\","
4926effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "    \"install_parameter\": \"id\""
49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }"
49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}";
49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, visitor.Visit(json_data));
49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate an external_extensions.json file that contains seven invalid
49325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // records:
49335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - One that is missing the 'external_crx' key.
49345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - One that is missing the 'external_version' key.
49355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - One that is specifying .. in the path.
49365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - One that specifies both a file and update URL.
49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - One that specifies no file or update URL.
49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - One that has an update URL that is not well formed.
49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - One that contains a malformed version.
49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - One that has an invalid id.
49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - One that has a non-dictionary value.
49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - One that has an integer 'external_version' instead of a string.
49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The final extension is valid, and we check that it is read to make sure
49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // failures don't stop valid records from being read.
49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  json_data =
49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "{"
49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": \"1.0\""
49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  },"
49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {"
49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"RandomExtension.crx\""
49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  },"
49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"cccccccccccccccccccccccccccccccc\": {"
49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"..\\\\foo\\\\RandomExtension2.crx\","
49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": \"2.0\""
49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  },"
49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"dddddddddddddddddddddddddddddddd\": {"
49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"RandomExtension2.crx\","
49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": \"2.0\","
49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_update_url\": \"http:\\\\foo.com/update\""
49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  },"
49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\": {"
49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  },"
49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"ffffffffffffffffffffffffffffffff\": {"
49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_update_url\": \"This string is not a valid URL\""
49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  },"
49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"gggggggggggggggggggggggggggggggg\": {"
49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"RandomExtension3.crx\","
49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": \"This is not a valid version!\""
49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  },"
49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"This is not a valid id!\": {},"
49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\": true,"
49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\": {"
49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"RandomExtension4.crx\","
49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": 1.0"
49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  },"
49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"pppppppppppppppppppppppppppppppp\": {"
49785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"RandomValidExtension.crx\","
49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": \"1.0\""
49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }"
49815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}";
49825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, visitor.Visit(json_data));
49835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that if a base path is not provided, use of a relative
49855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // path fails.
49862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath empty;
49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockProviderVisitor visitor_no_relative_paths(empty);
49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use absolute paths.  Expect success.
49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  json_data =
49915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "{"
49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"//RandomExtension1.crx\","
49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": \"3.0\""
49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  },"
49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {"
49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"//path/to/RandomExtension2.crx\","
49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": \"3.0\""
49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }"
50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}";
50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, visitor_no_relative_paths.Visit(json_data));
50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use a relative path.  Expect that it will error out.
50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  json_data =
50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "{"
50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"cccccccccccccccccccccccccccccccc\": {"
50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"RandomExtension2.crx\","
50085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": \"3.0\""
50095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }"
50105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}";
50115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, visitor_no_relative_paths.Visit(json_data));
50125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test supported_locales.
50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  json_data =
50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "{"
50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"RandomExtension.crx\","
50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": \"1.0\","
50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"supported_locales\": [ \"en\" ]"
50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  },"
50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {"
50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"RandomExtension2.crx\","
50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": \"2.0\","
50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"supported_locales\": [ \"en-GB\" ]"
50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  },"
50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"cccccccccccccccccccccccccccccccc\": {"
50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"RandomExtension2.crx\","
50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": \"3.0\","
50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"supported_locales\": [ \"en_US\", \"fr\" ]"
50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }"
50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}";
50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedBrowserLocale guard("en-US");
50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, visitor.Visit(json_data));
50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5037868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Test keep_if_present.
5038868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  json_data =
5039868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "{"
5040868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
5041868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "    \"external_crx\": \"RandomExtension.crx\","
5042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "    \"external_version\": \"1.0\","
5043868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "    \"keep_if_present\": true"
5044868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "  }"
5045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "}";
5046868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {
5047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(0, visitor.Visit(json_data));
5048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
5049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test is_bookmark_app.
50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockProviderVisitor from_bookmark_visitor(
50525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base_path, Extension::FROM_BOOKMARK);
50535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  json_data =
50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "{"
50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_crx\": \"RandomExtension.crx\","
50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"external_version\": \"1.0\","
50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"is_bookmark_app\": true"
50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }"
50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}";
50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, from_bookmark_visitor.Visit(json_data));
50622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
50632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test is_from_webstore.
50642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockProviderVisitor from_webstore_visitor(
50652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base_path, Extension::FROM_WEBSTORE);
50662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  json_data =
50672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "{"
50682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
50692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    \"external_crx\": \"RandomExtension.crx\","
50702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    \"external_version\": \"1.0\","
50712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    \"is_from_webstore\": true"
50722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  }"
50732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "}";
50742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, from_webstore_visitor.Visit(json_data));
5075c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5076c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Test was_installed_by_eom.
5077c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  MockProviderVisitor was_installed_by_eom_visitor(
5078c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      base_path, Extension::WAS_INSTALLED_BY_OEM);
5079c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  json_data =
5080c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "{"
5081c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
5082c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "    \"external_crx\": \"RandomExtension.crx\","
5083c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "    \"external_version\": \"1.0\","
5084c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "    \"was_installed_by_oem\": true"
5085c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "  }"
5086c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "}";
5087c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(1, was_installed_by_eom_visitor.Visit(json_data));
50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test loading good extensions from the profile directory.
50912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, LoadAndRelocalizeExtensions) {
50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure we're testing in "en" and leave global state untouched.
50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_l10n_util::ScopedLocaleForTest testLocale("en");
50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the test dir with a good Preferences/extensions.
5096f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath source_install_dir = data_dir().AppendASCII("l10n");
50975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FilePath pref_path =
50985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_install_dir.Append(chrome::kPreferencesFilename);
50995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeInstalledExtensionService(pref_path, source_install_dir);
51005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, loaded_.size());
51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This was equal to "sr" on load.
51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateStringPref(loaded_[0]->id(), keys::kCurrentLocale, "en");
51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These are untouched by re-localization.
51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateStringPref(loaded_[1]->id(), keys::kCurrentLocale, "en");
51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsPrefExist(loaded_[1]->id(), keys::kCurrentLocale));
51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This one starts with Serbian name, and gets re-localized into English.
51135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("My name is simple.", loaded_[0]->name());
51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These are untouched by re-localization.
51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("My name is simple.", loaded_[1]->name());
51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("no l10n", loaded_[2]->name());
51185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionsReadyRecorder : public content::NotificationObserver {
51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionsReadyRecorder() : ready_(false) {
51235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    registrar_.Add(this,
51245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED,
51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   content::NotificationService::AllSources());
51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_ready(bool value) { ready_ = value; }
51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ready() { return ready_; }
51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
51325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
51342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
51355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
51365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      case extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED:
51375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ready_ = true;
51385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
51395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
51405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
51415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
51425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ready_;
51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we get enabled/disabled correctly for all the pref/command-line
51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// combinations. We don't want to derive from the ExtensionServiceTest class
51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for this test, so we use ExtensionServiceTestSimple.
51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Also tests that we always fire EXTENSIONS_READY, no matter whether we are
51535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// enabled or not.
51545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionServiceTestSimple, Enabledness) {
51552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the PluginService singleton is destroyed at the end of the test.
51562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ShadowingAtExitManager at_exit_manager;
5157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(ENABLE_PLUGINS)
5158ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  content::PluginService::GetInstance()->Init();
5159ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  content::PluginService::GetInstance()->DisablePluginsDiscoveryForTesting();
5160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
51612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionErrorReporter::Init(false);  // no noisy errors
51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionsReadyRecorder recorder;
51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile(new TestingProfile());
5165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
5166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined OS_CHROMEOS
5167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestDeviceSettingsService device_settings_service;
5168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestCrosSettings cros_settings;
5169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<chromeos::ScopedTestUserManager> user_manager(
5170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new chromeos::ScopedTestUserManager);
5171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
51725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CommandLine> command_line;
51732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath install_dir = profile->GetPath()
517490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .AppendASCII(extensions::kInstallDirectoryName);
51752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // By default, we are enabled.
51775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line.reset(new CommandLine(CommandLine::NO_PROGRAM));
51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionService* service = static_cast<extensions::TestExtensionSystem*>(
51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionSystem::Get(profile.get()))->
51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateExtensionService(
51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          command_line.get(),
51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          install_dir,
51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false);
51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service->extensions_enabled());
51855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->Init();
5186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(recorder.ready());
5188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined OS_CHROMEOS
5189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  user_manager.reset();
5190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If either the command line or pref is set, we are disabled.
51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  recorder.set_ready(false);
51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.reset(new TestingProfile());
51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line->AppendSwitch(switches::kDisableExtensions);
51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service = static_cast<extensions::TestExtensionSystem*>(
51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionSystem::Get(profile.get()))->
51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateExtensionService(
51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          command_line.get(),
52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          install_dir,
52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false);
52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(service->extensions_enabled());
52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->Init();
5204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(recorder.ready());
52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  recorder.set_ready(false);
52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.reset(new TestingProfile());
52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(prefs::kDisableExtensions, true);
52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service = static_cast<extensions::TestExtensionSystem*>(
52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionSystem::Get(profile.get()))->
52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateExtensionService(
52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          command_line.get(),
52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          install_dir,
52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false);
52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(service->extensions_enabled());
52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->Init();
5218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(recorder.ready());
52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  recorder.set_ready(false);
52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.reset(new TestingProfile());
52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->GetPrefs()->SetBoolean(prefs::kDisableExtensions, true);
52245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line.reset(new CommandLine(CommandLine::NO_PROGRAM));
52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service = static_cast<extensions::TestExtensionSystem*>(
52265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionSystem::Get(profile.get()))->
52275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateExtensionService(
52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          command_line.get(),
52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          install_dir,
52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false);
52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(service->extensions_enabled());
52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->Init();
5233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
52345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(recorder.ready());
52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Explicitly delete all the resources used in this test.
52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.reset();
52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service = NULL;
52395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Execute any pending deletion tasks.
5240ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test loading extensions that require limited and unlimited storage quotas.
52442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, StorageQuota) {
52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath extensions_path = data_dir().AppendASCII("storage_quota");
52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath limited_quota_ext =
52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions_path.AppendASCII("limited_quota")
52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .AppendASCII("1.0");
52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The old permission name for unlimited quota was "unlimited_storage", but
52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we changed it to "unlimitedStorage". This tests both versions.
52552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath unlimited_quota_ext =
52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions_path.AppendASCII("unlimited_quota")
52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .AppendASCII("1.0");
52582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath unlimited_quota_ext2 =
52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions_path.AppendASCII("unlimited_quota")
52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .AppendASCII("2.0");
5261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(limited_quota_ext);
5262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(unlimited_quota_ext);
5263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::UnpackedInstaller::Create(service())->Load(unlimited_quota_ext2);
5264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
52655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, loaded_.size());
5267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(profile());
5268f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(profile()->IsOffTheRecord());
5269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(
5270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
5271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          loaded_[0]->url()));
5272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loaded_[1]->url()));
5274f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loaded_[2]->url()));
52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests ComponentLoader::Add().
52792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ComponentExtensions) {
52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Component extensions should work even when extensions are disabled.
5283f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(false);
52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir()
5286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            .AppendASCII("good")
5287f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            .AppendASCII("Extensions")
5288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
5289f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            .AppendASCII("1.0.0.0");
52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string manifest;
529258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(base::ReadFileToString(
52932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      path.Append(extensions::kManifestFilename), &manifest));
52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->component_loader()->Add(manifest, path);
5296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that we do not pump messages -- the extension should be loaded
52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // immediately.
53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, loaded_.size());
53032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::COMPONENT, loaded_[0]->location());
5304f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Component extensions get a prefs entry on first install.
53072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValidatePrefKeyCount(1);
53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reload all extensions, and make sure it comes back.
5310f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string extension_id = (*registry()->enabled_extensions().begin())->id();
53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loaded_.clear();
5312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->ReloadExtensionsForTest();
5313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
5314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(extension_id, (*registry()->enabled_extensions().begin())->id());
53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53177dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(ExtensionServiceTest, DeferredSyncStartupPreInstalledComponent) {
53187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  InitializeEmptyExtensionService();
53191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
53207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
53217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool flare_was_called = false;
53227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  syncer::ModelType triggered_type(syncer::UNSPECIFIED);
53237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::WeakPtrFactory<ExtensionServiceTest> factory(this);
5324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->SetSyncStartFlare(
53257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&ExtensionServiceTest::MockSyncStartFlare,
53267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 factory.GetWeakPtr(),
53277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 &flare_was_called,  // Safe due to WeakPtrFactory scope.
53287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 &triggered_type));  // Safe due to WeakPtrFactory scope.
53297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
53307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Install a component extension.
53317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string manifest;
533258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(base::ReadFileToString(
533368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      good0_path().Append(extensions::kManifestFilename), &manifest));
5334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->component_loader()->Add(manifest, good0_path());
5335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(service()->is_ready());
5336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
5337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(service()->is_ready());
53387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
53397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Extensions added before service is_ready() don't trigger sync startup.
53407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(flare_was_called);
53417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(syncer::UNSPECIFIED, triggered_type);
53427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
53437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
53447dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(ExtensionServiceTest, DeferredSyncStartupPreInstalledNormal) {
534568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  InitializeGoodInstalledExtensionService();
53461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
53477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
53487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool flare_was_called = false;
53497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  syncer::ModelType triggered_type(syncer::UNSPECIFIED);
53507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::WeakPtrFactory<ExtensionServiceTest> factory(this);
5351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->SetSyncStartFlare(
53527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&ExtensionServiceTest::MockSyncStartFlare,
53537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 factory.GetWeakPtr(),
53547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 &flare_was_called,  // Safe due to WeakPtrFactory scope.
53557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 &triggered_type));  // Safe due to WeakPtrFactory scope.
53567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5357f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(service()->is_ready());
5358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
535968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_EQ(3u, loaded_.size());
5360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(service()->is_ready());
53617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
53627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Extensions added before service is_ready() don't trigger sync startup.
53637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(flare_was_called);
53647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(syncer::UNSPECIFIED, triggered_type);
53657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
53667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
53677dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(ExtensionServiceTest, DeferredSyncStartupOnInstall) {
53687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  InitializeEmptyExtensionService();
53691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
5370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
5371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(service()->is_ready());
53727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
53737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool flare_was_called = false;
53747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  syncer::ModelType triggered_type(syncer::UNSPECIFIED);
53757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::WeakPtrFactory<ExtensionServiceTest> factory(this);
5376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->SetSyncStartFlare(
53777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&ExtensionServiceTest::MockSyncStartFlare,
53787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 factory.GetWeakPtr(),
53797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 &flare_was_called,  // Safe due to WeakPtrFactory scope.
53807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 &triggered_type));  // Safe due to WeakPtrFactory scope.
53817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5382f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
53837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  InstallCRX(path, INSTALL_NEW);
53847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
53857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(flare_was_called);
53867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(syncer::EXTENSIONS, triggered_type);
53877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
53887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Reset.
53897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  flare_was_called = false;
53907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  triggered_type = syncer::UNSPECIFIED;
53917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
53927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Once sync starts, flare should no longer be invoked.
5393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::EXTENSIONS,
5395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::SyncDataList(),
5396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
53987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  path = data_dir().AppendASCII("page_action.crx");
54007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  InstallCRX(path, INSTALL_NEW);
54017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(flare_was_called);
54027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(syncer::UNSPECIFIED, triggered_type);
54037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
54047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ExtensionServiceTest, DisableExtensionFromSync) {
5406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Start the extensions service with one external extension already installed.
5407f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath source_install_dir =
5408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("good").AppendASCII("Extensions");
54095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FilePath pref_path =
54105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_install_dir.DirName().Append(chrome::kPreferencesFilename);
5411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InitializeInstalledExtensionService(pref_path, source_install_dir);
5413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InitializeExtensionSyncService();
5414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The user has enabled sync.
5416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ProfileSyncService* sync_service =
5417f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ProfileSyncServiceFactory::GetForProfile(profile());
5418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  sync_service->SetSyncSetupCompleted();
5419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
5421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(service()->is_ready());
5422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(3u, loaded_.size());
5424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // We start enabled.
5426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetExtensionById(good0, true);
5427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(extension);
5428f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(service()->IsExtensionEnabled(good0));
5429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  extensions::ExtensionSyncData disable_good_crx(
5430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      *extension, false, false, false);
5431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Then sync data arrives telling us to disable |good0|.
5433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  syncer::SyncDataList sync_data;
5434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  sync_data.push_back(disable_good_crx.GetSyncData());
5435f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::EXTENSIONS,
5437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sync_data,
5438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
5440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5441f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(service()->IsExtensionEnabled(good0));
5442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
5443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ExtensionServiceTest, DontDisableExtensionWithPendingEnableFromSync) {
5445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Start the extensions service with one external extension already installed.
5446f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath source_install_dir =
5447f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("good").AppendASCII("Extensions");
54485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FilePath pref_path =
54495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_install_dir.DirName().Append(chrome::kPreferencesFilename);
5450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InitializeInstalledExtensionService(pref_path, source_install_dir);
5452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InitializeExtensionSyncService();
5453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The user has enabled sync.
5455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ProfileSyncService* sync_service =
5456f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ProfileSyncServiceFactory::GetForProfile(profile());
5457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  sync_service->SetSyncSetupCompleted();
5458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5459f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Init();
5460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(service()->is_ready());
5461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(3u, loaded_.size());
5462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetExtensionById(good0, true);
5464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(service()->IsExtensionEnabled(good0));
5465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Disable extension before first sync data arrives.
5467f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->DisableExtension(good0, Extension::DISABLE_USER_ACTION);
5468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_FALSE(service()->IsExtensionEnabled(good0));
5469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Enable extension - this is now the most recent state.
5471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->EnableExtension(good0);
5472f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(service()->IsExtensionEnabled(good0));
5473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Now sync data comes in that says to disable good0. This should be
5475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // ignored.
5476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  extensions::ExtensionSyncData disable_good_crx(
5477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      *extension, false, false, false);
5478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  syncer::SyncDataList sync_data;
5479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  sync_data.push_back(disable_good_crx.GetSyncData());
5480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::EXTENSIONS,
5482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sync_data,
5483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
5485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The extension was enabled locally before the sync data arrived, so it
5488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // should still be enabled now.
5489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(service()->IsExtensionEnabled(good0));
5490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
5491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
54922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GetSyncData) {
54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
54941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
5495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
5496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetInstalledExtension(good_crx);
54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::EXTENSIONS,
5501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::SyncDataList(),
5502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5506f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  syncer::SyncDataList list =
5507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(list.size(), 1U);
55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionSyncData data(list[0]);
55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(extension->id(), data.id());
55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(data.uninstalled());
5512f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(service()->IsExtensionEnabled(good_crx), data.enabled());
5513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(extensions::util::IsIncognitoEnabled(good_crx, profile()),
55148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            data.incognito_enabled());
55155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(data.version().Equals(*extension->version()));
55162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(extensions::ManifestURL::GetUpdateURL(extension),
55172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            data.update_url());
55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(extension->name(), data.name());
55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GetSyncDataTerminated) {
55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
55231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
5524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TerminateExtension(good_crx);
5526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetInstalledExtension(good_crx);
55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  syncer::FakeSyncChangeProcessor processor;
5530f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::EXTENSIONS,
5532a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::SyncDataList(),
5533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5537f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  syncer::SyncDataList list =
5538f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(list.size(), 1U);
55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionSyncData data(list[0]);
55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(extension->id(), data.id());
55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(data.uninstalled());
5543f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(service()->IsExtensionEnabled(good_crx), data.enabled());
5544f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(extensions::util::IsIncognitoEnabled(good_crx, profile()),
55458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            data.incognito_enabled());
55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(data.version().Equals(*extension->version()));
55472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(extensions::ManifestURL::GetUpdateURL(extension),
55482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            data.update_url());
55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(extension->name(), data.name());
55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GetSyncDataFilter) {
55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
55541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
5555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
5556f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetInstalledExtension(good_crx);
55575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  syncer::FakeSyncChangeProcessor processor;
5560f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::APPS,
55621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      syncer::SyncDataList(),
5563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5567f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  syncer::SyncDataList list =
5568f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(list.size(), 0U);
55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GetSyncExtensionDataUserSettings) {
55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
5574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InitializeProcessManager();
55751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
5576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
5577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetInstalledExtension(good_crx);
55785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  syncer::FakeSyncChangeProcessor processor;
5581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::EXTENSIONS,
5583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::SyncDataList(),
5584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    syncer::SyncDataList list =
5590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(list.size(), 1U);
55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::ExtensionSyncData data(list[0]);
5593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(data.enabled());
5594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(data.incognito_enabled());
5595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
5596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION);
5598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
5599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    syncer::SyncDataList list =
5600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
5601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_EQ(list.size(), 1U);
5602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extensions::ExtensionSyncData data(list[0]);
5603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(data.enabled());
56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(data.incognito_enabled());
56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5607f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extensions::util::SetIsIncognitoEnabled(good_crx, profile(), true);
56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5609f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    syncer::SyncDataList list =
5610f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(list.size(), 1U);
56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::ExtensionSyncData data(list[0]);
5613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(data.enabled());
5614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(data.incognito_enabled());
5615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
5616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->EnableExtension(good_crx);
5618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
5619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    syncer::SyncDataList list =
5620f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
5621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_EQ(list.size(), 1U);
5622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extensions::ExtensionSyncData data(list[0]);
5623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(data.enabled());
56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(data.incognito_enabled());
56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, SyncForUninstalledExternalExtension) {
56295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
56301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
5631f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRXWithLocation(
5632f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      data_dir().AppendASCII("good.crx"), Manifest::EXTERNAL_PREF, INSTALL_NEW);
5633f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension = service()->GetInstalledExtension(good_crx);
56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5636a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  syncer::FakeSyncChangeProcessor processor;
5637f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::EXTENSIONS,
5639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::SyncDataList(),
5640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(good_crx, false);
5645f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(
5646f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ExtensionPrefs::Get(profile())->IsExternalExtensionUninstalled(good_crx));
56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::EntitySpecifics specifics;
56495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::AppSpecifics* app_specifics = specifics.mutable_app();
56505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::ExtensionSpecifics* extension_specifics =
56515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_specifics->mutable_extension();
56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_specifics->set_id(good_crx);
56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_specifics->set_version("1.0");
5654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  extension_specifics->set_enabled(true);
56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncData sync_data =
56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncChange sync_change(FROM_HERE,
56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 syncer::SyncChange::ACTION_UPDATE,
56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 sync_data);
56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncChangeList list(1);
56625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list[0] = sync_change;
56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5664f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5665f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(
5666f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ExtensionPrefs::Get(profile())->IsExternalExtensionUninstalled(good_crx));
56675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GetSyncAppDataUserSettings) {
56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
56711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
56725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* app =
5673f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      PackAndInstallCRX(data_dir().AppendASCII("app"), INSTALL_NEW);
56745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(app);
56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(app->is_app());
56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  syncer::FakeSyncChangeProcessor processor;
5678f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::APPS,
56801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      syncer::SyncDataList(),
5681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::StringOrdinal initial_ordinal =
56865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::StringOrdinal::CreateInitialOrdinal();
56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5688f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    syncer::SyncDataList list =
5689f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        extension_sync_service()->GetAllSyncData(syncer::APPS);
56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(list.size(), 1U);
56915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::AppSyncData app_sync_data(list[0]);
56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(initial_ordinal.Equals(app_sync_data.app_launch_ordinal()));
56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(initial_ordinal.Equals(app_sync_data.page_ordinal()));
56955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5697f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AppSorting* sorting = ExtensionPrefs::Get(profile())->app_sorting();
56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sorting->SetAppLaunchOrdinal(app->id(), initial_ordinal.CreateAfter());
56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5700f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    syncer::SyncDataList list =
5701f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        extension_sync_service()->GetAllSyncData(syncer::APPS);
57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(list.size(), 1U);
57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::AppSyncData app_sync_data(list[0]);
57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(initial_ordinal.LessThan(app_sync_data.app_launch_ordinal()));
57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(initial_ordinal.Equals(app_sync_data.page_ordinal()));
57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sorting->SetPageOrdinal(app->id(), initial_ordinal.CreateAfter());
57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5711f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    syncer::SyncDataList list =
5712f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        extension_sync_service()->GetAllSyncData(syncer::APPS);
57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(list.size(), 1U);
57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::AppSyncData app_sync_data(list[0]);
57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(initial_ordinal.LessThan(app_sync_data.app_launch_ordinal()));
57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(initial_ordinal.LessThan(app_sync_data.page_ordinal()));
57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
572123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// TODO (rdevlin.cronin): The OnExtensionMoved() method has been removed from
572223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// ExtensionService, so this test probably needs a new home. Unfortunately, it
572323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// relies pretty heavily on things like InitializeExtension[Sync]Service() and
572423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// PackAndInstallCRX(). When we clean up a bit more, this should move out.
57252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GetSyncAppDataUserSettingsOnExtensionMoved) {
57265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
57271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kAppCount = 3;
57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* apps[kAppCount];
5730f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  apps[0] = PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW);
5731f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  apps[1] = PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW);
5732f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  apps[2] = PackAndInstallCRX(data_dir().AppendASCII("app4"), INSTALL_NEW);
57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < kAppCount; ++i) {
57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(apps[i]);
57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(apps[i]->is_app());
57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  syncer::FakeSyncChangeProcessor processor;
5739f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5740a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::APPS,
57411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      syncer::SyncDataList(),
5742a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5743a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5746f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionPrefs::Get(service()->GetBrowserContext())
574723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      ->app_sorting()
574823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      ->OnExtensionMoved(apps[0]->id(), apps[1]->id(), apps[2]->id());
57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5750f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    syncer::SyncDataList list =
5751f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        extension_sync_service()->GetAllSyncData(syncer::APPS);
57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(list.size(), 3U);
57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::AppSyncData data[kAppCount];
57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < kAppCount; ++i) {
57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data[i] = extensions::AppSyncData(list[i]);
57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The sync data is not always in the same order our apps were installed in,
57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // so we do that sorting here so we can make sure the values are changed as
57615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // expected.
57625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::StringOrdinal app_launch_ordinals[kAppCount];
57635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < kAppCount; ++i) {
57645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (size_t j = 0; j < kAppCount; ++j) {
57655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (apps[i]->id() == data[j].id())
57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          app_launch_ordinals[i] = data[j].app_launch_ordinal();
57675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
57685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
57695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(app_launch_ordinals[1].LessThan(app_launch_ordinals[0]));
57715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(app_launch_ordinals[0].LessThan(app_launch_ordinals[2]));
57725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GetSyncDataList) {
57765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
57771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
5778f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
5779f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("page_action.crx"), INSTALL_NEW);
5780f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("theme.crx"), INSTALL_NEW);
5781f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("theme2.crx"), INSTALL_NEW);
57825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  syncer::FakeSyncChangeProcessor processor;
5784f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5785a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::APPS,
5786a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::SyncDataList(),
5787a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
57895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5790f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::EXTENSIONS,
5792a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::SyncDataList(),
5793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
57965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5797f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->DisableExtension(page_action, Extension::DISABLE_USER_ACTION);
57985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TerminateExtension(theme2_crx);
57995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5800f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, extension_sync_service()->GetAllSyncData(syncer::APPS).size());
5801f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(
5802f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      2u, extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS).size());
58035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ProcessSyncDataUninstall) {
58065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
58071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
5808a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  syncer::FakeSyncChangeProcessor processor;
5809f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::EXTENSIONS,
5811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::SyncDataList(),
5812a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5813a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
58145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
58155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::EntitySpecifics specifics;
58175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension();
58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ext_specifics->set_id(good_crx);
58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ext_specifics->set_version("1.0");
58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncData sync_data =
58215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncChange sync_change(FROM_HERE,
58235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 syncer::SyncChange::ACTION_DELETE,
58245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 sync_data);
58255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncChangeList list(1);
58265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list[0] = sync_change;
58275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should do nothing.
5829f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5830f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->GetExtensionById(good_crx, true));
58315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install the extension.
5833f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath extension_path = data_dir().AppendASCII("good.crx");
58345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(extension_path, INSTALL_NEW);
5835f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good_crx, true));
58365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should uninstall the extension.
5838f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5839f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->GetExtensionById(good_crx, true));
58405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should again do nothing.
5842f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5843f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->GetExtensionById(good_crx, true));
58445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ProcessSyncDataWrongType) {
58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
58481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
58495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install the extension.
5851f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath extension_path = data_dir().AppendASCII("good.crx");
58525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(extension_path, INSTALL_NEW);
5853f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetExtensionById(good_crx, true));
58545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::EntitySpecifics specifics;
58565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::AppSpecifics* app_specifics = specifics.mutable_app();
58575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::ExtensionSpecifics* extension_specifics =
58585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_specifics->mutable_extension();
58595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_specifics->set_id(good_crx);
58605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_specifics->set_version(
5861f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->GetInstalledExtension(good_crx)->version()->GetString());
58625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5864f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extension_specifics->set_enabled(true);
58655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncData sync_data =
58665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
58675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChange sync_change(FROM_HERE,
58685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   syncer::SyncChange::ACTION_DELETE,
58695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   sync_data);
58705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChangeList list(1);
58715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list[0] = sync_change;
58725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should do nothing
5874f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5875f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(service()->GetExtensionById(good_crx, true));
58765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
58775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5879f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extension_specifics->set_enabled(false);
58805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncData sync_data =
58815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
58825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChange sync_change(FROM_HERE,
58835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   syncer::SyncChange::ACTION_UPDATE,
58845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   sync_data);
58855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChangeList list(1);
58865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list[0] = sync_change;
58875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should again do nothing.
5889f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5890f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
58915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
58925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ProcessSyncDataSettings) {
58955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
5896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InitializeProcessManager();
58971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
5898a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  syncer::FakeSyncChangeProcessor processor;
5899f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5900a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::EXTENSIONS,
5901a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::SyncDataList(),
5902a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5903a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
59045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
59055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5906f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
5907f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->IsExtensionEnabled(good_crx));
5908f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
59095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::EntitySpecifics specifics;
59115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension();
59125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ext_specifics->set_id(good_crx);
59135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ext_specifics->set_version(
5914f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->GetInstalledExtension(good_crx)->version()->GetString());
5915f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ext_specifics->set_enabled(false);
59165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
59185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncData sync_data =
59195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
59205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChange sync_change(FROM_HERE,
59215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   syncer::SyncChange::ACTION_UPDATE,
59225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   sync_data);
59235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChangeList list(1);
59245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list[0] = sync_change;
5925f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5926f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_FALSE(service()->IsExtensionEnabled(good_crx));
5927f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
59285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
59295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ext_specifics->set_enabled(true);
59325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext_specifics->set_incognito_enabled(true);
59335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncData sync_data =
59345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
59355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChange sync_change(FROM_HERE,
59365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   syncer::SyncChange::ACTION_UPDATE,
59375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   sync_data);
59385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChangeList list(1);
59395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list[0] = sync_change;
5940f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5941f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(service()->IsExtensionEnabled(good_crx));
5942f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
59435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
59445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
5946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ext_specifics->set_enabled(false);
5947f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ext_specifics->set_incognito_enabled(true);
5948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    syncer::SyncData sync_data =
5949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
5950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    syncer::SyncChange sync_change(FROM_HERE,
5951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   syncer::SyncChange::ACTION_UPDATE,
5952f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   sync_data);
5953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    syncer::SyncChangeList list(1);
5954f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    list[0] = sync_change;
5955f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5956f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_FALSE(service()->IsExtensionEnabled(good_crx));
5957f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
5958f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
5959f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5960f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx));
59615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ProcessSyncDataTerminatedExtension) {
59645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeExtensionServiceWithUpdater();
59651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
5966a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  syncer::FakeSyncChangeProcessor processor;
5967f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
5968a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::EXTENSIONS,
5969a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::SyncDataList(),
5970a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
5971a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
59725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
59735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5974f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
59755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TerminateExtension(good_crx);
5976f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->IsExtensionEnabled(good_crx));
5977f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
59785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::EntitySpecifics specifics;
59805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension();
59815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ext_specifics->set_id(good_crx);
59825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ext_specifics->set_version(
5983f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->GetInstalledExtension(good_crx)->version()->GetString());
5984f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ext_specifics->set_enabled(false);
59855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ext_specifics->set_incognito_enabled(true);
59865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncData sync_data =
59875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
59885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncChange sync_change(FROM_HERE,
59895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 syncer::SyncChange::ACTION_UPDATE,
59905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 sync_data);
59915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncChangeList list(1);
59925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list[0] = sync_change;
59935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5994f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5995f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(good_crx));
5996f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
59975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5998f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx));
59995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
60005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ProcessSyncDataVersionCheck) {
60025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeExtensionServiceWithUpdater();
60031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
6004a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  syncer::FakeSyncChangeProcessor processor;
6005f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
6006a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::EXTENSIONS,
6007a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::SyncDataList(),
6008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
6009a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
60105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
60115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6012f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
6013f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->IsExtensionEnabled(good_crx));
6014f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
60155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::EntitySpecifics specifics;
60175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension();
60185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ext_specifics->set_id(good_crx);
6019f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ext_specifics->set_enabled(true);
60205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
60225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext_specifics->set_version(
6023f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        service()->GetInstalledExtension(good_crx)->version()->GetString());
60245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncData sync_data =
60255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
60265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChange sync_change(FROM_HERE,
60275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   syncer::SyncChange::ACTION_UPDATE,
60285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   sync_data);
60295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChangeList list(1);
60305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list[0] = sync_change;
60315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should do nothing if extension version == sync version.
6033f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
6034f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_FALSE(service()->updater()->WillCheckSoon());
60355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
60365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should do nothing if extension version > sync version (but see
60385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the TODO in ProcessExtensionSyncData).
60395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
60405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext_specifics->set_version("0.0.0.0");
60415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncData sync_data =
60425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
60435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChange sync_change(FROM_HERE,
60445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   syncer::SyncChange::ACTION_UPDATE,
60455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   sync_data);
60465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChangeList list(1);
60475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list[0] = sync_change;
60485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6049f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
6050f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_FALSE(service()->updater()->WillCheckSoon());
60515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
60525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should kick off an update if extension version < sync version.
60545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
60555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext_specifics->set_version("9.9.9.9");
60565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncData sync_data =
60575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
60585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChange sync_change(FROM_HERE,
60595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   syncer::SyncChange::ACTION_UPDATE,
60605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   sync_data);
60615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChangeList list(1);
60625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list[0] = sync_change;
60635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6064f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
6065f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(service()->updater()->WillCheckSoon());
60665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
60675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6068f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx));
60695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
60705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ProcessSyncDataNotInstalled) {
60725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeExtensionServiceWithUpdater();
60731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InitializeExtensionSyncService();
6074a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  syncer::FakeSyncChangeProcessor processor;
6075f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
6076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::EXTENSIONS,
6077a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::SyncDataList(),
6078a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
6079a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
60805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
60815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::EntitySpecifics specifics;
60835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension();
60845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ext_specifics->set_id(good_crx);
6085f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ext_specifics->set_enabled(false);
60865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ext_specifics->set_incognito_enabled(true);
60875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ext_specifics->set_update_url("http://www.google.com/");
60885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ext_specifics->set_version("1.2.3.4");
60895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncData sync_data =
60905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
60915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncChange sync_change(FROM_HERE,
60925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 syncer::SyncChange::ACTION_UPDATE,
60935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 sync_data);
60945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncChangeList list(1);
60955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list[0] = sync_change;
60965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6097f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->IsExtensionEnabled(good_crx));
6098f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
6099f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
6100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->updater()->WillCheckSoon());
6101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(good_crx));
6102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
61035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::PendingExtensionInfo* info;
6105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(
6106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      (info = service()->pending_extension_manager()->GetById(good_crx)));
61075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ext_specifics->update_url(), info->update_url().spec());
61085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(info->is_from_sync());
61095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(info->install_silently());
61102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::INTERNAL, info->install_source());
61115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(akalin): Figure out a way to test |info.ShouldAllowInstall()|.
61125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
61135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ExtensionServiceTest, SupervisedUser_InstallOnlyAllowedByCustodian) {
61155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExtensionServiceInitParams params = CreateDefaultInitParams();
61165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  params.profile_is_supervised = true;
61175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeExtensionService(params);
61185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SupervisedUserService* supervised_user_service =
61205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      SupervisedUserServiceFactory::GetForProfile(profile());
61215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GetManagementPolicy()->RegisterProvider(supervised_user_service);
61225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::FilePath path1 = data_dir().AppendASCII("good.crx");
61245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::FilePath path2 = data_dir().AppendASCII("good2048.crx");
61255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const Extension* extensions[] = {
61265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    InstallCRX(path1, INSTALL_FAILED),
61275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN)
61285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
61295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Only the extension with the "installed by custodian" flag should have been
61315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // installed and enabled.
61325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(extensions[0]);
61335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(extensions[1]);
61345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(registry()->enabled_extensions().Contains(extensions[1]->id()));
61355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
61365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ExtensionServiceTest, SupervisedUser_UpdateWithoutPermissionIncrease) {
61385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExtensionServiceInitParams params = CreateDefaultInitParams();
61395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  params.profile_is_supervised = true;
61405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeExtensionService(params);
61415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SupervisedUserService* supervised_user_service =
61435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      SupervisedUserServiceFactory::GetForProfile(profile());
61445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GetManagementPolicy()->RegisterProvider(supervised_user_service);
61455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::FilePath base_path = data_dir().AppendASCII("autoupdate");
61475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::FilePath pem_path = base_path.AppendASCII("key.pem");
61485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::FilePath path = base_path.AppendASCII("v1");
61505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const Extension* extension =
61515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      PackAndInstallCRX(path, pem_path, INSTALL_NEW,
61525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        Extension::WAS_INSTALLED_BY_CUSTODIAN);
61535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The extension must now be installed and enabled.
61545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(extension);
61555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(registry()->enabled_extensions().Contains(extension->id()));
61565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Save the id, as the extension object will be destroyed during updating.
61585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string id = extension->id();
61595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string old_version = extension->VersionString();
61615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Update to a new version.
61635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  path = base_path.AppendASCII("v2");
61645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PackCRXAndUpdateExtension(id, path, pem_path, ENABLED);
61655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The extension should still be there and enabled.
61675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  extension = registry()->enabled_extensions().GetByID(id);
61685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(extension);
61695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The version should have changed.
61705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_NE(extension->VersionString(), old_version);
61715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
61725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ExtensionServiceTest, SupervisedUser_UpdateWithPermissionIncrease) {
61745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExtensionServiceInitParams params = CreateDefaultInitParams();
61755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  params.profile_is_supervised = true;
61765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeExtensionService(params);
61775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SupervisedUserService* supervised_user_service =
61795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      SupervisedUserServiceFactory::GetForProfile(profile());
61805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GetManagementPolicy()->RegisterProvider(supervised_user_service);
61815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::FilePath base_path = data_dir().AppendASCII("permissions_increase");
61835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::FilePath pem_path = base_path.AppendASCII("permissions.pem");
61845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::FilePath path = base_path.AppendASCII("v1");
61865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const Extension* extension =
61875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      PackAndInstallCRX(path, pem_path, INSTALL_NEW,
61885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        Extension::WAS_INSTALLED_BY_CUSTODIAN);
61895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The extension must now be installed and enabled.
61905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(extension);
61915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(registry()->enabled_extensions().Contains(extension->id()));
61925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Save the id, as the extension object will be destroyed during updating.
61945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string id = extension->id();
61955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string old_version = extension->VersionString();
61975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
61985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Update to a new version with increased permissions.
61995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  path = base_path.AppendASCII("v2");
62005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PackCRXAndUpdateExtension(id, path, pem_path, DISABLED);
62015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
62025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The extension should still be there, but disabled.
62035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(registry()->enabled_extensions().Contains(id));
62045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  extension = registry()->disabled_extensions().GetByID(id);
62055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(extension);
62065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The version should have changed.
62075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_NE(extension->VersionString(), old_version);
62085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
62095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
62105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ExtensionServiceTest,
62115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       SupervisedUser_SyncUninstallByCustodianSkipsPolicy) {
62125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeEmptyExtensionService();
62135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitializeExtensionSyncService();
62145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  extension_sync_service()->MergeDataAndStartSyncing(
62155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      syncer::EXTENSIONS,
62165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      syncer::SyncDataList(),
62175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      scoped_ptr<syncer::SyncChangeProcessor>(
62185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          new syncer::FakeSyncChangeProcessor),
62195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
62205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
62215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Install two extensions.
62225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::FilePath path1 = data_dir().AppendASCII("good.crx");
62235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::FilePath path2 = data_dir().AppendASCII("good2048.crx");
62245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const Extension* extensions[] = {
62255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    InstallCRX(path1, INSTALL_NEW),
62265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN)
62275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
62285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
62295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Add a policy provider that will disallow any changes.
62305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  extensions::TestManagementPolicyProvider provider(
62315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS);
62325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GetManagementPolicy()->RegisterProvider(&provider);
62335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
62345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Create a sync deletion for each extension.
62355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  syncer::SyncChangeList change_list;
62365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (size_t i = 0; i < arraysize(extensions); i++) {
62375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& id = extensions[i]->id();
62385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    sync_pb::EntitySpecifics specifics;
62395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension();
62405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ext_specifics->set_id(id);
62415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ext_specifics->set_version("1.0");
62425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ext_specifics->set_installed_by_custodian(
62435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions[i]->was_installed_by_custodian());
62445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    syncer::SyncData sync_data =
62455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        syncer::SyncData::CreateLocalData(id, "Name", specifics);
62465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_list.push_back(syncer::SyncChange(FROM_HERE,
62475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             syncer::SyncChange::ACTION_DELETE,
62485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             sync_data));
62495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
62505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
62515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Save the extension ids, as uninstalling destroys the Extension instance.
62525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string extension_ids[] = {
62535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    extensions[0]->id(),
62545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    extensions[1]->id()
62555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
62565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
62575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Now apply the uninstallations.
62585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  extension_sync_service()->ProcessSyncChanges(FROM_HERE, change_list);
62595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
62605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Uninstalling the extension without installed_by_custodian should have been
62615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // blocked by policy, so it should still be there.
62625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_ids[0]));
62635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
62645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // But installed_by_custodian should result in bypassing the policy check.
62655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(
62665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      registry()->GenerateInstalledExtensionsSet()->Contains(extension_ids[1]));
62675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
62685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
62692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallPriorityExternalUpdateUrl) {
62705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
62715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
62735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_NEW);
62745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(1u);
62755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
62762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL);
62775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::PendingExtensionManager* pending =
6279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->pending_extension_manager();
62805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pending->IsIdPending(kGoodId));
62815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Skip install when the location is the same.
6283f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(
6284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->OnExternalExtensionUpdateUrlFound(kGoodId,
6285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   std::string(),
6286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   GURL(kGoodUpdateURL),
6287f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   Manifest::INTERNAL,
6288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   Extension::NO_FLAGS,
6289f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   false));
62905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pending->IsIdPending(kGoodId));
62915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install when the location has higher priority.
6293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->OnExternalExtensionUpdateUrlFound(
6294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      kGoodId,
6295effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      std::string(),
6296effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GURL(kGoodUpdateURL),
6297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Manifest::EXTERNAL_POLICY_DOWNLOAD,
6298effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Extension::NO_FLAGS,
6299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      false));
63005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pending->IsIdPending(kGoodId));
63015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try the low priority again.  Should be rejected.
6303f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->OnExternalExtensionUpdateUrlFound(
6304effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      kGoodId,
6305effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      std::string(),
6306effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GURL(kGoodUpdateURL),
6307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Manifest::EXTERNAL_PREF_DOWNLOAD,
6308effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Extension::NO_FLAGS,
6309effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      false));
63105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The existing record should still be present in the pending extension
63115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // manager.
63125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pending->IsIdPending(kGoodId));
63135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending->Remove(kGoodId);
63155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Skip install when the location has the same priority as the installed
63175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // location.
6318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(
6319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->OnExternalExtensionUpdateUrlFound(kGoodId,
6320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   std::string(),
6321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   GURL(kGoodUpdateURL),
6322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   Manifest::INTERNAL,
6323f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   Extension::NO_FLAGS,
6324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   false));
63255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pending->IsIdPending(kGoodId));
63275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
63285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallPriorityExternalLocalFile) {
63305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version older_version("0.1.0.0");
63315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version newer_version("2.0.0.0");
63325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't want the extension to be installed.  A path that doesn't
63345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // point to a valid CRX ensures this.
63352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath kInvalidPathToCrx = base::FilePath();
63365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kCreationFlags = 0;
63385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool kDontMarkAcknowledged = false;
63395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
63415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The test below uses install source constants to test that
63435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // priority is enforced.  It assumes a specific ranking of install
63445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sources: Registry (EXTERNAL_REGISTRY) overrides external pref
63455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (EXTERNAL_PREF), and external pref overrides user install (INTERNAL).
63465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following assertions verify these assumptions:
63472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(Manifest::EXTERNAL_REGISTRY,
63482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            Manifest::GetHigherPriorityLocation(Manifest::EXTERNAL_REGISTRY,
63492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 Manifest::EXTERNAL_PREF));
63502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(Manifest::EXTERNAL_REGISTRY,
63512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            Manifest::GetHigherPriorityLocation(Manifest::EXTERNAL_REGISTRY,
63522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 Manifest::INTERNAL));
63532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(Manifest::EXTERNAL_PREF,
63542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            Manifest::GetHigherPriorityLocation(Manifest::EXTERNAL_PREF,
63552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 Manifest::INTERNAL));
63565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::PendingExtensionManager* pending =
6358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->pending_extension_manager();
63595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pending->IsIdPending(kGoodId));
63605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
6362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Simulate an external source adding the extension as INTERNAL.
6363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::WindowedNotificationObserver observer(
63645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::NotificationService::AllSources());
6366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
6367f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                        &older_version,
6368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                        kInvalidPathToCrx,
6369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                        Manifest::INTERNAL,
6370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                        kCreationFlags,
6371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                        kDontMarkAcknowledged));
6372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(pending->IsIdPending(kGoodId));
6373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    observer.Wait();
6374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED);
6375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
63765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
6378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Simulate an external source adding the extension as EXTERNAL_PREF.
6379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::WindowedNotificationObserver observer(
63805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::NotificationService::AllSources());
6382f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
6383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                        &older_version,
6384f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                        kInvalidPathToCrx,
6385f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                        Manifest::EXTERNAL_PREF,
6386f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                        kCreationFlags,
6387f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                        kDontMarkAcknowledged));
6388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(pending->IsIdPending(kGoodId));
6389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    observer.Wait();
6390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED);
6391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
63925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate an external source adding as EXTERNAL_PREF again.
63942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This is rejected because the version and the location are the same as
63952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the previous installation, which is still pending.
6396f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6397f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       &older_version,
6398f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kInvalidPathToCrx,
6399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       Manifest::EXTERNAL_PREF,
6400f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kCreationFlags,
6401f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kDontMarkAcknowledged));
64025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pending->IsIdPending(kGoodId));
64035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try INTERNAL again.  Should fail.
6405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       &older_version,
6407f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kInvalidPathToCrx,
6408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       Manifest::INTERNAL,
6409f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kCreationFlags,
6410f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kDontMarkAcknowledged));
64115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pending->IsIdPending(kGoodId));
64125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
6414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Now the registry adds the extension.
6415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::WindowedNotificationObserver observer(
64165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::NotificationService::AllSources());
6418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(
6419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        service()->OnExternalExtensionFileFound(kGoodId,
6420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                &older_version,
6421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                kInvalidPathToCrx,
6422f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                Manifest::EXTERNAL_REGISTRY,
6423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                kCreationFlags,
6424f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                kDontMarkAcknowledged));
6425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(pending->IsIdPending(kGoodId));
6426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    observer.Wait();
6427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED);
6428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
64295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registry outranks both external pref and internal, so both fail.
6431f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6432f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       &older_version,
6433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kInvalidPathToCrx,
6434f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       Manifest::EXTERNAL_PREF,
6435f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kCreationFlags,
6436f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kDontMarkAcknowledged));
64375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pending->IsIdPending(kGoodId));
64385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6439f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6440f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       &older_version,
6441f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kInvalidPathToCrx,
6442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       Manifest::INTERNAL,
6443f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kCreationFlags,
6444f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kDontMarkAcknowledged));
64455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pending->IsIdPending(kGoodId));
64465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending->Remove(kGoodId);
64485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install the extension.
6450f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
64515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* ext = InstallCRX(path, INSTALL_NEW);
64525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidatePrefKeyCount(1u);
64535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
64542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL);
64555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now test the logic of OnExternalExtensionFileFound() when the extension
64575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being added is already installed.
64585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests assume |older_version| is less than the installed version, and
64605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |newer_version| is greater.  Verify this:
64615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(older_version.IsOlderThan(ext->VersionString()));
64625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ext->version()->IsOlderThan(newer_version.GetString()));
64635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An external install for the same location should fail if the version is
64655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // older, or the same, and succeed if the version is newer.
64665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Older than the installed version...
6468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       &older_version,
6470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kInvalidPathToCrx,
6471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       Manifest::INTERNAL,
6472f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kCreationFlags,
6473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kDontMarkAcknowledged));
64745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pending->IsIdPending(kGoodId));
64755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same version as the installed version...
6477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       ext->version(),
6479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kInvalidPathToCrx,
6480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       Manifest::INTERNAL,
6481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kCreationFlags,
6482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kDontMarkAcknowledged));
64835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pending->IsIdPending(kGoodId));
64845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Newer than the installed version...
6486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
6487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      &newer_version,
6488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      kInvalidPathToCrx,
6489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      Manifest::INTERNAL,
6490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      kCreationFlags,
6491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      kDontMarkAcknowledged));
64925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pending->IsIdPending(kGoodId));
64935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An external install for a higher priority install source should succeed
64955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if the version is greater.  |older_version| is not...
6496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       &older_version,
6498f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kInvalidPathToCrx,
6499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       Manifest::EXTERNAL_PREF,
6500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kCreationFlags,
6501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kDontMarkAcknowledged));
65025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pending->IsIdPending(kGoodId));
65035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |newer_version| is newer.
6505f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
6506f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      &newer_version,
6507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      kInvalidPathToCrx,
6508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      Manifest::EXTERNAL_PREF,
6509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      kCreationFlags,
6510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      kDontMarkAcknowledged));
65115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pending->IsIdPending(kGoodId));
65125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An external install for an even higher priority install source should
65145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // succeed if the version is greater.
65155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
6516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->OnExternalExtensionFileFound(kGoodId,
6517f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              &newer_version,
6518f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              kInvalidPathToCrx,
6519f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              Manifest::EXTERNAL_REGISTRY,
6520f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              kCreationFlags,
6521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              kDontMarkAcknowledged));
65225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pending->IsIdPending(kGoodId));
65235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Because EXTERNAL_PREF is a lower priority source than EXTERNAL_REGISTRY,
65255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // adding from external pref will now fail.
6526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6527f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       &newer_version,
6528f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kInvalidPathToCrx,
6529f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       Manifest::EXTERNAL_PREF,
6530f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kCreationFlags,
6531f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kDontMarkAcknowledged));
65325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pending->IsIdPending(kGoodId));
65335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
65345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ConcurrentExternalLocalFile) {
65365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version kVersion123("1.2.3");
65375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version kVersion124("1.2.4");
65385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version kVersion125("1.2.5");
65392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath kInvalidPathToCrx = base::FilePath();
65405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kCreationFlags = 0;
65415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool kDontMarkAcknowledged = false;
65425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
65445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::PendingExtensionManager* pending =
6546f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->pending_extension_manager();
65475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pending->IsIdPending(kGoodId));
65485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An external provider starts installing from a local crx.
6550f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
6551f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      &kVersion123,
6552f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      kInvalidPathToCrx,
6553f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      Manifest::EXTERNAL_PREF,
6554f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      kCreationFlags,
6555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      kDontMarkAcknowledged));
65565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::PendingExtensionInfo* info;
65575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((info = pending->GetById(kGoodId)));
65585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(info->version().IsValid());
65595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(info->version().Equals(kVersion123));
65605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adding a newer version overrides the currently pending version.
6562f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
6563f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      &kVersion124,
6564f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      kInvalidPathToCrx,
6565f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      Manifest::EXTERNAL_PREF,
6566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      kCreationFlags,
6567f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                      kDontMarkAcknowledged));
65685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((info = pending->GetById(kGoodId)));
65695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(info->version().IsValid());
65705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(info->version().Equals(kVersion124));
65715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adding an older version fails.
6573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6574f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       &kVersion123,
6575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kInvalidPathToCrx,
6576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       Manifest::EXTERNAL_PREF,
6577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kCreationFlags,
6578f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       kDontMarkAcknowledged));
65795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((info = pending->GetById(kGoodId)));
65805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(info->version().IsValid());
65815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(info->version().Equals(kVersion124));
65825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adding an older version fails even when coming from a higher-priority
65845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // location.
65855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
6586f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->OnExternalExtensionFileFound(kGoodId,
6587f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              &kVersion123,
6588f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              kInvalidPathToCrx,
6589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              Manifest::EXTERNAL_REGISTRY,
6590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              kCreationFlags,
6591f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              kDontMarkAcknowledged));
65925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((info = pending->GetById(kGoodId)));
65935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(info->version().IsValid());
65945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(info->version().Equals(kVersion124));
65955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adding the latest version from the webstore overrides a specific version.
65975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL kUpdateUrl("http://example.com/update");
6598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->OnExternalExtensionUpdateUrlFound(
6599effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      kGoodId,
6600effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      std::string(),
6601effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      kUpdateUrl,
6602effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Manifest::EXTERNAL_POLICY_DOWNLOAD,
6603effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Extension::NO_FLAGS,
6604effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      false));
66055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((info = pending->GetById(kGoodId)));
66065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(info->version().IsValid());
66075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
66085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This makes sure we can package and install CRX files that use whitelisted
66105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permissions.
66112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallWhitelistedExtension) {
66125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string test_id = "hdkklepkcpckhnpgjnmbdfhehckloojk";
66135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitchASCII(
6614e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      extensions::switches::kWhitelistedExtensionID, test_id);
66155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
6617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("permissions");
66182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath pem_path = path
66195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .AppendASCII("whitelist.pem");
66205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path
66215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .AppendASCII("whitelist");
66225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = PackAndInstallCRX(path, pem_path, INSTALL_NEW);
66245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, GetErrors().size());
6625f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1u, registry()->enabled_extensions().size());
66265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(test_id, extension->id());
66275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
66285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when multiple sources try to install an extension,
66305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we consistently choose the right one. To make tests easy to read,
66315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// methods that fake requests to install crx files in several ways
66325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are provided.
66335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionSourcePriorityTest : public ExtensionServiceTest {
66345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
66352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
66365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionServiceTest::SetUp();
66375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // All tests use a single extension.  Put the id and path in member vars
66395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // that all methods can read.
66405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    crx_id_ = kGoodId;
6641f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    crx_path_ = data_dir().AppendASCII("good.crx");
66425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
66435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fake an external source adding a URL to fetch an extension from.
66455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddPendingExternalPrefUrl() {
6646f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return service()->pending_extension_manager()->AddFromExternalUpdateUrl(
6647effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        crx_id_,
6648effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        std::string(),
6649effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        GURL(),
6650effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        Manifest::EXTERNAL_PREF_DOWNLOAD,
6651effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        Extension::NO_FLAGS,
6652effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        false);
66535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
66545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fake an external file from external_extensions.json.
66565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddPendingExternalPrefFileInstall() {
66575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Version version("1.0.0.0");
66585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6659f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return service()->OnExternalExtensionFileFound(crx_id_,
6660f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   &version,
6661f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   crx_path_,
6662f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   Manifest::EXTERNAL_PREF,
6663f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   Extension::NO_FLAGS,
6664f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                   false);
66655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
66665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fake a request from sync to install an extension.
66685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddPendingSyncInstall() {
6669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return service()->pending_extension_manager()->AddFromSync(
6670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        crx_id_,
6671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        GURL(kGoodUpdateURL),
6672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        &IsExtension,
6673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        kGoodInstallSilently,
6674116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        kGoodRemoteInstall,
6675116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        kGoodInstalledByCustodian);
66765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
66775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fake a policy install.
66795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddPendingPolicyInstall() {
66805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get path to the CRX with id |kGoodId|.
6681f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return service()->OnExternalExtensionUpdateUrlFound(
6682effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        crx_id_,
6683effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        std::string(),
6684effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        GURL(),
6685effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        Manifest::EXTERNAL_POLICY_DOWNLOAD,
6686effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        Extension::NO_FLAGS,
6687effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        false);
66885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
66895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the install source of a pending extension.
66912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Manifest::Location GetPendingLocation() {
66925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const extensions::PendingExtensionInfo* info;
6693f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(
6694f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        (info = service()->pending_extension_manager()->GetById(crx_id_)));
66955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return info->install_source();
66965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
66975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Is an extension pending from a sync request?
66995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetPendingIsFromSync() {
67005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const extensions::PendingExtensionInfo* info;
6701f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(
6702f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        (info = service()->pending_extension_manager()->GetById(crx_id_)));
67035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return info->is_from_sync();
67045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
67055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Is the CRX id these tests use pending?
67075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsCrxPending() {
6708f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return service()->pending_extension_manager()->IsIdPending(crx_id_);
67095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
67105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Is an extension installed?
67125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsCrxInstalled() {
6713f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return (service()->GetExtensionById(crx_id_, true) != NULL);
67145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
67155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
67175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All tests use a single extension.  Making the id and path member
67185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // vars avoids pasing the same argument to every method.
67195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string crx_id_;
67202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath crx_path_;
67215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
67225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that a pending request for installation of an external CRX from
67245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an update URL overrides a pending request to install the same extension
67255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from sync.
67265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSourcePriorityTest, PendingExternalFileOverSync) {
67275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
67285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(IsCrxInstalled());
67305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install pending extension from sync.
6732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
67335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
67355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddPendingSyncInstall());
67362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(Manifest::INTERNAL, GetPendingLocation());
67375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetPendingIsFromSync());
67385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(IsCrxInstalled());
67395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install pending as external prefs json would.
67415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPendingExternalPrefFileInstall();
67422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(Manifest::EXTERNAL_PREF, GetPendingLocation());
67435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(IsCrxInstalled());
67445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Another request from sync should be ignored.
67465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(AddPendingSyncInstall());
67472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(Manifest::EXTERNAL_PREF, GetPendingLocation());
67485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(IsCrxInstalled());
67495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
6751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  VerifyCrxInstall(crx_path_, INSTALL_NEW);
67525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(IsCrxInstalled());
67535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
67545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that an install of an external CRX from an update overrides
67565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an install of the same extension from sync.
67575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSourcePriorityTest, PendingExternalUrlOverSync) {
67585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
67595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(IsCrxInstalled());
67605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddPendingSyncInstall());
67622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(Manifest::INTERNAL, GetPendingLocation());
67635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetPendingIsFromSync());
67645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(IsCrxInstalled());
67655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(AddPendingExternalPrefUrl());
67672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, GetPendingLocation());
67685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetPendingIsFromSync());
67695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(IsCrxInstalled());
67705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(AddPendingSyncInstall());
67722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, GetPendingLocation());
67735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetPendingIsFromSync());
67745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(IsCrxInstalled());
67755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
67765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that an external install request stops sync from installing
67785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the same extension.
67795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSourcePriorityTest, InstallExternalBlocksSyncRequest) {
67805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
67815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(IsCrxInstalled());
67825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // External prefs starts an install.
67845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPendingExternalPrefFileInstall();
67855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Crx installer was made, but has not yet run.
67875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(IsCrxInstalled());
67885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Before the CRX installer runs, Sync requests that the same extension
67905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be installed. Should fail, because an external source is pending.
6791f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
67925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
67945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(AddPendingSyncInstall());
67955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the external source to install.
6797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
6798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  VerifyCrxInstall(crx_path_, INSTALL_NEW);
67995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(IsCrxInstalled());
68005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now that the extension is installed, sync request should fail
68025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because the extension is already installed.
68035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(AddPendingSyncInstall());
68045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
68055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that installing an external extension displays a GlobalError.
68072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallGlobalError) {
68085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FeatureSwitch::ScopedOverride prompt(
68095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FeatureSwitch::prompt_for_external_extensions(), true);
68105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
68125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockExtensionProvider* provider =
6813f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
68145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMockExternalProvider(provider);
68155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6816116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service()->external_install_manager()->UpdateExternalExtensionAlert();
68175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should return false, meaning there aren't any extensions that the user
68185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // needs to know about.
6819116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(
6820116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service()->external_install_manager()->HasExternalInstallError());
68215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a normal extension, installed normally.
68235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should NOT trigger an alert.
6824f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->set_extensions_enabled(true);
6825f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path = data_dir().AppendASCII("good.crx");
68265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallCRX(path, INSTALL_NEW);
68275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6828f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
6829ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
6830116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(
6831116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service()->external_install_manager()->HasExternalInstallError());
68325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A hosted app, installed externally.
68342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should NOT trigger an alert.
6835f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  provider->UpdateOrAddExtension(
6836f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      hosted_app, "1.0.0.0", data_dir().AppendASCII("hosted_app.crx"));
68375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6838f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
68395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6840f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
6841f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
6842f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
6843116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(
6844116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service()->external_install_manager()->HasExternalInstallError());
68455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Another normal extension, but installed externally.
68475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This SHOULD trigger an alert.
6848f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  provider->UpdateOrAddExtension(
6849f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx"));
68505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer2(
68525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6853f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
6854f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
6855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer2.Wait();
6856116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError());
68575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
68585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that external extensions are initially disabled, and that enabling
68605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// them clears the prompt.
68612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallInitiallyDisabled) {
68625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FeatureSwitch::ScopedOverride prompt(
68635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FeatureSwitch::prompt_for_external_extensions(), true);
68645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
68665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockExtensionProvider* provider =
6867f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
68685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMockExternalProvider(provider);
68695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6870f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  provider->UpdateOrAddExtension(
6871f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx"));
68725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6873f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
68745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6875f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
6876f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
6877f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
6878116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError());
6879f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(page_action));
68805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension =
6882f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      registry()->disabled_extensions().GetByID(page_action);
68835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension);
68845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(page_action, extension->id());
68855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6886f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->EnableExtension(page_action);
6887116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(
6888116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service()->external_install_manager()->HasExternalInstallError());
6889f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->IsExtensionEnabled(page_action));
68905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
68915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that installing multiple external extensions works.
689368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Flaky on windows; http://crbug.com/295757 .
689468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_WIN)
689568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define MAYBE_ExternalInstallMultiple DISABLED_ExternalInstallMultiple
689668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#else
689768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define MAYBE_ExternalInstallMultiple ExternalInstallMultiple
689868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif
689968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(ExtensionServiceTest, MAYBE_ExternalInstallMultiple) {
69005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FeatureSwitch::ScopedOverride prompt(
69015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FeatureSwitch::prompt_for_external_extensions(), true);
69025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeEmptyExtensionService();
69045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockExtensionProvider* provider =
6905f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
69065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddMockExternalProvider(provider);
69075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6908f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  provider->UpdateOrAddExtension(
6909f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx"));
6910f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  provider->UpdateOrAddExtension(
6911f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      good_crx, "1.0.0.0", data_dir().AppendASCII("good.crx"));
6912f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  provider->UpdateOrAddExtension(
6913f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      theme_crx, "2.0", data_dir().AppendASCII("theme.crx"));
69145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int count = 3;
6916f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
69175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6918f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&WaitForCountNotificationsCallback, &count));
6919f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
6920f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
6921116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError());
6922f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(page_action));
6923f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(good_crx));
6924f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(theme_crx));
6925f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
6926f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->EnableExtension(page_action);
6927116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError());
6928116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(service()
6929116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   ->external_install_manager()
6930116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   ->HasExternalInstallBubbleForTesting());
6931116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
6932f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->EnableExtension(theme_crx);
6933116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError());
6934116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(service()
6935116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   ->external_install_manager()
6936116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   ->HasExternalInstallBubbleForTesting());
6937116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
6938f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->EnableExtension(good_crx);
6939116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(
6940116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service()->external_install_manager()->HasExternalInstallError());
6941116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(service()
6942116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   ->external_install_manager()
6943116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   ->HasExternalInstallBubbleForTesting());
69445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
69455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test that there is a bubble for external extensions that update
6947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from the webstore if the profile is not new.
6948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreOldProfile) {
69495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FeatureSwitch::ScopedOverride prompt(
6950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FeatureSwitch::prompt_for_external_extensions(), true);
69515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This sets up the ExtensionPrefs used by our ExtensionService to be
6953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // post-first run.
69548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ExtensionServiceInitParams params = CreateDefaultInitParams();
69558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  params.is_first_run = false;
69568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  InitializeExtensionService(params);
69575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6958f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx");
6959f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PackCRX(data_dir().AppendASCII("update_from_webstore"),
6960f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          data_dir().AppendASCII("update_from_webstore.pem"),
6961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          crx_path);
6962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockExtensionProvider* provider =
6964f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
6965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddMockExternalProvider(provider);
6966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path);
69675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6968f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
69695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
6971f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
6972f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
6973116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError());
6974116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service()
6975116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  ->external_install_manager()
6976116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  ->HasExternalInstallBubbleForTesting());
6977f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(updates_from_webstore));
6978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
69795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test that there is no bubble for external extensions if the profile is new.
6981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreNewProfile) {
6982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FeatureSwitch::ScopedOverride prompt(
6983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FeatureSwitch::prompt_for_external_extensions(), true);
6984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InitializeEmptyExtensionService();
6986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6987f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx");
6988f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PackCRX(data_dir().AppendASCII("update_from_webstore"),
6989f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          data_dir().AppendASCII("update_from_webstore.pem"),
6990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          crx_path);
6991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockExtensionProvider* provider =
6993f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
6994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddMockExternalProvider(provider);
6995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path);
6996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6997f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WindowedNotificationObserver observer(
69985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::NotificationService::AllSources());
7000f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->CheckForExternalUpdates();
7001f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  observer.Wait();
7002116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError());
7003116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(service()
7004116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   ->external_install_manager()
7005116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   ->HasExternalInstallBubbleForTesting());
7006f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(service()->IsExtensionEnabled(updates_from_webstore));
70075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7008a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7009116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Test that clicking to remove the extension on an external install warning
7010116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// uninstalls the extension.
7011116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ExtensionServiceTest, ExternalInstallClickToRemove) {
7012116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FeatureSwitch::ScopedOverride prompt(
7013116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FeatureSwitch::prompt_for_external_extensions(), true);
7014116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7015116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionServiceInitParams params = CreateDefaultInitParams();
7016116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  params.is_first_run = false;
7017116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InitializeExtensionService(params);
7018116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7019116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx");
7020116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PackCRX(data_dir().AppendASCII("update_from_webstore"),
7021116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          data_dir().AppendASCII("update_from_webstore.pem"),
7022116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          crx_path);
7023116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7024116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockExtensionProvider* provider =
7025116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF);
7026116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddMockExternalProvider(provider);
7027116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path);
7028116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7029116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::WindowedNotificationObserver observer(
70305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
7031116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::NotificationService::AllSources());
7032116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->CheckForExternalUpdates();
7033116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  observer.Wait();
7034116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError());
7035116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7036116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // We check both enabled and disabled, since these are "eventually exclusive"
7037116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // sets.
7038116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(registry()->disabled_extensions().GetByID(updates_from_webstore));
7039116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(registry()->enabled_extensions().GetByID(updates_from_webstore));
7040116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7041116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Click the negative response.
7042116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->external_install_manager()->error_for_testing()->InstallUIAbort(
7043116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      true);
7044116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The Extension should be uninstalled.
7045116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(registry()->GetExtensionById(updates_from_webstore,
7046116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            ExtensionRegistry::EVERYTHING));
7047116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The error should be removed.
7048116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError());
7049116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
7050116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7051116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Test that clicking to keep the extension on an external install warning
7052116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// re-enables the extension.
7053116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ExtensionServiceTest, ExternalInstallClickToKeep) {
7054116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FeatureSwitch::ScopedOverride prompt(
7055116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FeatureSwitch::prompt_for_external_extensions(), true);
7056116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7057116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionServiceInitParams params = CreateDefaultInitParams();
7058116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  params.is_first_run = false;
7059116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InitializeExtensionService(params);
7060116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7061116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx");
7062116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PackCRX(data_dir().AppendASCII("update_from_webstore"),
7063116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          data_dir().AppendASCII("update_from_webstore.pem"),
7064116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          crx_path);
7065116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7066116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockExtensionProvider* provider =
7067116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF);
7068116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddMockExternalProvider(provider);
7069116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path);
7070116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7071116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::WindowedNotificationObserver observer(
70725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
7073116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::NotificationService::AllSources());
7074116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->CheckForExternalUpdates();
7075116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  observer.Wait();
7076116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError());
7077116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7078116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // We check both enabled and disabled, since these are "eventually exclusive"
7079116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // sets.
7080116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(registry()->disabled_extensions().GetByID(updates_from_webstore));
7081116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(registry()->enabled_extensions().GetByID(updates_from_webstore));
7082116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7083116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Accept the extension.
7084116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->external_install_manager()->error_for_testing()->InstallUIProceed();
7085116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7086116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // It should be enabled again.
7087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(registry()->enabled_extensions().GetByID(updates_from_webstore));
7088116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(
7089116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      registry()->disabled_extensions().GetByID(updates_from_webstore));
7090116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7091116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The error should be removed.
7092116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError());
7093116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
7094116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7095a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(ExtensionServiceTest, InstallBlacklistedExtension) {
7096a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  InitializeEmptyExtensionService();
7097a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7098a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<Extension> extension = extensions::ExtensionBuilder()
7099a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      .SetManifest(extensions::DictionaryBuilder()
7100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          .Set("name", "extension")
7101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          .Set("version", "1.0")
7102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          .Set("manifest_version", 2).Build())
7103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      .Build();
7104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(extension.get());
7105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const std::string& id = extension->id();
7106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::set<std::string> id_set;
7108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  id_set.insert(id);
7109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  extensions::ExtensionNotificationObserver notifications(
7110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      content::NotificationService::AllSources(), id_set);
7111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Installation should be allowed but the extension should never have been
7113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // loaded and it should be blacklisted in prefs.
7114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->OnExtensionInstalled(
7115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      extension.get(),
7116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      syncer::StringOrdinal(),
7117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      (extensions::kInstallFlagIsBlacklistedForMalware |
7118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       extensions::kInstallFlagInstallImmediately));
7119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::RunLoop().RunUntilIdle();
7120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Extension was installed but not loaded.
7122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(notifications.CheckNotifications(
71235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED));
7124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(service()->GetInstalledExtension(id));
71255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(registry()->enabled_extensions().Contains(id));
7127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(registry()->blacklisted_extensions().Contains(id));
71285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(ExtensionPrefs::Get(profile())->IsExtensionBlacklisted(id));
7130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(
7131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ExtensionPrefs::Get(profile())->IsBlacklistedExtensionAcknowledged(id));
7132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
71334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests a profile being destroyed correctly disables extensions.
7135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ExtensionServiceTest, DestroyingProfileClearsExtensions) {
7136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  InitializeEmptyExtensionService();
7137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
7139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NE(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_);
7140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, registry()->enabled_extensions().size());
7141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
7142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->terminated_extensions().size());
7143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->blacklisted_extensions().size());
7144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
7145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED,
7146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     content::Source<Profile>(profile()),
7147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     content::NotificationService::NoDetails());
7148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_);
7149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->enabled_extensions().size());
7150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->disabled_extensions().size());
7151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->terminated_extensions().size());
7152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, registry()->blacklisted_extensions().size());
7153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
7154