Index: chrome/browser/extensions/api/file_system/file_system_api_unittest.cc |
diff --git a/chrome/browser/extensions/api/file_system/file_system_api_unittest.cc b/chrome/browser/extensions/api/file_system/file_system_api_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..68ca44efcfbbff069846d37d0c6f4a574b49937c |
--- /dev/null |
+++ b/chrome/browser/extensions/api/file_system/file_system_api_unittest.cc |
@@ -0,0 +1,187 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/file_path.h" |
+#include "base/file_util.h" |
+#include "base/string_split.h" |
+#include "base/utf_string_conversions.h" |
+#include "chrome/browser/extensions/api/file_system/file_system_api.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/base/dialogs/select_file_dialog.h" |
+ |
+using extensions::FileSystemChooseFileFunction; |
+using extensions::api::file_system::AcceptOption; |
+ |
+namespace { |
+ |
+void CheckExtensions(std::vector<FilePath::StringType>& expected, |
+ std::vector<FilePath::StringType>& actual) { |
+ EXPECT_EQ(expected.size(), actual.size()); |
+ if (expected.size() != actual.size()) |
+ return; |
+ |
+ for (size_t i = 0; i < expected.size(); ++i) { |
+ EXPECT_EQ(expected[i], actual[i]); |
+ } |
+} |
+ |
+AcceptOption* BuildAcceptOption(std::string description, |
+ std::string mime_types, |
+ std::string extensions) { |
+ AcceptOption* option = new AcceptOption(); |
+ |
+ if (!description.empty()) |
+ option->description.reset(new std::string(description)); |
+ |
+ if (!mime_types.empty()) { |
+ option->mime_types.reset(new std::vector<std::string>()); |
+ base::SplitString(mime_types, ',', option->mime_types.get()); |
+ } |
+ |
+ if (!extensions.empty()) { |
+ option->extensions.reset(new std::vector<std::string>()); |
+ base::SplitString(extensions, ',', option->extensions.get()); |
+ } |
+ |
+ return option; |
+} |
+ |
+#if defined(OS_WIN) |
+#define ToStringType UTF8ToWide |
+#else |
+#define ToStringType |
+#endif |
+ |
+} // namespace |
+ |
+class FileSystemApiUnitTest : public testing::Test { |
+}; |
+ |
+TEST_F(FileSystemApiUnitTest, FileSystemChooseFileFunctionFileTypeInfoTest) { |
+ // AcceptsAllTypes is ignored when no other extensions are available. |
+ ui::SelectFileDialog::FileTypeInfo file_type_info; |
+ bool acceptsAllTypes = false; |
+ FileSystemChooseFileFunction::BuildFileTypeInfo(&file_type_info, |
+ FilePath::StringType(), NULL, &acceptsAllTypes); |
+ EXPECT_TRUE(file_type_info.include_all_files); |
+ EXPECT_TRUE(file_type_info.extensions.empty()); |
+ |
+ // Test grouping of multiple types. |
+ file_type_info = ui::SelectFileDialog::FileTypeInfo(); |
+ std::vector<linked_ptr<AcceptOption> > options; |
+ options.push_back(linked_ptr<AcceptOption>( |
+ BuildAcceptOption("", "application/x-chrome-extension", "jso"))); |
+ acceptsAllTypes = false; |
+ FileSystemChooseFileFunction::BuildFileTypeInfo(&file_type_info, |
+ FilePath::StringType(), &options, &acceptsAllTypes); |
+ EXPECT_FALSE(file_type_info.include_all_files); |
+ ASSERT_EQ(file_type_info.extensions.size(), (size_t) 1); |
+ EXPECT_TRUE(file_type_info.extension_description_overrides[0].empty()) << |
+ "No override must be specified for boring accept types"; |
+ // Note here (and below) that the expectedTypes are sorted, because we use a |
+ // set internally to generate the output: thus, the output is sorted. |
+ std::vector<FilePath::StringType> expectedTypes; |
+ expectedTypes.push_back(ToStringType("crx")); |
+ expectedTypes.push_back(ToStringType("jso")); |
+ CheckExtensions(expectedTypes, file_type_info.extensions[0]); |
+ |
+ // Test that not satisfying the extension will force all types. |
+ file_type_info = ui::SelectFileDialog::FileTypeInfo(); |
+ options.clear(); |
+ options.push_back(linked_ptr<AcceptOption>( |
+ BuildAcceptOption("", "", "unrelated"))); |
+ acceptsAllTypes = false; |
+ FileSystemChooseFileFunction::BuildFileTypeInfo(&file_type_info, |
+ ToStringType(".jso"), &options, &acceptsAllTypes); |
+ EXPECT_TRUE(file_type_info.include_all_files); |
+ |
+ // Test multiple list entries, all containing their own types. |
+ file_type_info = ui::SelectFileDialog::FileTypeInfo(); |
+ options.clear(); |
+ options.push_back(linked_ptr<AcceptOption>( |
+ BuildAcceptOption("", "", "jso,js"))); |
+ options.push_back(linked_ptr<AcceptOption>( |
+ BuildAcceptOption("", "", "cpp,cc"))); |
+ acceptsAllTypes = false; |
+ FileSystemChooseFileFunction::BuildFileTypeInfo(&file_type_info, |
+ FilePath::StringType(), &options, &acceptsAllTypes); |
+ ASSERT_EQ(file_type_info.extensions.size(), options.size()); |
+ |
+ expectedTypes.clear(); |
+ expectedTypes.push_back(ToStringType("js")); |
+ expectedTypes.push_back(ToStringType("jso")); |
+ CheckExtensions(expectedTypes, file_type_info.extensions[0]); |
+ |
+ expectedTypes.clear(); |
+ expectedTypes.push_back(ToStringType("cc")); |
+ expectedTypes.push_back(ToStringType("cpp")); |
+ CheckExtensions(expectedTypes, file_type_info.extensions[1]); |
+ |
+ // Test accept type that causes description override. |
+ file_type_info = ui::SelectFileDialog::FileTypeInfo(); |
+ options.clear(); |
+ options.push_back(linked_ptr<AcceptOption>( |
+ BuildAcceptOption("", "image/*", "html"))); |
+ acceptsAllTypes = false; |
+ FileSystemChooseFileFunction::BuildFileTypeInfo(&file_type_info, |
+ FilePath::StringType(), &options, &acceptsAllTypes); |
+ ASSERT_EQ(file_type_info.extension_description_overrides.size(), (size_t) 1); |
+ EXPECT_FALSE(file_type_info.extension_description_overrides[0].empty()) << |
+ "Accept type \"image/*\" must generate description override"; |
+ |
+ // Test multiple accept types that cause description override causes us to |
+ // still present the default. |
+ file_type_info = ui::SelectFileDialog::FileTypeInfo(); |
+ options.clear(); |
+ options.push_back(linked_ptr<AcceptOption>( |
+ BuildAcceptOption("", "image/*,audio/*,video/*", ""))); |
+ acceptsAllTypes = false; |
+ FileSystemChooseFileFunction::BuildFileTypeInfo(&file_type_info, |
+ FilePath::StringType(), &options, &acceptsAllTypes); |
+ ASSERT_EQ(file_type_info.extension_description_overrides.size(), (size_t) 1); |
+ EXPECT_TRUE(file_type_info.extension_description_overrides[0].empty()); |
+ |
+ // Test explicit description override. |
+ file_type_info = ui::SelectFileDialog::FileTypeInfo(); |
+ options.clear(); |
+ options.push_back(linked_ptr<AcceptOption>( |
+ BuildAcceptOption("File Types 101", "image/jpeg", ""))); |
+ acceptsAllTypes = false; |
+ FileSystemChooseFileFunction::BuildFileTypeInfo(&file_type_info, |
+ FilePath::StringType(), &options, &acceptsAllTypes); |
+ EXPECT_EQ(file_type_info.extension_description_overrides[0], |
+ UTF8ToUTF16("File Types 101")); |
+} |
+ |
+TEST_F(FileSystemApiUnitTest, FileSystemChooseFileFunctionSuggestionTest) { |
+ std::string opt_name; |
+ FilePath suggested_name; |
+ FilePath::StringType suggested_extension; |
+ |
+ opt_name = std::string("normal_path.txt"); |
+ FileSystemChooseFileFunction::BuildSuggestion(&opt_name, &suggested_name, |
+ &suggested_extension); |
+ EXPECT_FALSE(suggested_name.IsAbsolute()); |
+ EXPECT_EQ(suggested_name.MaybeAsASCII(), "normal_path.txt"); |
+ EXPECT_EQ(suggested_extension, ToStringType("txt")); |
+ |
+ // We should provide just the basename, i.e., "path". |
+ opt_name = std::string("/a/bad/path"); |
+ FileSystemChooseFileFunction::BuildSuggestion(&opt_name, &suggested_name, |
+ &suggested_extension); |
+ EXPECT_FALSE(suggested_name.IsAbsolute()); |
+ EXPECT_EQ(suggested_name.MaybeAsASCII(), "path"); |
+ EXPECT_TRUE(suggested_extension.empty()); |
+ |
+#if !defined(OS_WIN) |
+ // TODO(thorogood): Fix this test on Windows. |
+ // Filter out absolute paths with no basename. |
+ opt_name = std::string("/"); |
+ FileSystemChooseFileFunction::BuildSuggestion(&opt_name, &suggested_name, |
+ &suggested_extension); |
+ EXPECT_FALSE(suggested_name.IsAbsolute()); |
+ EXPECT_TRUE(suggested_name.MaybeAsASCII().empty()); |
+ EXPECT_TRUE(suggested_extension.empty()); |
+#endif |
+} |