1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/version.h" 6 #include "extensions/common/extension.h" 7 #include "extensions/common/manifest_handlers/shared_module_info.h" 8 #include "extensions/common/manifest_test.h" 9 #include "testing/gtest/include/gtest/gtest.h" 10 11 namespace { 12 13 const char* kValidImportPath = 14 "_modules/abcdefghijklmnopabcdefghijklmnop/foo/bar.html"; 15 const char* kValidImportPathID = "abcdefghijklmnopabcdefghijklmnop"; 16 const char* kValidImportPathRelative = "foo/bar.html"; 17 const char* kInvalidImportPath = "_modules/abc/foo.html"; 18 const char* kImportId1 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 19 const char* kImportId2 = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; 20 const char* kNoImport = "cccccccccccccccccccccccccccccccc"; 21 22 } // namespace 23 24 namespace extensions { 25 26 class SharedModuleManifestTest : public ManifestTest { 27 }; 28 29 TEST_F(SharedModuleManifestTest, ExportsAll) { 30 ManifestData manifest("shared_module_export.json"); 31 32 scoped_refptr<Extension> extension = LoadAndExpectSuccess(manifest); 33 34 EXPECT_TRUE(SharedModuleInfo::IsSharedModule(extension.get())) 35 << manifest.name(); 36 EXPECT_FALSE(SharedModuleInfo::ImportsModules(extension.get())) 37 << manifest.name(); 38 EXPECT_TRUE(SharedModuleInfo::IsExportAllowed(extension.get(), "foo")) 39 << manifest.name(); 40 EXPECT_TRUE(SharedModuleInfo::IsExportAllowed(extension.get(), "foo/bar")) 41 << manifest.name(); 42 43 EXPECT_TRUE(SharedModuleInfo::IsExportAllowedByWhitelist(extension.get(), 44 kImportId1)) << manifest.name(); 45 EXPECT_TRUE(SharedModuleInfo::IsExportAllowedByWhitelist(extension.get(), 46 kImportId2)) << manifest.name(); 47 EXPECT_FALSE(SharedModuleInfo::IsExportAllowedByWhitelist(extension.get(), 48 kNoImport)) << manifest.name(); 49 } 50 51 TEST_F(SharedModuleManifestTest, ExportWhitelistAll) { 52 ManifestData manifest("shared_module_export_no_whitelist.json"); 53 54 scoped_refptr<Extension> extension = LoadAndExpectSuccess(manifest); 55 56 EXPECT_TRUE(SharedModuleInfo::IsExportAllowedByWhitelist(extension.get(), 57 kImportId1)) << manifest.name(); 58 EXPECT_TRUE(SharedModuleInfo::IsExportAllowedByWhitelist(extension.get(), 59 kImportId2)) << manifest.name(); 60 EXPECT_TRUE(SharedModuleInfo::IsExportAllowedByWhitelist(extension.get(), 61 kNoImport)) << manifest.name(); 62 } 63 64 TEST_F(SharedModuleManifestTest, ExportFoo) { 65 ManifestData manifest("shared_module_export_foo.json"); 66 67 scoped_refptr<Extension> extension = LoadAndExpectSuccess(manifest); 68 69 EXPECT_TRUE(SharedModuleInfo::IsSharedModule(extension.get())) 70 << manifest.name(); 71 EXPECT_FALSE(SharedModuleInfo::ImportsModules(extension.get())) 72 << manifest.name(); 73 EXPECT_TRUE(SharedModuleInfo::IsExportAllowed(extension.get(), "foo")) 74 << manifest.name(); 75 EXPECT_FALSE(SharedModuleInfo::IsExportAllowed(extension.get(), "foo/bar")) 76 << manifest.name(); 77 } 78 79 TEST_F(SharedModuleManifestTest, ExportParseErrors) { 80 Testcase testcases[] = { 81 Testcase("shared_module_export_and_import.json", 82 "Simultaneous 'import' and 'export' are not allowed."), 83 Testcase("shared_module_export_not_dict.json", 84 "Invalid value for 'export'."), 85 Testcase("shared_module_export_resources_not_list.json", 86 "Invalid value for 'export.resources'."), 87 Testcase("shared_module_export_resource_not_string.json", 88 "Invalid value for 'export.resources[1]'."), 89 Testcase("shared_module_export_whitelist_item_not_id.json", 90 "Invalid value for 'export.whitelist[0]'."), 91 Testcase("shared_module_export_whitelist_item_not_string.json", 92 "Invalid value for 'export.whitelist[0]'."), 93 Testcase("shared_module_export_whitelist_not_list.json", 94 "Invalid value for 'export.whitelist'."), 95 }; 96 RunTestcases(testcases, arraysize(testcases), EXPECT_TYPE_ERROR); 97 } 98 99 TEST_F(SharedModuleManifestTest, SharedModuleStaticFunctions) { 100 EXPECT_TRUE(SharedModuleInfo::IsImportedPath(kValidImportPath)); 101 EXPECT_FALSE(SharedModuleInfo::IsImportedPath(kInvalidImportPath)); 102 103 std::string id; 104 std::string relative; 105 SharedModuleInfo::ParseImportedPath(kValidImportPath, &id, &relative); 106 EXPECT_EQ(id, kValidImportPathID); 107 EXPECT_EQ(relative, kValidImportPathRelative); 108 } 109 110 TEST_F(SharedModuleManifestTest, Import) { 111 ManifestData manifest("shared_module_import.json"); 112 113 scoped_refptr<Extension> extension = LoadAndExpectSuccess(manifest); 114 115 EXPECT_FALSE(SharedModuleInfo::IsSharedModule(extension.get())) 116 << manifest.name(); 117 EXPECT_TRUE(SharedModuleInfo::ImportsModules(extension.get())) 118 << manifest.name(); 119 const std::vector<SharedModuleInfo::ImportInfo>& imports = 120 SharedModuleInfo::GetImports(extension.get()); 121 ASSERT_EQ(2U, imports.size()); 122 EXPECT_EQ(imports[0].extension_id, kImportId1); 123 EXPECT_EQ(imports[0].minimum_version, ""); 124 EXPECT_EQ(imports[1].extension_id, kImportId2); 125 EXPECT_TRUE(base::Version(imports[1].minimum_version).IsValid()); 126 EXPECT_TRUE( 127 SharedModuleInfo::ImportsExtensionById(extension.get(), kImportId1)); 128 EXPECT_TRUE( 129 SharedModuleInfo::ImportsExtensionById(extension.get(), kImportId2)); 130 EXPECT_FALSE( 131 SharedModuleInfo::ImportsExtensionById(extension.get(), kNoImport)); 132 } 133 134 TEST_F(SharedModuleManifestTest, ImportParseErrors) { 135 Testcase testcases[] = { 136 Testcase("shared_module_import_not_list.json", 137 "Invalid value for 'import'."), 138 Testcase("shared_module_import_invalid_id.json", 139 "Invalid value for 'import[0].id'."), 140 Testcase("shared_module_import_invalid_version.json", 141 "Invalid value for 'import[0].minimum_version'."), 142 }; 143 RunTestcases(testcases, arraysize(testcases), EXPECT_TYPE_ERROR); 144 } 145 146 } // namespace extensions 147