OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "modules/fetch/FetchDataLoader.h" | 5 #include "modules/fetch/FetchDataLoader.h" |
6 | 6 |
| 7 #include <memory> |
| 8 #include "core/fileapi/Blob.h" |
| 9 #include "core/html/FormData.h" |
7 #include "modules/fetch/BytesConsumerForDataConsumerHandle.h" | 10 #include "modules/fetch/BytesConsumerForDataConsumerHandle.h" |
8 #include "modules/fetch/BytesConsumerTestUtil.h" | 11 #include "modules/fetch/BytesConsumerTestUtil.h" |
9 #include "testing/gmock/include/gmock/gmock.h" | 12 #include "testing/gmock/include/gmock/gmock.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
11 #include <memory> | |
12 | 14 |
13 namespace blink { | 15 namespace blink { |
14 | 16 |
15 namespace { | 17 namespace { |
16 | 18 |
17 using ::testing::ByMove; | 19 using ::testing::ByMove; |
18 using ::testing::InSequence; | 20 using ::testing::InSequence; |
19 using ::testing::Return; | 21 using ::testing::Return; |
20 using ::testing::DoAll; | 22 using ::testing::DoAll; |
21 using ::testing::StrictMock; | 23 using ::testing::StrictMock; |
22 using ::testing::_; | 24 using ::testing::_; |
23 using ::testing::SaveArg; | 25 using ::testing::SaveArg; |
24 using ::testing::SetArgPointee; | 26 using ::testing::SetArgPointee; |
25 using Checkpoint = StrictMock<::testing::MockFunction<void(int)>>; | 27 using Checkpoint = StrictMock<::testing::MockFunction<void(int)>>; |
26 using MockFetchDataLoaderClient = | 28 using MockFetchDataLoaderClient = |
27 BytesConsumerTestUtil::MockFetchDataLoaderClient; | 29 BytesConsumerTestUtil::MockFetchDataLoaderClient; |
28 using MockBytesConsumer = BytesConsumerTestUtil::MockBytesConsumer; | 30 using MockBytesConsumer = BytesConsumerTestUtil::MockBytesConsumer; |
29 using Result = BytesConsumer::Result; | 31 using Result = BytesConsumer::Result; |
30 | 32 |
31 constexpr char kQuickBrownFox[] = "Quick brown fox"; | 33 constexpr char kQuickBrownFox[] = "Quick brown fox"; |
32 constexpr size_t kQuickBrownFoxLength = 15; | 34 constexpr size_t kQuickBrownFoxLength = 15; |
33 constexpr size_t kQuickBrownFoxLengthWithTerminatingNull = 16; | 35 constexpr size_t kQuickBrownFoxLengthWithTerminatingNull = 16; |
| 36 constexpr char kQuickBrownFoxFormData[] = |
| 37 "--boundary\r\n" |
| 38 "Content-Disposition: form-data; name=blob; filename=blob\r\n" |
| 39 "Content-Type: text/plain; charset=iso-8859-1\r\n" |
| 40 "\r\n" |
| 41 "Quick brown fox\r\n" |
| 42 "--boundary\r\n" |
| 43 "Content-Disposition: form-data; name=\"blob\xC2\xA0without\xC2\xA0type\"; " |
| 44 "filename=\"blob\xC2\xA0without\xC2\xA0type.txt\"\r\n" |
| 45 "\r\n" |
| 46 "Quick brown fox\r\n" |
| 47 "--boundary\r\n" |
| 48 "Content-Disposition: form-data; name=string\r\n" |
| 49 "\r\n" |
| 50 "Quick brown fox\r\n" |
| 51 "--boundary\r\n" |
| 52 "Content-Disposition: form-data; name=string-with-type\r\n" |
| 53 "Content-Type: text/plain; charset=invalid\r\n" |
| 54 "\r\n" |
| 55 "Quick brown fox\r\n" |
| 56 "--boundary--\r\n"; |
| 57 constexpr size_t kQuickBrownFoxFormDataLength = |
| 58 WTF_ARRAY_LENGTH(kQuickBrownFoxFormData) - 1u; |
34 | 59 |
35 TEST(FetchDataLoaderTest, LoadAsBlob) { | 60 TEST(FetchDataLoaderTest, LoadAsBlob) { |
36 Checkpoint checkpoint; | 61 Checkpoint checkpoint; |
37 BytesConsumer::Client* client = nullptr; | 62 BytesConsumer::Client* client = nullptr; |
38 MockBytesConsumer* consumer = MockBytesConsumer::Create(); | 63 MockBytesConsumer* consumer = MockBytesConsumer::Create(); |
39 | 64 |
40 FetchDataLoader* fetch_data_loader = | 65 FetchDataLoader* fetch_data_loader = |
41 FetchDataLoader::CreateLoaderAsBlobHandle("text/test"); | 66 FetchDataLoader::CreateLoaderAsBlobHandle("text/test"); |
42 MockFetchDataLoaderClient* fetch_data_loader_client = | 67 MockFetchDataLoaderClient* fetch_data_loader_client = |
43 MockFetchDataLoaderClient::Create(); | 68 MockFetchDataLoaderClient::Create(); |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 EXPECT_CALL(*consumer, Cancel()); | 369 EXPECT_CALL(*consumer, Cancel()); |
345 EXPECT_CALL(checkpoint, Call(3)); | 370 EXPECT_CALL(checkpoint, Call(3)); |
346 | 371 |
347 checkpoint.Call(1); | 372 checkpoint.Call(1); |
348 fetch_data_loader->Start(consumer, fetch_data_loader_client); | 373 fetch_data_loader->Start(consumer, fetch_data_loader_client); |
349 checkpoint.Call(2); | 374 checkpoint.Call(2); |
350 fetch_data_loader->Cancel(); | 375 fetch_data_loader->Cancel(); |
351 checkpoint.Call(3); | 376 checkpoint.Call(3); |
352 } | 377 } |
353 | 378 |
| 379 TEST(FetchDataLoaderTest, LoadAsFormData) { |
| 380 Checkpoint checkpoint; |
| 381 BytesConsumer::Client* client = nullptr; |
| 382 MockBytesConsumer* consumer = MockBytesConsumer::Create(); |
| 383 |
| 384 FetchDataLoader* fetch_data_loader = |
| 385 FetchDataLoader::CreateLoaderAsFormData("boundary"); |
| 386 MockFetchDataLoaderClient* fetch_data_loader_client = |
| 387 MockFetchDataLoaderClient::Create(); |
| 388 FormData* form_data = nullptr; |
| 389 |
| 390 InSequence s; |
| 391 EXPECT_CALL(checkpoint, Call(1)); |
| 392 EXPECT_CALL(*consumer, SetClient(_)).WillOnce(SaveArg<0>(&client)); |
| 393 EXPECT_CALL(*consumer, BeginRead(_, _)) |
| 394 .WillOnce(DoAll(SetArgPointee<0>(nullptr), SetArgPointee<1>(0), |
| 395 Return(Result::kShouldWait))); |
| 396 EXPECT_CALL(checkpoint, Call(2)); |
| 397 EXPECT_CALL(*consumer, BeginRead(_, _)) |
| 398 .WillOnce(DoAll(SetArgPointee<0>(kQuickBrownFoxFormData), |
| 399 SetArgPointee<1>(kQuickBrownFoxFormDataLength), |
| 400 Return(Result::kOk))); |
| 401 EXPECT_CALL(*consumer, EndRead(kQuickBrownFoxFormDataLength)) |
| 402 .WillOnce(Return(Result::kOk)); |
| 403 EXPECT_CALL(*consumer, BeginRead(_, _)).WillOnce(Return(Result::kDone)); |
| 404 EXPECT_CALL(*fetch_data_loader_client, DidFetchDataLoadedFormDataMock(_)) |
| 405 .WillOnce(SaveArg<0>(&form_data)); |
| 406 EXPECT_CALL(checkpoint, Call(3)); |
| 407 EXPECT_CALL(*consumer, Cancel()); |
| 408 EXPECT_CALL(checkpoint, Call(4)); |
| 409 |
| 410 checkpoint.Call(1); |
| 411 fetch_data_loader->Start(consumer, fetch_data_loader_client); |
| 412 checkpoint.Call(2); |
| 413 ASSERT_TRUE(client); |
| 414 client->OnStateChange(); |
| 415 checkpoint.Call(3); |
| 416 fetch_data_loader->Cancel(); |
| 417 checkpoint.Call(4); |
| 418 |
| 419 ASSERT_TRUE(form_data); |
| 420 ASSERT_EQ(4u, form_data->Entries().size()); |
| 421 |
| 422 EXPECT_EQ("blob", form_data->Entries()[0]->name()); |
| 423 EXPECT_EQ("blob", form_data->Entries()[0]->Filename()); |
| 424 ASSERT_TRUE(form_data->Entries()[0]->isFile()); |
| 425 EXPECT_EQ(kQuickBrownFoxLength, form_data->Entries()[0]->GetBlob()->size()); |
| 426 EXPECT_EQ("text/plain; charset=iso-8859-1", |
| 427 form_data->Entries()[0]->GetBlob()->type()); |
| 428 |
| 429 EXPECT_EQ("blob\xC2\xA0without\xC2\xA0type", form_data->Entries()[1]->name()); |
| 430 EXPECT_EQ("blob\xC2\xA0without\xC2\xA0type.txt", |
| 431 form_data->Entries()[1]->Filename().Utf8()); |
| 432 ASSERT_TRUE(form_data->Entries()[1]->isFile()); |
| 433 EXPECT_EQ(kQuickBrownFoxLength, form_data->Entries()[1]->GetBlob()->size()); |
| 434 EXPECT_EQ("text/plain", form_data->Entries()[1]->GetBlob()->type()); |
| 435 |
| 436 EXPECT_EQ("string", form_data->Entries()[2]->name()); |
| 437 EXPECT_TRUE(form_data->Entries()[2]->Filename().IsNull()); |
| 438 ASSERT_TRUE(form_data->Entries()[2]->IsString()); |
| 439 EXPECT_EQ(kQuickBrownFox, form_data->Entries()[2]->Value()); |
| 440 |
| 441 EXPECT_EQ("string-with-type", form_data->Entries()[3]->name()); |
| 442 EXPECT_TRUE(form_data->Entries()[3]->Filename().IsNull()); |
| 443 ASSERT_TRUE(form_data->Entries()[3]->IsString()); |
| 444 EXPECT_EQ(kQuickBrownFox, form_data->Entries()[3]->Value()); |
| 445 } |
| 446 |
| 447 TEST(FetchDataLoaderTest, LoadAsFormDataPartialInput) { |
| 448 Checkpoint checkpoint; |
| 449 BytesConsumer::Client* client = nullptr; |
| 450 MockBytesConsumer* consumer = MockBytesConsumer::Create(); |
| 451 |
| 452 FetchDataLoader* fetch_data_loader = |
| 453 FetchDataLoader::CreateLoaderAsFormData("boundary"); |
| 454 MockFetchDataLoaderClient* fetch_data_loader_client = |
| 455 MockFetchDataLoaderClient::Create(); |
| 456 |
| 457 InSequence s; |
| 458 EXPECT_CALL(checkpoint, Call(1)); |
| 459 EXPECT_CALL(*consumer, SetClient(_)).WillOnce(SaveArg<0>(&client)); |
| 460 EXPECT_CALL(*consumer, BeginRead(_, _)) |
| 461 .WillOnce(DoAll(SetArgPointee<0>(nullptr), SetArgPointee<1>(0), |
| 462 Return(Result::kShouldWait))); |
| 463 EXPECT_CALL(checkpoint, Call(2)); |
| 464 EXPECT_CALL(*consumer, BeginRead(_, _)) |
| 465 .WillOnce(DoAll(SetArgPointee<0>(kQuickBrownFoxFormData), |
| 466 SetArgPointee<1>(kQuickBrownFoxFormDataLength - 3u), |
| 467 Return(Result::kOk))); |
| 468 EXPECT_CALL(*consumer, EndRead(kQuickBrownFoxFormDataLength - 3u)) |
| 469 .WillOnce(Return(Result::kOk)); |
| 470 EXPECT_CALL(*consumer, BeginRead(_, _)).WillOnce(Return(Result::kDone)); |
| 471 EXPECT_CALL(*fetch_data_loader_client, DidFetchDataLoadFailed()); |
| 472 EXPECT_CALL(checkpoint, Call(3)); |
| 473 EXPECT_CALL(*consumer, Cancel()); |
| 474 EXPECT_CALL(checkpoint, Call(4)); |
| 475 |
| 476 checkpoint.Call(1); |
| 477 fetch_data_loader->Start(consumer, fetch_data_loader_client); |
| 478 checkpoint.Call(2); |
| 479 ASSERT_TRUE(client); |
| 480 client->OnStateChange(); |
| 481 checkpoint.Call(3); |
| 482 fetch_data_loader->Cancel(); |
| 483 checkpoint.Call(4); |
| 484 } |
| 485 |
| 486 TEST(FetchDataLoaderTest, LoadAsFormDataFailed) { |
| 487 Checkpoint checkpoint; |
| 488 BytesConsumer::Client* client = nullptr; |
| 489 MockBytesConsumer* consumer = MockBytesConsumer::Create(); |
| 490 |
| 491 FetchDataLoader* fetch_data_loader = |
| 492 FetchDataLoader::CreateLoaderAsFormData("boundary"); |
| 493 MockFetchDataLoaderClient* fetch_data_loader_client = |
| 494 MockFetchDataLoaderClient::Create(); |
| 495 |
| 496 InSequence s; |
| 497 EXPECT_CALL(checkpoint, Call(1)); |
| 498 EXPECT_CALL(*consumer, SetClient(_)).WillOnce(SaveArg<0>(&client)); |
| 499 EXPECT_CALL(*consumer, BeginRead(_, _)) |
| 500 .WillOnce(DoAll(SetArgPointee<0>(nullptr), SetArgPointee<1>(0), |
| 501 Return(Result::kShouldWait))); |
| 502 EXPECT_CALL(checkpoint, Call(2)); |
| 503 EXPECT_CALL(*consumer, BeginRead(_, _)) |
| 504 .WillOnce(DoAll(SetArgPointee<0>(kQuickBrownFoxFormData), |
| 505 SetArgPointee<1>(kQuickBrownFoxFormDataLength), |
| 506 Return(Result::kOk))); |
| 507 EXPECT_CALL(*consumer, EndRead(kQuickBrownFoxFormDataLength)) |
| 508 .WillOnce(Return(Result::kOk)); |
| 509 EXPECT_CALL(*consumer, BeginRead(_, _)).WillOnce(Return(Result::kError)); |
| 510 EXPECT_CALL(*fetch_data_loader_client, DidFetchDataLoadFailed()); |
| 511 EXPECT_CALL(checkpoint, Call(3)); |
| 512 EXPECT_CALL(*consumer, Cancel()); |
| 513 EXPECT_CALL(checkpoint, Call(4)); |
| 514 |
| 515 checkpoint.Call(1); |
| 516 fetch_data_loader->Start(consumer, fetch_data_loader_client); |
| 517 checkpoint.Call(2); |
| 518 ASSERT_TRUE(client); |
| 519 client->OnStateChange(); |
| 520 checkpoint.Call(3); |
| 521 fetch_data_loader->Cancel(); |
| 522 checkpoint.Call(4); |
| 523 } |
| 524 |
| 525 TEST(FetchDataLoaderTest, LoadAsFormDataCancel) { |
| 526 Checkpoint checkpoint; |
| 527 BytesConsumer::Client* client = nullptr; |
| 528 MockBytesConsumer* consumer = MockBytesConsumer::Create(); |
| 529 |
| 530 FetchDataLoader* fetch_data_loader = |
| 531 FetchDataLoader::CreateLoaderAsFormData("boundary"); |
| 532 MockFetchDataLoaderClient* fetch_data_loader_client = |
| 533 MockFetchDataLoaderClient::Create(); |
| 534 |
| 535 InSequence s; |
| 536 EXPECT_CALL(checkpoint, Call(1)); |
| 537 EXPECT_CALL(*consumer, SetClient(_)).WillOnce(SaveArg<0>(&client)); |
| 538 EXPECT_CALL(*consumer, BeginRead(_, _)) |
| 539 .WillOnce(DoAll(SetArgPointee<0>(nullptr), SetArgPointee<1>(0), |
| 540 Return(Result::kShouldWait))); |
| 541 EXPECT_CALL(checkpoint, Call(2)); |
| 542 EXPECT_CALL(*consumer, Cancel()); |
| 543 EXPECT_CALL(checkpoint, Call(3)); |
| 544 |
| 545 checkpoint.Call(1); |
| 546 fetch_data_loader->Start(consumer, fetch_data_loader_client); |
| 547 checkpoint.Call(2); |
| 548 fetch_data_loader->Cancel(); |
| 549 checkpoint.Call(3); |
| 550 } |
| 551 |
354 TEST(FetchDataLoaderTest, LoadAsString) { | 552 TEST(FetchDataLoaderTest, LoadAsString) { |
355 Checkpoint checkpoint; | 553 Checkpoint checkpoint; |
356 BytesConsumer::Client* client = nullptr; | 554 BytesConsumer::Client* client = nullptr; |
357 MockBytesConsumer* consumer = MockBytesConsumer::Create(); | 555 MockBytesConsumer* consumer = MockBytesConsumer::Create(); |
358 | 556 |
359 FetchDataLoader* fetch_data_loader = FetchDataLoader::CreateLoaderAsString(); | 557 FetchDataLoader* fetch_data_loader = FetchDataLoader::CreateLoaderAsString(); |
360 MockFetchDataLoaderClient* fetch_data_loader_client = | 558 MockFetchDataLoaderClient* fetch_data_loader_client = |
361 MockFetchDataLoaderClient::Create(); | 559 MockFetchDataLoaderClient::Create(); |
362 | 560 |
363 InSequence s; | 561 InSequence s; |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 checkpoint.Call(1); | 688 checkpoint.Call(1); |
491 fetch_data_loader->Start(consumer, fetch_data_loader_client); | 689 fetch_data_loader->Start(consumer, fetch_data_loader_client); |
492 checkpoint.Call(2); | 690 checkpoint.Call(2); |
493 fetch_data_loader->Cancel(); | 691 fetch_data_loader->Cancel(); |
494 checkpoint.Call(3); | 692 checkpoint.Call(3); |
495 } | 693 } |
496 | 694 |
497 } // namespace | 695 } // namespace |
498 | 696 |
499 } // namespace blink | 697 } // namespace blink |
OLD | NEW |