| 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 "net/http2/decoder/payload_decoders/settings_payload_decoder.h" | 5 #include "net/http2/decoder/payload_decoders/settings_payload_decoder.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/bind.h" | |
| 12 #include "base/logging.h" | 11 #include "base/logging.h" |
| 13 #include "net/http2/decoder/frame_parts.h" | 12 #include "net/http2/decoder/frame_parts.h" |
| 14 #include "net/http2/decoder/frame_parts_collector.h" | 13 #include "net/http2/decoder/frame_parts_collector.h" |
| 15 #include "net/http2/decoder/http2_frame_decoder_listener.h" | 14 #include "net/http2/decoder/http2_frame_decoder_listener.h" |
| 16 #include "net/http2/decoder/payload_decoders/payload_decoder_base_test_util.h" | 15 #include "net/http2/decoder/payload_decoders/payload_decoder_base_test_util.h" |
| 17 #include "net/http2/http2_constants.h" | 16 #include "net/http2/http2_constants.h" |
| 18 #include "net/http2/http2_constants_test_util.h" | 17 #include "net/http2/http2_constants_test_util.h" |
| 19 #include "net/http2/http2_structures_test_util.h" | 18 #include "net/http2/http2_structures_test_util.h" |
| 20 #include "net/http2/tools/http2_frame_builder.h" | 19 #include "net/http2/tools/http2_frame_builder.h" |
| 21 #include "net/http2/tools/http2_random.h" | 20 #include "net/http2/tools/http2_random.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 void OnFrameSizeError(const Http2FrameHeader& header) override { | 70 void OnFrameSizeError(const Http2FrameHeader& header) override { |
| 72 VLOG(1) << "OnFrameSizeError: " << header; | 71 VLOG(1) << "OnFrameSizeError: " << header; |
| 73 FrameError(header)->OnFrameSizeError(header); | 72 FrameError(header)->OnFrameSizeError(header); |
| 74 } | 73 } |
| 75 }; | 74 }; |
| 76 | 75 |
| 77 class SettingsPayloadDecoderTest | 76 class SettingsPayloadDecoderTest |
| 78 : public AbstractPayloadDecoderTest<SettingsPayloadDecoder, | 77 : public AbstractPayloadDecoderTest<SettingsPayloadDecoder, |
| 79 SettingsPayloadDecoderPeer, | 78 SettingsPayloadDecoderPeer, |
| 80 Listener> { | 79 Listener> { |
| 81 public: | |
| 82 static bool ApproveSizeForSettingsWrongSize(size_t size) { | |
| 83 // Should get an error if size is not an integral multiple of the size | |
| 84 // of one setting. | |
| 85 return 0 != (size % Http2SettingFields::EncodedSize()); | |
| 86 } | |
| 87 | |
| 88 static bool ApproveSizeForSettingsAkcWrongSize(size_t size) { | |
| 89 return size != 0; | |
| 90 } | |
| 91 | |
| 92 protected: | 80 protected: |
| 93 Http2SettingFields RandSettingsFields() { | 81 Http2SettingFields RandSettingsFields() { |
| 94 Http2SettingFields fields; | 82 Http2SettingFields fields; |
| 95 test::Randomize(&fields, RandomPtr()); | 83 test::Randomize(&fields, RandomPtr()); |
| 96 return fields; | 84 return fields; |
| 97 } | 85 } |
| 98 }; | 86 }; |
| 99 | 87 |
| 100 // Confirm we get an error if the SETTINGS payload is not the correct size | 88 // Confirm we get an error if the SETTINGS payload is not the correct size |
| 101 // to hold exactly zero or more whole Http2SettingFields. | 89 // to hold exactly zero or more whole Http2SettingFields. |
| 102 TEST_F(SettingsPayloadDecoderTest, SettingsWrongSize) { | 90 TEST_F(SettingsPayloadDecoderTest, SettingsWrongSize) { |
| 91 auto approve_size = [](size_t size) { |
| 92 // Should get an error if size is not an integral multiple of the size |
| 93 // of one setting. |
| 94 return 0 != (size % Http2SettingFields::EncodedSize()); |
| 95 }; |
| 103 Http2FrameBuilder fb; | 96 Http2FrameBuilder fb; |
| 104 fb.Append(RandSettingsFields()); | 97 fb.Append(RandSettingsFields()); |
| 105 fb.Append(RandSettingsFields()); | 98 fb.Append(RandSettingsFields()); |
| 106 fb.Append(RandSettingsFields()); | 99 fb.Append(RandSettingsFields()); |
| 107 EXPECT_TRUE(VerifyDetectsFrameSizeError( | 100 EXPECT_TRUE(VerifyDetectsFrameSizeError(0, fb.buffer(), approve_size)); |
| 108 0, fb.buffer(), | |
| 109 base::Bind( | |
| 110 &SettingsPayloadDecoderTest::ApproveSizeForSettingsWrongSize))); | |
| 111 } | 101 } |
| 112 | 102 |
| 113 // Confirm we get an error if the SETTINGS ACK payload is not empty. | 103 // Confirm we get an error if the SETTINGS ACK payload is not empty. |
| 114 TEST_F(SettingsPayloadDecoderTest, SettingsAkcWrongSize) { | 104 TEST_F(SettingsPayloadDecoderTest, SettingsAkcWrongSize) { |
| 105 auto approve_size = [](size_t size) { return size != 0; }; |
| 115 Http2FrameBuilder fb; | 106 Http2FrameBuilder fb; |
| 116 fb.Append(RandSettingsFields()); | 107 fb.Append(RandSettingsFields()); |
| 117 fb.Append(RandSettingsFields()); | 108 fb.Append(RandSettingsFields()); |
| 118 fb.Append(RandSettingsFields()); | 109 fb.Append(RandSettingsFields()); |
| 119 EXPECT_TRUE(VerifyDetectsFrameSizeError( | 110 EXPECT_TRUE(VerifyDetectsFrameSizeError(Http2FrameFlag::FLAG_ACK, fb.buffer(), |
| 120 Http2FrameFlag::FLAG_ACK, fb.buffer(), | 111 approve_size)); |
| 121 base::Bind( | |
| 122 &SettingsPayloadDecoderTest::ApproveSizeForSettingsAkcWrongSize))); | |
| 123 } | 112 } |
| 124 | 113 |
| 125 // SETTINGS must have stream_id==0, but the payload decoder doesn't check that. | 114 // SETTINGS must have stream_id==0, but the payload decoder doesn't check that. |
| 126 TEST_F(SettingsPayloadDecoderTest, SettingsAck) { | 115 TEST_F(SettingsPayloadDecoderTest, SettingsAck) { |
| 127 for (int stream_id = 0; stream_id < 3; ++stream_id) { | 116 for (int stream_id = 0; stream_id < 3; ++stream_id) { |
| 128 Http2FrameHeader header(0, Http2FrameType::SETTINGS, | 117 Http2FrameHeader header(0, Http2FrameType::SETTINGS, |
| 129 RandFlags() | Http2FrameFlag::FLAG_ACK, stream_id); | 118 RandFlags() | Http2FrameFlag::FLAG_ACK, stream_id); |
| 130 set_frame_header(header); | 119 set_frame_header(header); |
| 131 FrameParts expected(header); | 120 FrameParts expected(header); |
| 132 EXPECT_TRUE(DecodePayloadAndValidateSeveralWays("", expected)); | 121 EXPECT_TRUE(DecodePayloadAndValidateSeveralWays("", expected)); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 fb.Append(fields); | 156 fb.Append(fields); |
| 168 expected.settings.push_back(fields); | 157 expected.settings.push_back(fields); |
| 169 } | 158 } |
| 170 ASSERT_EQ(size, fb.size()); | 159 ASSERT_EQ(size, fb.size()); |
| 171 EXPECT_TRUE(DecodePayloadAndValidateSeveralWays(fb.buffer(), expected)); | 160 EXPECT_TRUE(DecodePayloadAndValidateSeveralWays(fb.buffer(), expected)); |
| 172 } | 161 } |
| 173 | 162 |
| 174 } // namespace | 163 } // namespace |
| 175 } // namespace test | 164 } // namespace test |
| 176 } // namespace net | 165 } // namespace net |
| OLD | NEW |