Chromium Code Reviews| Index: net/http2/decoder/payload_decoders/payload_decoder_base_test_util.h |
| diff --git a/net/http2/decoder/payload_decoders/payload_decoder_base_test_util.h b/net/http2/decoder/payload_decoders/payload_decoder_base_test_util.h |
| index b49b15efbd0e874582434a283a4c4f3b0941b98b..5f998e42d082d8fc068390b3aff5773b9386eb4e 100644 |
| --- a/net/http2/decoder/payload_decoders/payload_decoder_base_test_util.h |
| +++ b/net/http2/decoder/payload_decoders/payload_decoder_base_test_util.h |
| @@ -11,9 +11,6 @@ |
| #include <string> |
| -#include "base/bind.h" |
| -#include "base/bind_helpers.h" |
| -#include "base/callback.h" |
| #include "base/logging.h" |
| #include "base/strings/string_piece.h" |
| #include "net/http2/decoder/decode_buffer.h" |
| @@ -123,15 +120,13 @@ template <class Decoder, |
| class Listener, |
| bool SupportedFrameType = true> |
| class AbstractPayloadDecoderTest : public PayloadDecoderBaseTest { |
| - public: |
| - static bool SucceedingApproveSize(size_t size) { return true; } |
| protected: |
| // An ApproveSize function returns true to approve decoding the specified |
| // size of payload, else false to skip that size. Typically used for negative |
| // tests; for example, decoding a SETTINGS frame at all sizes except for |
| // multiples of 6. |
| - typedef base::Callback<bool(size_t size)> ApproveSize; |
| + typedef std::function<bool(size_t size)> ApproveSize; |
| AbstractPayloadDecoderTest() {} |
| @@ -196,14 +191,6 @@ class AbstractPayloadDecoderTest : public PayloadDecoderBaseTest { |
| return payload_decoder_.ResumeDecodingPayload(mutable_state(), db); |
| } |
| - // Wrap |validator| in another one which will check that we've reached the |
| - // expected state of kDecodeError with OnFrameSizeError having been called by |
| - AssertionResult ValidatorForDecodePayloadAndValidateSeveralWays( |
| - const FrameParts& expected) { |
| - VERIFY_FALSE(listener_.IsInProgress()); |
| - VERIFY_EQ(1u, listener_.size()); |
| - VERIFY_AND_RETURN_SUCCESS(expected.VerifyEquals(*listener_.frame(0))); |
| - } |
| // Decode one frame's payload and confirm that the listener recorded the |
| // expected FrameParts instance, and only FrameParts instance. The payload |
| @@ -212,33 +199,13 @@ class AbstractPayloadDecoderTest : public PayloadDecoderBaseTest { |
| AssertionResult DecodePayloadAndValidateSeveralWays( |
| base::StringPiece payload, |
| const FrameParts& expected) { |
| + NoArgValidator validator = [&expected, this]() -> AssertionResult { |
|
James Synge
2017/01/05 21:39:06
auto validator?
Bence
2017/01/06 01:42:40
../../net/http2/decoder/payload_decoders/payload_d
|
| + VERIFY_FALSE(listener_.IsInProgress()); |
| + VERIFY_EQ(1u, listener_.size()); |
| + VERIFY_AND_RETURN_SUCCESS(expected.VerifyEquals(*listener_.frame(0))); |
| + }; |
| return PayloadDecoderBaseTest::DecodePayloadAndValidateSeveralWays( |
| - payload, this->ValidateDoneAndEmpty(base::Bind( |
| - &AbstractPayloadDecoderTest:: |
| - ValidatorForDecodePayloadAndValidateSeveralWays, |
| - base::Unretained(this), base::ConstRef(expected)))); |
| - } |
| - |
| - // Wrap |validator| in another one which will check that we've reached the |
| - // expected state of kDecodeError with OnFrameSizeError having been called by |
| - // the payload decoder. |
| - AssertionResult ValidatorForVerifyDetectsFrameSizeError( |
| - const Http2FrameHeader& header, |
| - const Validator& validator, |
| - const DecodeBuffer& input, |
| - DecodeStatus status) { |
| - DVLOG(2) << "VerifyDetectsFrameSizeError validator; status=" << status |
| - << "; input.Remaining=" << input.Remaining(); |
| - VERIFY_EQ(DecodeStatus::kDecodeError, status); |
| - VERIFY_FALSE(listener_.IsInProgress()); |
| - VERIFY_EQ(1u, listener_.size()); |
| - const FrameParts* frame = listener_.frame(0); |
| - VERIFY_EQ(header, frame->frame_header); |
| - VERIFY_TRUE(frame->has_frame_size_error); |
| - // Verify did not get OnPaddingTooLong, as we should only ever produce |
| - // one of these two errors for a single frame. |
| - VERIFY_FALSE(frame->opt_missing_length); |
| - return validator.Run(input, status); |
| + payload, ValidateDoneAndEmpty(validator)); |
| } |
| // Decode one frame's payload, expecting that the final status will be |
| @@ -254,13 +221,29 @@ class AbstractPayloadDecoderTest : public PayloadDecoderBaseTest { |
| WrappedValidator wrapped_validator) { |
| set_frame_header(header); |
| // If wrapped_validator is not a RandomDecoderTest::Validator, make it so. |
| - Validator validator = this->ToValidator(wrapped_validator); |
| + Validator validator = ToValidator(wrapped_validator); |
| + // And wrap that validator in another which will check that we've reached |
| + // the expected state of kDecodeError with OnFrameSizeError having been |
| + // called by the payload decoder. |
| + validator = [header, validator, this]( |
| + const DecodeBuffer& input, |
| + DecodeStatus status) -> ::testing::AssertionResult { |
| + DVLOG(2) << "VerifyDetectsFrameSizeError validator; status=" << status |
| + << "; input.Remaining=" << input.Remaining(); |
| + VERIFY_EQ(DecodeStatus::kDecodeError, status); |
| + VERIFY_FALSE(listener_.IsInProgress()); |
| + VERIFY_EQ(1u, listener_.size()); |
| + const FrameParts* frame = listener_.frame(0); |
| + VERIFY_EQ(header, frame->frame_header); |
| + VERIFY_TRUE(frame->has_frame_size_error); |
| + // Verify did not get OnPaddingTooLong, as we should only ever produce |
| + // one of these two errors for a single frame. |
| + VERIFY_FALSE(frame->opt_missing_length); |
| + return validator(input, status); |
| + }; |
| VERIFY_AND_RETURN_SUCCESS( |
| - PayloadDecoderBaseTest::DecodePayloadAndValidateSeveralWays( |
| - payload, base::Bind(&AbstractPayloadDecoderTest:: |
| - ValidatorForVerifyDetectsFrameSizeError, |
| - base::Unretained(this), base::ConstRef(header), |
| - base::ConstRef(validator)))); |
| + PayloadDecoderBaseTest::DecodePayloadAndValidateSeveralWays(payload, |
| + validator)); |
| } |
| // Confirm that we get OnFrameSizeError when trying to decode unpadded_payload |
| @@ -299,7 +282,7 @@ class AbstractPayloadDecoderTest : public PayloadDecoderBaseTest { |
| bool validated = false; |
| for (size_t real_payload_size = 0; |
| real_payload_size <= unpadded_payload.size(); ++real_payload_size) { |
| - if (!approve_size.Run(real_payload_size)) { |
| + if (approve_size != nullptr && !approve_size(real_payload_size)) { |
| continue; |
| } |
| VLOG(1) << "real_payload_size=" << real_payload_size; |
| @@ -320,8 +303,7 @@ class AbstractPayloadDecoderTest : public PayloadDecoderBaseTest { |
| // checking stream ids. |
| uint32_t stream_id = RandStreamId(); |
| Http2FrameHeader header(fb.size(), frame_type, flags, stream_id); |
| - VERIFY_SUCCESS(VerifyDetectsFrameSizeError( |
| - fb.buffer(), header, base::Bind(&SucceedingValidator))); |
| + VERIFY_SUCCESS(VerifyDetectsFrameSizeError(fb.buffer(), header, nullptr)); |
| validated = true; |
| } |
| VERIFY_TRUE(validated); |
| @@ -406,23 +388,6 @@ class AbstractPaddablePayloadDecoderTest |
| return flags; |
| } |
| - static ::testing::AssertionResult ValidatorForVerifyDetectsPaddingTooLong( |
| - const Http2FrameHeader& header, |
| - int expected_missing_length, |
| - const Listener& listener, |
| - const DecodeBuffer& input, |
| - DecodeStatus status) { |
| - VERIFY_EQ(DecodeStatus::kDecodeError, status); |
| - VERIFY_FALSE(listener.IsInProgress()); |
| - VERIFY_EQ(1u, listener.size()); |
| - const FrameParts* frame = listener.frame(0); |
| - VERIFY_EQ(header, frame->frame_header); |
| - VERIFY_TRUE(frame->opt_missing_length); |
| - VERIFY_EQ(expected_missing_length, frame->opt_missing_length.value()); |
| - // Verify did not get OnFrameSizeError. |
| - VERIFY_FALSE(frame->has_frame_size_error); |
| - return ::testing::AssertionSuccess(); |
| - } |
| // Verify that we get OnPaddingTooLong when decoding payload, and that the |
| // amount of missing padding is as specified. header.IsPadded must be true, |
| @@ -433,12 +398,23 @@ class AbstractPaddablePayloadDecoderTest |
| int expected_missing_length) { |
| set_frame_header(header); |
| auto& listener = listener_; |
| + Validator validator = [header, expected_missing_length, &listener]( |
| + const DecodeBuffer& input, |
| + DecodeStatus status) -> ::testing::AssertionResult { |
| + VERIFY_EQ(DecodeStatus::kDecodeError, status); |
| + VERIFY_FALSE(listener.IsInProgress()); |
| + VERIFY_EQ(1u, listener.size()); |
| + const FrameParts* frame = listener.frame(0); |
| + VERIFY_EQ(header, frame->frame_header); |
| + VERIFY_TRUE(frame->opt_missing_length); |
| + VERIFY_EQ(expected_missing_length, frame->opt_missing_length.value()); |
| + // Verify did not get OnFrameSizeError. |
| + VERIFY_FALSE(frame->has_frame_size_error); |
| + return ::testing::AssertionSuccess(); |
| + }; |
| VERIFY_AND_RETURN_SUCCESS( |
| - PayloadDecoderBaseTest::DecodePayloadAndValidateSeveralWays( |
| - payload, base::Bind(&AbstractPaddablePayloadDecoderTest:: |
| - ValidatorForVerifyDetectsPaddingTooLong, |
| - header, expected_missing_length, |
| - base::ConstRef(listener)))); |
| + PayloadDecoderBaseTest::DecodePayloadAndValidateSeveralWays(payload, |
| + validator)); |
| } |
| // Verifies that we get OnPaddingTooLong for a padded frame payload whose |