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