OLD | NEW |
1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. Use of this | 1 // 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 | 2 // source code is governed by a BSD-style license that can be found in the |
3 // LICENSE file. | 3 // LICENSE file. |
4 | 4 |
5 #include "base/file_util.h" | 5 #include "base/file_util.h" |
6 #include "base/path_service.h" | 6 #include "base/path_service.h" |
7 #include "base/platform_test.h" | 7 #include "base/platform_test.h" |
8 #include "net/base/file_input_stream.h" | 8 #include "net/base/file_stream.h" |
9 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" |
10 #include "net/base/test_completion_callback.h" | 10 #include "net/base/test_completion_callback.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
12 | 12 |
13 static const char kTestData[] = "0123456789"; | 13 static const char kTestData[] = "0123456789"; |
| 14 static const int kTestDataSize = arraysize(kTestData) - 1; |
14 | 15 |
15 class FileInputStreamTest : public PlatformTest { | 16 class FileStreamTest : public PlatformTest { |
16 public: | 17 public: |
17 virtual void SetUp() { | 18 virtual void SetUp() { |
18 PlatformTest::SetUp(); | 19 PlatformTest::SetUp(); |
19 | 20 |
20 file_util::CreateTemporaryFileName(&temp_file_path_); | 21 file_util::CreateTemporaryFileName(&temp_file_path_); |
21 file_util::WriteFile(temp_file_path_, kTestData, arraysize(kTestData)-1); | 22 file_util::WriteFile(temp_file_path_, kTestData, kTestDataSize); |
22 } | 23 } |
23 virtual void TearDown() { | 24 virtual void TearDown() { |
24 file_util::Delete(temp_file_path_, false); | 25 file_util::Delete(temp_file_path_, false); |
25 | 26 |
26 PlatformTest::TearDown(); | 27 PlatformTest::TearDown(); |
27 } | 28 } |
28 const std::wstring temp_file_path() const { return temp_file_path_; } | 29 const std::wstring temp_file_path() const { return temp_file_path_; } |
29 private: | 30 private: |
30 std::wstring temp_file_path_; | 31 std::wstring temp_file_path_; |
31 }; | 32 }; |
32 | 33 |
33 TEST_F(FileInputStreamTest, BasicOpenClose) { | 34 TEST_F(FileStreamTest, BasicOpenClose) { |
34 net::FileInputStream stream; | 35 net::FileStream stream; |
35 int rv = stream.Open(temp_file_path(), false); | 36 int rv = stream.Open(temp_file_path(), |
| 37 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ); |
36 EXPECT_EQ(net::OK, rv); | 38 EXPECT_EQ(net::OK, rv); |
37 } | 39 } |
38 | 40 |
39 TEST_F(FileInputStreamTest, UseClosedStream) { | 41 TEST_F(FileStreamTest, UseClosedStream) { |
40 net::FileInputStream stream; | 42 net::FileStream stream; |
41 | 43 |
42 EXPECT_FALSE(stream.IsOpen()); | 44 EXPECT_FALSE(stream.IsOpen()); |
43 | 45 |
44 // Try seeking... | 46 // Try seeking... |
45 int64 new_offset = stream.Seek(net::FROM_BEGIN, 5); | 47 int64 new_offset = stream.Seek(net::FROM_BEGIN, 5); |
46 EXPECT_EQ(net::ERR_UNEXPECTED, new_offset); | 48 EXPECT_EQ(net::ERR_UNEXPECTED, new_offset); |
47 | 49 |
48 // Try available... | 50 // Try available... |
49 int64 avail = stream.Available(); | 51 int64 avail = stream.Available(); |
50 EXPECT_EQ(net::ERR_UNEXPECTED, avail); | 52 EXPECT_EQ(net::ERR_UNEXPECTED, avail); |
51 | 53 |
52 // Try reading... | 54 // Try reading... |
53 char buf[10]; | 55 char buf[10]; |
54 int rv = stream.Read(buf, sizeof(buf), NULL); | 56 int rv = stream.Read(buf, sizeof(buf), NULL); |
55 EXPECT_EQ(net::ERR_UNEXPECTED, rv); | 57 EXPECT_EQ(net::ERR_UNEXPECTED, rv); |
56 } | 58 } |
57 | 59 |
58 TEST_F(FileInputStreamTest, BasicRead) { | 60 TEST_F(FileStreamTest, BasicRead) { |
59 int64 file_size; | 61 int64 file_size; |
60 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); | 62 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); |
61 EXPECT_TRUE(ok); | 63 EXPECT_TRUE(ok); |
62 | 64 |
63 net::FileInputStream stream; | 65 net::FileStream stream; |
64 int rv = stream.Open(temp_file_path(), false); | 66 int flags = base::PLATFORM_FILE_OPEN | |
| 67 base::PLATFORM_FILE_READ; |
| 68 int rv = stream.Open(temp_file_path(), flags); |
65 EXPECT_EQ(net::OK, rv); | 69 EXPECT_EQ(net::OK, rv); |
66 | 70 |
67 int64 total_bytes_avail = stream.Available(); | 71 int64 total_bytes_avail = stream.Available(); |
68 EXPECT_EQ(file_size, total_bytes_avail); | 72 EXPECT_EQ(file_size, total_bytes_avail); |
69 | 73 |
70 int64 total_bytes_read = 0; | 74 int64 total_bytes_read = 0; |
71 | 75 |
72 std::string data_read; | 76 std::string data_read; |
73 for (;;) { | 77 for (;;) { |
74 char buf[4]; | 78 char buf[4]; |
75 rv = stream.Read(buf, sizeof(buf), NULL); | 79 rv = stream.Read(buf, sizeof(buf), NULL); |
76 EXPECT_LE(0, rv); | 80 EXPECT_LE(0, rv); |
77 if (rv <= 0) | 81 if (rv <= 0) |
78 break; | 82 break; |
79 total_bytes_read += rv; | 83 total_bytes_read += rv; |
80 data_read.append(buf, rv); | 84 data_read.append(buf, rv); |
81 } | 85 } |
82 EXPECT_EQ(file_size, total_bytes_read); | 86 EXPECT_EQ(file_size, total_bytes_read); |
83 EXPECT_TRUE(data_read == kTestData); | 87 EXPECT_TRUE(data_read == kTestData); |
84 } | 88 } |
85 | 89 |
86 TEST_F(FileInputStreamTest, AsyncRead) { | 90 TEST_F(FileStreamTest, AsyncRead) { |
87 int64 file_size; | 91 int64 file_size; |
88 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); | 92 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); |
89 EXPECT_TRUE(ok); | 93 EXPECT_TRUE(ok); |
90 | 94 |
91 net::FileInputStream stream; | 95 net::FileStream stream; |
92 int rv = stream.Open(temp_file_path(), true); | 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); |
93 EXPECT_EQ(net::OK, rv); | 100 EXPECT_EQ(net::OK, rv); |
94 | 101 |
95 int64 total_bytes_avail = stream.Available(); | 102 int64 total_bytes_avail = stream.Available(); |
96 EXPECT_EQ(file_size, total_bytes_avail); | 103 EXPECT_EQ(file_size, total_bytes_avail); |
97 | 104 |
98 TestCompletionCallback callback; | 105 TestCompletionCallback callback; |
99 | 106 |
100 int64 total_bytes_read = 0; | 107 int64 total_bytes_read = 0; |
101 | 108 |
102 std::string data_read; | 109 std::string data_read; |
103 for (;;) { | 110 for (;;) { |
104 char buf[4]; | 111 char buf[4]; |
105 rv = stream.Read(buf, sizeof(buf), &callback); | 112 rv = stream.Read(buf, sizeof(buf), &callback); |
106 if (rv == net::ERR_IO_PENDING) | 113 if (rv == net::ERR_IO_PENDING) |
107 rv = callback.WaitForResult(); | 114 rv = callback.WaitForResult(); |
108 EXPECT_LE(0, rv); | 115 EXPECT_LE(0, rv); |
109 if (rv <= 0) | 116 if (rv <= 0) |
110 break; | 117 break; |
111 total_bytes_read += rv; | 118 total_bytes_read += rv; |
112 data_read.append(buf, rv); | 119 data_read.append(buf, rv); |
113 } | 120 } |
114 EXPECT_EQ(file_size, total_bytes_read); | 121 EXPECT_EQ(file_size, total_bytes_read); |
115 EXPECT_TRUE(data_read == kTestData); | 122 EXPECT_TRUE(data_read == kTestData); |
116 } | 123 } |
117 | 124 |
118 TEST_F(FileInputStreamTest, BasicRead_FromOffset) { | 125 TEST_F(FileStreamTest, BasicRead_FromOffset) { |
119 int64 file_size; | 126 int64 file_size; |
120 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); | 127 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); |
121 EXPECT_TRUE(ok); | 128 EXPECT_TRUE(ok); |
122 | 129 |
123 net::FileInputStream stream; | 130 net::FileStream stream; |
124 int rv = stream.Open(temp_file_path(), false); | 131 int flags = base::PLATFORM_FILE_OPEN | |
| 132 base::PLATFORM_FILE_READ; |
| 133 int rv = stream.Open(temp_file_path(), flags); |
125 EXPECT_EQ(net::OK, rv); | 134 EXPECT_EQ(net::OK, rv); |
126 | 135 |
127 const int64 kOffset = 3; | 136 const int64 kOffset = 3; |
128 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset); | 137 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset); |
129 EXPECT_EQ(kOffset, new_offset); | 138 EXPECT_EQ(kOffset, new_offset); |
130 | 139 |
131 int64 total_bytes_avail = stream.Available(); | 140 int64 total_bytes_avail = stream.Available(); |
132 EXPECT_EQ(file_size - kOffset, total_bytes_avail); | 141 EXPECT_EQ(file_size - kOffset, total_bytes_avail); |
133 | 142 |
134 int64 total_bytes_read = 0; | 143 int64 total_bytes_read = 0; |
135 | 144 |
136 std::string data_read; | 145 std::string data_read; |
137 for (;;) { | 146 for (;;) { |
138 char buf[4]; | 147 char buf[4]; |
139 rv = stream.Read(buf, sizeof(buf), NULL); | 148 rv = stream.Read(buf, sizeof(buf), NULL); |
140 EXPECT_LE(0, rv); | 149 EXPECT_LE(0, rv); |
141 if (rv <= 0) | 150 if (rv <= 0) |
142 break; | 151 break; |
143 total_bytes_read += rv; | 152 total_bytes_read += rv; |
144 data_read.append(buf, rv); | 153 data_read.append(buf, rv); |
145 } | 154 } |
146 EXPECT_EQ(file_size - kOffset, total_bytes_read); | 155 EXPECT_EQ(file_size - kOffset, total_bytes_read); |
147 EXPECT_TRUE(data_read == kTestData + kOffset); | 156 EXPECT_TRUE(data_read == kTestData + kOffset); |
148 } | 157 } |
149 | 158 |
150 TEST_F(FileInputStreamTest, AsyncRead_FromOffset) { | 159 TEST_F(FileStreamTest, AsyncRead_FromOffset) { |
151 int64 file_size; | 160 int64 file_size; |
152 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); | 161 bool ok = file_util::GetFileSize(temp_file_path(), &file_size); |
153 EXPECT_TRUE(ok); | 162 EXPECT_TRUE(ok); |
154 | 163 |
155 net::FileInputStream stream; | 164 net::FileStream stream; |
156 int rv = stream.Open(temp_file_path(), true); | 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); |
157 EXPECT_EQ(net::OK, rv); | 169 EXPECT_EQ(net::OK, rv); |
158 | 170 |
159 const int64 kOffset = 3; | 171 const int64 kOffset = 3; |
160 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset); | 172 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset); |
161 EXPECT_EQ(kOffset, new_offset); | 173 EXPECT_EQ(kOffset, new_offset); |
162 | 174 |
163 int64 total_bytes_avail = stream.Available(); | 175 int64 total_bytes_avail = stream.Available(); |
164 EXPECT_EQ(file_size - kOffset, total_bytes_avail); | 176 EXPECT_EQ(file_size - kOffset, total_bytes_avail); |
165 | 177 |
166 TestCompletionCallback callback; | 178 TestCompletionCallback callback; |
167 | 179 |
168 int64 total_bytes_read = 0; | 180 int64 total_bytes_read = 0; |
169 | 181 |
170 std::string data_read; | 182 std::string data_read; |
171 for (;;) { | 183 for (;;) { |
172 char buf[4]; | 184 char buf[4]; |
173 rv = stream.Read(buf, sizeof(buf), &callback); | 185 rv = stream.Read(buf, sizeof(buf), &callback); |
174 if (rv == net::ERR_IO_PENDING) | 186 if (rv == net::ERR_IO_PENDING) |
175 rv = callback.WaitForResult(); | 187 rv = callback.WaitForResult(); |
176 EXPECT_LE(0, rv); | 188 EXPECT_LE(0, rv); |
177 if (rv <= 0) | 189 if (rv <= 0) |
178 break; | 190 break; |
179 total_bytes_read += rv; | 191 total_bytes_read += rv; |
180 data_read.append(buf, rv); | 192 data_read.append(buf, rv); |
181 } | 193 } |
182 EXPECT_EQ(file_size - kOffset, total_bytes_read); | 194 EXPECT_EQ(file_size - kOffset, total_bytes_read); |
183 EXPECT_TRUE(data_read == kTestData + kOffset); | 195 EXPECT_TRUE(data_read == kTestData + kOffset); |
184 } | 196 } |
185 | 197 |
186 TEST_F(FileInputStreamTest, SeekAround) { | 198 TEST_F(FileStreamTest, SeekAround) { |
187 net::FileInputStream stream; | 199 net::FileStream stream; |
188 int rv = stream.Open(temp_file_path(), true); | 200 int flags = base::PLATFORM_FILE_OPEN | |
| 201 base::PLATFORM_FILE_READ; |
| 202 int rv = stream.Open(temp_file_path(), flags); |
189 EXPECT_EQ(net::OK, rv); | 203 EXPECT_EQ(net::OK, rv); |
190 | 204 |
191 const int64 kOffset = 3; | 205 const int64 kOffset = 3; |
192 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset); | 206 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset); |
193 EXPECT_EQ(kOffset, new_offset); | 207 EXPECT_EQ(kOffset, new_offset); |
194 | 208 |
195 new_offset = stream.Seek(net::FROM_CURRENT, kOffset); | 209 new_offset = stream.Seek(net::FROM_CURRENT, kOffset); |
196 EXPECT_EQ(2 * kOffset, new_offset); | 210 EXPECT_EQ(2 * kOffset, new_offset); |
197 | 211 |
198 new_offset = stream.Seek(net::FROM_CURRENT, -kOffset); | 212 new_offset = stream.Seek(net::FROM_CURRENT, -kOffset); |
199 EXPECT_EQ(kOffset, new_offset); | 213 EXPECT_EQ(kOffset, new_offset); |
200 | 214 |
201 const int kTestDataLen = arraysize(kTestData) - 1; | 215 const int kTestDataLen = arraysize(kTestData) - 1; |
202 | 216 |
203 new_offset = stream.Seek(net::FROM_END, -kTestDataLen); | 217 new_offset = stream.Seek(net::FROM_END, -kTestDataLen); |
204 EXPECT_EQ(0, new_offset); | 218 EXPECT_EQ(0, new_offset); |
205 } | 219 } |
| 220 |
| 221 TEST_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 |
| 242 TEST_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 |
| 272 TEST_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 |
| 297 TEST_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 |
| 330 TEST_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? |
OLD | NEW |