// Copyright 2016 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifdef UNSAFE_BUFFERS_BUILD // TODO(crbug.com/40284755): Remove this and spanify to fix the errors. #pragma allow_unsafe_buffers #endif #include <algorithm> #include <string> #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/numerics/safe_conversions.h" #include "base/types/expected.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" #include "net/base/test_completion_callback.h" #include "net/filter/filter_source_stream.h" #include "net/filter/mock_source_stream.h" #include "testing/gtest/include/gtest/gtest.h" namespace net { namespace { const size_t kDefaultBufferSize = …; const size_t kSmallBufferSize = …; class TestFilterSourceStreamBase : public FilterSourceStream { … }; // A FilterSourceStream that needs all input data before it can return non-zero // bytes read. class NeedsAllInputFilterSourceStream : public TestFilterSourceStreamBase { … }; // A FilterSourceStream that repeat every input byte by |multiplier| amount of // times. class MultiplySourceStream : public TestFilterSourceStreamBase { … }; // A FilterSourceStream passes through data unchanged to consumer. class PassThroughFilterSourceStream : public TestFilterSourceStreamBase { … }; // A FilterSourceStream passes throttle input data such that it returns them to // caller only one bytes at a time. class ThrottleSourceStream : public TestFilterSourceStreamBase { … }; // A FilterSourceStream that consumes all input data but return no output. class NoOutputSourceStream : public TestFilterSourceStreamBase { … }; // A FilterSourceStream return an error code in FilterData(). class ErrorFilterSourceStream : public FilterSourceStream { … }; } // namespace class FilterSourceStreamTest : public ::testing::TestWithParam<MockSourceStream::Mode> { … }; INSTANTIATE_TEST_SUITE_P(…); // Tests that a FilterSourceStream subclass (NeedsAllInputFilterSourceStream) // can return 0 bytes for FilterData()s when it has not consumed EOF from the // upstream. In this case, FilterSourceStream should continue reading from // upstream to complete filtering. TEST_P(FilterSourceStreamTest, FilterDataReturnNoBytesExceptLast) { … } // Tests that FilterData() returns 0 byte read because the upstream gives an // EOF. TEST_P(FilterSourceStreamTest, FilterDataReturnNoByte) { … } // Tests that FilterData() returns 0 byte filtered even though the upstream // produces data. TEST_P(FilterSourceStreamTest, FilterDataOutputNoData) { … } // Tests that FilterData() returns non-zero bytes because the upstream // returns data. TEST_P(FilterSourceStreamTest, FilterDataReturnData) { … } // Tests that FilterData() returns more data than what it consumed. TEST_P(FilterSourceStreamTest, FilterDataReturnMoreData) { … } // Tests that FilterData() returns non-zero bytes and output buffer size is // smaller than the number of bytes read from the upstream. TEST_P(FilterSourceStreamTest, FilterDataOutputSpace) { … } // Tests that FilterData() returns an error code, which is then surfaced as // the result of calling Read(). TEST_P(FilterSourceStreamTest, FilterDataReturnError) { … } TEST_P(FilterSourceStreamTest, FilterChaining) { … } // Tests that FilterData() returns multiple times for a single MockStream // read, because there is not enough output space. TEST_P(FilterSourceStreamTest, OutputSpaceForOneRead) { … } // Tests that FilterData() returns multiple times for a single MockStream // read, because the filter returns one byte at a time. TEST_P(FilterSourceStreamTest, ThrottleSourceStream) { … } } // namespace net