Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "content/browser/loader/mojo_async_resource_handler.h" | 5 #include "content/browser/loader/mojo_async_resource_handler.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 596 uint32_t read_size = sizeof(buffer); | 596 uint32_t read_size = sizeof(buffer); |
| 597 MojoResult result = | 597 MojoResult result = |
| 598 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | 598 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, |
| 599 &read_size, MOJO_READ_DATA_FLAG_NONE); | 599 &read_size, MOJO_READ_DATA_FLAG_NONE); |
| 600 if (result == MOJO_RESULT_SHOULD_WAIT) | 600 if (result == MOJO_RESULT_SHOULD_WAIT) |
| 601 continue; | 601 continue; |
| 602 ASSERT_EQ(MOJO_RESULT_OK, result); | 602 ASSERT_EQ(MOJO_RESULT_OK, result); |
| 603 contents.append(buffer, read_size); | 603 contents.append(buffer, read_size); |
| 604 } | 604 } |
| 605 EXPECT_EQ(data, contents); | 605 EXPECT_EQ(data, contents); |
| 606 EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | 606 EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
| 607 mock_loader_->status()); | |
| 608 } | 607 } |
| 609 | 608 |
| 610 TEST_F(MojoAsyncResourceHandlerTest, | 609 TEST_F(MojoAsyncResourceHandlerTest, |
| 611 IOBufferFromOnWillReadShouldRemainValidEvenIfHandlerIsGone) { | 610 IOBufferFromOnWillReadShouldRemainValidEvenIfHandlerIsGone) { |
| 612 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 611 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 613 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); | 612 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); |
| 614 // The io_buffer size that the mime sniffer requires implicitly. | 613 // The io_buffer size that the mime sniffer requires implicitly. |
| 615 ASSERT_GE(mock_loader_->io_buffer_size(), | 614 ASSERT_GE(mock_loader_->io_buffer_size(), |
| 616 kSizeMimeSnifferRequiresForFirstOnWillRead); | 615 kSizeMimeSnifferRequiresForFirstOnWillRead); |
| 617 | 616 |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 734 break; | 733 break; |
| 735 ASSERT_TRUE(result == MOJO_RESULT_SHOULD_WAIT || result == MOJO_RESULT_OK); | 734 ASSERT_TRUE(result == MOJO_RESULT_SHOULD_WAIT || result == MOJO_RESULT_OK); |
| 736 } | 735 } |
| 737 } | 736 } |
| 738 | 737 |
| 739 TEST_F(MojoAsyncResourceHandlerTest, OutOfBandCancelDuringBodyTransmission) { | 738 TEST_F(MojoAsyncResourceHandlerTest, OutOfBandCancelDuringBodyTransmission) { |
| 740 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 739 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 741 | 740 |
| 742 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); | 741 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); |
| 743 std::string data(mock_loader_->io_buffer_size(), 'a'); | 742 std::string data(mock_loader_->io_buffer_size(), 'a'); |
| 743 ASSERT_EQ(MockResourceLoader::Status::IDLE, | |
| 744 mock_loader_->OnReadCompleted(data)); | |
| 744 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | 745 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| 745 mock_loader_->OnReadCompleted(data)); | 746 mock_loader_->OnWillRead()); |
| 746 url_loader_client_.RunUntilResponseBodyArrived(); | 747 url_loader_client_.RunUntilResponseBodyArrived(); |
| 747 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 748 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 748 | 749 |
| 749 net::URLRequestStatus status(net::URLRequestStatus::FAILED, net::ERR_FAILED); | 750 net::URLRequestStatus status(net::URLRequestStatus::FAILED, net::ERR_FAILED); |
| 750 ASSERT_EQ( | 751 ASSERT_EQ( |
| 751 MockResourceLoader::Status::IDLE, | 752 MockResourceLoader::Status::IDLE, |
| 752 mock_loader_->OnResponseCompletedFromExternalOutOfBandCancel(status)); | 753 mock_loader_->OnResponseCompletedFromExternalOutOfBandCancel(status)); |
| 753 | 754 |
| 754 url_loader_client_.RunUntilComplete(); | 755 url_loader_client_.RunUntilComplete(); |
| 755 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 756 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 775 } | 776 } |
| 776 | 777 |
| 777 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteFailsOnWillRead) { | 778 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteFailsOnWillRead) { |
| 778 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); | 779 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); |
| 779 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 780 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 780 ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead()); | 781 ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead()); |
| 781 } | 782 } |
| 782 | 783 |
| 783 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteReturnsShouldWaitOnWillRead) { | 784 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteReturnsShouldWaitOnWillRead) { |
| 784 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 785 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
| 786 | |
| 785 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 787 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 786 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); | 788 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); |
| 789 | |
| 790 // Bytes are read one-at-a-time, and each OnWillRead() call completes | |
| 791 // asynchronously. Note that this loop runs 4 times (once for the terminal | |
| 792 // '\0'). | |
| 793 const char kReadData[] = "ABC"; | |
| 794 for (const char read_char : kReadData) { | |
| 795 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); | |
| 796 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | |
| 797 mock_loader_->OnWillRead()); | |
| 798 EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing()); | |
| 799 | |
| 800 handler_->ResetBeginWriteExpectation(); | |
| 801 handler_->OnWritableForTesting(); | |
| 802 EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); | |
| 803 | |
| 804 ASSERT_EQ(MockResourceLoader::Status::IDLE, | |
| 805 mock_loader_->OnReadCompleted(std::string(1, read_char))); | |
| 806 url_loader_client_.RunUntilResponseBodyArrived(); | |
| 807 | |
| 808 char buffer[16]; | |
| 809 uint32_t read_size = sizeof(buffer); | |
| 810 MojoResult result = | |
| 811 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | |
| 812 &read_size, MOJO_READ_DATA_FLAG_NONE); | |
| 813 if (result == MOJO_RESULT_SHOULD_WAIT) { | |
|
Randy Smith (Not in Mondays)
2017/03/17 20:06:06
Under what circumstances would this happen? And i
mmenke
2017/03/17 22:29:39
You're absolutely right that this code is complete
| |
| 814 base::RunLoop().RunUntilIdle(); | |
| 815 continue; | |
| 816 } | |
| 817 ASSERT_EQ(1u, read_size); | |
| 818 EXPECT_EQ(read_char, buffer[0]); | |
| 819 } | |
| 820 | |
| 821 // Should only count as one in-flight request. | |
| 822 EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing()); | |
| 823 | |
| 824 ASSERT_EQ(MockResourceLoader::Status::IDLE, | |
| 825 mock_loader_->OnResponseCompleted( | |
| 826 net::URLRequestStatus::FromError(net::OK))); | |
| 827 | |
| 828 url_loader_client_.RunUntilComplete(); | |
| 829 EXPECT_TRUE(url_loader_client_.has_received_completion()); | |
| 830 | |
| 831 handler_.reset(); | |
| 832 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); | |
| 833 } | |
| 834 | |
| 835 // Same as above, but after th efirst OnWriteable() call, BeginWrite() indicates | |
|
Randy Smith (Not in Mondays)
2017/03/17 20:06:06
nit: "th efirst"
mmenke
2017/03/17 22:29:39
Done.
| |
| 836 // should wait again. Unclear if this can happen in practice, but seems best to | |
| 837 // support it. | |
| 838 TEST_F(MojoAsyncResourceHandlerTest, | |
| 839 BeginWriteReturnsShouldWaitTwiceOnWillRead) { | |
| 840 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); | |
| 841 | |
| 842 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | |
| 843 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); | |
| 844 | |
| 845 // Bytes are read one-at-a-time, and each OnWillRead() call completes | |
| 846 // asynchronously. Note that this loop runs 4 times (once for the terminal | |
| 847 // '\0'). | |
| 848 const char kReadData[] = "ABC"; | |
| 849 for (const char read_char : kReadData) { | |
| 850 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); | |
| 851 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | |
| 852 mock_loader_->OnWillRead()); | |
| 853 EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing()); | |
| 854 | |
| 855 handler_->OnWritableForTesting(); | |
| 856 EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | |
| 857 mock_loader_->status()); | |
| 858 | |
| 859 handler_->ResetBeginWriteExpectation(); | |
| 860 handler_->OnWritableForTesting(); | |
| 861 EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); | |
| 862 | |
| 863 ASSERT_EQ(MockResourceLoader::Status::IDLE, | |
| 864 mock_loader_->OnReadCompleted(std::string(1, read_char))); | |
| 865 url_loader_client_.RunUntilResponseBodyArrived(); | |
| 866 | |
| 867 char buffer[16]; | |
| 868 uint32_t read_size = sizeof(buffer); | |
| 869 MojoResult result = | |
| 870 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | |
| 871 &read_size, MOJO_READ_DATA_FLAG_NONE); | |
| 872 if (result == MOJO_RESULT_SHOULD_WAIT) { | |
| 873 base::RunLoop().RunUntilIdle(); | |
| 874 continue; | |
| 875 } | |
| 876 ASSERT_EQ(1u, read_size); | |
| 877 EXPECT_EQ(read_char, buffer[0]); | |
| 878 } | |
| 879 | |
| 880 // Should only count as one in-flight request. | |
| 881 EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing()); | |
| 882 | |
| 883 ASSERT_EQ(MockResourceLoader::Status::IDLE, | |
| 884 mock_loader_->OnResponseCompleted( | |
| 885 net::URLRequestStatus::FromError(net::OK))); | |
| 886 | |
| 887 url_loader_client_.RunUntilComplete(); | |
| 888 EXPECT_TRUE(url_loader_client_.has_received_completion()); | |
| 889 | |
| 890 handler_.reset(); | |
| 891 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); | |
| 787 } | 892 } |
| 788 | 893 |
| 789 TEST_F(MojoAsyncResourceHandlerTest, | 894 TEST_F(MojoAsyncResourceHandlerTest, |
| 790 BeginWriteReturnsShouldWaitOnWillReadAndThenReturnsOK) { | |
| 791 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); | |
| 792 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | |
| 793 size_t written = 0; | |
| 794 while (true) { | |
| 795 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); | |
| 796 MockResourceLoader::Status result = mock_loader_->OnReadCompleted( | |
| 797 std::string(mock_loader_->io_buffer_size(), 'X')); | |
| 798 written += mock_loader_->io_buffer_size(); | |
| 799 if (result == MockResourceLoader::Status::CALLBACK_PENDING) | |
| 800 break; | |
| 801 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); | |
| 802 } | |
| 803 | |
| 804 url_loader_client_.RunUntilResponseBodyArrived(); | |
| 805 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | |
| 806 handler_->ResetBeginWriteExpectation(); | |
| 807 handler_->OnWritableForTesting(); | |
| 808 | |
| 809 std::string actual; | |
| 810 while (actual.size() < written) { | |
| 811 char buf[16]; | |
| 812 uint32_t read_size = sizeof(buf); | |
| 813 MojoResult result = | |
| 814 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, | |
| 815 MOJO_READ_DATA_FLAG_NONE); | |
| 816 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT); | |
| 817 if (result == MOJO_RESULT_OK) | |
| 818 actual.append(buf, read_size); | |
| 819 base::RunLoop().RunUntilIdle(); | |
| 820 } | |
| 821 | |
| 822 EXPECT_EQ(std::string(written, 'X'), actual); | |
| 823 EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); | |
| 824 } | |
| 825 | |
| 826 TEST_F(MojoAsyncResourceHandlerTest, | |
| 827 EndWriteFailsOnWillReadWithInsufficientInitialCapacity) { | 895 EndWriteFailsOnWillReadWithInsufficientInitialCapacity) { |
| 828 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); | 896 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); |
| 829 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 897 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 830 handler_->set_end_write_expectation(MOJO_RESULT_UNKNOWN); | 898 handler_->set_end_write_expectation(MOJO_RESULT_UNKNOWN); |
| 831 ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead()); | 899 ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead()); |
| 832 } | 900 } |
| 833 | 901 |
| 834 TEST_F(MojoAsyncResourceHandlerTest, EndWriteFailsOnReadCompleted) { | 902 TEST_F(MojoAsyncResourceHandlerTest, EndWriteFailsOnReadCompleted) { |
| 835 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 903 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 836 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); | 904 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 880 MOJO_READ_DATA_FLAG_NONE); | 948 MOJO_READ_DATA_FLAG_NONE); |
| 881 if (result == MOJO_RESULT_SHOULD_WAIT) | 949 if (result == MOJO_RESULT_SHOULD_WAIT) |
| 882 break; | 950 break; |
| 883 ASSERT_EQ(MOJO_RESULT_OK, result); | 951 ASSERT_EQ(MOJO_RESULT_OK, result); |
| 884 } | 952 } |
| 885 | 953 |
| 886 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 954 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
| 887 mock_loader_->WaitUntilIdleOrCanceled(); | 955 mock_loader_->WaitUntilIdleOrCanceled(); |
| 888 EXPECT_FALSE(url_loader_client_.has_received_completion()); | 956 EXPECT_FALSE(url_loader_client_.has_received_completion()); |
| 889 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); | 957 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
| 890 EXPECT_EQ(net::ERR_FAILED, mock_loader_->error_code()); | 958 EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES, mock_loader_->error_code()); |
| 891 } | 959 } |
| 892 | 960 |
| 893 TEST_F(MojoAsyncResourceHandlerUploadTest, UploadProgressHandling) { | 961 TEST_F(MojoAsyncResourceHandlerUploadTest, UploadProgressHandling) { |
| 894 ASSERT_TRUE(CallOnWillStart()); | 962 ASSERT_TRUE(CallOnWillStart()); |
| 895 | 963 |
| 896 // Expect no report for no progress. | 964 // Expect no report for no progress. |
| 897 set_upload_progress(net::UploadProgress(0, 1000)); | 965 set_upload_progress(net::UploadProgress(0, 1000)); |
| 898 handler_->PollUploadProgress(); | 966 handler_->PollUploadProgress(); |
| 899 EXPECT_FALSE(url_loader_client_.has_received_upload_progress()); | 967 EXPECT_FALSE(url_loader_client_.has_received_upload_progress()); |
| 900 EXPECT_EQ(0, url_loader_client_.current_upload_position()); | 968 EXPECT_EQ(0, url_loader_client_.current_upload_position()); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 953 EXPECT_EQ(net::LOWEST, request_->priority()); | 1021 EXPECT_EQ(net::LOWEST, request_->priority()); |
| 954 | 1022 |
| 955 handler_->SetPriority(net::RequestPriority::HIGHEST, kIntraPriority); | 1023 handler_->SetPriority(net::RequestPriority::HIGHEST, kIntraPriority); |
| 956 | 1024 |
| 957 EXPECT_EQ(net::HIGHEST, request_->priority()); | 1025 EXPECT_EQ(net::HIGHEST, request_->priority()); |
| 958 } | 1026 } |
| 959 | 1027 |
| 960 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 1028 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 961 OnWillReadWithLongContents) { | 1029 OnWillReadWithLongContents) { |
| 962 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 1030 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 963 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); | 1031 |
| 964 std::string expected; | 1032 std::string expected; |
| 965 for (int i = 0; i < 3 * mock_loader_->io_buffer_size() + 2; ++i) | 1033 for (int i = 0; i < 3 * mock_loader_->io_buffer_size() + 2; ++i) |
| 966 expected += ('A' + i % 26); | 1034 expected += ('A' + i % 26); |
| 967 | 1035 |
| 968 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnReadCompleted(0)); | |
|
mmenke
2017/03/10 22:03:45
I assume that this was to skip past the initial no
| |
| 969 | |
| 970 size_t written = 0; | 1036 size_t written = 0; |
| 971 std::string actual; | 1037 std::string actual; |
| 972 while (actual.size() < expected.size()) { | 1038 while (actual.size() < expected.size()) { |
| 973 while (written < expected.size() && | 1039 while (written < expected.size() && |
| 974 mock_loader_->status() == MockResourceLoader::Status::IDLE) { | 1040 mock_loader_->status() == MockResourceLoader::Status::IDLE) { |
| 975 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); | 1041 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); |
| 976 const size_t to_be_written = | 1042 size_t to_be_written = |
| 977 std::min(static_cast<size_t>(mock_loader_->io_buffer_size()), | 1043 std::min(static_cast<size_t>(mock_loader_->io_buffer_size()), |
| 978 expected.size() - written); | 1044 expected.size() - written); |
| 979 | 1045 |
| 980 // Request should be resumed or paused. | 1046 // Request should be resumed or paused. |
| 981 ASSERT_NE(MockResourceLoader::Status::CANCELED, | 1047 ASSERT_NE(MockResourceLoader::Status::CANCELED, |
| 982 mock_loader_->OnReadCompleted( | 1048 mock_loader_->OnReadCompleted( |
| 983 expected.substr(written, to_be_written))); | 1049 expected.substr(written, to_be_written))); |
| 984 | 1050 |
| 985 written += to_be_written; | 1051 written += to_be_written; |
| 986 } | 1052 } |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 1004 base::RunLoop().RunUntilIdle(); | 1070 base::RunLoop().RunUntilIdle(); |
| 1005 } | 1071 } |
| 1006 EXPECT_EQ(expected, actual); | 1072 EXPECT_EQ(expected, actual); |
| 1007 } | 1073 } |
| 1008 | 1074 |
| 1009 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 1075 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 1010 BeginWriteFailsOnReadCompleted) { | 1076 BeginWriteFailsOnReadCompleted) { |
| 1011 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 1077 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 1012 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); | 1078 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); |
| 1013 | 1079 |
| 1080 // Whether the next OnReadCompleted call or OnWillRead returns the error | |
| 1081 // depends on whether or not an intermediary buffer is being used by the | |
| 1082 // MojoAsyncResourceHandler. | |
| 1014 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); | 1083 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); |
| 1015 ASSERT_EQ(MockResourceLoader::Status::CANCELED, | 1084 MockResourceLoader::Status result = mock_loader_->OnReadCompleted( |
| 1016 mock_loader_->OnReadCompleted( | 1085 std::string(mock_loader_->io_buffer_size(), 'A')); |
| 1017 std::string(mock_loader_->io_buffer_size(), 'A'))); | 1086 if (result == MockResourceLoader::Status::CANCELED) |
| 1087 return; | |
| 1088 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); | |
| 1089 ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead()); | |
| 1018 } | 1090 } |
| 1019 | 1091 |
| 1020 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 1092 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 1021 BeginWriteReturnsShouldWaitOnReadCompleted) { | 1093 BeginWriteReturnsShouldWaitOnReadCompleted) { |
| 1022 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 1094 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 1023 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); | 1095 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); |
| 1024 | 1096 |
| 1097 // Whether the next OnReadCompleted call or OnWillRead call completes | |
| 1098 // asynchronously depends on whether or not an intermediary buffer is being | |
| 1099 // used by the MojoAsyncResourceHandler. | |
| 1025 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 1100 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
| 1101 MockResourceLoader::Status result = mock_loader_->OnReadCompleted( | |
| 1102 std::string(mock_loader_->io_buffer_size() - 1, 'A')); | |
| 1103 if (result == MockResourceLoader::Status::CALLBACK_PENDING) | |
| 1104 return; | |
| 1105 | |
| 1026 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | 1106 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| 1027 mock_loader_->OnReadCompleted( | 1107 mock_loader_->OnWillRead()); |
| 1028 std::string(mock_loader_->io_buffer_size(), 'A'))); | |
| 1029 } | 1108 } |
| 1030 | 1109 |
| 1031 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 1110 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 1032 BeginWriteFailsOnResume) { | 1111 BeginWriteFailsOnResume) { |
| 1033 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 1112 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 1034 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); | |
| 1035 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnReadCompleted(0)); | |
| 1036 | 1113 |
| 1037 while (true) { | 1114 while (true) { |
| 1038 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); | 1115 // Whether the next OnReadCompleted call or OnWillRead call completes |
| 1039 MockResourceLoader::Status result = mock_loader_->OnReadCompleted( | 1116 // asynchronously depends on whether or not an intermediary buffer is being |
| 1117 // used by the MojoAsyncResourceHandler. | |
| 1118 MockResourceLoader::Status result = mock_loader_->OnWillRead(); | |
| 1119 if (result == MockResourceLoader::Status::CALLBACK_PENDING) | |
| 1120 break; | |
| 1121 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); | |
| 1122 result = mock_loader_->OnReadCompleted( | |
| 1040 std::string(mock_loader_->io_buffer_size(), 'A')); | 1123 std::string(mock_loader_->io_buffer_size(), 'A')); |
| 1041 if (result == MockResourceLoader::Status::CALLBACK_PENDING) | 1124 if (result == MockResourceLoader::Status::CALLBACK_PENDING) |
| 1042 break; | 1125 break; |
| 1043 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); | 1126 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); |
| 1044 } | 1127 } |
| 1045 url_loader_client_.RunUntilResponseBodyArrived(); | 1128 url_loader_client_.RunUntilResponseBodyArrived(); |
| 1046 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 1129 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 1047 | 1130 |
| 1048 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); | 1131 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); |
| 1049 | 1132 |
| 1050 while (mock_loader_->status() != MockResourceLoader::Status::CANCELED) { | 1133 while (mock_loader_->status() != MockResourceLoader::Status::CANCELED) { |
| 1051 char buf[256]; | 1134 char buf[256]; |
| 1052 uint32_t read_size = sizeof(buf); | 1135 uint32_t read_size = sizeof(buf); |
| 1053 MojoResult result = | 1136 MojoResult result = |
| 1054 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, | 1137 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, |
| 1055 MOJO_READ_DATA_FLAG_NONE); | 1138 MOJO_READ_DATA_FLAG_NONE); |
| 1056 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT); | 1139 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT); |
| 1057 base::RunLoop().RunUntilIdle(); | 1140 base::RunLoop().RunUntilIdle(); |
| 1058 } | 1141 } |
| 1059 | 1142 |
| 1143 if (mock_loader_->status() == MockResourceLoader::Status::IDLE) | |
| 1144 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead()); | |
| 1145 | |
| 1060 EXPECT_FALSE(url_loader_client_.has_received_completion()); | 1146 EXPECT_FALSE(url_loader_client_.has_received_completion()); |
| 1061 EXPECT_EQ(net::ERR_FAILED, mock_loader_->error_code()); | 1147 EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES, mock_loader_->error_code()); |
| 1062 } | 1148 } |
| 1063 | 1149 |
| 1064 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, CancelWhileWaiting) { | 1150 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, CancelWhileWaiting) { |
| 1065 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 1151 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 1066 | 1152 |
| 1067 while (true) { | 1153 while (true) { |
| 1068 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); | 1154 // Whether the next OnReadCompleted call or OnWillRead call completes |
| 1069 MockResourceLoader::Status result = mock_loader_->OnReadCompleted( | 1155 // asynchronously depends on whether or not an intermediary buffer is being |
| 1156 // used by the MojoAsyncResourceHandler. | |
| 1157 MockResourceLoader::Status result = mock_loader_->OnWillRead(); | |
| 1158 if (result == MockResourceLoader::Status::CALLBACK_PENDING) | |
| 1159 break; | |
| 1160 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); | |
| 1161 result = mock_loader_->OnReadCompleted( | |
| 1070 std::string(mock_loader_->io_buffer_size(), 'A')); | 1162 std::string(mock_loader_->io_buffer_size(), 'A')); |
| 1071 if (result == MockResourceLoader::Status::CALLBACK_PENDING) | 1163 if (result == MockResourceLoader::Status::CALLBACK_PENDING) |
| 1072 break; | 1164 break; |
| 1073 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); | 1165 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); |
| 1074 } | 1166 } |
| 1075 | 1167 |
| 1076 url_loader_client_.RunUntilResponseBodyArrived(); | 1168 url_loader_client_.RunUntilResponseBodyArrived(); |
| 1077 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 1169 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 1078 | 1170 |
| 1079 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, | 1171 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1274 } | 1366 } |
| 1275 } | 1367 } |
| 1276 EXPECT_EQ("B", body); | 1368 EXPECT_EQ("B", body); |
| 1277 } | 1369 } |
| 1278 | 1370 |
| 1279 INSTANTIATE_TEST_CASE_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 1371 INSTANTIATE_TEST_CASE_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 1280 MojoAsyncResourceHandlerWithAllocationSizeTest, | 1372 MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 1281 ::testing::Values(8, 32 * 2014)); | 1373 ::testing::Values(8, 32 * 2014)); |
| 1282 } // namespace | 1374 } // namespace |
| 1283 } // namespace content | 1375 } // namespace content |
| OLD | NEW |