// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include #include "base/file_path.h" #include "base/file_util.h" #include "base/message_loop.h" #include "base/path_service.h" #include "base/string_util.h" #include "chrome/browser/extensions/extension.h" #include "chrome/browser/extensions/extensions_service.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/json_value_serializer.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" namespace { struct ExtensionsOrder { bool operator()(const Extension* a, const Extension* b) { return a->name() < b->name(); } }; } // namespace // A mock implementation of ExtensionsServiceFrontendInterface for testing the // backend. class ExtensionsServiceTestFrontend : public ExtensionsServiceFrontendInterface { public: ~ExtensionsServiceTestFrontend() { for (ExtensionList::iterator iter = extensions_.begin(); iter != extensions_.end(); ++iter) { delete *iter; } } std::vector* errors() { return &errors_; } ExtensionList* extensions() { return &extensions_; } // ExtensionsServiceFrontendInterface virtual MessageLoop* GetMessageLoop() { return &message_loop_; } virtual void OnExtensionLoadError(const std::string& message) { errors_.push_back(message); } virtual void OnExtensionsLoadedFromDirectory(ExtensionList* new_extensions) { extensions_.insert(extensions_.end(), new_extensions->begin(), new_extensions->end()); delete new_extensions; // In the tests we rely on extensions being in particular order, // which is not always the case (and is not guaranteed by used APIs). std::stable_sort(extensions_.begin(), extensions_.end(), ExtensionsOrder()); } private: MessageLoop message_loop_; ExtensionList extensions_; std::vector errors_; }; // make the test a PlatformTest to setup autorelease pools properly on mac typedef PlatformTest ExtensionsServiceTest; // Test loading extensions from the profile directory. TEST_F(ExtensionsServiceTest, LoadAllExtensionsFromDirectory) { std::wstring extensions_dir; ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_dir)); FilePath extensions_path = FilePath::FromWStringHack(extensions_dir).Append( FILE_PATH_LITERAL("extensions")); scoped_refptr backend(new ExtensionsServiceBackend); scoped_refptr frontend( new ExtensionsServiceTestFrontend); std::vector extensions; EXPECT_TRUE(backend->LoadExtensionsFromDirectory(extensions_path, scoped_refptr(frontend.get()))); frontend->GetMessageLoop()->RunAllPending(); // Note: There can be more errors if there are extra directories, like .svn // directories. EXPECT_TRUE(frontend->errors()->size() >= 2u); ASSERT_EQ(2u, frontend->extensions()->size()); EXPECT_EQ(std::string("com.google.myextension1"), frontend->extensions()->at(0)->id()); EXPECT_EQ(std::string("My extension 1"), frontend->extensions()->at(0)->name()); EXPECT_EQ(std::string("The first extension that I made."), frontend->extensions()->at(0)->description()); Extension* extension = frontend->extensions()->at(0); const UserScriptList& scripts = extension->user_scripts(); ASSERT_EQ(2u, scripts.size()); EXPECT_EQ(2u, scripts[0].matches.size()); EXPECT_EQ("http://*.google.com/*", scripts[0].matches[0]); EXPECT_EQ("https://*.google.com/*", scripts[0].matches[1]); EXPECT_EQ(extension->path().Append(FILE_PATH_LITERAL("script1.js")).value(), scripts[0].path.value()); EXPECT_EQ(1u, scripts[1].matches.size()); EXPECT_EQ("http://*.yahoo.com/*", scripts[1].matches[0]); EXPECT_EQ(extension->path().Append(FILE_PATH_LITERAL("script2.js")).value(), scripts[1].path.value()); EXPECT_EQ(std::string("com.google.myextension2"), frontend->extensions()->at(1)->id()); EXPECT_EQ(std::string("My extension 2"), frontend->extensions()->at(1)->name()); EXPECT_EQ(std::string(""), frontend->extensions()->at(1)->description()); ASSERT_EQ(0u, frontend->extensions()->at(1)->user_scripts().size()); };