// Copyright (c) 2011 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 "base/file_path.h" #include "base/logging.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/values.h" #include "chrome/common/extensions/extension.h" #include "chrome/common/extensions/extension_set.h" #include "testing/gtest/include/gtest/gtest.h" namespace { scoped_refptr<Extension> CreateTestExtension(const std::string& name, const std::string& launch_url, const std::string& extent) { #if defined(OS_WIN) FilePath path(FILE_PATH_LITERAL("c:\\")); #else FilePath path(FILE_PATH_LITERAL("/")); #endif path = path.AppendASCII(name); DictionaryValue manifest; manifest.SetString("name", name); manifest.SetString("version", "1"); if (!launch_url.empty()) manifest.SetString("app.launch.web_url", launch_url); if (!extent.empty()) { ListValue* urls = new ListValue(); manifest.Set("app.urls", urls); urls->Append(Value::CreateStringValue(extent)); } std::string error; scoped_refptr<Extension> extension( Extension::Create(path, Extension::INTERNAL, manifest, Extension::STRICT_ERROR_CHECKS, &error)); EXPECT_TRUE(extension.get()) << error; return extension; } } // namespace TEST(ExtensionSetTest, ExtensionSet) { scoped_refptr<Extension> ext1(CreateTestExtension( "a", "https://chrome.google.com/launch", "https://chrome.google.com/")); scoped_refptr<Extension> ext2(CreateTestExtension( "a", "http://code.google.com/p/chromium", "http://code.google.com/p/chromium/")); scoped_refptr<Extension> ext3(CreateTestExtension( "b", "http://dev.chromium.org/", "http://dev.chromium.org/")); scoped_refptr<Extension> ext4(CreateTestExtension("c", "", "")); ASSERT_TRUE(ext1 && ext2 && ext3 && ext4); ExtensionSet extensions; // Add an extension. extensions.Insert(ext1); EXPECT_EQ(1u, extensions.size()); EXPECT_EQ(ext1, extensions.GetByID(ext1->id())); // Since extension2 has same ID, it should overwrite extension1. extensions.Insert(ext2); EXPECT_EQ(1u, extensions.size()); EXPECT_EQ(ext2, extensions.GetByID(ext1->id())); // Add the other extensions. extensions.Insert(ext3); extensions.Insert(ext4); EXPECT_EQ(3u, extensions.size()); // Get extension by its chrome-extension:// URL EXPECT_EQ(ext2, extensions.GetByURL( ext2->GetResourceURL("test.html"))); EXPECT_EQ(ext3, extensions.GetByURL( ext3->GetResourceURL("test.html"))); EXPECT_EQ(ext4, extensions.GetByURL( ext4->GetResourceURL("test.html"))); // Get extension by web extent. EXPECT_EQ(ext2, extensions.GetByURL( GURL("http://code.google.com/p/chromium/monkey"))); EXPECT_EQ(ext3, extensions.GetByURL( GURL("http://dev.chromium.org/design-docs/"))); EXPECT_FALSE(extensions.GetByURL( GURL("http://blog.chromium.org/"))); // Test InSameExtent(). EXPECT_TRUE(extensions.InSameExtent( GURL("http://code.google.com/p/chromium/monkey/"), GURL("http://code.google.com/p/chromium/"))); EXPECT_FALSE(extensions.InSameExtent( GURL("http://code.google.com/p/chromium/"), GURL("https://code.google.com/p/chromium/"))); EXPECT_FALSE(extensions.InSameExtent( GURL("http://code.google.com/p/chromium/"), GURL("http://dev.chromium.org/design-docs/"))); // Both of these should be NULL, which mean true for InSameExtent. EXPECT_TRUE(extensions.InSameExtent( GURL("http://www.google.com/"), GURL("http://blog.chromium.org/"))); // Remove one of the extensions. extensions.Remove(ext2->id()); EXPECT_EQ(2u, extensions.size()); EXPECT_FALSE(extensions.GetByID(ext2->id())); }