Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(125)

Side by Side Diff: chrome/browser/extensions/extension_unittest.cc

Issue 18352: Miscellaneous changes to Extension class in prep for user scripts (Closed)
Patch Set: be more paranoid about accessing string indexes than is probably warranted Created 11 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_protocols_unittest.cc ('k') | chrome/browser/extensions/extensions_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698