1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/api/file_handlers/mime_util.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string> 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <vector> 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/files/file_path.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/run_loop.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/test/base/testing_profile.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/browser_thread.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/test/test_file_system_context.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/test/test_utils.h" 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace extensions { 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace app_file_handler_util { 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kOrigin[] = "chrome-extension://cmalghjoncmjoeakimpfhojhpgemgaje"; 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJPEGExtensionFilePath[] = "/fake/path/foo.jpg"; 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJPEGExtensionUpperCaseFilePath[] = "/fake/path/FOO.JPG"; 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Saves the returned mime type to a variable. 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid OnMimeTypeResult(std::string* output, const std::string& mime_type) { 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *output = mime_type; 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Saves returned mime types to a vector. 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid OnMimeTypesCollected(std::vector<std::string>* output, 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<std::vector<std::string> > mime_types) { 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *output = *mime_types; 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Creates a native local file system URL for a local path. 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::FileSystemURL CreateNativeLocalFileSystemURL( 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemContext* context, 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath local_path) { 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return context->CreateCrackedFileSystemURL( 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GURL(kOrigin), storage::kFileSystemTypeNativeLocal, local_path); 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass FileHandlersMimeUtilTest : public testing::Test { 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected: 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FileHandlersMimeUtilTest() {} 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~FileHandlersMimeUtilTest() {} 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void SetUp() OVERRIDE { 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(data_dir_.CreateUniqueTempDir()); 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch file_system_context_ = 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::CreateFileSystemContextForTesting(NULL, data_dir_.path()); 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(base::CreateTemporaryFile(&html_mime_file_path_)); 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string kSampleContent = "<html><body></body></html>"; 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(base::WriteFile( 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch html_mime_file_path_, kSampleContent.c_str(), kSampleContent.size())); 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::TestBrowserThreadBundle thread_bundle_; 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestingProfile profile_; 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<storage::FileSystemContext> file_system_context_; 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::ScopedTempDir data_dir_; 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath html_mime_file_path_; 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 73116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileHandlersMimeUtilTest, GetMimeTypeForLocalPath) { 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string result; 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetMimeTypeForLocalPath( 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &profile_, 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath::FromUTF8Unsafe(kJPEGExtensionFilePath), 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&OnMimeTypeResult, &result)); 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ("image/jpeg", result); 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string result; 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetMimeTypeForLocalPath( 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &profile_, 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath::FromUTF8Unsafe(kJPEGExtensionUpperCaseFilePath), 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&OnMimeTypeResult, &result)); 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ("image/jpeg", result); 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string result; 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetMimeTypeForLocalPath(&profile_, 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch html_mime_file_path_, 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&OnMimeTypeResult, &result)); 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ("text/html", result); 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 104116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileHandlersMimeUtilTest, MimeTypeCollector_ForURLs) { 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MimeTypeCollector collector(&profile_); 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::vector<storage::FileSystemURL> urls; 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch urls.push_back(CreateNativeLocalFileSystemURL( 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file_system_context_.get(), 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath::FromUTF8Unsafe(kJPEGExtensionFilePath))); 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch urls.push_back(CreateNativeLocalFileSystemURL( 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file_system_context_.get(), 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath::FromUTF8Unsafe(kJPEGExtensionUpperCaseFilePath))); 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci urls.push_back(CreateNativeLocalFileSystemURL(file_system_context_.get(), 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch html_mime_file_path_)); 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<std::string> result; 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch collector.CollectForURLs(urls, base::Bind(&OnMimeTypesCollected, &result)); 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(3u, result.size()); 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ("image/jpeg", result[0]); 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ("image/jpeg", result[1]); 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ("text/html", result[2]); 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 127116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileHandlersMimeUtilTest, MimeTypeCollector_ForLocalPaths) { 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MimeTypeCollector collector(&profile_); 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<base::FilePath> local_paths; 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch local_paths.push_back(base::FilePath::FromUTF8Unsafe(kJPEGExtensionFilePath)); 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch local_paths.push_back( 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath::FromUTF8Unsafe(kJPEGExtensionUpperCaseFilePath)); 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch local_paths.push_back(html_mime_file_path_); 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<std::string> result; 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch collector.CollectForLocalPaths(local_paths, 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&OnMimeTypesCollected, &result)); 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(3u, result.size()); 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ("image/jpeg", result[0]); 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ("image/jpeg", result[1]); 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ("text/html", result[2]); 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace app_file_handler_util 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace extensions 149