OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chrome/browser/chromeos/drive/drive_url_request_job.h" | 5 #include "chrome/browser/chromeos/drive/drive_url_request_job.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/run_loop.h" |
10 #include "base/sequenced_task_runner.h" | 11 #include "base/sequenced_task_runner.h" |
11 #include "base/threading/sequenced_worker_pool.h" | 12 #include "base/threading/sequenced_worker_pool.h" |
12 #include "base/threading/thread.h" | 13 #include "base/threading/thread.h" |
13 #include "chrome/browser/chromeos/drive/drive_file_stream_reader.h" | 14 #include "chrome/browser/chromeos/drive/drive_file_stream_reader.h" |
14 #include "chrome/browser/chromeos/drive/fake_file_system.h" | 15 #include "chrome/browser/chromeos/drive/fake_file_system.h" |
15 #include "chrome/browser/chromeos/drive/file_system_util.h" | 16 #include "chrome/browser/chromeos/drive/file_system_util.h" |
16 #include "chrome/browser/chromeos/drive/test_util.h" | 17 #include "chrome/browser/chromeos/drive/test_util.h" |
17 #include "chrome/browser/drive/fake_drive_service.h" | 18 #include "chrome/browser/drive/fake_drive_service.h" |
18 #include "chrome/browser/google_apis/task_util.h" | 19 #include "chrome/browser/google_apis/task_util.h" |
19 #include "chrome/browser/google_apis/test_util.h" | 20 #include "chrome/browser/google_apis/test_util.h" |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 new base::Thread("ReadDriveFileSync")); | 150 new base::Thread("ReadDriveFileSync")); |
150 if (!worker_thread->Start()) | 151 if (!worker_thread->Start()) |
151 return false; | 152 return false; |
152 | 153 |
153 scoped_ptr<DriveFileStreamReader> reader(new DriveFileStreamReader( | 154 scoped_ptr<DriveFileStreamReader> reader(new DriveFileStreamReader( |
154 base::Bind(&DriveURLRequestJobTest::GetFileSystem, | 155 base::Bind(&DriveURLRequestJobTest::GetFileSystem, |
155 base::Unretained(this)), | 156 base::Unretained(this)), |
156 worker_thread->message_loop_proxy())); | 157 worker_thread->message_loop_proxy())); |
157 int error = net::ERR_FAILED; | 158 int error = net::ERR_FAILED; |
158 scoped_ptr<ResourceEntry> entry; | 159 scoped_ptr<ResourceEntry> entry; |
159 reader->Initialize( | 160 { |
160 file_path, | 161 base::RunLoop run_loop; |
161 net::HttpByteRange(), | 162 reader->Initialize( |
162 google_apis::CreateComposedCallback( | 163 file_path, |
163 base::Bind(&google_apis::test_util::RunAndQuit), | 164 net::HttpByteRange(), |
164 google_apis::test_util::CreateCopyResultCallback( | 165 google_apis::test_util::CreateQuitCallback( |
165 &error, &entry))); | 166 &run_loop, |
166 base::MessageLoop::current()->Run(); | 167 google_apis::test_util::CreateCopyResultCallback( |
| 168 &error, &entry))); |
| 169 run_loop.Run(); |
| 170 } |
167 if (error != net::OK || !entry) | 171 if (error != net::OK || !entry) |
168 return false; | 172 return false; |
169 | 173 |
170 // Read data from the reader. | 174 // Read data from the reader. |
171 std::string content; | 175 std::string content; |
172 if (test_util::ReadAllData(reader.get(), &content) != net::OK) | 176 if (test_util::ReadAllData(reader.get(), &content) != net::OK) |
173 return false; | 177 return false; |
174 | 178 |
175 if (static_cast<size_t>(entry->file_info().size()) != content.size()) | 179 if (static_cast<size_t>(entry->file_info().size()) != content.size()) |
176 return false; | 180 return false; |
(...skipping 13 matching lines...) Expand all Loading... |
190 scoped_ptr<TestDelegate> test_delegate_; | 194 scoped_ptr<TestDelegate> test_delegate_; |
191 }; | 195 }; |
192 | 196 |
193 TEST_F(DriveURLRequestJobTest, NonGetMethod) { | 197 TEST_F(DriveURLRequestJobTest, NonGetMethod) { |
194 net::URLRequest request( | 198 net::URLRequest request( |
195 GURL("drive:drive/root/File 1.txt"), test_delegate_.get(), | 199 GURL("drive:drive/root/File 1.txt"), test_delegate_.get(), |
196 url_request_context_.get(), test_network_delegate_.get()); | 200 url_request_context_.get(), test_network_delegate_.get()); |
197 request.set_method("POST"); // Set non "GET" method. | 201 request.set_method("POST"); // Set non "GET" method. |
198 request.Start(); | 202 request.Start(); |
199 | 203 |
200 base::MessageLoop::current()->Run(); | 204 base::RunLoop().Run(); |
201 | 205 |
202 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 206 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); |
203 EXPECT_EQ(net::ERR_METHOD_NOT_SUPPORTED, request.status().error()); | 207 EXPECT_EQ(net::ERR_METHOD_NOT_SUPPORTED, request.status().error()); |
204 } | 208 } |
205 | 209 |
206 TEST_F(DriveURLRequestJobTest, RegularFile) { | 210 TEST_F(DriveURLRequestJobTest, RegularFile) { |
207 const GURL kTestUrl("drive:drive/root/File 1.txt"); | 211 const GURL kTestUrl("drive:drive/root/File 1.txt"); |
208 const base::FilePath kTestFilePath("drive/root/File 1.txt"); | 212 const base::FilePath kTestFilePath("drive/root/File 1.txt"); |
209 | 213 |
210 // For the first time, the file should be fetched from the server. | 214 // For the first time, the file should be fetched from the server. |
211 { | 215 { |
212 net::URLRequest request( | 216 net::URLRequest request( |
213 kTestUrl, test_delegate_.get(), | 217 kTestUrl, test_delegate_.get(), |
214 url_request_context_.get(), test_network_delegate_.get()); | 218 url_request_context_.get(), test_network_delegate_.get()); |
215 request.Start(); | 219 request.Start(); |
216 | 220 |
217 base::MessageLoop::current()->Run(); | 221 base::RunLoop().Run(); |
218 | 222 |
219 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 223 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); |
220 // It looks weird, but the mime type for the "File 1.txt" is "audio/mpeg" | 224 // It looks weird, but the mime type for the "File 1.txt" is "audio/mpeg" |
221 // on the server. | 225 // on the server. |
222 std::string mime_type; | 226 std::string mime_type; |
223 request.GetMimeType(&mime_type); | 227 request.GetMimeType(&mime_type); |
224 EXPECT_EQ("audio/mpeg", mime_type); | 228 EXPECT_EQ("audio/mpeg", mime_type); |
225 | 229 |
226 // Reading file must be done after |request| runs, otherwise | 230 // Reading file must be done after |request| runs, otherwise |
227 // it'll create a local cache file, and we cannot test correctly. | 231 // it'll create a local cache file, and we cannot test correctly. |
228 std::string expected_data; | 232 std::string expected_data; |
229 ASSERT_TRUE(ReadDriveFileSync(kTestFilePath, &expected_data)); | 233 ASSERT_TRUE(ReadDriveFileSync(kTestFilePath, &expected_data)); |
230 EXPECT_EQ(expected_data, test_delegate_->data_received()); | 234 EXPECT_EQ(expected_data, test_delegate_->data_received()); |
231 } | 235 } |
232 | 236 |
233 // For the second time, the locally cached file should be used. | 237 // For the second time, the locally cached file should be used. |
234 // The caching emulation is done by FakeFileSystem. | 238 // The caching emulation is done by FakeFileSystem. |
235 { | 239 { |
236 test_delegate_.reset(new TestDelegate); | 240 test_delegate_.reset(new TestDelegate); |
237 net::URLRequest request( | 241 net::URLRequest request( |
238 GURL("drive:drive/root/File 1.txt"), test_delegate_.get(), | 242 GURL("drive:drive/root/File 1.txt"), test_delegate_.get(), |
239 url_request_context_.get(), test_network_delegate_.get()); | 243 url_request_context_.get(), test_network_delegate_.get()); |
240 request.Start(); | 244 request.Start(); |
241 | 245 |
242 base::MessageLoop::current()->Run(); | 246 base::RunLoop().Run(); |
243 | 247 |
244 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 248 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); |
245 std::string mime_type; | 249 std::string mime_type; |
246 request.GetMimeType(&mime_type); | 250 request.GetMimeType(&mime_type); |
247 EXPECT_EQ("audio/mpeg", mime_type); | 251 EXPECT_EQ("audio/mpeg", mime_type); |
248 | 252 |
249 std::string expected_data; | 253 std::string expected_data; |
250 ASSERT_TRUE(ReadDriveFileSync(kTestFilePath, &expected_data)); | 254 ASSERT_TRUE(ReadDriveFileSync(kTestFilePath, &expected_data)); |
251 EXPECT_EQ(expected_data, test_delegate_->data_received()); | 255 EXPECT_EQ(expected_data, test_delegate_->data_received()); |
252 } | 256 } |
253 } | 257 } |
254 | 258 |
255 TEST_F(DriveURLRequestJobTest, HostedDocument) { | 259 TEST_F(DriveURLRequestJobTest, HostedDocument) { |
256 // Open a gdoc file. | 260 // Open a gdoc file. |
257 test_delegate_->set_quit_on_redirect(true); | 261 test_delegate_->set_quit_on_redirect(true); |
258 net::URLRequest request( | 262 net::URLRequest request( |
259 GURL("drive:drive/root/Document 1 excludeDir-test.gdoc"), | 263 GURL("drive:drive/root/Document 1 excludeDir-test.gdoc"), |
260 test_delegate_.get(), | 264 test_delegate_.get(), |
261 url_request_context_.get(), test_network_delegate_.get()); | 265 url_request_context_.get(), test_network_delegate_.get()); |
262 request.Start(); | 266 request.Start(); |
263 | 267 |
264 base::MessageLoop::current()->Run(); | 268 base::RunLoop().Run(); |
265 | 269 |
266 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 270 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); |
267 // Make sure that a hosted document triggers redirection. | 271 // Make sure that a hosted document triggers redirection. |
268 EXPECT_TRUE(request.is_redirecting()); | 272 EXPECT_TRUE(request.is_redirecting()); |
269 EXPECT_EQ(GURL("https://3_document_alternate_link"), | 273 EXPECT_EQ(GURL("https://3_document_alternate_link"), |
270 test_delegate_->redirect_url()); | 274 test_delegate_->redirect_url()); |
271 } | 275 } |
272 | 276 |
273 TEST_F(DriveURLRequestJobTest, RootDirectory) { | 277 TEST_F(DriveURLRequestJobTest, RootDirectory) { |
274 net::URLRequest request( | 278 net::URLRequest request( |
275 GURL("drive:drive/root"), test_delegate_.get(), | 279 GURL("drive:drive/root"), test_delegate_.get(), |
276 url_request_context_.get(), test_network_delegate_.get()); | 280 url_request_context_.get(), test_network_delegate_.get()); |
277 request.Start(); | 281 request.Start(); |
278 | 282 |
279 base::MessageLoop::current()->Run(); | 283 base::RunLoop().Run(); |
280 | 284 |
281 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 285 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); |
282 EXPECT_EQ(net::ERR_FAILED, request.status().error()); | 286 EXPECT_EQ(net::ERR_FAILED, request.status().error()); |
283 } | 287 } |
284 | 288 |
285 TEST_F(DriveURLRequestJobTest, Directory) { | 289 TEST_F(DriveURLRequestJobTest, Directory) { |
286 net::URLRequest request( | 290 net::URLRequest request( |
287 GURL("drive:drive/root/Directory 1"), test_delegate_.get(), | 291 GURL("drive:drive/root/Directory 1"), test_delegate_.get(), |
288 url_request_context_.get(), test_network_delegate_.get()); | 292 url_request_context_.get(), test_network_delegate_.get()); |
289 request.Start(); | 293 request.Start(); |
290 | 294 |
291 base::MessageLoop::current()->Run(); | 295 base::RunLoop().Run(); |
292 | 296 |
293 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 297 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); |
294 EXPECT_EQ(net::ERR_FAILED, request.status().error()); | 298 EXPECT_EQ(net::ERR_FAILED, request.status().error()); |
295 } | 299 } |
296 | 300 |
297 TEST_F(DriveURLRequestJobTest, NonExistingFile) { | 301 TEST_F(DriveURLRequestJobTest, NonExistingFile) { |
298 net::URLRequest request( | 302 net::URLRequest request( |
299 GURL("drive:drive/root/non-existing-file.txt"), test_delegate_.get(), | 303 GURL("drive:drive/root/non-existing-file.txt"), test_delegate_.get(), |
300 url_request_context_.get(), test_network_delegate_.get()); | 304 url_request_context_.get(), test_network_delegate_.get()); |
301 request.Start(); | 305 request.Start(); |
302 | 306 |
303 base::MessageLoop::current()->Run(); | 307 base::RunLoop().Run(); |
304 | 308 |
305 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 309 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); |
306 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, request.status().error()); | 310 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, request.status().error()); |
307 } | 311 } |
308 | 312 |
309 TEST_F(DriveURLRequestJobTest, WrongFormat) { | 313 TEST_F(DriveURLRequestJobTest, WrongFormat) { |
310 net::URLRequest request( | 314 net::URLRequest request( |
311 GURL("drive:"), test_delegate_.get(), | 315 GURL("drive:"), test_delegate_.get(), |
312 url_request_context_.get(), test_network_delegate_.get()); | 316 url_request_context_.get(), test_network_delegate_.get()); |
313 request.Start(); | 317 request.Start(); |
314 | 318 |
315 base::MessageLoop::current()->Run(); | 319 base::RunLoop().Run(); |
316 | 320 |
317 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 321 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); |
318 EXPECT_EQ(net::ERR_INVALID_URL, request.status().error()); | 322 EXPECT_EQ(net::ERR_INVALID_URL, request.status().error()); |
319 } | 323 } |
320 | 324 |
321 TEST_F(DriveURLRequestJobTest, Cancel) { | 325 TEST_F(DriveURLRequestJobTest, Cancel) { |
322 net::URLRequest request( | 326 net::URLRequest request( |
323 GURL("drive:drive/root/File 1.txt"), test_delegate_.get(), | 327 GURL("drive:drive/root/File 1.txt"), test_delegate_.get(), |
324 url_request_context_.get(), test_network_delegate_.get()); | 328 url_request_context_.get(), test_network_delegate_.get()); |
325 | 329 |
326 // Start the request, and cancel it immediately after it. | 330 // Start the request, and cancel it immediately after it. |
327 request.Start(); | 331 request.Start(); |
328 request.Cancel(); | 332 request.Cancel(); |
329 | 333 |
330 base::MessageLoop::current()->Run(); | 334 base::RunLoop().Run(); |
331 | 335 |
332 EXPECT_EQ(net::URLRequestStatus::CANCELED, request.status().status()); | 336 EXPECT_EQ(net::URLRequestStatus::CANCELED, request.status().status()); |
333 } | 337 } |
334 | 338 |
335 TEST_F(DriveURLRequestJobTest, RangeHeader) { | 339 TEST_F(DriveURLRequestJobTest, RangeHeader) { |
336 const GURL kTestUrl("drive:drive/root/File 1.txt"); | 340 const GURL kTestUrl("drive:drive/root/File 1.txt"); |
337 const base::FilePath kTestFilePath("drive/root/File 1.txt"); | 341 const base::FilePath kTestFilePath("drive/root/File 1.txt"); |
338 | 342 |
339 net::URLRequest request( | 343 net::URLRequest request( |
340 kTestUrl, test_delegate_.get(), | 344 kTestUrl, test_delegate_.get(), |
341 url_request_context_.get(), test_network_delegate_.get()); | 345 url_request_context_.get(), test_network_delegate_.get()); |
342 | 346 |
343 // Set range header. | 347 // Set range header. |
344 request.SetExtraRequestHeaderByName( | 348 request.SetExtraRequestHeaderByName( |
345 "Range", "bytes=3-5", false /* overwrite */); | 349 "Range", "bytes=3-5", false /* overwrite */); |
346 request.Start(); | 350 request.Start(); |
347 | 351 |
348 base::MessageLoop::current()->Run(); | 352 base::RunLoop().Run(); |
349 | 353 |
350 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 354 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); |
351 | 355 |
352 // Reading file must be done after |request| runs, otherwise | 356 // Reading file must be done after |request| runs, otherwise |
353 // it'll create a local cache file, and we cannot test correctly. | 357 // it'll create a local cache file, and we cannot test correctly. |
354 std::string expected_data; | 358 std::string expected_data; |
355 ASSERT_TRUE(ReadDriveFileSync(kTestFilePath, &expected_data)); | 359 ASSERT_TRUE(ReadDriveFileSync(kTestFilePath, &expected_data)); |
356 EXPECT_EQ(expected_data.substr(3, 3), test_delegate_->data_received()); | 360 EXPECT_EQ(expected_data.substr(3, 3), test_delegate_->data_received()); |
357 } | 361 } |
358 | 362 |
359 TEST_F(DriveURLRequestJobTest, WrongRangeHeader) { | 363 TEST_F(DriveURLRequestJobTest, WrongRangeHeader) { |
360 const GURL kTestUrl("drive:drive/root/File 1.txt"); | 364 const GURL kTestUrl("drive:drive/root/File 1.txt"); |
361 | 365 |
362 net::URLRequest request( | 366 net::URLRequest request( |
363 kTestUrl, test_delegate_.get(), | 367 kTestUrl, test_delegate_.get(), |
364 url_request_context_.get(), test_network_delegate_.get()); | 368 url_request_context_.get(), test_network_delegate_.get()); |
365 | 369 |
366 // Set range header. | 370 // Set range header. |
367 request.SetExtraRequestHeaderByName( | 371 request.SetExtraRequestHeaderByName( |
368 "Range", "Wrong Range Header Value", false /* overwrite */); | 372 "Range", "Wrong Range Header Value", false /* overwrite */); |
369 request.Start(); | 373 request.Start(); |
370 | 374 |
371 base::MessageLoop::current()->Run(); | 375 base::RunLoop().Run(); |
372 | 376 |
373 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 377 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); |
374 EXPECT_EQ(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE, request.status().error()); | 378 EXPECT_EQ(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE, request.status().error()); |
375 } | 379 } |
376 | 380 |
377 } // namespace drive | 381 } // namespace drive |
OLD | NEW |