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 |