1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 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
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/create_directory.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string>
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <vector>
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/files/file.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/files/file_path.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_vector.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/file_system_provider/operations/test_util.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/extensions/api/file_system_provider.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/extensions/api/file_system_provider_internal.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/event_router.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace chromeos {
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace file_system_provider {
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace operations {
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj";
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kFileSystemId[] = "testing-file-system";
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kRequestId = 2;
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst base::FilePath::CharType kDirectoryPath[] = "/kitty/and/puppy/happy";
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass FileSystemProviderOperationsCreateDirectoryTest : public testing::Test {
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FileSystemProviderOperationsCreateDirectoryTest() {}
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~FileSystemProviderOperationsCreateDirectoryTest() {}
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetUp() OVERRIDE {
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    file_system_info_ =
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ProvidedFileSystemInfo(kExtensionId,
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               kFileSystemId,
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               "" /* file_system_name */,
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               true /* writable */,
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               base::FilePath() /* mount_path */);
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ProvidedFileSystemInfo file_system_info_;
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
51116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileSystemProviderOperationsCreateDirectoryTest, Execute) {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  using extensions::api::file_system_provider::CreateDirectoryRequestedOptions;
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::StatusCallbackLog callback_log;
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateDirectory create_directory(
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NULL,
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      file_system_info_,
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::FilePath::FromUTF8Unsafe(kDirectoryPath),
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      true /* recursive */,
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&util::LogStatusCallback, &callback_log));
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  create_directory.SetDispatchEventImplForTesting(
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Unretained(&dispatcher)));
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(create_directory.Execute(kRequestId));
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1u, dispatcher.events().size());
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extensions::Event* event = dispatcher.events()[0];
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(extensions::api::file_system_provider::OnCreateDirectoryRequested::
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                kEventName,
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            event->event_name);
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::ListValue* event_args = event->event_args.get();
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1u, event_args->GetSize());
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const base::DictionaryValue* options_as_value = NULL;
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(event_args->GetDictionary(0, &options_as_value));
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CreateDirectoryRequestedOptions options;
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateDirectoryRequestedOptions::Populate(*options_as_value, &options));
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kFileSystemId, options.file_system_id);
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kRequestId, options.request_id);
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kDirectoryPath, options.directory_path);
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(options.recursive);
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
89116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileSystemProviderOperationsCreateDirectoryTest, Execute_NoListener) {
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::LoggingDispatchEventImpl dispatcher(false /* dispatch_reply */);
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::StatusCallbackLog callback_log;
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateDirectory create_directory(
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NULL,
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      file_system_info_,
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::FilePath::FromUTF8Unsafe(kDirectoryPath),
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      true /* recursive */,
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&util::LogStatusCallback, &callback_log));
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  create_directory.SetDispatchEventImplForTesting(
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Unretained(&dispatcher)));
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(create_directory.Execute(kRequestId));
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsCreateDirectoryTest, Execute_ReadOnly) {
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::StatusCallbackLog callback_log;
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const ProvidedFileSystemInfo read_only_file_system_info(
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      kExtensionId,
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      kFileSystemId,
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "" /* file_system_name */,
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      false /* writable */,
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::FilePath() /* mount_path */);
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CreateDirectory create_directory(
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      NULL,
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      read_only_file_system_info,
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::FilePath::FromUTF8Unsafe(kDirectoryPath),
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      true /* recursive */,
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&util::LogStatusCallback, &callback_log));
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  create_directory.SetDispatchEventImplForTesting(
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Unretained(&dispatcher)));
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(create_directory.Execute(kRequestId));
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
130116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileSystemProviderOperationsCreateDirectoryTest, OnSuccess) {
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::StatusCallbackLog callback_log;
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateDirectory create_directory(
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NULL,
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      file_system_info_,
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::FilePath::FromUTF8Unsafe(kDirectoryPath),
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      true /* recursive */,
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&util::LogStatusCallback, &callback_log));
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  create_directory.SetDispatchEventImplForTesting(
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Unretained(&dispatcher)));
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(create_directory.Execute(kRequestId));
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  create_directory.OnSuccess(kRequestId,
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             scoped_ptr<RequestValue>(new RequestValue()),
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             false /* has_more */);
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1u, callback_log.size());
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(base::File::FILE_OK, callback_log[0]);
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
153116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileSystemProviderOperationsCreateDirectoryTest, OnError) {
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::StatusCallbackLog callback_log;
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateDirectory create_directory(
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NULL,
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      file_system_info_,
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::FilePath::FromUTF8Unsafe(kDirectoryPath),
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      true /* recursive */,
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&util::LogStatusCallback, &callback_log));
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  create_directory.SetDispatchEventImplForTesting(
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Unretained(&dispatcher)));
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(create_directory.Execute(kRequestId));
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  create_directory.OnError(kRequestId,
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           scoped_ptr<RequestValue>(new RequestValue()),
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           base::File::FILE_ERROR_TOO_MANY_OPENED);
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1u, callback_log.size());
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, callback_log[0]);
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace operations
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace file_system_provider
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace chromeos
179