15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 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) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace extensions { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension> CreateTestExtension(const std::string& name, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& launch_url, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extent) { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path(FILE_PATH_LITERAL("c:\\")); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path(FILE_PATH_LITERAL("/")); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.AppendASCII(name); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue manifest; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString("name", name); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString("version", "1"); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!launch_url.empty()) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString("app.launch.web_url", launch_url); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extent.empty()) { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue* urls = new base::ListValue(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.Set("app.urls", urls); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) urls->Append(new base::StringValue(extent)); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension( 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Extension::Create(path, Manifest::INTERNAL, manifest, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::NO_FLAGS, &error)); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension.get()) << error; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionSetTest, ExtensionSet) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> ext1(CreateTestExtension( 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a", "https://chrome.google.com/launch", "https://chrome.google.com/")); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> ext2(CreateTestExtension( 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a", "http://code.google.com/p/chromium", 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://code.google.com/p/chromium/")); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> ext3(CreateTestExtension( 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "b", "http://dev.chromium.org/", "http://dev.chromium.org/")); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> ext4( 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateTestExtension("c", std::string(), std::string())); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(ext1.get() && ext2.get() && ext3.get() && ext4.get()); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionSet extensions; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add an extension. 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(extensions.Insert(ext1)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, extensions.size()); 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(ext1.get(), extensions.GetByID(ext1->id())); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since extension2 has same ID, it should overwrite extension1. 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(extensions.Insert(ext2)); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, extensions.size()); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(ext2.get(), extensions.GetByID(ext1->id())); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the other extensions. 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(extensions.Insert(ext3)); 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(extensions.Insert(ext4)); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3u, extensions.size()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get extension by its chrome-extension:// URL 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ( 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ext2.get(), 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions.GetExtensionOrAppByURL(ext2->GetResourceURL("test.html"))); 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ( 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ext3.get(), 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions.GetExtensionOrAppByURL(ext3->GetResourceURL("test.html"))); 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ( 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ext4.get(), 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions.GetExtensionOrAppByURL(ext4->GetResourceURL("test.html"))); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get extension by web extent. 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(ext2.get(), 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions.GetExtensionOrAppByURL( 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL("http://code.google.com/p/chromium/monkey"))); 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(ext3.get(), 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions.GetExtensionOrAppByURL( 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL("http://dev.chromium.org/design-docs/"))); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extensions.GetExtensionOrAppByURL( 103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GURL("http://blog.chromium.org/"))); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test InSameExtent(). 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extensions.InSameExtent( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://code.google.com/p/chromium/monkey/"), 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://code.google.com/p/chromium/"))); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extensions.InSameExtent( 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://code.google.com/p/chromium/"), 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("https://code.google.com/p/chromium/"))); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extensions.InSameExtent( 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://code.google.com/p/chromium/"), 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://dev.chromium.org/design-docs/"))); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both of these should be NULL, which mean true for InSameExtent. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extensions.InSameExtent( 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://www.google.com/"), 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://blog.chromium.org/"))); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove one of the extensions. 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(extensions.Remove(ext2->id())); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, extensions.size()); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extensions.GetByID(ext2->id())); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make a union of a set with 3 more extensions (only 2 are new). 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> ext5( 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateTestExtension("d", std::string(), std::string())); 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> ext6( 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateTestExtension("e", std::string(), std::string())); 131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(ext5.get() && ext6.get()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ExtensionSet> to_add(new ExtensionSet()); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |ext3| is already in |extensions|, should not affect size. 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(to_add->Insert(ext3)); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(to_add->Insert(ext5)); 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(to_add->Insert(ext6)); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extensions.Contains(ext3->id())); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extensions.InsertAll(*to_add)); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4u, extensions.size()); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(extensions.InsertAll(*to_add)); // Re-adding same set no-ops. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4u, extensions.size()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace extensions 148