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" |
6 #include "chrome/browser/extensions/extension.h" | 7 #include "chrome/browser/extensions/extension.h" |
| 8 #include "chrome/common/chrome_paths.h" |
| 9 #include "chrome/common/json_value_serializer.h" |
7 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
8 | 11 |
9 class ExtensionTest : public testing::Test { | 12 class ExtensionTest : public testing::Test { |
10 }; | 13 }; |
11 | 14 |
12 TEST(ExtensionTest, InitFromValueInvalid) { | 15 TEST(ExtensionTest, InitFromValueInvalid) { |
13 Extension extension; | 16 #if defined(OS_WIN) |
| 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); |
14 std::string error; | 22 std::string error; |
15 | 23 |
16 // Test invalid format version | 24 // Start with a valid extension manifest |
17 DictionaryValue input_value; | 25 std::wstring extensions_dir; |
18 input_value.SetInteger(Extension::kFormatVersionKey, 2); | 26 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_dir)); |
19 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); | 27 FilePath extensions_path = FilePath::FromWStringHack(extensions_dir) |
| 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)); |
20 EXPECT_EQ(Extension::kInvalidFormatVersionError, error); | 46 EXPECT_EQ(Extension::kInvalidFormatVersionError, error); |
21 input_value.SetInteger(Extension::kFormatVersionKey, 1); | 47 |
| 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); |
22 | 55 |
23 // Test missing and invalid ids | 56 // Test missing and invalid ids |
24 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); | 57 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); |
| 58 input_value->Remove(Extension::kIdKey, NULL); |
| 59 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
25 EXPECT_EQ(Extension::kInvalidIdError, error); | 60 EXPECT_EQ(Extension::kInvalidIdError, error); |
26 input_value.SetInteger(Extension::kIdKey, 42); | 61 |
27 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); | 62 input_value->SetInteger(Extension::kIdKey, 42); |
| 63 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
28 EXPECT_EQ(Extension::kInvalidIdError, error); | 64 EXPECT_EQ(Extension::kInvalidIdError, error); |
29 input_value.SetString(Extension::kIdKey, L"com.google.myextension"); | |
30 | 65 |
31 // Test missing and invalid versions | 66 // Test missing and invalid versions |
32 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); | 67 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); |
| 68 input_value->Remove(Extension::kVersionKey, NULL); |
| 69 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
33 EXPECT_EQ(Extension::kInvalidVersionError, error); | 70 EXPECT_EQ(Extension::kInvalidVersionError, error); |
34 input_value.SetInteger(Extension::kVersionKey, 42); | 71 |
35 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); | 72 input_value->SetInteger(Extension::kVersionKey, 42); |
| 73 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
36 EXPECT_EQ(Extension::kInvalidVersionError, error); | 74 EXPECT_EQ(Extension::kInvalidVersionError, error); |
37 input_value.SetString(Extension::kVersionKey, L"1.0"); | |
38 | 75 |
39 // Test missing and invalid names | 76 // Test missing and invalid names |
40 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); | 77 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); |
| 78 input_value->Remove(Extension::kNameKey, NULL); |
| 79 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
41 EXPECT_EQ(Extension::kInvalidNameError, error); | 80 EXPECT_EQ(Extension::kInvalidNameError, error); |
42 input_value.SetInteger(Extension::kNameKey, 42); | 81 |
43 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); | 82 input_value->SetInteger(Extension::kNameKey, 42); |
| 83 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
44 EXPECT_EQ(Extension::kInvalidNameError, error); | 84 EXPECT_EQ(Extension::kInvalidNameError, error); |
45 input_value.SetString(Extension::kNameKey, L"my extension"); | |
46 | 85 |
47 // Test invalid description | 86 // Test invalid description |
48 input_value.SetInteger(Extension::kDescriptionKey, 42); | 87 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); |
49 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); | 88 input_value->SetInteger(Extension::kDescriptionKey, 42); |
| 89 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
50 EXPECT_EQ(Extension::kInvalidDescriptionError, error); | 90 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); |
57 | 97 |
58 // Test invalid content script item | 98 // Test invalid user script item |
59 ListValue* content_scripts = new ListValue; | 99 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); |
60 input_value.Set(Extension::kContentScriptsKey, content_scripts); | 100 ListValue* user_scripts = NULL; |
61 content_scripts->Set(0, Value::CreateIntegerValue(42)); | 101 input_value->GetList(Extension::kUserScriptsKey, &user_scripts); |
62 EXPECT_FALSE(extension.InitFromValue(input_value, &error)); | 102 user_scripts->Set(0, Value::CreateIntegerValue(42)); |
63 EXPECT_EQ(0u, error.find(Extension::kInvalidContentScriptError)); | 103 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
| 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)); |
64 } | 156 } |
65 | 157 |
66 TEST(ExtensionTest, InitFromValueValid) { | 158 TEST(ExtensionTest, InitFromValueValid) { |
67 Extension extension; | 159 #if defined(OS_WIN) |
| 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); |
68 std::string error; | 165 std::string error; |
69 DictionaryValue input_value; | 166 DictionaryValue input_value; |
70 DictionaryValue output_value; | |
71 | 167 |
72 // Test minimal extension | 168 // Test minimal extension |
73 input_value.SetInteger(Extension::kFormatVersionKey, 1); | 169 input_value.SetInteger(Extension::kFormatVersionKey, 1); |
74 input_value.SetString(Extension::kIdKey, L"com.google.myextension"); | 170 input_value.SetString(Extension::kIdKey, "com.google.myextension"); |
75 input_value.SetString(Extension::kVersionKey, L"1.0"); | 171 input_value.SetString(Extension::kVersionKey, "1.0"); |
76 input_value.SetString(Extension::kNameKey, L"my extension"); | 172 input_value.SetString(Extension::kNameKey, "my extension"); |
77 | 173 |
78 EXPECT_TRUE(extension.InitFromValue(input_value, &error)); | 174 EXPECT_TRUE(extension.InitFromValue(input_value, &error)); |
79 extension.CopyToValue(&output_value); | 175 EXPECT_EQ("", error); |
80 EXPECT_TRUE(input_value.Equals(&output_value)); | 176 EXPECT_EQ("com.google.myextension", extension.id()); |
81 | 177 EXPECT_EQ("1.0", extension.version()); |
82 // Test with a description | 178 EXPECT_EQ("my extension", extension.name()); |
83 input_value.SetString(Extension::kDescriptionKey, | 179 EXPECT_EQ("chrome-extension://com.google.myextension/", |
84 L"my extension does things"); | 180 extension.url().spec()); |
85 EXPECT_TRUE(extension.InitFromValue(input_value, &error)); | 181 EXPECT_EQ(path.value(), extension.path().value()); |
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)); | |
97 } | 182 } |
| 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 |