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