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/write_file.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <string>
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file_path.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/ref_counted.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_vector.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/values.h"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/test_util.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"
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/base/io_buffer.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util.h"
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace chromeos {
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace file_system_provider {
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace operations {
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace {
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj";
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kFileSystemId[] = "testing-file-system";
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kRequestId = 2;
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kFileHandle = 3;
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kWriteData[] = "Welcome to my world!";
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kOffset = 10;
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class FileSystemProviderOperationsWriteFileTest : public testing::Test {
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected:
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FileSystemProviderOperationsWriteFileTest() {}
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~FileSystemProviderOperationsWriteFileTest() {}
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    file_system_info_ =
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ProvidedFileSystemInfo(kExtensionId,
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               kFileSystemId,
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               "" /* display_name */,
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               true /* writable */,
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               base::FilePath() /* mount_path */);
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    io_buffer_ = make_scoped_refptr(new net::StringIOBuffer(kWriteData));
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ProvidedFileSystemInfo file_system_info_;
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<net::StringIOBuffer> io_buffer_;
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsWriteFileTest, Execute) {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  using extensions::api::file_system_provider::WriteFileRequestedOptions;
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::StatusCallbackLog callback_log;
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  WriteFile write_file(NULL,
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       file_system_info_,
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       kFileHandle,
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       io_buffer_.get(),
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       kOffset,
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       io_buffer_->size(),
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       base::Bind(&util::LogStatusCallback, &callback_log));
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  write_file.SetDispatchEventImplForTesting(
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Unretained(&dispatcher)));
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(write_file.Execute(kRequestId));
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1u, dispatcher.events().size());
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  extensions::Event* event = dispatcher.events()[0];
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::api::file_system_provider::OnWriteFileRequested::kEventName,
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      event->event_name);
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::ListValue* event_args = event->event_args.get();
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1u, event_args->GetSize());
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const base::DictionaryValue* options_as_value = NULL;
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(event_args->GetDictionary(0, &options_as_value));
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WriteFileRequestedOptions options;
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(WriteFileRequestedOptions::Populate(*options_as_value, &options));
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kFileSystemId, options.file_system_id);
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kRequestId, options.request_id);
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kFileHandle, options.open_request_id);
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kOffset, static_cast<double>(options.offset));
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(std::string(kWriteData), options.data);
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsWriteFileTest, Execute_NoListener) {
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::LoggingDispatchEventImpl dispatcher(false /* dispatch_reply */);
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::StatusCallbackLog callback_log;
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  WriteFile write_file(NULL,
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       file_system_info_,
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       kFileHandle,
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       io_buffer_.get(),
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       kOffset,
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       io_buffer_->size(),
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       base::Bind(&util::LogStatusCallback, &callback_log));
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  write_file.SetDispatchEventImplForTesting(
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Unretained(&dispatcher)));
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(write_file.Execute(kRequestId));
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsWriteFileTest, Execute_ReadOnly) {
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::StatusCallbackLog callback_log;
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const ProvidedFileSystemInfo read_only_file_system_info(
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        kExtensionId,
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        kFileSystemId,
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "" /* file_system_name */,
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        false /* writable */,
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::FilePath() /* mount_path */);
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  WriteFile write_file(NULL,
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       read_only_file_system_info,
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       kFileHandle,
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       io_buffer_.get(),
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       kOffset,
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       io_buffer_->size(),
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       base::Bind(&util::LogStatusCallback, &callback_log));
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  write_file.SetDispatchEventImplForTesting(
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Unretained(&dispatcher)));
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(write_file.Execute(kRequestId));
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsWriteFileTest, OnSuccess) {
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::StatusCallbackLog callback_log;
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  WriteFile write_file(NULL,
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       file_system_info_,
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       kFileHandle,
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       io_buffer_.get(),
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       kOffset,
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       io_buffer_->size(),
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       base::Bind(&util::LogStatusCallback, &callback_log));
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  write_file.SetDispatchEventImplForTesting(
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Unretained(&dispatcher)));
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(write_file.Execute(kRequestId));
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  write_file.OnSuccess(kRequestId,
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       scoped_ptr<RequestValue>(new RequestValue()),
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       false /* has_more */);
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1u, callback_log.size());
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK, callback_log[0]);
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(FileSystemProviderOperationsWriteFileTest, OnError) {
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::StatusCallbackLog callback_log;
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  WriteFile write_file(NULL,
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       file_system_info_,
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       kFileHandle,
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       io_buffer_.get(),
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       kOffset,
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       io_buffer_->size(),
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       base::Bind(&util::LogStatusCallback, &callback_log));
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  write_file.SetDispatchEventImplForTesting(
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Unretained(&dispatcher)));
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(write_file.Execute(kRequestId));
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  write_file.OnError(kRequestId,
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     scoped_ptr<RequestValue>(new RequestValue()),
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     base::File::FILE_ERROR_TOO_MANY_OPENED);
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1u, callback_log.size());
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, callback_log[0]);
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace operations
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace file_system_provider
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace chromeos
190