172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file. 472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/file_path.h" 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/logging.h" 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/values.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/extensions/extension.h" 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/extensions/extension_set.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "testing/gtest/include/gtest/gtest.h" 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace { 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenscoped_refptr<Extension> CreateTestExtension(const std::string& name, 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& launch_url, 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& extent) { 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_WIN) 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen FilePath path(FILE_PATH_LITERAL("c:\\")); 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#else 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen FilePath path(FILE_PATH_LITERAL("/")); 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen path = path.AppendASCII(name); 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DictionaryValue manifest; 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen manifest.SetString("name", name); 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen manifest.SetString("version", "1"); 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!launch_url.empty()) 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen manifest.SetString("app.launch.web_url", launch_url); 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!extent.empty()) { 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ListValue* urls = new ListValue(); 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen manifest.Set("app.urls", urls); 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen urls->Append(Value::CreateStringValue(extent)); 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string error; 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<Extension> extension( 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Extension::Create(path, Extension::INTERNAL, manifest, 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Extension::STRICT_ERROR_CHECKS, &error)); 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(extension.get()) << error; 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return extension; 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(ExtensionSetTest, ExtensionSet) { 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<Extension> ext1(CreateTestExtension( 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "a", "https://chrome.google.com/launch", "https://chrome.google.com/")); 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<Extension> ext2(CreateTestExtension( 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "a", "http://code.google.com/p/chromium", 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "http://code.google.com/p/chromium/")); 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<Extension> ext3(CreateTestExtension( 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "b", "http://dev.chromium.org/", "http://dev.chromium.org/")); 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<Extension> ext4(CreateTestExtension("c", "", "")); 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(ext1 && ext2 && ext3 && ext4); 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionSet extensions; 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Add an extension. 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extensions.Insert(ext1); 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1u, extensions.size()); 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(ext1, extensions.GetByID(ext1->id())); 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Since extension2 has same ID, it should overwrite extension1. 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extensions.Insert(ext2); 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(1u, extensions.size()); 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(ext2, extensions.GetByID(ext1->id())); 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Add the other extensions. 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extensions.Insert(ext3); 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extensions.Insert(ext4); 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(3u, extensions.size()); 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Get extension by its chrome-extension:// URL 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(ext2, extensions.GetByURL( 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ext2->GetResourceURL("test.html"))); 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(ext3, extensions.GetByURL( 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ext3->GetResourceURL("test.html"))); 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(ext4, extensions.GetByURL( 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ext4->GetResourceURL("test.html"))); 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Get extension by web extent. 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(ext2, extensions.GetByURL( 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL("http://code.google.com/p/chromium/monkey"))); 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(ext3, extensions.GetByURL( 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL("http://dev.chromium.org/design-docs/"))); 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(extensions.GetByURL( 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL("http://blog.chromium.org/"))); 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Test InSameExtent(). 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(extensions.InSameExtent( 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL("http://code.google.com/p/chromium/monkey/"), 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL("http://code.google.com/p/chromium/"))); 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(extensions.InSameExtent( 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL("http://code.google.com/p/chromium/"), 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL("https://code.google.com/p/chromium/"))); 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(extensions.InSameExtent( 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL("http://code.google.com/p/chromium/"), 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL("http://dev.chromium.org/design-docs/"))); 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Both of these should be NULL, which mean true for InSameExtent. 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(extensions.InSameExtent( 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL("http://www.google.com/"), 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL("http://blog.chromium.org/"))); 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Remove one of the extensions. 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extensions.Remove(ext2->id()); 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(2u, extensions.size()); 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(extensions.GetByID(ext2->id())); 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 118