[go: nahoru, domu]

blob: 080bc10ecf468f6fbeeed7a66fe1e8bbf9444f43 [file] [log] [blame]
mtomasz@chromium.orgfa90215f2014-07-29 07:52:541// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/chromeos/file_system_provider/operations/write_file.h"
6
dcheng24002d02016-04-08 02:42:407#include <memory>
mtomasz@chromium.orgfa90215f2014-07-29 07:52:548#include <string>
pneubeck93871252015-01-20 11:26:369#include <vector>
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5410
11#include "base/files/file.h"
12#include "base/files/file_path.h"
pneubeck93871252015-01-20 11:26:3613#include "base/macros.h"
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5414#include "base/memory/ref_counted.h"
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5415#include "base/values.h"
16#include "chrome/browser/chromeos/file_system_provider/operations/test_util.h"
17#include "chrome/common/extensions/api/file_system_provider.h"
mtomaszb9c370a2015-05-15 11:54:1818#include "chrome/common/extensions/api/file_system_provider_capabilities/file_system_provider_capabilities_handler.h"
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5419#include "chrome/common/extensions/api/file_system_provider_internal.h"
20#include "extensions/browser/event_router.h"
21#include "net/base/io_buffer.h"
pilgrime92c5fcd2014-09-10 23:31:2322#include "storage/browser/fileapi/async_file_util.h"
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5423#include "testing/gtest/include/gtest/gtest.h"
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5424
25namespace chromeos {
26namespace file_system_provider {
27namespace operations {
28namespace {
29
30const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj";
31const char kFileSystemId[] = "testing-file-system";
32const int kRequestId = 2;
33const int kFileHandle = 3;
mtomasz3485d1a02014-09-03 07:34:2034const char kWriteData[] = "Welcome to my world!";
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5435const int kOffset = 10;
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5436
37} // namespace
38
39class FileSystemProviderOperationsWriteFileTest : public testing::Test {
40 protected:
41 FileSystemProviderOperationsWriteFileTest() {}
dchengb35a1322015-01-16 02:21:3242 ~FileSystemProviderOperationsWriteFileTest() override {}
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5443
dchengb35a1322015-01-16 02:21:3244 void SetUp() override {
mtomasz00336db6f2014-10-14 05:57:3745 MountOptions mount_options(kFileSystemId, "" /* display_name */);
46 mount_options.writable = true;
mtomaszb9c370a2015-05-15 11:54:1847 file_system_info_ = ProvidedFileSystemInfo(
48 kExtensionId, mount_options, base::FilePath(), false /* configurable */,
mtomaszb577564f2015-07-07 06:07:4049 true /* watchable */, extensions::SOURCE_FILE);
kylechar96f3eba2017-09-25 20:23:5650 io_buffer_ = base::MakeRefCounted<net::StringIOBuffer>(kWriteData);
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5451 }
52
53 ProvidedFileSystemInfo file_system_info_;
mtomasz3485d1a02014-09-03 07:34:2054 scoped_refptr<net::StringIOBuffer> io_buffer_;
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5455};
56
57TEST_F(FileSystemProviderOperationsWriteFileTest, Execute) {
mtomasz091a0ad72014-09-12 00:35:3858 using extensions::api::file_system_provider::WriteFileRequestedOptions;
59
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5460 util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
61 util::StatusCallbackLog callback_log;
62
63 WriteFile write_file(NULL,
64 file_system_info_,
65 kFileHandle,
66 io_buffer_.get(),
67 kOffset,
mtomasz3485d1a02014-09-03 07:34:2068 io_buffer_->size(),
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5469 base::Bind(&util::LogStatusCallback, &callback_log));
70 write_file.SetDispatchEventImplForTesting(
71 base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
72 base::Unretained(&dispatcher)));
73
74 EXPECT_TRUE(write_file.Execute(kRequestId));
75
76 ASSERT_EQ(1u, dispatcher.events().size());
avi3dbcc202017-03-13 02:48:3677 extensions::Event* event = dispatcher.events()[0].get();
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5478 EXPECT_EQ(
79 extensions::api::file_system_provider::OnWriteFileRequested::kEventName,
80 event->event_name);
81 base::ListValue* event_args = event->event_args.get();
82 ASSERT_EQ(1u, event_args->GetSize());
83
mtomasz091a0ad72014-09-12 00:35:3884 const base::DictionaryValue* options_as_value = NULL;
85 ASSERT_TRUE(event_args->GetDictionary(0, &options_as_value));
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5486
mtomasz091a0ad72014-09-12 00:35:3887 WriteFileRequestedOptions options;
88 ASSERT_TRUE(WriteFileRequestedOptions::Populate(*options_as_value, &options));
89 EXPECT_EQ(kFileSystemId, options.file_system_id);
90 EXPECT_EQ(kRequestId, options.request_id);
91 EXPECT_EQ(kFileHandle, options.open_request_id);
92 EXPECT_EQ(kOffset, static_cast<double>(options.offset));
pneubeck93871252015-01-20 11:26:3693 std::string write_data(kWriteData);
94 EXPECT_EQ(std::vector<char>(write_data.begin(), write_data.end()),
95 options.data);
mtomasz@chromium.orgfa90215f2014-07-29 07:52:5496}
97
98TEST_F(FileSystemProviderOperationsWriteFileTest, Execute_NoListener) {
99 util::LoggingDispatchEventImpl dispatcher(false /* dispatch_reply */);
100 util::StatusCallbackLog callback_log;
101
102 WriteFile write_file(NULL,
103 file_system_info_,
104 kFileHandle,
105 io_buffer_.get(),
106 kOffset,
mtomasz3485d1a02014-09-03 07:34:20107 io_buffer_->size(),
mtomasz@chromium.orgfa90215f2014-07-29 07:52:54108 base::Bind(&util::LogStatusCallback, &callback_log));
109 write_file.SetDispatchEventImplForTesting(
110 base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
111 base::Unretained(&dispatcher)));
112
113 EXPECT_FALSE(write_file.Execute(kRequestId));
114}
115
116TEST_F(FileSystemProviderOperationsWriteFileTest, Execute_ReadOnly) {
117 util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
118 util::StatusCallbackLog callback_log;
119
120 const ProvidedFileSystemInfo read_only_file_system_info(
mtomaszb9c370a2015-05-15 11:54:18121 kExtensionId, MountOptions(kFileSystemId, "" /* display_name */),
122 base::FilePath() /* mount_path */, false /* configurable */,
mtomaszb577564f2015-07-07 06:07:40123 true /* watchable */, extensions::SOURCE_FILE);
mtomasz@chromium.orgfa90215f2014-07-29 07:52:54124
125 WriteFile write_file(NULL,
126 read_only_file_system_info,
127 kFileHandle,
128 io_buffer_.get(),
129 kOffset,
mtomasz3485d1a02014-09-03 07:34:20130 io_buffer_->size(),
mtomasz@chromium.orgfa90215f2014-07-29 07:52:54131 base::Bind(&util::LogStatusCallback, &callback_log));
132 write_file.SetDispatchEventImplForTesting(
133 base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
134 base::Unretained(&dispatcher)));
135
136 EXPECT_FALSE(write_file.Execute(kRequestId));
137}
138
139TEST_F(FileSystemProviderOperationsWriteFileTest, OnSuccess) {
140 util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
141 util::StatusCallbackLog callback_log;
142
143 WriteFile write_file(NULL,
144 file_system_info_,
145 kFileHandle,
146 io_buffer_.get(),
147 kOffset,
mtomasz3485d1a02014-09-03 07:34:20148 io_buffer_->size(),
mtomasz@chromium.orgfa90215f2014-07-29 07:52:54149 base::Bind(&util::LogStatusCallback, &callback_log));
150 write_file.SetDispatchEventImplForTesting(
151 base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
152 base::Unretained(&dispatcher)));
153
154 EXPECT_TRUE(write_file.Execute(kRequestId));
155
156 write_file.OnSuccess(kRequestId,
dcheng24002d02016-04-08 02:42:40157 std::unique_ptr<RequestValue>(new RequestValue()),
mtomasz@chromium.orgfa90215f2014-07-29 07:52:54158 false /* has_more */);
159 ASSERT_EQ(1u, callback_log.size());
160 EXPECT_EQ(base::File::FILE_OK, callback_log[0]);
161}
162
163TEST_F(FileSystemProviderOperationsWriteFileTest, OnError) {
164 util::LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
165 util::StatusCallbackLog callback_log;
166
167 WriteFile write_file(NULL,
168 file_system_info_,
169 kFileHandle,
170 io_buffer_.get(),
171 kOffset,
mtomasz3485d1a02014-09-03 07:34:20172 io_buffer_->size(),
mtomasz@chromium.orgfa90215f2014-07-29 07:52:54173 base::Bind(&util::LogStatusCallback, &callback_log));
174 write_file.SetDispatchEventImplForTesting(
175 base::Bind(&util::LoggingDispatchEventImpl::OnDispatchEventImpl,
176 base::Unretained(&dispatcher)));
177
178 EXPECT_TRUE(write_file.Execute(kRequestId));
179
180 write_file.OnError(kRequestId,
dcheng24002d02016-04-08 02:42:40181 std::unique_ptr<RequestValue>(new RequestValue()),
mtomasz@chromium.orgfa90215f2014-07-29 07:52:54182 base::File::FILE_ERROR_TOO_MANY_OPENED);
183
184 ASSERT_EQ(1u, callback_log.size());
185 EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, callback_log[0]);
186}
187
188} // namespace operations
189} // namespace file_system_provider
190} // namespace chromeos