15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/storage/settings_test_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/storage/settings_frontend.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system_factory.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace settings_test_util {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Intended as a StorageCallback from GetStorage.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void AssignStorage(ValueStore** dst, ValueStore* src) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *dst = src;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ValueStore* GetStorage(
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings_namespace::Namespace settings_namespace,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SettingsFrontend* frontend) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValueStore* storage = NULL;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frontend->RunWithStorage(
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_id,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      settings_namespace,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&AssignStorage, &storage));
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return storage;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ValueStore* GetStorage(
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id, SettingsFrontend* frontend) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetStorage(extension_id, settings_namespace::SYNC, frontend);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MockExtensionService
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockExtensionService::MockExtensionService() {}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockExtensionService::~MockExtensionService() {}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Extension* MockExtensionService::GetExtensionById(
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& id, bool include_disabled) const {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, scoped_refptr<Extension> >::const_iterator
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      maybe_extension = extensions_.find(id);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return maybe_extension == extensions_.end() ?
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL : maybe_extension->second.get();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockExtensionService::AddExtensionWithId(
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& id, Manifest::Type type) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> empty_permissions;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddExtensionWithIdAndPermissions(id, type, empty_permissions);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockExtensionService::AddExtensionWithIdAndPermissions(
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& id,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Manifest::Type type,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::set<std::string>& permissions_set) {
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue manifest;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString("name", std::string("Test extension ") + id);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString("version", "1.0");
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::ListValue> permissions(new base::ListValue());
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<std::string>::const_iterator it = permissions_set.begin();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      it != permissions_set.end(); ++it) {
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    permissions->Append(new base::StringValue(*it));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.Set("permissions", permissions.release());
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case Manifest::TYPE_EXTENSION:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case Manifest::TYPE_LEGACY_PACKAGED_APP: {
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::DictionaryValue* app = new base::DictionaryValue();
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::DictionaryValue* app_launch = new base::DictionaryValue();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_launch->SetString("local_path", "fake.html");
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app->Set("launch", app_launch);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manifest.Set("app", app);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension(Extension::Create(
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Manifest::INTERNAL,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manifest,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Extension::NO_FLAGS,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &error));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(extension.get());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(error.empty());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions_[id] = extension;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<std::string>::const_iterator it = permissions_set.begin();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      it != permissions_set.end(); ++it) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(extension->HasAPIPermission(*it));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MockExtensionSystem
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockExtensionSystem::MockExtensionSystem(Profile* profile)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TestExtensionSystem(profile) {}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockExtensionSystem::~MockExtensionSystem() {}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EventRouter* MockExtensionSystem::event_router() {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!event_router_.get())
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event_router_.reset(new EventRouter(profile_, NULL));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return event_router_.get();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionService* MockExtensionSystem::extension_service() {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionServiceInterface* as_interface =
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<ExtensionServiceInterface*>(&extension_service_);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return static_cast<ExtensionService*>(as_interface);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)BrowserContextKeyedService* BuildMockExtensionSystem(
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* profile) {
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return new MockExtensionSystem(static_cast<Profile*>(profile));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MockProfile
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockProfile::MockProfile(const base::FilePath& file_path)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : TestingProfile(file_path) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSystemFactory::GetInstance()->SetTestingFactoryAndUse(this,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &BuildMockExtensionSystem);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockProfile::~MockProfile() {}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScopedSettingsFactory
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedSettingsStorageFactory::ScopedSettingsStorageFactory() {}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedSettingsStorageFactory::ScopedSettingsStorageFactory(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const scoped_refptr<SettingsStorageFactory>& delegate)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : delegate_(delegate) {}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedSettingsStorageFactory::~ScopedSettingsStorageFactory() {}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScopedSettingsStorageFactory::Reset(
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const scoped_refptr<SettingsStorageFactory>& delegate) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ValueStore* ScopedSettingsStorageFactory::Create(
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& base_path,
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& extension_id) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(delegate_.get());
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return delegate_->Create(base_path, extension_id);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace settings_test_util
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
168