Index: net/filter/filter_source_stream_unittest.cc |
diff --git a/net/filter/filter_source_stream_unittest.cc b/net/filter/filter_source_stream_unittest.cc |
index 43c6b6c9d61179121d6d2f4b2ff1d4f7f58d1319..a5a0c3b0f26c3f3f26b083d86e65732fd401d999 100644 |
--- a/net/filter/filter_source_stream_unittest.cc |
+++ b/net/filter/filter_source_stream_unittest.cc |
@@ -66,16 +66,17 @@ class NeedsAllInputFilterSourceStream : public TestFilterSourceStreamBase { |
expected_input_bytes_(expected_input_bytes) {} |
int FilterData(IOBuffer* output_buffer, |
int output_buffer_size, |
- DrainableIOBuffer* input_buffer) override { |
+ DrainableIOBuffer* input_buffer, |
+ bool upstream_eof_reached) override { |
buffer_.append(input_buffer->data(), input_buffer->BytesRemaining()); |
EXPECT_GE(expected_input_bytes_, input_buffer->BytesRemaining()); |
expected_input_bytes_ -= input_buffer->BytesRemaining(); |
input_buffer->DidConsume(input_buffer->BytesRemaining()); |
- if (expected_input_bytes_ > 0) { |
- // Keep returning 0 bytes read until all |expected_input_bytes| have |
- // been read from |upstream|. |
+ if (!upstream_eof_reached) { |
+ // Keep returning 0 bytes read until all input has been consumed. |
return 0; |
} |
+ EXPECT_EQ(0, expected_input_bytes_); |
return WriteBufferToOutput(output_buffer, output_buffer_size); |
} |
@@ -95,7 +96,8 @@ class MultiplySourceStream : public TestFilterSourceStreamBase { |
multiplier_(multiplier) {} |
int FilterData(IOBuffer* output_buffer, |
int output_buffer_size, |
- DrainableIOBuffer* input_buffer) override { |
+ DrainableIOBuffer* input_buffer, |
+ bool /*upstream_eof_reached*/) override { |
for (int i = 0; i < input_buffer->BytesRemaining(); i++) { |
for (int j = 0; j < multiplier_; j++) |
buffer_.append(input_buffer->data() + i, 1); |
@@ -117,7 +119,8 @@ class PassThroughFilterSourceStream : public TestFilterSourceStreamBase { |
: TestFilterSourceStreamBase(std::move(upstream)) {} |
int FilterData(IOBuffer* output_buffer, |
int output_buffer_size, |
- DrainableIOBuffer* input_buffer) override { |
+ DrainableIOBuffer* input_buffer, |
+ bool /*upstream_eof_reached*/) override { |
buffer_.append(input_buffer->data(), input_buffer->BytesRemaining()); |
input_buffer->DidConsume(input_buffer->BytesRemaining()); |
return WriteBufferToOutput(output_buffer, output_buffer_size); |
@@ -135,7 +138,8 @@ class ThrottleSourceStream : public TestFilterSourceStreamBase { |
: TestFilterSourceStreamBase(std::move(upstream)) {} |
int FilterData(IOBuffer* output_buffer, |
int output_buffer_size, |
- DrainableIOBuffer* input_buffer) override { |
+ DrainableIOBuffer* input_buffer, |
+ bool /*upstream_eof_reached*/) override { |
buffer_.append(input_buffer->data(), input_buffer->BytesRemaining()); |
input_buffer->DidConsume(input_buffer->BytesRemaining()); |
int bytes_to_read = std::min(1, static_cast<int>(buffer_.size())); |
@@ -158,7 +162,8 @@ class NoOutputSourceStream : public TestFilterSourceStreamBase { |
consumed_all_input_(false) {} |
int FilterData(IOBuffer* output_buffer, |
int output_buffer_size, |
- DrainableIOBuffer* input_buffer) override { |
+ DrainableIOBuffer* input_buffer, |
+ bool /*upstream_eof_reached*/) override { |
expected_input_size_ -= input_buffer->BytesRemaining(); |
input_buffer->DidConsume(input_buffer->BytesRemaining()); |
EXPECT_LE(0, expected_input_size_); |
@@ -184,7 +189,8 @@ class ErrorFilterSourceStream : public FilterSourceStream { |
int FilterData(IOBuffer* output_buffer, |
int output_buffer_size, |
- DrainableIOBuffer* input_buffer) override { |
+ DrainableIOBuffer* input_buffer, |
+ bool /*upstream_eof_reached*/) override { |
return ERR_CONTENT_DECODING_FAILED; |
} |
std::string GetTypeAsString() const override { return ""; } |
@@ -238,16 +244,26 @@ TEST_P(FilterSourceStreamTest, FilterDataReturnNoBytesExceptLast) { |
GetParam()); |
num_reads++; |
} |
+ source->AddReadResult(input.data(), 0, OK, GetParam()); // EOF |
+ num_reads++; |
+ |
MockSourceStream* mock_stream = source.get(); |
NeedsAllInputFilterSourceStream stream(std::move(source), input.length()); |
scoped_refptr<IOBufferWithSize> output_buffer = |
new IOBufferWithSize(kDefaultBufferSize); |
TestCompletionCallback callback; |
- int rv = stream.Read(output_buffer.get(), output_buffer->size(), |
- callback.callback()); |
- rv = CompleteReadIfAsync(rv, &callback, mock_stream, num_reads); |
- ASSERT_EQ(static_cast<int>(input.length()), rv); |
- EXPECT_EQ(input, std::string(output_buffer->data(), rv)); |
+ std::string actual_output; |
+ while (true) { |
+ int rv = stream.Read(output_buffer.get(), output_buffer->size(), |
+ callback.callback()); |
+ if (rv == ERR_IO_PENDING) |
+ rv = CompleteReadIfAsync(rv, &callback, mock_stream, num_reads); |
+ if (rv == OK) |
+ break; |
+ ASSERT_GT(rv, OK); |
+ actual_output.append(output_buffer->data(), rv); |
+ } |
+ EXPECT_EQ(input, actual_output); |
} |
// Tests that FilterData() returns 0 byte read because the upstream gives an |
@@ -423,6 +439,8 @@ TEST_P(FilterSourceStreamTest, FilterChaining) { |
std::unique_ptr<MockSourceStream> source(new MockSourceStream); |
std::string input = "hello, world!"; |
source->AddReadResult(input.data(), input.length(), OK, GetParam()); |
+ source->AddReadResult(input.data(), 0, OK, GetParam()); // EOF |
+ |
MockSourceStream* mock_stream = source.get(); |
std::unique_ptr<PassThroughFilterSourceStream> pass_through_source( |
new PassThroughFilterSourceStream(std::move(source))); |
@@ -438,13 +456,18 @@ TEST_P(FilterSourceStreamTest, FilterChaining) { |
new IOBufferWithSize(kDefaultBufferSize); |
TestCompletionCallback callback; |
- int bytes_read = second_pass_through_source->Read( |
- output_buffer.get(), output_buffer->size(), callback.callback()); |
- |
- bytes_read = |
- CompleteReadIfAsync(bytes_read, &callback, mock_stream, /*num_reads=*/1); |
- ASSERT_EQ(input.length(), static_cast<size_t>(bytes_read)); |
- EXPECT_EQ(input, std::string(output_buffer->data(), bytes_read)); |
+ std::string actual_output; |
+ while (true) { |
+ int rv = second_pass_through_source->Read( |
+ output_buffer.get(), output_buffer->size(), callback.callback()); |
+ if (rv == ERR_IO_PENDING) |
+ rv = CompleteReadIfAsync(rv, &callback, mock_stream, /*num_reads=*/2); |
+ if (rv == OK) |
+ break; |
+ ASSERT_GT(rv, OK); |
+ actual_output.append(output_buffer->data(), rv); |
+ } |
+ EXPECT_EQ(input, actual_output); |
// Type string (from left to right) should be the order of data flow. |
EXPECT_EQ("FIRST_PASS_THROUGH,NEEDS_ALL,SECOND_PASS_THROUGH", |
second_pass_through_source->Description()); |