summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions/extension_unittest.cc')
-rw-r--r--chrome/browser/extensions/extension_unittest.cc226
1 files changed, 171 insertions, 55 deletions
diff --git a/chrome/browser/extensions/extension_unittest.cc b/chrome/browser/extensions/extension_unittest.cc
index 71812b9..83973dd 100644
--- a/chrome/browser/extensions/extension_unittest.cc
+++ b/chrome/browser/extensions/extension_unittest.cc
@@ -3,95 +3,211 @@
// found in the LICENSE file.
#include "base/string_util.h"
+#include "base/path_service.h"
#include "chrome/browser/extensions/extension.h"
+#include "chrome/common/chrome_paths.h"
+#include "chrome/common/json_value_serializer.h"
#include "testing/gtest/include/gtest/gtest.h"
class ExtensionTest : public testing::Test {
};
TEST(ExtensionTest, InitFromValueInvalid) {
- Extension extension;
+#if defined(OS_WIN)
+ FilePath path(FILE_PATH_LITERAL("c:\\foo"));
+#elif defined(OS_POSIX)
+ FilePath path(FILE_PATH_LITERAL("/foo"));
+#endif
+ Extension extension(path);
std::string error;
- // Test invalid format version
- DictionaryValue input_value;
- input_value.SetInteger(Extension::kFormatVersionKey, 2);
- EXPECT_FALSE(extension.InitFromValue(input_value, &error));
+ // Start with a valid extension manifest
+ std::wstring extensions_dir;
+ ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_dir));
+ FilePath extensions_path = FilePath::FromWStringHack(extensions_dir)
+ .Append(FILE_PATH_LITERAL("extensions"))
+ .Append(FILE_PATH_LITERAL("extension1"))
+ .Append(FILE_PATH_LITERAL("manifest"));
+
+ JSONFileValueSerializer serializer(extensions_path.ToWStringHack());
+ scoped_ptr<DictionaryValue> valid_value(
+ static_cast<DictionaryValue*>(serializer.Deserialize(&error)));
+ ASSERT_TRUE(valid_value.get());
+ ASSERT_EQ("", error);
+ ASSERT_TRUE(extension.InitFromValue(*valid_value, &error));
+ ASSERT_EQ("", error);
+
+ scoped_ptr<DictionaryValue> input_value;
+
+ // Test missing and invalid format versions
+ input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy()));
+ input_value->Remove(Extension::kFormatVersionKey, NULL);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
+ EXPECT_EQ(Extension::kInvalidFormatVersionError, error);
+
+ input_value->SetString(Extension::kFormatVersionKey, "foo");
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
+ EXPECT_EQ(Extension::kInvalidFormatVersionError, error);
+
+ input_value->SetInteger(Extension::kFormatVersionKey, 2);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
EXPECT_EQ(Extension::kInvalidFormatVersionError, error);
- input_value.SetInteger(Extension::kFormatVersionKey, 1);
// Test missing and invalid ids
- EXPECT_FALSE(extension.InitFromValue(input_value, &error));
+ input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy()));
+ input_value->Remove(Extension::kIdKey, NULL);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
EXPECT_EQ(Extension::kInvalidIdError, error);
- input_value.SetInteger(Extension::kIdKey, 42);
- EXPECT_FALSE(extension.InitFromValue(input_value, &error));
+
+ input_value->SetInteger(Extension::kIdKey, 42);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
EXPECT_EQ(Extension::kInvalidIdError, error);
- input_value.SetString(Extension::kIdKey, L"com.google.myextension");
// Test missing and invalid versions
- EXPECT_FALSE(extension.InitFromValue(input_value, &error));
+ input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy()));
+ input_value->Remove(Extension::kVersionKey, NULL);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
EXPECT_EQ(Extension::kInvalidVersionError, error);
- input_value.SetInteger(Extension::kVersionKey, 42);
- EXPECT_FALSE(extension.InitFromValue(input_value, &error));
+
+ input_value->SetInteger(Extension::kVersionKey, 42);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
EXPECT_EQ(Extension::kInvalidVersionError, error);
- input_value.SetString(Extension::kVersionKey, L"1.0");
// Test missing and invalid names
- EXPECT_FALSE(extension.InitFromValue(input_value, &error));
+ input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy()));
+ input_value->Remove(Extension::kNameKey, NULL);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
EXPECT_EQ(Extension::kInvalidNameError, error);
- input_value.SetInteger(Extension::kNameKey, 42);
- EXPECT_FALSE(extension.InitFromValue(input_value, &error));
+
+ input_value->SetInteger(Extension::kNameKey, 42);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
EXPECT_EQ(Extension::kInvalidNameError, error);
- input_value.SetString(Extension::kNameKey, L"my extension");
// Test invalid description
- input_value.SetInteger(Extension::kDescriptionKey, 42);
- EXPECT_FALSE(extension.InitFromValue(input_value, &error));
+ input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy()));
+ input_value->SetInteger(Extension::kDescriptionKey, 42);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
EXPECT_EQ(Extension::kInvalidDescriptionError, error);
- input_value.Remove(Extension::kDescriptionKey, NULL);
-
- // Test invalid content scripts list
- input_value.SetInteger(Extension::kContentScriptsKey, 42);
- EXPECT_FALSE(extension.InitFromValue(input_value, &error));
- EXPECT_EQ(Extension::kInvalidContentScriptsListError, error);
-
- // Test invalid content script item
- ListValue* content_scripts = new ListValue;
- input_value.Set(Extension::kContentScriptsKey, content_scripts);
- content_scripts->Set(0, Value::CreateIntegerValue(42));
- EXPECT_FALSE(extension.InitFromValue(input_value, &error));
- EXPECT_EQ(0u, error.find(Extension::kInvalidContentScriptError));
+
+ // Test invalid user scripts list
+ input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy()));
+ input_value->SetInteger(Extension::kUserScriptsKey, 42);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
+ EXPECT_EQ(Extension::kInvalidUserScriptsListError, error);
+
+ // Test invalid user script item
+ input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy()));
+ ListValue* user_scripts = NULL;
+ input_value->GetList(Extension::kUserScriptsKey, &user_scripts);
+ user_scripts->Set(0, Value::CreateIntegerValue(42));
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
+ EXPECT_TRUE(MatchPattern(error, Extension::kInvalidUserScriptError));
+
+ // Test missing and invalid matches array
+ input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy()));
+ input_value->GetList(Extension::kUserScriptsKey, &user_scripts);
+ DictionaryValue* user_script = NULL;
+ user_scripts->GetDictionary(0, &user_script);
+ user_script->Remove(Extension::kMatchesKey, NULL);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
+ EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchesError));
+
+ user_script->Set(Extension::kMatchesKey, Value::CreateIntegerValue(42));
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
+ EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchesError));
+
+ ListValue* matches = new ListValue;
+ user_script->Set(Extension::kMatchesKey, matches);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
+ EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchCountError));
+
+ // Test invalid match element
+ matches->Set(0, Value::CreateIntegerValue(42));
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
+ EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchError));
+
+ // Test missing and invalid files array
+ input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy()));
+ input_value->GetList(Extension::kUserScriptsKey, &user_scripts);
+ user_scripts->GetDictionary(0, &user_script);
+ user_script->Remove(Extension::kFilesKey, NULL);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
+ EXPECT_TRUE(MatchPattern(error, Extension::kInvalidFilesError));
+
+ user_script->Set(Extension::kFilesKey, Value::CreateIntegerValue(42));
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
+ EXPECT_TRUE(MatchPattern(error, Extension::kInvalidFilesError));
+
+ ListValue* files = new ListValue;
+ user_script->Set(Extension::kFilesKey, files);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
+ EXPECT_TRUE(MatchPattern(error, Extension::kInvalidFileCountError));
+
+ // Test invalid file element
+ files->Set(0, Value::CreateIntegerValue(42));
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
+ EXPECT_TRUE(MatchPattern(error, Extension::kInvalidFileError));
+
+ // Test too many file elements (more than one not yet supported)
+ files->Set(0, Value::CreateStringValue("foo.js"));
+ files->Set(1, Value::CreateStringValue("bar.js"));
+ EXPECT_FALSE(extension.InitFromValue(*input_value, &error));
+ EXPECT_TRUE(MatchPattern(error, Extension::kInvalidFileCountError));
}
TEST(ExtensionTest, InitFromValueValid) {
- Extension extension;
+#if defined(OS_WIN)
+ FilePath path(FILE_PATH_LITERAL("C:\\foo"));
+#elif defined(OS_POSIX)
+ FilePath path(FILE_PATH_LITERAL("/foo"));
+#endif
+ Extension extension(path);
std::string error;
DictionaryValue input_value;
- DictionaryValue output_value;
// Test minimal extension
input_value.SetInteger(Extension::kFormatVersionKey, 1);
- input_value.SetString(Extension::kIdKey, L"com.google.myextension");
- input_value.SetString(Extension::kVersionKey, L"1.0");
- input_value.SetString(Extension::kNameKey, L"my extension");
+ input_value.SetString(Extension::kIdKey, "com.google.myextension");
+ input_value.SetString(Extension::kVersionKey, "1.0");
+ input_value.SetString(Extension::kNameKey, "my extension");
EXPECT_TRUE(extension.InitFromValue(input_value, &error));
- extension.CopyToValue(&output_value);
- EXPECT_TRUE(input_value.Equals(&output_value));
+ EXPECT_EQ("", error);
+ EXPECT_EQ("com.google.myextension", extension.id());
+ EXPECT_EQ("1.0", extension.version());
+ EXPECT_EQ("my extension", extension.name());
+ EXPECT_EQ("chrome-extension://com.google.myextension/",
+ extension.url().spec());
+ EXPECT_EQ(path.value(), extension.path().value());
+}
- // Test with a description
- input_value.SetString(Extension::kDescriptionKey,
- L"my extension does things");
- EXPECT_TRUE(extension.InitFromValue(input_value, &error));
- extension.CopyToValue(&output_value);
- EXPECT_TRUE(input_value.Equals(&output_value));
-
- // Test content_scripts
- ListValue* content_scripts = new ListValue();
- input_value.Set(Extension::kContentScriptsKey, content_scripts);
- content_scripts->Set(0, Value::CreateStringValue(L"foo/bar.js"));
- content_scripts->Set(1, Value::CreateStringValue(L"hot/dog.js"));
- EXPECT_TRUE(extension.InitFromValue(input_value, &error));
- extension.CopyToValue(&output_value);
- EXPECT_TRUE(input_value.Equals(&output_value));
+TEST(ExtensionTest, GetResourceURLAndPath) {
+#if defined(OS_WIN)
+ FilePath path(FILE_PATH_LITERAL("C:\\foo"));
+#elif defined(OS_POSIX)
+ FilePath path(FILE_PATH_LITERAL("/foo"));
+#endif
+ Extension extension(path);
+ DictionaryValue input_value;
+ input_value.SetInteger(Extension::kFormatVersionKey, 1);
+ input_value.SetString(Extension::kIdKey, "com.google.myextension");
+ input_value.SetString(Extension::kVersionKey, "1.0");
+ input_value.SetString(Extension::kNameKey, "my extension");
+ EXPECT_TRUE(extension.InitFromValue(input_value, NULL));
+
+ EXPECT_EQ(extension.url().spec() + "bar/baz.js",
+ Extension::GetResourceURL(extension.url(), "bar/baz.js").spec());
+ EXPECT_EQ(extension.url().spec() + "baz.js",
+ Extension::GetResourceURL(extension.url(), "bar/../baz.js").spec());
+ EXPECT_EQ(extension.url().spec() + "baz.js",
+ Extension::GetResourceURL(extension.url(), "../baz.js").spec());
+
+ EXPECT_EQ(path.Append(FILE_PATH_LITERAL("bar"))
+ .Append(FILE_PATH_LITERAL("baz.js")).value(),
+ Extension::GetResourcePath(extension.path(), "bar/baz.js").value());
+ EXPECT_EQ(path.Append(FILE_PATH_LITERAL("baz.js")).value(),
+ Extension::GetResourcePath(extension.path(), "bar/../baz.js")
+ .value());
+ EXPECT_EQ(FilePath().value(),
+ Extension::GetResourcePath(extension.path(), "../baz.js").value());
}