15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/create_file.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <string>
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <vector>
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file_path.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_vector.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/test_util.h"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/common/extensions/api/file_system_provider.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/common/extensions/api/file_system_provider_internal.h"
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/event_router.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util.h"
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace chromeos {
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace file_system_provider {
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace operations {
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace {
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj";
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kFileSystemId[] = "testing-file-system";
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kRequestId = 2;
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const base::FilePath::CharType kFilePath[] = "/kitty/and/puppy/happy";
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class FileSystemProviderOperationsCreateFileTest : public testing::Test {
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected:
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FileSystemProviderOperationsCreateFileTest() {}
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~FileSystemProviderOperationsCreateFileTest() {}
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    file_system_info_ =
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ProvidedFileSystemInfo(kExtensionId,
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               kFileSystemId,
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               "" /* file_system_name */,
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               true /* writable */,
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               base::FilePath() /* mount_path */);
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ProvidedFileSystemInfo file_system_info_;
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsCreateFileTest, Execute) {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  using extensions::api::file_system_provider::CreateFileRequestedOptions;
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::StatusCallbackLog callback_log;
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CreateFile create_file(NULL,
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         file_system_info_,
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         base::FilePath::FromUTF8Unsafe(kFilePath),
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         base::Bind(&util::LogStatusCallback, &callback_log));
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  create_file.SetDispatchEventImplForTesting(
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Unretained(&dispatcher)));
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(create_file.Execute(kRequestId));
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1u, dispatcher.events().size());
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  extensions::Event* event = dispatcher.events()[0];
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::api::file_system_provider::OnCreateFileRequested::kEventName,
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      event->event_name);
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::ListValue* event_args = event->event_args.get();
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1u, event_args->GetSize());
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const base::DictionaryValue* options_as_value = NULL;
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(event_args->GetDictionary(0, &options_as_value));
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CreateFileRequestedOptions options;
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateFileRequestedOptions::Populate(*options_as_value, &options));
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kFileSystemId, options.file_system_id);
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kRequestId, options.request_id);
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kFilePath, options.file_path);
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsCreateFileTest, Execute_NoListener) {
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::LoggingDispatchEventImpl dispatcher(false /* dispatch_reply */);
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::StatusCallbackLog callback_log;
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CreateFile create_file(NULL,
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         file_system_info_,
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         base::FilePath::FromUTF8Unsafe(kFilePath),
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         base::Bind(&util::LogStatusCallback, &callback_log));
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  create_file.SetDispatchEventImplForTesting(
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Unretained(&dispatcher)));
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(create_file.Execute(kRequestId));
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsCreateFileTest, Execute_ReadOnly) {
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::StatusCallbackLog callback_log;
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const ProvidedFileSystemInfo read_only_file_system_info(
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      kExtensionId,
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      kFileSystemId,
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "" /* file_system_name */,
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      false /* writable */,
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::FilePath() /* mount_path */);
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CreateFile create_file(NULL,
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         read_only_file_system_info,
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         base::FilePath::FromUTF8Unsafe(kFilePath),
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         base::Bind(&util::LogStatusCallback, &callback_log));
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  create_file.SetDispatchEventImplForTesting(
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Unretained(&dispatcher)));
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(create_file.Execute(kRequestId));
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsCreateFileTest, OnSuccess) {
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::StatusCallbackLog callback_log;
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CreateFile create_file(NULL,
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         file_system_info_,
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         base::FilePath::FromUTF8Unsafe(kFilePath),
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         base::Bind(&util::LogStatusCallback, &callback_log));
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  create_file.SetDispatchEventImplForTesting(
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Unretained(&dispatcher)));
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(create_file.Execute(kRequestId));
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  create_file.OnSuccess(kRequestId,
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        scoped_ptr<RequestValue>(new RequestValue()),
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        false /* has_more */);
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1u, callback_log.size());
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK, callback_log[0]);
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsCreateFileTest, OnError) {
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::StatusCallbackLog callback_log;
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CreateFile create_file(NULL,
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         file_system_info_,
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         base::FilePath::FromUTF8Unsafe(kFilePath),
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         base::Bind(&util::LogStatusCallback, &callback_log));
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  create_file.SetDispatchEventImplForTesting(
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Unretained(&dispatcher)));
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(create_file.Execute(kRequestId));
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  create_file.OnError(kRequestId,
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      scoped_ptr<RequestValue>(new RequestValue()),
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      base::File::FILE_ERROR_TOO_MANY_OPENED);
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1u, callback_log.size());
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, callback_log[0]);
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace operations
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace file_system_provider
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace chromeos
168