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/decode_http2_structures.h" | 5 #include "net/http2/decoder/decode_http2_structures.h" |
6 | 6 |
7 // Tests decoding all of the fixed size HTTP/2 structures (i.e. those defined | 7 // Tests decoding all of the fixed size HTTP/2 structures (i.e. those defined |
8 // in net/http2/http2_structures.h). | 8 // in net/http2/http2_structures.h). |
9 | 9 |
10 // TODO(jamessynge): Combine tests of DoDecode, MaybeDecode, SlowDecode and | 10 // TODO(jamessynge): Combine tests of DoDecode, MaybeDecode, SlowDecode and |
11 // Http2StructureDecoder test using gUnit's support for tests parameterized | 11 // Http2StructureDecoder test using gUnit's support for tests parameterized |
12 // by type. | 12 // by type. |
13 | 13 |
14 #include <stddef.h> | 14 #include <stddef.h> |
15 #include <string> | 15 #include <string> |
16 | 16 |
17 #include "base/bind.h" | |
18 #include "base/bind_helpers.h" | |
19 #include "base/logging.h" | 17 #include "base/logging.h" |
20 #include "base/strings/string_piece.h" | 18 #include "base/strings/string_piece.h" |
21 #include "net/http2/decoder/decode_buffer.h" | 19 #include "net/http2/decoder/decode_buffer.h" |
22 #include "net/http2/decoder/decode_status.h" | 20 #include "net/http2/decoder/decode_status.h" |
23 #include "net/http2/http2_constants.h" | 21 #include "net/http2/http2_constants.h" |
24 #include "net/http2/http2_structures_test_util.h" | 22 #include "net/http2/http2_structures_test_util.h" |
25 #include "net/http2/tools/http2_frame_builder.h" | 23 #include "net/http2/tools/http2_frame_builder.h" |
26 #include "net/http2/tools/random_decoder_test.h" | 24 #include "net/http2/tools/random_decoder_test.h" |
27 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
28 | 26 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 // Drained the input buffer, but not yet done. | 101 // Drained the input buffer, but not yet done. |
104 EXPECT_TRUE(b->Empty()); | 102 EXPECT_TRUE(b->Empty()); |
105 EXPECT_GT(S::EncodedSize(), decode_offset_); | 103 EXPECT_GT(S::EncodedSize(), decode_offset_); |
106 | 104 |
107 return DecodeStatus::kDecodeInProgress; | 105 return DecodeStatus::kDecodeInProgress; |
108 } | 106 } |
109 | 107 |
110 // Set the fields of |*p| to random values. | 108 // Set the fields of |*p| to random values. |
111 void Randomize(S* p) { ::net::test::Randomize(p, RandomPtr()); } | 109 void Randomize(S* p) { ::net::test::Randomize(p, RandomPtr()); } |
112 | 110 |
113 AssertionResult ValidatorForDecodeLeadingStructure(const S* expected, | |
114 const DecodeBuffer& db, | |
115 DecodeStatus status) { | |
116 if (expected != nullptr && *expected != structure_) { | |
117 return AssertionFailure() | |
118 << "Expected structs to be equal\nExpected: " << *expected | |
119 << "\n Actual: " << structure_; | |
120 } | |
121 return AssertionSuccess(); | |
122 } | |
123 | |
124 // Fully decodes the Structure at the start of data, and confirms it matches | 111 // Fully decodes the Structure at the start of data, and confirms it matches |
125 // *expected (if provided). | 112 // *expected (if provided). |
126 void DecodeLeadingStructure(const S* expected, StringPiece data) { | 113 void DecodeLeadingStructure(const S* expected, StringPiece data) { |
127 ASSERT_LE(S::EncodedSize(), data.size()); | 114 ASSERT_LE(S::EncodedSize(), data.size()); |
128 DecodeBuffer original(data); | 115 DecodeBuffer original(data); |
129 | 116 |
130 // The validator is called after each of the several times that the input | 117 // The validator is called after each of the several times that the input |
131 // DecodeBuffer is decoded, each with a different segmentation of the input. | 118 // DecodeBuffer is decoded, each with a different segmentation of the input. |
132 // Validate that structure_ matches the expected value, if provided. | 119 // Validate that structure_ matches the expected value, if provided. |
133 Validator validator = | 120 Validator validator = [expected, this]( |
134 base::Bind(&StructureDecoderTest::ValidatorForDecodeLeadingStructure, | 121 const DecodeBuffer& db, DecodeStatus status) -> AssertionResult { |
135 base::Unretained(this), expected); | 122 if (expected != nullptr && *expected != structure_) { |
| 123 return AssertionFailure() |
| 124 << "Expected structs to be equal\nExpected: " << *expected |
| 125 << "\n Actual: " << structure_; |
| 126 } |
| 127 return AssertionSuccess(); |
| 128 }; |
136 | 129 |
137 // First validate that decoding is done and that we've advanced the cursor | 130 // First validate that decoding is done and that we've advanced the cursor |
138 // the expected amount. | 131 // the expected amount. |
139 Validator wrapped_validator = | 132 validator = ValidateDoneAndOffset(S::EncodedSize(), validator); |
140 ValidateDoneAndOffset(S::EncodedSize(), validator); | |
141 | 133 |
142 // Decode several times, with several segmentations of the input buffer. | 134 // Decode several times, with several segmentations of the input buffer. |
143 fast_decode_count_ = 0; | 135 fast_decode_count_ = 0; |
144 slow_decode_count_ = 0; | 136 slow_decode_count_ = 0; |
145 EXPECT_TRUE(DecodeAndValidateSeveralWays( | 137 EXPECT_TRUE(DecodeAndValidateSeveralWays( |
146 &original, false /*return_non_zero_on_first*/, wrapped_validator)); | 138 &original, false /*return_non_zero_on_first*/, validator)); |
147 | 139 |
148 if (!HasFailure()) { | 140 if (!HasFailure()) { |
149 EXPECT_EQ(S::EncodedSize(), decode_offset_); | 141 EXPECT_EQ(S::EncodedSize(), decode_offset_); |
150 EXPECT_EQ(S::EncodedSize(), original.Offset()); | 142 EXPECT_EQ(S::EncodedSize(), original.Offset()); |
151 EXPECT_LT(0u, fast_decode_count_); | 143 EXPECT_LT(0u, fast_decode_count_); |
152 EXPECT_LT(0u, slow_decode_count_); | 144 EXPECT_LT(0u, slow_decode_count_); |
153 if (expected != nullptr) { | 145 if (expected != nullptr) { |
154 DVLOG(1) << "DecodeLeadingStructure expected: " << *expected; | 146 DVLOG(1) << "DecodeLeadingStructure expected: " << *expected; |
155 DVLOG(1) << "DecodeLeadingStructure actual: " << structure_; | 147 DVLOG(1) << "DecodeLeadingStructure actual: " << structure_; |
156 EXPECT_EQ(*expected, structure_); | 148 EXPECT_EQ(*expected, structure_); |
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 } | 525 } |
534 } | 526 } |
535 | 527 |
536 TEST_F(AltSvcFieldsDecoderTest, DecodesRandomized) { | 528 TEST_F(AltSvcFieldsDecoderTest, DecodesRandomized) { |
537 TestDecodingRandomizedStructures(100); | 529 TestDecodingRandomizedStructures(100); |
538 } | 530 } |
539 | 531 |
540 } // namespace | 532 } // namespace |
541 } // namespace test | 533 } // namespace test |
542 } // namespace net | 534 } // namespace net |
OLD | NEW |