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

Side by Side Diff: webkit/browser/fileapi/upload_file_system_file_element_reader_unittest.cc

Issue 23440033: Move FileAPI test code from webkit to content (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 2 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
« no previous file with comments | « webkit/browser/fileapi/transient_file_util_unittest.cc ('k') | webkit/storage_browser.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2013 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 "webkit/browser/fileapi/upload_file_system_file_element_reader.h"
6
7 #include "base/files/scoped_temp_dir.h"
8 #include "base/run_loop.h"
9 #include "net/base/io_buffer.h"
10 #include "net/base/test_completion_callback.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "webkit/browser/fileapi/async_file_test_helper.h"
13 #include "webkit/browser/fileapi/file_system_backend.h"
14 #include "webkit/browser/fileapi/file_system_context.h"
15 #include "webkit/browser/fileapi/file_system_operation_context.h"
16 #include "webkit/browser/fileapi/file_system_url.h"
17 #include "webkit/browser/fileapi/mock_file_system_context.h"
18
19 namespace fileapi {
20
21 namespace {
22
23 const char kFileSystemURLOrigin[] = "http://remote";
24 const fileapi::FileSystemType kFileSystemType =
25 fileapi::kFileSystemTypeTemporary;
26
27 } // namespace
28
29 class UploadFileSystemFileElementReaderTest : public testing::Test {
30 public:
31 UploadFileSystemFileElementReaderTest() {}
32
33 virtual void SetUp() OVERRIDE {
34 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
35
36 file_system_context_ = fileapi::CreateFileSystemContextForTesting(
37 NULL, temp_dir_.path());
38
39 file_system_context_->OpenFileSystem(
40 GURL(kFileSystemURLOrigin),
41 kFileSystemType,
42 OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT,
43 base::Bind(&UploadFileSystemFileElementReaderTest::OnOpenFileSystem,
44 base::Unretained(this)));
45 base::RunLoop().RunUntilIdle();
46 ASSERT_TRUE(file_system_root_url_.is_valid());
47
48 // Prepare a file on file system.
49 const char kTestData[] = "abcdefghijklmnop0123456789";
50 file_data_.assign(kTestData, kTestData + arraysize(kTestData) - 1);
51 const char kFilename[] = "File.dat";
52 file_url_ = GetFileSystemURL(kFilename);
53 WriteFileSystemFile(kFilename, &file_data_[0], file_data_.size(),
54 &file_modification_time_);
55
56 // Create and initialize a reader.
57 reader_.reset(
58 new UploadFileSystemFileElementReader(file_system_context_.get(),
59 file_url_,
60 0,
61 kuint64max,
62 file_modification_time_));
63 net::TestCompletionCallback callback;
64 ASSERT_EQ(net::ERR_IO_PENDING, reader_->Init(callback.callback()));
65 EXPECT_EQ(net::OK, callback.WaitForResult());
66 EXPECT_EQ(file_data_.size(), reader_->GetContentLength());
67 EXPECT_EQ(file_data_.size(), reader_->BytesRemaining());
68 EXPECT_FALSE(reader_->IsInMemory());
69 }
70
71 virtual void TearDown() OVERRIDE {
72 reader_.reset();
73 base::RunLoop().RunUntilIdle();
74 }
75
76 protected:
77 GURL GetFileSystemURL(const std::string& filename) {
78 return GURL(file_system_root_url_.spec() + filename);
79 }
80
81 void WriteFileSystemFile(const std::string& filename,
82 const char* buf,
83 int buf_size,
84 base::Time* modification_time) {
85 fileapi::FileSystemURL url =
86 file_system_context_->CreateCrackedFileSystemURL(
87 GURL(kFileSystemURLOrigin),
88 kFileSystemType,
89 base::FilePath().AppendASCII(filename));
90
91 ASSERT_EQ(base::PLATFORM_FILE_OK,
92 AsyncFileTestHelper::CreateFileWithData(
93 file_system_context_, url, buf, buf_size));
94
95 base::PlatformFileInfo file_info;
96 ASSERT_EQ(base::PLATFORM_FILE_OK,
97 AsyncFileTestHelper::GetMetadata(
98 file_system_context_, url, &file_info));
99 *modification_time = file_info.last_modified;
100 }
101
102 void OnOpenFileSystem(base::PlatformFileError result,
103 const std::string& name,
104 const GURL& root) {
105 ASSERT_EQ(base::PLATFORM_FILE_OK, result);
106 ASSERT_TRUE(root.is_valid());
107 file_system_root_url_ = root;
108 }
109
110 base::MessageLoopForIO message_loop_;
111 base::ScopedTempDir temp_dir_;
112 scoped_refptr<FileSystemContext> file_system_context_;
113 GURL file_system_root_url_;
114 std::vector<char> file_data_;
115 GURL file_url_;
116 base::Time file_modification_time_;
117 scoped_ptr<UploadFileSystemFileElementReader> reader_;
118 };
119
120 TEST_F(UploadFileSystemFileElementReaderTest, ReadAll) {
121 scoped_refptr<net::IOBufferWithSize> buf =
122 new net::IOBufferWithSize(file_data_.size());
123 net::TestCompletionCallback read_callback;
124 ASSERT_EQ(net::ERR_IO_PENDING,
125 reader_->Read(buf.get(), buf->size(), read_callback.callback()));
126 EXPECT_EQ(buf->size(), read_callback.WaitForResult());
127 EXPECT_EQ(0U, reader_->BytesRemaining());
128 EXPECT_TRUE(std::equal(file_data_.begin(), file_data_.end(), buf->data()));
129 // Try to read again.
130 EXPECT_EQ(0, reader_->Read(buf.get(), buf->size(), read_callback.callback()));
131 }
132
133 TEST_F(UploadFileSystemFileElementReaderTest, ReadPartially) {
134 const size_t kHalfSize = file_data_.size() / 2;
135 ASSERT_EQ(file_data_.size(), kHalfSize * 2);
136
137 scoped_refptr<net::IOBufferWithSize> buf =
138 new net::IOBufferWithSize(kHalfSize);
139
140 net::TestCompletionCallback read_callback1;
141 ASSERT_EQ(net::ERR_IO_PENDING,
142 reader_->Read(buf.get(), buf->size(), read_callback1.callback()));
143 EXPECT_EQ(buf->size(), read_callback1.WaitForResult());
144 EXPECT_EQ(file_data_.size() - buf->size(), reader_->BytesRemaining());
145 EXPECT_TRUE(std::equal(file_data_.begin(), file_data_.begin() + kHalfSize,
146 buf->data()));
147
148 net::TestCompletionCallback read_callback2;
149 EXPECT_EQ(net::ERR_IO_PENDING,
150 reader_->Read(buf.get(), buf->size(), read_callback2.callback()));
151 EXPECT_EQ(buf->size(), read_callback2.WaitForResult());
152 EXPECT_EQ(0U, reader_->BytesRemaining());
153 EXPECT_TRUE(std::equal(file_data_.begin() + kHalfSize, file_data_.end(),
154 buf->data()));
155 }
156
157 TEST_F(UploadFileSystemFileElementReaderTest, ReadTooMuch) {
158 const size_t kTooLargeSize = file_data_.size() * 2;
159 scoped_refptr<net::IOBufferWithSize> buf =
160 new net::IOBufferWithSize(kTooLargeSize);
161 net::TestCompletionCallback read_callback;
162 ASSERT_EQ(net::ERR_IO_PENDING,
163 reader_->Read(buf.get(), buf->size(), read_callback.callback()));
164 EXPECT_EQ(static_cast<int>(file_data_.size()), read_callback.WaitForResult());
165 EXPECT_EQ(0U, reader_->BytesRemaining());
166 EXPECT_TRUE(std::equal(file_data_.begin(), file_data_.end(), buf->data()));
167 }
168
169 TEST_F(UploadFileSystemFileElementReaderTest, MultipleInit) {
170 scoped_refptr<net::IOBufferWithSize> buf =
171 new net::IOBufferWithSize(file_data_.size());
172
173 // Read all.
174 net::TestCompletionCallback read_callback1;
175 ASSERT_EQ(net::ERR_IO_PENDING,
176 reader_->Read(buf.get(), buf->size(), read_callback1.callback()));
177 EXPECT_EQ(buf->size(), read_callback1.WaitForResult());
178 EXPECT_EQ(0U, reader_->BytesRemaining());
179 EXPECT_TRUE(std::equal(file_data_.begin(), file_data_.end(), buf->data()));
180
181 // Call Init() again to reset the state.
182 net::TestCompletionCallback init_callback;
183 ASSERT_EQ(net::ERR_IO_PENDING, reader_->Init(init_callback.callback()));
184 EXPECT_EQ(net::OK, init_callback.WaitForResult());
185 EXPECT_EQ(file_data_.size(), reader_->GetContentLength());
186 EXPECT_EQ(file_data_.size(), reader_->BytesRemaining());
187
188 // Read again.
189 net::TestCompletionCallback read_callback2;
190 ASSERT_EQ(net::ERR_IO_PENDING,
191 reader_->Read(buf.get(), buf->size(), read_callback2.callback()));
192 EXPECT_EQ(buf->size(), read_callback2.WaitForResult());
193 EXPECT_EQ(0U, reader_->BytesRemaining());
194 EXPECT_TRUE(std::equal(file_data_.begin(), file_data_.end(), buf->data()));
195 }
196
197 TEST_F(UploadFileSystemFileElementReaderTest, InitDuringAsyncOperation) {
198 scoped_refptr<net::IOBufferWithSize> buf =
199 new net::IOBufferWithSize(file_data_.size());
200
201 // Start reading all.
202 net::TestCompletionCallback read_callback1;
203 EXPECT_EQ(net::ERR_IO_PENDING,
204 reader_->Read(buf.get(), buf->size(), read_callback1.callback()));
205
206 // Call Init to cancel the previous read.
207 net::TestCompletionCallback init_callback1;
208 EXPECT_EQ(net::ERR_IO_PENDING, reader_->Init(init_callback1.callback()));
209
210 // Call Init again to cancel the previous init.
211 net::TestCompletionCallback init_callback2;
212 EXPECT_EQ(net::ERR_IO_PENDING, reader_->Init(init_callback2.callback()));
213 EXPECT_EQ(net::OK, init_callback2.WaitForResult());
214 EXPECT_EQ(file_data_.size(), reader_->GetContentLength());
215 EXPECT_EQ(file_data_.size(), reader_->BytesRemaining());
216
217 // Read half.
218 scoped_refptr<net::IOBufferWithSize> buf2 =
219 new net::IOBufferWithSize(file_data_.size() / 2);
220 net::TestCompletionCallback read_callback2;
221 EXPECT_EQ(net::ERR_IO_PENDING,
222 reader_->Read(buf2.get(), buf2->size(), read_callback2.callback()));
223 EXPECT_EQ(buf2->size(), read_callback2.WaitForResult());
224 EXPECT_EQ(file_data_.size() - buf2->size(), reader_->BytesRemaining());
225 EXPECT_TRUE(std::equal(file_data_.begin(), file_data_.begin() + buf2->size(),
226 buf2->data()));
227
228 // Make sure callbacks are not called for cancelled operations.
229 EXPECT_FALSE(read_callback1.have_result());
230 EXPECT_FALSE(init_callback1.have_result());
231 }
232
233 TEST_F(UploadFileSystemFileElementReaderTest, Range) {
234 const int kOffset = 2;
235 const int kLength = file_data_.size() - kOffset * 3;
236 reader_.reset(new UploadFileSystemFileElementReader(
237 file_system_context_.get(), file_url_, kOffset, kLength, base::Time()));
238 net::TestCompletionCallback init_callback;
239 ASSERT_EQ(net::ERR_IO_PENDING, reader_->Init(init_callback.callback()));
240 EXPECT_EQ(net::OK, init_callback.WaitForResult());
241 EXPECT_EQ(static_cast<uint64>(kLength), reader_->GetContentLength());
242 EXPECT_EQ(static_cast<uint64>(kLength), reader_->BytesRemaining());
243 scoped_refptr<net::IOBufferWithSize> buf = new net::IOBufferWithSize(kLength);
244 net::TestCompletionCallback read_callback;
245 ASSERT_EQ(net::ERR_IO_PENDING,
246 reader_->Read(buf.get(), buf->size(), read_callback.callback()));
247 EXPECT_EQ(kLength, read_callback.WaitForResult());
248 EXPECT_TRUE(std::equal(file_data_.begin() + kOffset,
249 file_data_.begin() + kOffset + kLength,
250 buf->data()));
251 }
252
253 TEST_F(UploadFileSystemFileElementReaderTest, FileChanged) {
254 // Expect one second before the actual modification time to simulate change.
255 const base::Time expected_modification_time =
256 file_modification_time_ - base::TimeDelta::FromSeconds(1);
257 reader_.reset(
258 new UploadFileSystemFileElementReader(file_system_context_.get(),
259 file_url_,
260 0,
261 kuint64max,
262 expected_modification_time));
263 net::TestCompletionCallback init_callback;
264 ASSERT_EQ(net::ERR_IO_PENDING, reader_->Init(init_callback.callback()));
265 EXPECT_EQ(net::ERR_UPLOAD_FILE_CHANGED, init_callback.WaitForResult());
266 }
267
268 TEST_F(UploadFileSystemFileElementReaderTest, WrongURL) {
269 const GURL wrong_url = GetFileSystemURL("wrong_file_name.dat");
270 reader_.reset(new UploadFileSystemFileElementReader(
271 file_system_context_.get(), wrong_url, 0, kuint64max, base::Time()));
272 net::TestCompletionCallback init_callback;
273 ASSERT_EQ(net::ERR_IO_PENDING, reader_->Init(init_callback.callback()));
274 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, init_callback.WaitForResult());
275 }
276
277 } // namespace fileapi
OLDNEW
« no previous file with comments | « webkit/browser/fileapi/transient_file_util_unittest.cc ('k') | webkit/storage_browser.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698