| 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/hpack/decoder/hpack_whole_entry_buffer.h" | 5 #include "net/http2/hpack/decoder/hpack_whole_entry_buffer.h" |
| 6 | 6 |
| 7 // Tests of HpackWholeEntryBuffer: does it buffer correctly, and does it | 7 // Tests of HpackWholeEntryBuffer: does it buffer correctly, and does it |
| 8 // detect Huffman decoding errors and oversize string errors? | 8 // detect Huffman decoding errors and oversize string errors? |
| 9 | 9 |
| 10 #include "net/test/gtest_util.h" |
| 11 #include "testing/gmock/include/gmock/gmock-matchers.h" |
| 10 #include "testing/gmock/include/gmock/gmock.h" | 12 #include "testing/gmock/include/gmock/gmock.h" |
| 11 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 12 | 14 |
| 13 using base::StringPiece; | 15 using base::StringPiece; |
| 14 using ::testing::AllOf; | 16 using ::testing::AllOf; |
| 15 using ::testing::HasSubstr; | 17 using ::testing::HasSubstr; |
| 16 using ::testing::InSequence; | 18 using ::testing::InSequence; |
| 17 using ::testing::Property; | 19 using ::testing::Property; |
| 18 using ::testing::SaveArg; | |
| 19 using ::testing::StrictMock; | 20 using ::testing::StrictMock; |
| 20 using ::testing::_; | 21 using ::testing::_; |
| 21 | 22 |
| 22 namespace net { | 23 namespace net { |
| 23 namespace test { | 24 namespace test { |
| 24 namespace { | 25 namespace { |
| 25 | 26 |
| 26 constexpr size_t kMaxStringSize = 20; | 27 constexpr size_t kMaxStringSize = 20; |
| 27 | 28 |
| 29 // Define HasSubstr() for base::StringPiece arguments. |
| 30 // This shadows ::testing::HasSubstr(), which only works on argument types |
| 31 // that can be implicilty converted to a std::string. |
| 32 inline ::testing::PolymorphicMatcher<StringPieceHasSubstrMatcher> HasSubstr( |
| 33 const std::string& substring) { |
| 34 return ::testing::MakePolymorphicMatcher( |
| 35 StringPieceHasSubstrMatcher(substring)); |
| 36 } |
| 37 |
| 28 class MockHpackWholeEntryListener : public HpackWholeEntryListener { | 38 class MockHpackWholeEntryListener : public HpackWholeEntryListener { |
| 29 public: | 39 public: |
| 30 ~MockHpackWholeEntryListener() override {} | 40 ~MockHpackWholeEntryListener() override {} |
| 31 | 41 |
| 32 MOCK_METHOD1(OnIndexedHeader, void(size_t index)); | 42 MOCK_METHOD1(OnIndexedHeader, void(size_t index)); |
| 33 MOCK_METHOD3(OnNameIndexAndLiteralValue, | 43 MOCK_METHOD3(OnNameIndexAndLiteralValue, |
| 34 void(HpackEntryType entry_type, | 44 void(HpackEntryType entry_type, |
| 35 size_t name_index, | 45 size_t name_index, |
| 36 HpackDecoderStringBuffer* value_buffer)); | 46 HpackDecoderStringBuffer* value_buffer)); |
| 37 MOCK_METHOD3(OnLiteralNameAndValue, | 47 MOCK_METHOD3(OnLiteralNameAndValue, |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 Property(&HpackDecoderStringBuffer::BufferedLength, 9)), | 160 Property(&HpackDecoderStringBuffer::BufferedLength, 9)), |
| 151 AllOf(Property(&HpackDecoderStringBuffer::str, "Header Value"), | 161 AllOf(Property(&HpackDecoderStringBuffer::str, "Header Value"), |
| 152 Property(&HpackDecoderStringBuffer::BufferedLength, 0)))); | 162 Property(&HpackDecoderStringBuffer::BufferedLength, 0)))); |
| 153 | 163 |
| 154 entry_buffer_.OnValueEnd(); | 164 entry_buffer_.OnValueEnd(); |
| 155 } | 165 } |
| 156 | 166 |
| 157 // Verify that a name longer than the allowed size generates an error. | 167 // Verify that a name longer than the allowed size generates an error. |
| 158 TEST_F(HpackWholeEntryBufferTest, NameTooLong) { | 168 TEST_F(HpackWholeEntryBufferTest, NameTooLong) { |
| 159 entry_buffer_.OnStartLiteralHeader(HpackEntryType::kIndexedLiteralHeader, 0); | 169 entry_buffer_.OnStartLiteralHeader(HpackEntryType::kIndexedLiteralHeader, 0); |
| 160 StringPiece error_message; | 170 EXPECT_CALL(listener_, OnHpackDecodeError(HasSubstr("HPACK entry name"))); |
| 161 EXPECT_CALL(listener_, OnHpackDecodeError(_)) | |
| 162 .WillOnce(SaveArg<0>(&error_message)); | |
| 163 entry_buffer_.OnNameStart(false, kMaxStringSize + 1); | 171 entry_buffer_.OnNameStart(false, kMaxStringSize + 1); |
| 164 EXPECT_THAT(error_message.as_string(), HasSubstr("HPACK entry name")); | |
| 165 } | 172 } |
| 166 | 173 |
| 167 // Verify that a name longer than the allowed size generates an error. | 174 // Verify that a name longer than the allowed size generates an error. |
| 168 TEST_F(HpackWholeEntryBufferTest, ValueTooLong) { | 175 TEST_F(HpackWholeEntryBufferTest, ValueTooLong) { |
| 169 entry_buffer_.OnStartLiteralHeader(HpackEntryType::kIndexedLiteralHeader, 1); | 176 entry_buffer_.OnStartLiteralHeader(HpackEntryType::kIndexedLiteralHeader, 1); |
| 170 StringPiece error_message; | 177 EXPECT_CALL(listener_, OnHpackDecodeError(HasSubstr("HPACK entry value"))); |
| 171 EXPECT_CALL(listener_, OnHpackDecodeError(_)) | |
| 172 .WillOnce(SaveArg<0>(&error_message)); | |
| 173 entry_buffer_.OnValueStart(false, kMaxStringSize + 1); | 178 entry_buffer_.OnValueStart(false, kMaxStringSize + 1); |
| 174 EXPECT_THAT(error_message.as_string(), HasSubstr("HPACK entry value")); | |
| 175 } | 179 } |
| 176 | 180 |
| 177 // Verify that a Huffman encoded name with an explicit EOS generates an error | 181 // Verify that a Huffman encoded name with an explicit EOS generates an error |
| 178 // for an explicit EOS. | 182 // for an explicit EOS. |
| 179 TEST_F(HpackWholeEntryBufferTest, NameHuffmanError) { | 183 TEST_F(HpackWholeEntryBufferTest, NameHuffmanError) { |
| 180 const char data[] = "\xff\xff\xff"; | 184 const char data[] = "\xff\xff\xff"; |
| 181 entry_buffer_.OnStartLiteralHeader(HpackEntryType::kUnindexedLiteralHeader, | 185 entry_buffer_.OnStartLiteralHeader(HpackEntryType::kUnindexedLiteralHeader, |
| 182 0); | 186 0); |
| 183 entry_buffer_.OnNameStart(true, 4); | 187 entry_buffer_.OnNameStart(true, 4); |
| 184 entry_buffer_.OnNameData(data, 3); | 188 entry_buffer_.OnNameData(data, 3); |
| 185 | 189 |
| 186 StringPiece error_message; | 190 EXPECT_CALL(listener_, OnHpackDecodeError(HasSubstr("HPACK entry name"))); |
| 187 EXPECT_CALL(listener_, OnHpackDecodeError(_)) | |
| 188 .WillOnce(SaveArg<0>(&error_message)); | |
| 189 | 191 |
| 190 entry_buffer_.OnNameData(data, 1); | 192 entry_buffer_.OnNameData(data, 1); |
| 191 EXPECT_THAT(error_message.as_string(), HasSubstr("HPACK entry name")); | |
| 192 | 193 |
| 193 // After an error is reported, the listener is not called again. | 194 // After an error is reported, the listener is not called again. |
| 194 EXPECT_CALL(listener_, OnDynamicTableSizeUpdate(8096)).Times(0); | 195 EXPECT_CALL(listener_, OnDynamicTableSizeUpdate(8096)).Times(0); |
| 195 entry_buffer_.OnDynamicTableSizeUpdate(8096); | 196 entry_buffer_.OnDynamicTableSizeUpdate(8096); |
| 196 } | 197 } |
| 197 | 198 |
| 198 // Verify that a Huffman encoded value that isn't properly terminated with | 199 // Verify that a Huffman encoded value that isn't properly terminated with |
| 199 // a partial EOS symbol generates an error. | 200 // a partial EOS symbol generates an error. |
| 200 TEST_F(HpackWholeEntryBufferTest, ValueeHuffmanError) { | 201 TEST_F(HpackWholeEntryBufferTest, ValueeHuffmanError) { |
| 201 const char data[] = "\x00\x00\x00"; | 202 const char data[] = "\x00\x00\x00"; |
| 202 entry_buffer_.OnStartLiteralHeader(HpackEntryType::kNeverIndexedLiteralHeader, | 203 entry_buffer_.OnStartLiteralHeader(HpackEntryType::kNeverIndexedLiteralHeader, |
| 203 61); | 204 61); |
| 204 entry_buffer_.OnValueStart(true, 3); | 205 entry_buffer_.OnValueStart(true, 3); |
| 205 entry_buffer_.OnValueData(data, 3); | 206 entry_buffer_.OnValueData(data, 3); |
| 206 | 207 |
| 207 StringPiece error_message; | 208 EXPECT_CALL(listener_, OnHpackDecodeError(HasSubstr("HPACK entry value"))); |
| 208 EXPECT_CALL(listener_, OnHpackDecodeError(_)) | |
| 209 .WillOnce(SaveArg<0>(&error_message)); | |
| 210 | 209 |
| 211 entry_buffer_.OnValueEnd(); | 210 entry_buffer_.OnValueEnd(); |
| 212 EXPECT_THAT(error_message.as_string(), HasSubstr("HPACK entry value")); | |
| 213 | 211 |
| 214 // After an error is reported, the listener is not called again. | 212 // After an error is reported, the listener is not called again. |
| 215 EXPECT_CALL(listener_, OnIndexedHeader(17)).Times(0); | 213 EXPECT_CALL(listener_, OnIndexedHeader(17)).Times(0); |
| 216 entry_buffer_.OnIndexedHeader(17); | 214 entry_buffer_.OnIndexedHeader(17); |
| 217 } | 215 } |
| 218 | 216 |
| 219 } // namespace | 217 } // namespace |
| 220 } // namespace test | 218 } // namespace test |
| 221 } // namespace net | 219 } // namespace net |
| OLD | NEW |