Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(353)

Side by Side Diff: chrome/browser/chromeos/file_system_provider/operations/read_file_unittest.cc

Issue 287673004: [fsp] First part of support for reading files. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <string> 5 #include <string>
6 6
7 #include "base/files/file.h" 7 #include "base/files/file.h"
8 #include "base/files/file_path.h" 8 #include "base/files/file_path.h"
9 #include "base/json/json_reader.h" 9 #include "base/json/json_reader.h"
10 #include "base/memory/ref_counted.h"
10 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
11 #include "base/memory/scoped_vector.h" 12 #include "base/memory/scoped_vector.h"
12 #include "chrome/browser/chromeos/file_system_provider/operations/get_metadata.h " 13 #include "chrome/browser/chromeos/file_system_provider/operations/read_file.h"
13 #include "chrome/common/extensions/api/file_system_provider.h" 14 #include "chrome/common/extensions/api/file_system_provider.h"
14 #include "chrome/common/extensions/api/file_system_provider_internal.h" 15 #include "chrome/common/extensions/api/file_system_provider_internal.h"
15 #include "extensions/browser/event_router.h" 16 #include "extensions/browser/event_router.h"
17 #include "net/base/io_buffer.h"
16 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
17 #include "webkit/browser/fileapi/async_file_util.h" 19 #include "webkit/browser/fileapi/async_file_util.h"
18 20
19 namespace chromeos { 21 namespace chromeos {
20 namespace file_system_provider { 22 namespace file_system_provider {
21 namespace operations { 23 namespace operations {
22 namespace { 24 namespace {
23 25
24 const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj"; 26 const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj";
25 const int kFileSystemId = 1; 27 const int kFileSystemId = 1;
26 const int kRequestId = 2; 28 const int kRequestId = 2;
27 const base::FilePath::CharType kDirectoryPath[] = "/directory"; 29 const int kFileHandle = 3;
30 const int kOffset = 10;
31 const int kLength = 5;
28 32
29 // Fake event dispatcher implementation with extra logging capability. Acts as 33 // Fake event dispatcher implementation with extra logging capability. Acts as
30 // a providing extension end-point. 34 // a providing extension end-point.
31 class LoggingDispatchEventImpl { 35 class LoggingDispatchEventImpl {
32 public: 36 public:
33 explicit LoggingDispatchEventImpl(bool dispatch_reply) 37 explicit LoggingDispatchEventImpl(bool dispatch_reply)
34 : dispatch_reply_(dispatch_reply) {} 38 : dispatch_reply_(dispatch_reply) {}
35 virtual ~LoggingDispatchEventImpl() {} 39 virtual ~LoggingDispatchEventImpl() {}
36 40
37 bool OnDispatchEventImpl(scoped_ptr<extensions::Event> event) { 41 bool OnDispatchEventImpl(scoped_ptr<extensions::Event> event) {
38 events_.push_back(event->DeepCopy()); 42 events_.push_back(event->DeepCopy());
39 return dispatch_reply_; 43 return dispatch_reply_;
40 } 44 }
41 45
42 ScopedVector<extensions::Event>& events() { return events_; } 46 ScopedVector<extensions::Event>& events() { return events_; }
43 47
44 private: 48 private:
45 ScopedVector<extensions::Event> events_; 49 ScopedVector<extensions::Event> events_;
46 bool dispatch_reply_; 50 bool dispatch_reply_;
47 51
48 DISALLOW_COPY_AND_ASSIGN(LoggingDispatchEventImpl); 52 DISALLOW_COPY_AND_ASSIGN(LoggingDispatchEventImpl);
49 }; 53 };
50 54
51 // Callback invocation logger. Acts as a fileapi end-point. 55 // Callback invocation logger. Acts as a fileapi end-point.
52 class CallbackLogger { 56 class CallbackLogger {
53 public: 57 public:
54 class Event { 58 class Event {
55 public: 59 public:
56 Event(base::File::Error result, const base::File::Info& file_info) 60 Event(int chunk_length, bool has_next, base::File::Error result)
57 : result_(result), file_info_(file_info) {} 61 : chunk_length_(chunk_length), has_next_(has_next), result_(result) {}
58 virtual ~Event() {} 62 virtual ~Event() {}
59 63
60 base::File::Error result() { return result_; } 64 int chunk_length() const { return chunk_length_; }
61 const base::File::Info& file_info() { return file_info_; } 65 bool has_next() const { return has_next_; }
66 base::File::Error result() const { return result_; }
62 67
63 private: 68 private:
69 int chunk_length_;
70 bool has_next_;
64 base::File::Error result_; 71 base::File::Error result_;
65 base::File::Info file_info_;
66 72
67 DISALLOW_COPY_AND_ASSIGN(Event); 73 DISALLOW_COPY_AND_ASSIGN(Event);
68 }; 74 };
69 75
70 CallbackLogger() : weak_ptr_factory_(this) {} 76 CallbackLogger() : weak_ptr_factory_(this) {}
71 virtual ~CallbackLogger() {} 77 virtual ~CallbackLogger() {}
72 78
73 void OnGetMetadata(base::File::Error result, 79 void OnReadFile(int chunk_length, bool has_next, base::File::Error result) {
74 const base::File::Info& file_info) { 80 events_.push_back(new Event(chunk_length, has_next, result));
75 events_.push_back(new Event(result, file_info));
76 } 81 }
77 82
78 ScopedVector<Event>& events() { return events_; } 83 ScopedVector<Event>& events() { return events_; }
79 84
80 base::WeakPtr<CallbackLogger> GetWeakPtr() { 85 base::WeakPtr<CallbackLogger> GetWeakPtr() {
81 return weak_ptr_factory_.GetWeakPtr(); 86 return weak_ptr_factory_.GetWeakPtr();
82 } 87 }
83 88
84 private: 89 private:
85 ScopedVector<Event> events_; 90 ScopedVector<Event> events_;
86 bool dispatch_reply_; 91 bool dispatch_reply_;
87 base::WeakPtrFactory<CallbackLogger> weak_ptr_factory_; 92 base::WeakPtrFactory<CallbackLogger> weak_ptr_factory_;
88 93
89 DISALLOW_COPY_AND_ASSIGN(CallbackLogger); 94 DISALLOW_COPY_AND_ASSIGN(CallbackLogger);
90 }; 95 };
91 96
92 } // namespace 97 } // namespace
93 98
94 class FileSystemProviderOperationsGetMetadataTest : public testing::Test { 99 class FileSystemProviderOperationsReadFileTest : public testing::Test {
95 protected: 100 protected:
96 FileSystemProviderOperationsGetMetadataTest() {} 101 FileSystemProviderOperationsReadFileTest() {}
97 virtual ~FileSystemProviderOperationsGetMetadataTest() {} 102 virtual ~FileSystemProviderOperationsReadFileTest() {}
98 103
99 virtual void SetUp() OVERRIDE { 104 virtual void SetUp() OVERRIDE {
100 file_system_info_ = 105 file_system_info_ =
101 ProvidedFileSystemInfo(kExtensionId, 106 ProvidedFileSystemInfo(kExtensionId,
102 kFileSystemId, 107 kFileSystemId,
103 "" /* file_system_name */, 108 "" /* file_system_name */,
104 base::FilePath() /* mount_path */); 109 base::FilePath() /* mount_path */);
110 io_buffer_ = make_scoped_refptr(new net::IOBuffer(kOffset + kLength));
105 } 111 }
106 112
107 ProvidedFileSystemInfo file_system_info_; 113 ProvidedFileSystemInfo file_system_info_;
114 scoped_refptr<net::IOBuffer> io_buffer_;
108 }; 115 };
109 116
110 TEST_F(FileSystemProviderOperationsGetMetadataTest, Execute) { 117 TEST_F(FileSystemProviderOperationsReadFileTest, Execute) {
111 LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 118 LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
112 CallbackLogger callback_logger; 119 CallbackLogger callback_logger;
113 120
114 GetMetadata get_metadata( 121 ReadFile read_file(
115 NULL, 122 NULL,
116 file_system_info_, 123 file_system_info_,
117 base::FilePath::FromUTF8Unsafe(kDirectoryPath), 124 kFileHandle,
118 base::Bind(&CallbackLogger::OnGetMetadata, callback_logger.GetWeakPtr())); 125 io_buffer_.get(),
119 get_metadata.SetDispatchEventImplForTesting( 126 kOffset,
127 kLength,
128 base::Bind(&CallbackLogger::OnReadFile, callback_logger.GetWeakPtr()));
129 read_file.SetDispatchEventImplForTesting(
120 base::Bind(&LoggingDispatchEventImpl::OnDispatchEventImpl, 130 base::Bind(&LoggingDispatchEventImpl::OnDispatchEventImpl,
121 base::Unretained(&dispatcher))); 131 base::Unretained(&dispatcher)));
122 132
123 EXPECT_TRUE(get_metadata.Execute(kRequestId)); 133 EXPECT_TRUE(read_file.Execute(kRequestId));
124 134
125 ASSERT_EQ(1u, dispatcher.events().size()); 135 ASSERT_EQ(1u, dispatcher.events().size());
126 extensions::Event* event = dispatcher.events()[0]; 136 extensions::Event* event = dispatcher.events()[0];
127 EXPECT_EQ( 137 EXPECT_EQ(
128 extensions::api::file_system_provider::OnGetMetadataRequested::kEventName, 138 extensions::api::file_system_provider::OnReadFileRequested::kEventName,
129 event->event_name); 139 event->event_name);
130 base::ListValue* event_args = event->event_args.get(); 140 base::ListValue* event_args = event->event_args.get();
131 ASSERT_EQ(3u, event_args->GetSize()); 141 ASSERT_EQ(5u, event_args->GetSize());
132 142
133 int event_file_system_id = -1; 143 int event_file_system_id = -1;
134 EXPECT_TRUE(event_args->GetInteger(0, &event_file_system_id)); 144 EXPECT_TRUE(event_args->GetInteger(0, &event_file_system_id));
135 EXPECT_EQ(kFileSystemId, event_file_system_id); 145 EXPECT_EQ(kFileSystemId, event_file_system_id);
136 146
137 int event_request_id = -1; 147 int event_request_id = -1;
138 EXPECT_TRUE(event_args->GetInteger(1, &event_request_id)); 148 EXPECT_TRUE(event_args->GetInteger(1, &event_request_id));
139 EXPECT_EQ(kRequestId, event_request_id); 149 EXPECT_EQ(kRequestId, event_request_id);
140 150
141 std::string event_directory_path; 151 int event_file_handle = -1;
142 EXPECT_TRUE(event_args->GetString(2, &event_directory_path)); 152 EXPECT_TRUE(event_args->GetInteger(2, &event_file_handle));
143 EXPECT_EQ(kDirectoryPath, event_directory_path); 153 EXPECT_EQ(kFileHandle, event_file_handle);
154
155 double event_offset = -1;
156 EXPECT_TRUE(event_args->GetDouble(3, &event_offset));
157 EXPECT_EQ(kOffset, static_cast<double>(event_offset));
158
159 int event_length = -1;
160 EXPECT_TRUE(event_args->GetInteger(4, &event_length));
161 EXPECT_EQ(kLength, event_length);
144 } 162 }
145 163
146 TEST_F(FileSystemProviderOperationsGetMetadataTest, Execute_NoListener) { 164 TEST_F(FileSystemProviderOperationsReadFileTest, Execute_NoListener) {
147 LoggingDispatchEventImpl dispatcher(false /* dispatch_reply */); 165 LoggingDispatchEventImpl dispatcher(false /* dispatch_reply */);
148 CallbackLogger callback_logger; 166 CallbackLogger callback_logger;
149 167
150 GetMetadata get_metadata( 168 ReadFile read_file(
151 NULL, 169 NULL,
152 file_system_info_, 170 file_system_info_,
153 base::FilePath::FromUTF8Unsafe(kDirectoryPath), 171 kFileHandle,
154 base::Bind(&CallbackLogger::OnGetMetadata, callback_logger.GetWeakPtr())); 172 io_buffer_.get(),
155 get_metadata.SetDispatchEventImplForTesting( 173 kOffset,
174 kLength,
175 base::Bind(&CallbackLogger::OnReadFile, callback_logger.GetWeakPtr()));
176 read_file.SetDispatchEventImplForTesting(
156 base::Bind(&LoggingDispatchEventImpl::OnDispatchEventImpl, 177 base::Bind(&LoggingDispatchEventImpl::OnDispatchEventImpl,
157 base::Unretained(&dispatcher))); 178 base::Unretained(&dispatcher)));
158 179
159 EXPECT_FALSE(get_metadata.Execute(kRequestId)); 180 EXPECT_FALSE(read_file.Execute(kRequestId));
160 } 181 }
161 182
162 TEST_F(FileSystemProviderOperationsGetMetadataTest, OnSuccess) { 183 TEST_F(FileSystemProviderOperationsReadFileTest, OnSuccess) {
163 using extensions::api::file_system_provider::EntryMetadata; 184 using extensions::api::file_system_provider::EntryMetadata;
164 using extensions::api::file_system_provider_internal:: 185 using extensions::api::file_system_provider_internal::
165 GetMetadataRequestedSuccess::Params; 186 ReadFileRequestedSuccess::Params;
166 187
167 LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 188 LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
168 CallbackLogger callback_logger; 189 CallbackLogger callback_logger;
169 190
170 GetMetadata get_metadata( 191 ReadFile read_file(
171 NULL, 192 NULL,
172 file_system_info_, 193 file_system_info_,
173 base::FilePath::FromUTF8Unsafe(kDirectoryPath), 194 kFileHandle,
174 base::Bind(&CallbackLogger::OnGetMetadata, callback_logger.GetWeakPtr())); 195 io_buffer_.get(),
175 get_metadata.SetDispatchEventImplForTesting( 196 kOffset,
197 kLength,
198 base::Bind(&CallbackLogger::OnReadFile, callback_logger.GetWeakPtr()));
199 read_file.SetDispatchEventImplForTesting(
176 base::Bind(&LoggingDispatchEventImpl::OnDispatchEventImpl, 200 base::Bind(&LoggingDispatchEventImpl::OnDispatchEventImpl,
177 base::Unretained(&dispatcher))); 201 base::Unretained(&dispatcher)));
178 202
179 EXPECT_TRUE(get_metadata.Execute(kRequestId)); 203 EXPECT_TRUE(read_file.Execute(kRequestId));
180 204
181 // Sample input as JSON. Keep in sync with file_system_provider_api.idl. 205 // Sample input as JSON. Keep in sync with file_system_provider_api.idl.
182 // As for now, it is impossible to create *::Params class directly, not from 206 // As for now, it is impossible to create *::Params class directly, not from
183 // base::Value. 207 // base::Value.
184 const std::string input = 208 const std::string input =
185 "[\n" 209 "[\n"
186 " 1,\n" // kFileSystemId 210 " 1,\n" // kFileSystemId
187 " 2,\n" // kRequestId 211 " 2,\n" // kRequestId
188 " {\n" 212 " \"ABCDE\",\n" // 5 bytes
189 " \"isDirectory\": false,\n" 213 " false\n" // has_next
190 " \"name\": \"blueberries.txt\",\n"
191 " \"size\": 4096,\n"
192 " \"modificationTime\": {\n"
193 " \"value\": \"Thu Apr 24 00:46:52 UTC 2014\"\n"
194 " }\n"
195 " }\n"
196 "]\n"; 214 "]\n";
197 215
198 int json_error_code; 216 int json_error_code;
199 std::string json_error_msg; 217 std::string json_error_msg;
200 scoped_ptr<base::Value> value(base::JSONReader::ReadAndReturnError( 218 scoped_ptr<base::Value> value(base::JSONReader::ReadAndReturnError(
201 input, base::JSON_PARSE_RFC, &json_error_code, &json_error_msg)); 219 input, base::JSON_PARSE_RFC, &json_error_code, &json_error_msg));
202 ASSERT_TRUE(value.get()) << json_error_msg; 220 ASSERT_TRUE(value.get()) << json_error_msg;
203 221
204 base::ListValue* value_as_list; 222 base::ListValue* value_as_list;
205 ASSERT_TRUE(value->GetAsList(&value_as_list)); 223 ASSERT_TRUE(value->GetAsList(&value_as_list));
206 scoped_ptr<Params> params(Params::Create(*value_as_list)); 224 scoped_ptr<Params> params(Params::Create(*value_as_list));
207 ASSERT_TRUE(params.get()); 225 ASSERT_TRUE(params.get());
208 scoped_ptr<RequestValue> request_value( 226 scoped_ptr<RequestValue> request_value(
209 RequestValue::CreateForGetMetadataSuccess(params.Pass())); 227 RequestValue::CreateForReadFileSuccess(params.Pass()));
210 ASSERT_TRUE(request_value.get()); 228 ASSERT_TRUE(request_value.get());
211 229
212 const bool has_next = false; 230 const bool has_next = false;
213 get_metadata.OnSuccess(kRequestId, request_value.Pass(), has_next); 231 read_file.OnSuccess(kRequestId, request_value.Pass(), has_next);
214 232
215 ASSERT_EQ(1u, callback_logger.events().size()); 233 ASSERT_EQ(1u, callback_logger.events().size());
216 CallbackLogger::Event* event = callback_logger.events()[0]; 234 CallbackLogger::Event* event = callback_logger.events()[0];
235 EXPECT_EQ(kLength, event->chunk_length());
236 EXPECT_FALSE(event->has_next());
237 EXPECT_EQ("ABCDE", std::string(io_buffer_->data() + kOffset, kLength));
217 EXPECT_EQ(base::File::FILE_OK, event->result()); 238 EXPECT_EQ(base::File::FILE_OK, event->result());
218
219 const base::File::Info& file_info = event->file_info();
220 EXPECT_FALSE(file_info.is_directory);
221 EXPECT_EQ(4096, file_info.size);
222 base::Time expected_time;
223 EXPECT_TRUE(
224 base::Time::FromString("Thu Apr 24 00:46:52 UTC 2014", &expected_time));
225 EXPECT_EQ(expected_time, file_info.last_modified);
226 } 239 }
227 240
228 TEST_F(FileSystemProviderOperationsGetMetadataTest, OnError) { 241 TEST_F(FileSystemProviderOperationsReadFileTest, OnError) {
229 using extensions::api::file_system_provider::EntryMetadata; 242 using extensions::api::file_system_provider::EntryMetadata;
230 using extensions::api::file_system_provider_internal:: 243 using extensions::api::file_system_provider_internal::ReadFileRequestedError::
231 GetMetadataRequestedError::Params; 244 Params;
232 245
233 LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); 246 LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */);
234 CallbackLogger callback_logger; 247 CallbackLogger callback_logger;
235 248
236 GetMetadata get_metadata( 249 ReadFile read_file(
237 NULL, 250 NULL,
238 file_system_info_, 251 file_system_info_,
239 base::FilePath::FromUTF8Unsafe(kDirectoryPath), 252 kFileHandle,
240 base::Bind(&CallbackLogger::OnGetMetadata, callback_logger.GetWeakPtr())); 253 io_buffer_.get(),
241 get_metadata.SetDispatchEventImplForTesting( 254 kOffset,
255 kLength,
256 base::Bind(&CallbackLogger::OnReadFile, callback_logger.GetWeakPtr()));
257 read_file.SetDispatchEventImplForTesting(
242 base::Bind(&LoggingDispatchEventImpl::OnDispatchEventImpl, 258 base::Bind(&LoggingDispatchEventImpl::OnDispatchEventImpl,
243 base::Unretained(&dispatcher))); 259 base::Unretained(&dispatcher)));
244 260
245 EXPECT_TRUE(get_metadata.Execute(kRequestId)); 261 EXPECT_TRUE(read_file.Execute(kRequestId));
246 262
247 get_metadata.OnError(kRequestId, base::File::FILE_ERROR_TOO_MANY_OPENED); 263 read_file.OnError(kRequestId, base::File::FILE_ERROR_TOO_MANY_OPENED);
248 264
249 ASSERT_EQ(1u, callback_logger.events().size()); 265 ASSERT_EQ(1u, callback_logger.events().size());
250 CallbackLogger::Event* event = callback_logger.events()[0]; 266 CallbackLogger::Event* event = callback_logger.events()[0];
251 EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, event->result()); 267 EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, event->result());
252 } 268 }
253 269
254 } // namespace operations 270 } // namespace operations
255 } // namespace file_system_provider 271 } // namespace file_system_provider
256 } // namespace chromeos 272 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698