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