blob: abee897254ffce3681beb10467c9e5e34e520f91 [file] [log] [blame]
[email protected]21da6eb2008-11-03 17:18:141// Copyright (c) 2008 The Chromium Authors. All rights reserved. Use of this
2// source code is governed by a BSD-style license that can be found in the
3// LICENSE file.
4
5#include "base/file_util.h"
6#include "base/path_service.h"
[email protected]21da6eb2008-11-03 17:18:147#include "net/base/file_stream.h"
8#include "net/base/net_errors.h"
9#include "net/base/test_completion_callback.h"
10#include "testing/gtest/include/gtest/gtest.h"
[email protected]23887f04f2008-12-02 19:20:1511#include "testing/platform_test.h"
[email protected]21da6eb2008-11-03 17:18:1412
13static const char kTestData[] = "0123456789";
14static const int kTestDataSize = arraysize(kTestData) - 1;
15
16class FileStreamTest : public PlatformTest {
17 public:
18 virtual void SetUp() {
19 PlatformTest::SetUp();
20
21 file_util::CreateTemporaryFileName(&temp_file_path_);
[email protected]07167e8f2009-01-26 21:38:1122 file_util::WriteFile(temp_file_path_.ToWStringHack(),
23 kTestData, kTestDataSize);
[email protected]21da6eb2008-11-03 17:18:1424 }
25 virtual void TearDown() {
26 file_util::Delete(temp_file_path_, false);
27
28 PlatformTest::TearDown();
29 }
[email protected]07167e8f2009-01-26 21:38:1130 const FilePath temp_file_path() const { return temp_file_path_; }
[email protected]21da6eb2008-11-03 17:18:1431 private:
[email protected]07167e8f2009-01-26 21:38:1132 FilePath temp_file_path_;
[email protected]21da6eb2008-11-03 17:18:1433};
34
35TEST_F(FileStreamTest, BasicOpenClose) {
36 net::FileStream stream;
37 int rv = stream.Open(temp_file_path(),
38 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ);
39 EXPECT_EQ(net::OK, rv);
40}
41
42TEST_F(FileStreamTest, UseClosedStream) {
43 net::FileStream stream;
44
45 EXPECT_FALSE(stream.IsOpen());
46
47 // Try seeking...
48 int64 new_offset = stream.Seek(net::FROM_BEGIN, 5);
49 EXPECT_EQ(net::ERR_UNEXPECTED, new_offset);
50
51 // Try available...
52 int64 avail = stream.Available();
53 EXPECT_EQ(net::ERR_UNEXPECTED, avail);
54
55 // Try reading...
56 char buf[10];
57 int rv = stream.Read(buf, sizeof(buf), NULL);
58 EXPECT_EQ(net::ERR_UNEXPECTED, rv);
59}
60
61TEST_F(FileStreamTest, BasicRead) {
62 int64 file_size;
63 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
64 EXPECT_TRUE(ok);
65
66 net::FileStream stream;
67 int flags = base::PLATFORM_FILE_OPEN |
68 base::PLATFORM_FILE_READ;
69 int rv = stream.Open(temp_file_path(), flags);
70 EXPECT_EQ(net::OK, rv);
71
72 int64 total_bytes_avail = stream.Available();
73 EXPECT_EQ(file_size, total_bytes_avail);
74
75 int64 total_bytes_read = 0;
76
77 std::string data_read;
78 for (;;) {
79 char buf[4];
80 rv = stream.Read(buf, sizeof(buf), NULL);
81 EXPECT_LE(0, rv);
82 if (rv <= 0)
83 break;
84 total_bytes_read += rv;
85 data_read.append(buf, rv);
86 }
87 EXPECT_EQ(file_size, total_bytes_read);
88 EXPECT_TRUE(data_read == kTestData);
89}
90
91TEST_F(FileStreamTest, AsyncRead) {
92 int64 file_size;
93 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
94 EXPECT_TRUE(ok);
95
96 net::FileStream stream;
97 int flags = base::PLATFORM_FILE_OPEN |
98 base::PLATFORM_FILE_READ |
99 base::PLATFORM_FILE_ASYNC;
100 int rv = stream.Open(temp_file_path(), flags);
101 EXPECT_EQ(net::OK, rv);
102
103 int64 total_bytes_avail = stream.Available();
104 EXPECT_EQ(file_size, total_bytes_avail);
105
106 TestCompletionCallback callback;
107
108 int64 total_bytes_read = 0;
109
110 std::string data_read;
111 for (;;) {
112 char buf[4];
113 rv = stream.Read(buf, sizeof(buf), &callback);
114 if (rv == net::ERR_IO_PENDING)
115 rv = callback.WaitForResult();
116 EXPECT_LE(0, rv);
117 if (rv <= 0)
118 break;
119 total_bytes_read += rv;
120 data_read.append(buf, rv);
121 }
122 EXPECT_EQ(file_size, total_bytes_read);
123 EXPECT_TRUE(data_read == kTestData);
124}
125
126TEST_F(FileStreamTest, BasicRead_FromOffset) {
127 int64 file_size;
128 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
129 EXPECT_TRUE(ok);
130
131 net::FileStream stream;
132 int flags = base::PLATFORM_FILE_OPEN |
133 base::PLATFORM_FILE_READ;
134 int rv = stream.Open(temp_file_path(), flags);
135 EXPECT_EQ(net::OK, rv);
136
137 const int64 kOffset = 3;
138 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset);
139 EXPECT_EQ(kOffset, new_offset);
140
141 int64 total_bytes_avail = stream.Available();
142 EXPECT_EQ(file_size - kOffset, total_bytes_avail);
143
144 int64 total_bytes_read = 0;
145
146 std::string data_read;
147 for (;;) {
148 char buf[4];
149 rv = stream.Read(buf, sizeof(buf), NULL);
150 EXPECT_LE(0, rv);
151 if (rv <= 0)
152 break;
153 total_bytes_read += rv;
154 data_read.append(buf, rv);
155 }
156 EXPECT_EQ(file_size - kOffset, total_bytes_read);
157 EXPECT_TRUE(data_read == kTestData + kOffset);
158}
159
160TEST_F(FileStreamTest, AsyncRead_FromOffset) {
161 int64 file_size;
162 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
163 EXPECT_TRUE(ok);
164
165 net::FileStream stream;
166 int flags = base::PLATFORM_FILE_OPEN |
167 base::PLATFORM_FILE_READ |
168 base::PLATFORM_FILE_ASYNC;
169 int rv = stream.Open(temp_file_path(), flags);
170 EXPECT_EQ(net::OK, rv);
171
172 const int64 kOffset = 3;
173 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset);
174 EXPECT_EQ(kOffset, new_offset);
175
176 int64 total_bytes_avail = stream.Available();
177 EXPECT_EQ(file_size - kOffset, total_bytes_avail);
178
179 TestCompletionCallback callback;
180
181 int64 total_bytes_read = 0;
182
183 std::string data_read;
184 for (;;) {
185 char buf[4];
186 rv = stream.Read(buf, sizeof(buf), &callback);
187 if (rv == net::ERR_IO_PENDING)
188 rv = callback.WaitForResult();
189 EXPECT_LE(0, rv);
190 if (rv <= 0)
191 break;
192 total_bytes_read += rv;
193 data_read.append(buf, rv);
194 }
195 EXPECT_EQ(file_size - kOffset, total_bytes_read);
196 EXPECT_TRUE(data_read == kTestData + kOffset);
197}
198
199TEST_F(FileStreamTest, SeekAround) {
200 net::FileStream stream;
201 int flags = base::PLATFORM_FILE_OPEN |
202 base::PLATFORM_FILE_READ;
203 int rv = stream.Open(temp_file_path(), flags);
204 EXPECT_EQ(net::OK, rv);
205
206 const int64 kOffset = 3;
207 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset);
208 EXPECT_EQ(kOffset, new_offset);
209
210 new_offset = stream.Seek(net::FROM_CURRENT, kOffset);
211 EXPECT_EQ(2 * kOffset, new_offset);
212
213 new_offset = stream.Seek(net::FROM_CURRENT, -kOffset);
214 EXPECT_EQ(kOffset, new_offset);
215
216 const int kTestDataLen = arraysize(kTestData) - 1;
217
218 new_offset = stream.Seek(net::FROM_END, -kTestDataLen);
219 EXPECT_EQ(0, new_offset);
220}
221
222TEST_F(FileStreamTest, BasicWrite) {
223 net::FileStream stream;
224 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
225 base::PLATFORM_FILE_WRITE;
226 int rv = stream.Open(temp_file_path(), flags);
227 EXPECT_EQ(net::OK, rv);
228
229 int64 file_size;
230 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
231 EXPECT_TRUE(ok);
232 EXPECT_EQ(0, file_size);
233
234 rv = stream.Write(kTestData, kTestDataSize, NULL);
235 EXPECT_EQ(kTestDataSize, rv);
236 stream.Close();
237
238 ok = file_util::GetFileSize(temp_file_path(), &file_size);
239 EXPECT_TRUE(ok);
240 EXPECT_EQ(kTestDataSize, file_size);
241}
242
243TEST_F(FileStreamTest, AsyncWrite) {
244 net::FileStream stream;
245 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
246 base::PLATFORM_FILE_WRITE |
247 base::PLATFORM_FILE_ASYNC;
248 int rv = stream.Open(temp_file_path(), flags);
249 EXPECT_EQ(net::OK, rv);
250
251 int64 file_size;
252 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
253 EXPECT_TRUE(ok);
254 EXPECT_EQ(0, file_size);
255
256 TestCompletionCallback callback;
257 int64 total_bytes_written = 0;
258
259 while (total_bytes_written != kTestDataSize) {
260 rv = stream.Write(kTestData, kTestDataSize, &callback);
261 if (rv == net::ERR_IO_PENDING)
262 rv = callback.WaitForResult();
263 EXPECT_LT(0, rv);
264 if (rv <= 0)
265 break;
266 total_bytes_written += rv;
267 }
268 ok = file_util::GetFileSize(temp_file_path(), &file_size);
269 EXPECT_TRUE(ok);
270 EXPECT_EQ(file_size, total_bytes_written);
271}
272
273TEST_F(FileStreamTest, BasicWrite_FromOffset) {
274 net::FileStream stream;
275 int flags = base::PLATFORM_FILE_OPEN |
276 base::PLATFORM_FILE_WRITE;
277 int rv = stream.Open(temp_file_path(), flags);
278 EXPECT_EQ(net::OK, rv);
279
280 int64 file_size;
281 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
282 EXPECT_TRUE(ok);
283 EXPECT_EQ(kTestDataSize, file_size);
284
285 const int64 kOffset = 0;
286 int64 new_offset = stream.Seek(net::FROM_END, kOffset);
287 EXPECT_EQ(kTestDataSize, new_offset);
288
289 rv = stream.Write(kTestData, kTestDataSize, NULL);
290 EXPECT_EQ(kTestDataSize, rv);
291 stream.Close();
292
293 ok = file_util::GetFileSize(temp_file_path(), &file_size);
294 EXPECT_TRUE(ok);
295 EXPECT_EQ(kTestDataSize * 2, file_size);
296}
297
298TEST_F(FileStreamTest, AsyncWrite_FromOffset) {
299 int64 file_size;
300 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
301 EXPECT_TRUE(ok);
302
303 net::FileStream stream;
304 int flags = base::PLATFORM_FILE_OPEN |
305 base::PLATFORM_FILE_WRITE |
306 base::PLATFORM_FILE_ASYNC;
307 int rv = stream.Open(temp_file_path(), flags);
308 EXPECT_EQ(net::OK, rv);
309
310 const int64 kOffset = 0;
311 int64 new_offset = stream.Seek(net::FROM_END, kOffset);
312 EXPECT_EQ(kTestDataSize, new_offset);
313
314 TestCompletionCallback callback;
315 int64 total_bytes_written = 0;
316
317 while (total_bytes_written != kTestDataSize) {
318 rv = stream.Write(kTestData, kTestDataSize, &callback);
319 if (rv == net::ERR_IO_PENDING)
320 rv = callback.WaitForResult();
321 EXPECT_LT(0, rv);
322 if (rv <= 0)
323 break;
324 total_bytes_written += rv;
325 }
326 ok = file_util::GetFileSize(temp_file_path(), &file_size);
327 EXPECT_TRUE(ok);
328 EXPECT_EQ(file_size, kTestDataSize * 2);
329}
330
331TEST_F(FileStreamTest, BasicReadWrite) {
332 int64 file_size;
333 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
334 EXPECT_TRUE(ok);
335
336 net::FileStream stream;
337 int flags = base::PLATFORM_FILE_OPEN |
338 base::PLATFORM_FILE_READ |
339 base::PLATFORM_FILE_WRITE;
340 int rv = stream.Open(temp_file_path(), flags);
341 EXPECT_EQ(net::OK, rv);
342
343 int64 total_bytes_avail = stream.Available();
344 EXPECT_EQ(file_size, total_bytes_avail);
345
346 int64 total_bytes_read = 0;
347
348 std::string data_read;
349 for (;;) {
350 char buf[4];
351 rv = stream.Read(buf, sizeof(buf), NULL);
352 EXPECT_LE(0, rv);
353 if (rv <= 0)
354 break;
355 total_bytes_read += rv;
356 data_read.append(buf, rv);
357 }
358 EXPECT_EQ(file_size, total_bytes_read);
359 EXPECT_TRUE(data_read == kTestData);
360
361 rv = stream.Write(kTestData, kTestDataSize, NULL);
362 EXPECT_EQ(kTestDataSize, rv);
363 stream.Close();
364
365 ok = file_util::GetFileSize(temp_file_path(), &file_size);
366 EXPECT_TRUE(ok);
367 EXPECT_EQ(kTestDataSize * 2, file_size);
368}
369
370// TODO(erikkay): more READ_WRITE tests?