Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1506)

Unified Diff: net/filter/filter_source_stream_unittest.cc

Issue 2331193005: Add EOF signal in FilterSourceStream::FilterData() (Closed)
Patch Set: self review Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/filter/filter_source_stream.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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());
« no previous file with comments | « net/filter/filter_source_stream.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698