| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/string_util.h" | 5 #include "base/string_util.h" |
| 6 #include "base/path_service.h" | |
| 7 #include "chrome/browser/extensions/extension.h" | 6 #include "chrome/browser/extensions/extension.h" |
| 8 #include "chrome/common/chrome_paths.h" | |
| 9 #include "chrome/common/json_value_serializer.h" | |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
| 11 | 8 |
| 12 class ExtensionTest : public testing::Test { | 9 class ExtensionTest : public testing::Test { |
| 13 }; | 10 }; |
| 14 | 11 |
| 15 TEST(ExtensionTest, InitFromValueInvalid) { | 12 TEST(ExtensionTest, InitFromValueInvalid) { |
| 16 #if defined(OS_WIN) | 13 Extension extension; |
| 17 FilePath path(FILE_PATH_LITERAL("c:\\foo")); | |
| 18 #elif defined(OS_POSIX) | |
| 19 FilePath path(FILE_PATH_LITERAL("/foo")); | |
| 20 #endif | |
| 21 Extension extension(path); | |
| 22 std::string error; | 14 std::string error; |
| 23 | 15 |
| 24 // Start with a valid extension manifest | 16 // Test invalid format version |
| 25 std::wstring extensions_dir; | 17 DictionaryValue input_value; |
| 26 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_dir)); | 18 input_value.SetInteger(Extension::kFormatVersionKey, 2); |
| 27 FilePath extensions_path = FilePath::FromWStringHack(extensions_dir) | 19 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); |
| 28 .Append(FILE_PATH_LITERAL("extensions")) | |
| 29 .Append(FILE_PATH_LITERAL("extension1")) | |
| 30 .Append(FILE_PATH_LITERAL("manifest")); | |
| 31 | |
| 32 JSONFileValueSerializer serializer(extensions_path.ToWStringHack()); | |
| 33 scoped_ptr<DictionaryValue> valid_value( | |
| 34 static_cast<DictionaryValue*>(serializer.Deserialize(&error))); | |
| 35 ASSERT_TRUE(valid_value.get()); | |
| 36 ASSERT_EQ("", error); | |
| 37 ASSERT_TRUE(extension.InitFromValue(*valid_value, &error)); | |
| 38 ASSERT_EQ("", error); | |
| 39 | |
| 40 scoped_ptr<DictionaryValue> input_value; | |
| 41 | |
| 42 // Test missing and invalid format versions | |
| 43 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | |
| 44 input_value->Remove(Extension::kFormatVersionKey, NULL); | |
| 45 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 46 EXPECT_EQ(Extension::kInvalidFormatVersionError, error); | 20 EXPECT_EQ(Extension::kInvalidFormatVersionError, error); |
| 47 | 21 input_value.SetInteger(Extension::kFormatVersionKey, 1); |
| 48 input_value->SetString(Extension::kFormatVersionKey, "foo"); | |
| 49 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 50 EXPECT_EQ(Extension::kInvalidFormatVersionError, error); | |
| 51 | |
| 52 input_value->SetInteger(Extension::kFormatVersionKey, 2); | |
| 53 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 54 EXPECT_EQ(Extension::kInvalidFormatVersionError, error); | |
| 55 | 22 |
| 56 // Test missing and invalid ids | 23 // Test missing and invalid ids |
| 57 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 24 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); |
| 58 input_value->Remove(Extension::kIdKey, NULL); | |
| 59 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 60 EXPECT_EQ(Extension::kInvalidIdError, error); | 25 EXPECT_EQ(Extension::kInvalidIdError, error); |
| 61 | 26 input_value.SetInteger(Extension::kIdKey, 42); |
| 62 input_value->SetInteger(Extension::kIdKey, 42); | 27 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); |
| 63 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 64 EXPECT_EQ(Extension::kInvalidIdError, error); | 28 EXPECT_EQ(Extension::kInvalidIdError, error); |
| 29 input_value.SetString(Extension::kIdKey, L"com.google.myextension"); |
| 65 | 30 |
| 66 // Test missing and invalid versions | 31 // Test missing and invalid versions |
| 67 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 32 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); |
| 68 input_value->Remove(Extension::kVersionKey, NULL); | |
| 69 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 70 EXPECT_EQ(Extension::kInvalidVersionError, error); | 33 EXPECT_EQ(Extension::kInvalidVersionError, error); |
| 71 | 34 input_value.SetInteger(Extension::kVersionKey, 42); |
| 72 input_value->SetInteger(Extension::kVersionKey, 42); | 35 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); |
| 73 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 74 EXPECT_EQ(Extension::kInvalidVersionError, error); | 36 EXPECT_EQ(Extension::kInvalidVersionError, error); |
| 37 input_value.SetString(Extension::kVersionKey, L"1.0"); |
| 75 | 38 |
| 76 // Test missing and invalid names | 39 // Test missing and invalid names |
| 77 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 40 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); |
| 78 input_value->Remove(Extension::kNameKey, NULL); | |
| 79 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 80 EXPECT_EQ(Extension::kInvalidNameError, error); | 41 EXPECT_EQ(Extension::kInvalidNameError, error); |
| 81 | 42 input_value.SetInteger(Extension::kNameKey, 42); |
| 82 input_value->SetInteger(Extension::kNameKey, 42); | 43 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); |
| 83 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 84 EXPECT_EQ(Extension::kInvalidNameError, error); | 44 EXPECT_EQ(Extension::kInvalidNameError, error); |
| 45 input_value.SetString(Extension::kNameKey, L"my extension"); |
| 85 | 46 |
| 86 // Test invalid description | 47 // Test invalid description |
| 87 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 48 input_value.SetInteger(Extension::kDescriptionKey, 42); |
| 88 input_value->SetInteger(Extension::kDescriptionKey, 42); | 49 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); |
| 89 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 90 EXPECT_EQ(Extension::kInvalidDescriptionError, error); | 50 EXPECT_EQ(Extension::kInvalidDescriptionError, error); |
| 51 input_value.Remove(Extension::kDescriptionKey, NULL); |
| 91 | 52 |
| 92 // Test invalid user scripts list | 53 // Test invalid content scripts list |
| 93 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 54 input_value.SetInteger(Extension::kContentScriptsKey, 42); |
| 94 input_value->SetInteger(Extension::kUserScriptsKey, 42); | 55 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); |
| 95 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 56 EXPECT_EQ(Extension::kInvalidContentScriptsListError, error); |
| 96 EXPECT_EQ(Extension::kInvalidUserScriptsListError, error); | |
| 97 | 57 |
| 98 // Test invalid user script item | 58 // Test invalid content script item |
| 99 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 59 ListValue* content_scripts = new ListValue; |
| 100 ListValue* user_scripts = NULL; | 60 input_value.Set(Extension::kContentScriptsKey, content_scripts); |
| 101 input_value->GetList(Extension::kUserScriptsKey, &user_scripts); | 61 content_scripts->Set(0, Value::CreateIntegerValue(42)); |
| 102 user_scripts->Set(0, Value::CreateIntegerValue(42)); | 62 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); |
| 103 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 63 EXPECT_EQ(0u, error.find(Extension::kInvalidContentScriptError)); |
| 104 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidUserScriptError)); | |
| 105 | |
| 106 // Test missing and invalid matches array | |
| 107 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | |
| 108 input_value->GetList(Extension::kUserScriptsKey, &user_scripts); | |
| 109 DictionaryValue* user_script = NULL; | |
| 110 user_scripts->GetDictionary(0, &user_script); | |
| 111 user_script->Remove(Extension::kMatchesKey, NULL); | |
| 112 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 113 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchesError)); | |
| 114 | |
| 115 user_script->Set(Extension::kMatchesKey, Value::CreateIntegerValue(42)); | |
| 116 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 117 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchesError)); | |
| 118 | |
| 119 ListValue* matches = new ListValue; | |
| 120 user_script->Set(Extension::kMatchesKey, matches); | |
| 121 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 122 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchCountError)); | |
| 123 | |
| 124 // Test invalid match element | |
| 125 matches->Set(0, Value::CreateIntegerValue(42)); | |
| 126 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 127 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchError)); | |
| 128 | |
| 129 // Test missing and invalid files array | |
| 130 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | |
| 131 input_value->GetList(Extension::kUserScriptsKey, &user_scripts); | |
| 132 user_scripts->GetDictionary(0, &user_script); | |
| 133 user_script->Remove(Extension::kFilesKey, NULL); | |
| 134 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 135 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidFilesError)); | |
| 136 | |
| 137 user_script->Set(Extension::kFilesKey, Value::CreateIntegerValue(42)); | |
| 138 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 139 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidFilesError)); | |
| 140 | |
| 141 ListValue* files = new ListValue; | |
| 142 user_script->Set(Extension::kFilesKey, files); | |
| 143 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 144 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidFileCountError)); | |
| 145 | |
| 146 // Test invalid file element | |
| 147 files->Set(0, Value::CreateIntegerValue(42)); | |
| 148 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 149 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidFileError)); | |
| 150 | |
| 151 // Test too many file elements (more than one not yet supported) | |
| 152 files->Set(0, Value::CreateStringValue("foo.js")); | |
| 153 files->Set(1, Value::CreateStringValue("bar.js")); | |
| 154 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | |
| 155 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidFileCountError)); | |
| 156 } | 64 } |
| 157 | 65 |
| 158 TEST(ExtensionTest, InitFromValueValid) { | 66 TEST(ExtensionTest, InitFromValueValid) { |
| 159 #if defined(OS_WIN) | 67 Extension extension; |
| 160 FilePath path(FILE_PATH_LITERAL("C:\\foo")); | |
| 161 #elif defined(OS_POSIX) | |
| 162 FilePath path(FILE_PATH_LITERAL("/foo")); | |
| 163 #endif | |
| 164 Extension extension(path); | |
| 165 std::string error; | 68 std::string error; |
| 166 DictionaryValue input_value; | 69 DictionaryValue input_value; |
| 70 DictionaryValue output_value; |
| 167 | 71 |
| 168 // Test minimal extension | 72 // Test minimal extension |
| 169 input_value.SetInteger(Extension::kFormatVersionKey, 1); | 73 input_value.SetInteger(Extension::kFormatVersionKey, 1); |
| 170 input_value.SetString(Extension::kIdKey, "com.google.myextension"); | 74 input_value.SetString(Extension::kIdKey, L"com.google.myextension"); |
| 171 input_value.SetString(Extension::kVersionKey, "1.0"); | 75 input_value.SetString(Extension::kVersionKey, L"1.0"); |
| 172 input_value.SetString(Extension::kNameKey, "my extension"); | 76 input_value.SetString(Extension::kNameKey, L"my extension"); |
| 173 | 77 |
| 174 EXPECT_TRUE(extension.InitFromValue(input_value, &error)); | 78 EXPECT_TRUE(extension.InitFromValue(input_value, &error)); |
| 175 EXPECT_EQ("", error); | 79 extension.CopyToValue(&output_value); |
| 176 EXPECT_EQ("com.google.myextension", extension.id()); | 80 EXPECT_TRUE(input_value.Equals(&output_value)); |
| 177 EXPECT_EQ("1.0", extension.version()); | 81 |
| 178 EXPECT_EQ("my extension", extension.name()); | 82 // Test with a description |
| 179 EXPECT_EQ("chrome-extension://com.google.myextension/", | 83 input_value.SetString(Extension::kDescriptionKey, |
| 180 extension.url().spec()); | 84 L"my extension does things"); |
| 181 EXPECT_EQ(path.value(), extension.path().value()); | 85 EXPECT_TRUE(extension.InitFromValue(input_value, &error)); |
| 86 extension.CopyToValue(&output_value); |
| 87 EXPECT_TRUE(input_value.Equals(&output_value)); |
| 88 |
| 89 // Test content_scripts |
| 90 ListValue* content_scripts = new ListValue(); |
| 91 input_value.Set(Extension::kContentScriptsKey, content_scripts); |
| 92 content_scripts->Set(0, Value::CreateStringValue(L"foo/bar.js")); |
| 93 content_scripts->Set(1, Value::CreateStringValue(L"hot/dog.js")); |
| 94 EXPECT_TRUE(extension.InitFromValue(input_value, &error)); |
| 95 extension.CopyToValue(&output_value); |
| 96 EXPECT_TRUE(input_value.Equals(&output_value)); |
| 182 } | 97 } |
| 183 | |
| 184 TEST(ExtensionTest, GetResourceURLAndPath) { | |
| 185 #if defined(OS_WIN) | |
| 186 FilePath path(FILE_PATH_LITERAL("C:\\foo")); | |
| 187 #elif defined(OS_POSIX) | |
| 188 FilePath path(FILE_PATH_LITERAL("/foo")); | |
| 189 #endif | |
| 190 Extension extension(path); | |
| 191 DictionaryValue input_value; | |
| 192 input_value.SetInteger(Extension::kFormatVersionKey, 1); | |
| 193 input_value.SetString(Extension::kIdKey, "com.google.myextension"); | |
| 194 input_value.SetString(Extension::kVersionKey, "1.0"); | |
| 195 input_value.SetString(Extension::kNameKey, "my extension"); | |
| 196 EXPECT_TRUE(extension.InitFromValue(input_value, NULL)); | |
| 197 | |
| 198 EXPECT_EQ(extension.url().spec() + "bar/baz.js", | |
| 199 Extension::GetResourceURL(extension.url(), "bar/baz.js").spec()); | |
| 200 EXPECT_EQ(extension.url().spec() + "baz.js", | |
| 201 Extension::GetResourceURL(extension.url(), "bar/../baz.js").spec()); | |
| 202 EXPECT_EQ(extension.url().spec() + "baz.js", | |
| 203 Extension::GetResourceURL(extension.url(), "../baz.js").spec()); | |
| 204 | |
| 205 EXPECT_EQ(path.Append(FILE_PATH_LITERAL("bar")) | |
| 206 .Append(FILE_PATH_LITERAL("baz.js")).value(), | |
| 207 Extension::GetResourcePath(extension.path(), "bar/baz.js").value()); | |
| 208 EXPECT_EQ(path.Append(FILE_PATH_LITERAL("baz.js")).value(), | |
| 209 Extension::GetResourcePath(extension.path(), "bar/../baz.js") | |
| 210 .value()); | |
| 211 EXPECT_EQ(FilePath().value(), | |
| 212 Extension::GetResourcePath(extension.path(), "../baz.js").value()); | |
| 213 } | |
| OLD | NEW |