1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/version.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/manifest_handlers/shared_module_info.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/manifest_test.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char* kValidImportPath =
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "_modules/abcdefghijklmnopabcdefghijklmnop/foo/bar.html";
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char* kValidImportPathID = "abcdefghijklmnopabcdefghijklmnop";
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char* kValidImportPathRelative = "foo/bar.html";
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char* kInvalidImportPath = "_modules/abc/foo.html";
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char* kImportId1 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char* kImportId2 = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char* kNoImport = "cccccccccccccccccccccccccccccccc";
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace extensions {
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SharedModuleManifestTest : public ManifestTest {
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(SharedModuleManifestTest, ExportsAll) {
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ManifestData manifest("shared_module_export.json");
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension = LoadAndExpectSuccess(manifest);
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SharedModuleInfo::IsSharedModule(extension.get()))
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      << manifest.name();
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(SharedModuleInfo::ImportsModules(extension.get()))
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << manifest.name();
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SharedModuleInfo::IsExportAllowed(extension.get(), "foo"))
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << manifest.name();
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SharedModuleInfo::IsExportAllowed(extension.get(), "foo/bar"))
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      << manifest.name();
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(SharedModuleInfo::IsExportAllowedByWhitelist(extension.get(),
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kImportId1)) << manifest.name();
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(SharedModuleInfo::IsExportAllowedByWhitelist(extension.get(),
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kImportId2)) << manifest.name();
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(SharedModuleInfo::IsExportAllowedByWhitelist(extension.get(),
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kNoImport)) << manifest.name();
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(SharedModuleManifestTest, ExportWhitelistAll) {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ManifestData manifest("shared_module_export_no_whitelist.json");
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<Extension> extension = LoadAndExpectSuccess(manifest);
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(SharedModuleInfo::IsExportAllowedByWhitelist(extension.get(),
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kImportId1)) << manifest.name();
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(SharedModuleInfo::IsExportAllowedByWhitelist(extension.get(),
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kImportId2)) << manifest.name();
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(SharedModuleInfo::IsExportAllowedByWhitelist(extension.get(),
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kNoImport)) << manifest.name();
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(SharedModuleManifestTest, ExportFoo) {
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ManifestData manifest("shared_module_export_foo.json");
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension = LoadAndExpectSuccess(manifest);
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SharedModuleInfo::IsSharedModule(extension.get()))
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << manifest.name();
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(SharedModuleInfo::ImportsModules(extension.get()))
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      << manifest.name();
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SharedModuleInfo::IsExportAllowed(extension.get(), "foo"))
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << manifest.name();
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(SharedModuleInfo::IsExportAllowed(extension.get(), "foo/bar"))
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      << manifest.name();
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(SharedModuleManifestTest, ExportParseErrors) {
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Testcase testcases[] = {
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Testcase("shared_module_export_and_import.json",
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             "Simultaneous 'import' and 'export' are not allowed."),
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Testcase("shared_module_export_not_dict.json",
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             "Invalid value for 'export'."),
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Testcase("shared_module_export_resources_not_list.json",
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             "Invalid value for 'export.resources'."),
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Testcase("shared_module_export_resource_not_string.json",
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             "Invalid value for 'export.resources[1]'."),
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Testcase("shared_module_export_whitelist_item_not_id.json",
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             "Invalid value for 'export.whitelist[0]'."),
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Testcase("shared_module_export_whitelist_item_not_string.json",
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             "Invalid value for 'export.whitelist[0]'."),
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Testcase("shared_module_export_whitelist_not_list.json",
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             "Invalid value for 'export.whitelist'."),
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RunTestcases(testcases, arraysize(testcases), EXPECT_TYPE_ERROR);
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(SharedModuleManifestTest, SharedModuleStaticFunctions) {
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(SharedModuleInfo::IsImportedPath(kValidImportPath));
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(SharedModuleInfo::IsImportedPath(kInvalidImportPath));
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string id;
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string relative;
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SharedModuleInfo::ParseImportedPath(kValidImportPath, &id, &relative);
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(id, kValidImportPathID);
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(relative, kValidImportPathRelative);
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(SharedModuleManifestTest, Import) {
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ManifestData manifest("shared_module_import.json");
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension = LoadAndExpectSuccess(manifest);
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(SharedModuleInfo::IsSharedModule(extension.get()))
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << manifest.name();
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(SharedModuleInfo::ImportsModules(extension.get()))
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << manifest.name();
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::vector<SharedModuleInfo::ImportInfo>& imports =
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SharedModuleInfo::GetImports(extension.get());
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(2U, imports.size());
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(imports[0].extension_id, kImportId1);
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(imports[0].minimum_version, "");
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(imports[1].extension_id, kImportId2);
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(base::Version(imports[1].minimum_version).IsValid());
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SharedModuleInfo::ImportsExtensionById(extension.get(), kImportId1));
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SharedModuleInfo::ImportsExtensionById(extension.get(), kImportId2));
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SharedModuleInfo::ImportsExtensionById(extension.get(), kNoImport));
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(SharedModuleManifestTest, ImportParseErrors) {
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Testcase testcases[] = {
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Testcase("shared_module_import_not_list.json",
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             "Invalid value for 'import'."),
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Testcase("shared_module_import_invalid_id.json",
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             "Invalid value for 'import[0].id'."),
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Testcase("shared_module_import_invalid_version.json",
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             "Invalid value for 'import[0].minimum_version'."),
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RunTestcases(testcases, arraysize(testcases), EXPECT_TYPE_ERROR);
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace extensions
147