| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/quic/quic_packet_creator.h" | 5 #include "net/quic/quic_packet_creator.h" |
| 6 | 6 |
| 7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
| 8 #include "net/quic/crypto/null_encrypter.h" | 8 #include "net/quic/crypto/null_encrypter.h" |
| 9 #include "net/quic/crypto/quic_decrypter.h" | 9 #include "net/quic/crypto/quic_decrypter.h" |
| 10 #include "net/quic/crypto/quic_encrypter.h" | 10 #include "net/quic/crypto/quic_encrypter.h" |
| 11 #include "net/quic/quic_utils.h" | 11 #include "net/quic/quic_utils.h" |
| 12 #include "net/quic/test_tools/mock_random.h" | 12 #include "net/quic/test_tools/mock_random.h" |
| 13 #include "net/quic/test_tools/quic_packet_creator_peer.h" | 13 #include "net/quic/test_tools/quic_packet_creator_peer.h" |
| 14 #include "net/quic/test_tools/quic_test_utils.h" | 14 #include "net/quic/test_tools/quic_test_utils.h" |
| 15 #include "net/test/gtest_util.h" |
| 15 #include "testing/gmock/include/gmock/gmock.h" | 16 #include "testing/gmock/include/gmock/gmock.h" |
| 16 | 17 |
| 17 using base::StringPiece; | 18 using base::StringPiece; |
| 19 using std::ostream; |
| 18 using std::string; | 20 using std::string; |
| 19 using std::vector; | 21 using std::vector; |
| 20 using testing::DoAll; | 22 using testing::DoAll; |
| 21 using testing::InSequence; | 23 using testing::InSequence; |
| 22 using testing::Return; | 24 using testing::Return; |
| 23 using testing::SaveArg; | 25 using testing::SaveArg; |
| 24 using testing::_; | 26 using testing::_; |
| 25 | 27 |
| 26 namespace net { | 28 namespace net { |
| 27 namespace test { | 29 namespace test { |
| 28 namespace { | 30 namespace { |
| 29 | 31 |
| 30 class QuicPacketCreatorTest : public ::testing::TestWithParam<bool> { | 32 // Run tests with combinations of {QuicVersion, ToggleVersionSerialization}. |
| 33 struct TestParams { |
| 34 TestParams(QuicVersion version, |
| 35 bool version_serialization) |
| 36 : version(version), |
| 37 version_serialization(version_serialization) { |
| 38 } |
| 39 |
| 40 friend ostream& operator<<(ostream& os, const TestParams& p) { |
| 41 os << "{ client_version: " << QuicVersionToString(p.version) |
| 42 << " include version: " << p.version_serialization << " }"; |
| 43 return os; |
| 44 } |
| 45 |
| 46 QuicVersion version; |
| 47 bool version_serialization; |
| 48 }; |
| 49 |
| 50 // Constructs various test permutations. |
| 51 vector<TestParams> GetTestParams() { |
| 52 vector<TestParams> params; |
| 53 QuicVersionVector all_supported_versions = QuicSupportedVersions(); |
| 54 for (size_t i = 0; i < all_supported_versions.size(); ++i) { |
| 55 params.push_back(TestParams(all_supported_versions[i], true)); |
| 56 params.push_back(TestParams(all_supported_versions[i], false)); |
| 57 } |
| 58 return params; |
| 59 } |
| 60 |
| 61 class QuicPacketCreatorTest : public ::testing::TestWithParam<TestParams> { |
| 31 protected: | 62 protected: |
| 32 QuicPacketCreatorTest() | 63 QuicPacketCreatorTest() |
| 33 : server_framer_(QuicSupportedVersions(), QuicTime::Zero(), true), | 64 : server_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(), |
| 34 client_framer_(QuicSupportedVersions(), QuicTime::Zero(), false), | 65 true), |
| 66 client_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(), |
| 67 false), |
| 35 sequence_number_(0), | 68 sequence_number_(0), |
| 36 connection_id_(2), | 69 connection_id_(2), |
| 37 data_("foo"), | 70 data_("foo"), |
| 38 creator_(connection_id_, &client_framer_, &mock_random_, false) { | 71 creator_(connection_id_, &client_framer_, &mock_random_, false) { |
| 39 client_framer_.set_visitor(&framer_visitor_); | 72 client_framer_.set_visitor(&framer_visitor_); |
| 40 server_framer_.set_visitor(&framer_visitor_); | 73 server_framer_.set_visitor(&framer_visitor_); |
| 41 } | 74 } |
| 42 ~QuicPacketCreatorTest() { | 75 ~QuicPacketCreatorTest() { |
| 43 } | 76 } |
| 44 | 77 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 QuicFramer server_framer_; | 127 QuicFramer server_framer_; |
| 95 QuicFramer client_framer_; | 128 QuicFramer client_framer_; |
| 96 testing::StrictMock<MockFramerVisitor> framer_visitor_; | 129 testing::StrictMock<MockFramerVisitor> framer_visitor_; |
| 97 QuicPacketSequenceNumber sequence_number_; | 130 QuicPacketSequenceNumber sequence_number_; |
| 98 QuicConnectionId connection_id_; | 131 QuicConnectionId connection_id_; |
| 99 string data_; | 132 string data_; |
| 100 MockRandom mock_random_; | 133 MockRandom mock_random_; |
| 101 QuicPacketCreator creator_; | 134 QuicPacketCreator creator_; |
| 102 }; | 135 }; |
| 103 | 136 |
| 104 TEST_F(QuicPacketCreatorTest, SerializeFrames) { | 137 // Run all packet creator tests with all supported versions of QUIC, and with |
| 138 // and without version in the packet header. |
| 139 INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests, |
| 140 QuicPacketCreatorTest, |
| 141 ::testing::ValuesIn(GetTestParams())); |
| 142 |
| 143 |
| 144 TEST_P(QuicPacketCreatorTest, SerializeFrames) { |
| 105 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); | 145 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); |
| 106 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); | 146 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
| 107 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, true, 0u, IOVector()))); | 147 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, true, 0u, IOVector()))); |
| 108 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 148 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 109 delete frames_[0].ack_frame; | 149 delete frames_[0].ack_frame; |
| 110 delete frames_[1].stream_frame; | 150 delete frames_[1].stream_frame; |
| 111 delete frames_[2].stream_frame; | 151 delete frames_[2].stream_frame; |
| 112 | 152 |
| 113 { | 153 { |
| 114 InSequence s; | 154 InSequence s; |
| 115 EXPECT_CALL(framer_visitor_, OnPacket()); | 155 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 116 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 156 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 117 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 157 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 118 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 158 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 119 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); | 159 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); |
| 120 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 160 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 121 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 161 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 122 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 162 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 123 } | 163 } |
| 124 ProcessPacket(serialized.packet); | 164 ProcessPacket(serialized.packet); |
| 125 delete serialized.packet; | 165 delete serialized.packet; |
| 126 } | 166 } |
| 127 | 167 |
| 128 TEST_F(QuicPacketCreatorTest, SerializeWithFEC) { | 168 TEST_P(QuicPacketCreatorTest, SerializeWithFEC) { |
| 129 creator_.options()->max_packets_per_fec_group = 6; | 169 creator_.options()->max_packets_per_fec_group = 6; |
| 130 ASSERT_FALSE(creator_.ShouldSendFec(false)); | 170 // Should return false since we do not have enough packets in the FEC group to |
| 171 // trigger an FEC packet. |
| 172 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); |
| 131 | 173 |
| 132 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); | 174 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
| 133 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 175 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 134 delete frames_[0].stream_frame; | 176 delete frames_[0].stream_frame; |
| 135 | 177 |
| 136 { | 178 { |
| 137 InSequence s; | 179 InSequence s; |
| 138 EXPECT_CALL(framer_visitor_, OnPacket()); | 180 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 139 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 181 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 140 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 182 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 141 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 183 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 142 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); | 184 if (GetParam().version != QUIC_VERSION_13) { |
| 185 // FEC is only used for versions > 13. |
| 186 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); |
| 187 } |
| 143 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 188 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 144 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 189 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 145 } | 190 } |
| 146 ProcessPacket(serialized.packet); | 191 ProcessPacket(serialized.packet); |
| 147 delete serialized.packet; | 192 delete serialized.packet; |
| 148 | 193 |
| 149 ASSERT_FALSE(creator_.ShouldSendFec(false)); | 194 // Should return false since we do not have enough packets in the FEC group to |
| 150 ASSERT_TRUE(creator_.ShouldSendFec(true)); | 195 // trigger an FEC packet. |
| 196 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); |
| 197 if (GetParam().version == QUIC_VERSION_13) { |
| 198 // FEC is only used for versions > 13. |
| 199 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/true)); |
| 200 } else { |
| 201 // Should return true since there are packets in the FEC group. |
| 202 ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); |
| 203 } |
| 151 | 204 |
| 205 if (GetParam().version == QUIC_VERSION_13) { |
| 206 // FEC is only used for versions > 13. |
| 207 EXPECT_DFATAL(creator_.SerializeFec(), |
| 208 "SerializeFEC called but no group or zero packets in group."); |
| 209 return; |
| 210 } |
| 152 serialized = creator_.SerializeFec(); | 211 serialized = creator_.SerializeFec(); |
| 153 ASSERT_EQ(2u, serialized.sequence_number); | 212 ASSERT_EQ(2u, serialized.sequence_number); |
| 154 | |
| 155 { | 213 { |
| 156 InSequence s; | 214 InSequence s; |
| 157 EXPECT_CALL(framer_visitor_, OnPacket()); | 215 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 158 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 216 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 159 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 217 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 160 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 218 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 161 EXPECT_CALL(framer_visitor_, OnFecData(_)); | 219 EXPECT_CALL(framer_visitor_, OnFecData(_)); |
| 162 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 220 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 163 } | 221 } |
| 164 ProcessPacket(serialized.packet); | 222 ProcessPacket(serialized.packet); |
| 165 delete serialized.packet; | 223 delete serialized.packet; |
| 166 } | 224 } |
| 167 | 225 |
| 168 TEST_F(QuicPacketCreatorTest, SerializeChangingSequenceNumberLength) { | 226 TEST_P(QuicPacketCreatorTest, SerializeChangingSequenceNumberLength) { |
| 169 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); | 227 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); |
| 170 creator_.AddSavedFrame(frames_[0]); | 228 creator_.AddSavedFrame(frames_[0]); |
| 171 creator_.options()->send_sequence_number_length = | 229 creator_.options()->send_sequence_number_length = |
| 172 PACKET_4BYTE_SEQUENCE_NUMBER; | 230 PACKET_4BYTE_SEQUENCE_NUMBER; |
| 173 SerializedPacket serialized = creator_.SerializePacket(); | 231 SerializedPacket serialized = creator_.SerializePacket(); |
| 174 // The sequence number length will not change mid-packet. | 232 // The sequence number length will not change mid-packet. |
| 175 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); | 233 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); |
| 176 | 234 |
| 177 { | 235 { |
| 178 InSequence s; | 236 InSequence s; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 198 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 256 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 199 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 257 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 200 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 258 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 201 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); | 259 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); |
| 202 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 260 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 203 } | 261 } |
| 204 ProcessPacket(serialized.packet); | 262 ProcessPacket(serialized.packet); |
| 205 delete serialized.packet; | 263 delete serialized.packet; |
| 206 } | 264 } |
| 207 | 265 |
| 208 TEST_F(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) { | 266 TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) { |
| 267 if (GetParam().version == QUIC_VERSION_13) { |
| 268 // FEC is only used for ver. > 13. This test does not add value for ver. 13. |
| 269 return; |
| 270 } |
| 271 // Test goal is to test the following sequence (P1 => generate Packet 1): |
| 272 // P1 <change seq num length> P2 FEC, |
| 273 // and we expect that sequence number length should not change until the end |
| 274 // of the open FEC group. |
| 209 creator_.options()->max_packets_per_fec_group = 6; | 275 creator_.options()->max_packets_per_fec_group = 6; |
| 210 ASSERT_FALSE(creator_.ShouldSendFec(false)); | 276 // Should return false since we do not have enough packets in the FEC group to |
| 277 // trigger an FEC packet. |
| 278 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); |
| 279 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); |
| 211 | 280 |
| 212 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); | 281 // Generate Packet 1. |
| 213 creator_.AddSavedFrame(frames_[0]); | 282 creator_.AddSavedFrame(frames_[0]); |
| 214 // Change the sequence number length mid-FEC group and it should not change. | 283 // Change the sequence number length mid-FEC group and it should not change. |
| 215 creator_.options()->send_sequence_number_length = | 284 creator_.options()->send_sequence_number_length = |
| 216 PACKET_4BYTE_SEQUENCE_NUMBER; | 285 PACKET_4BYTE_SEQUENCE_NUMBER; |
| 217 SerializedPacket serialized = creator_.SerializePacket(); | 286 SerializedPacket serialized = creator_.SerializePacket(); |
| 218 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); | 287 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); |
| 219 | 288 |
| 220 { | 289 { |
| 221 InSequence s; | 290 InSequence s; |
| 222 EXPECT_CALL(framer_visitor_, OnPacket()); | 291 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 223 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 292 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 224 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 293 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 225 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 294 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 226 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); | 295 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); |
| 227 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); | 296 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); |
| 228 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 297 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 229 } | 298 } |
| 230 ProcessPacket(serialized.packet); | 299 ProcessPacket(serialized.packet); |
| 231 delete serialized.packet; | 300 delete serialized.packet; |
| 232 | 301 |
| 233 ASSERT_FALSE(creator_.ShouldSendFec(false)); | 302 // Generate Packet 2. |
| 234 ASSERT_TRUE(creator_.ShouldSendFec(true)); | 303 creator_.AddSavedFrame(frames_[0]); |
| 235 | 304 serialized = creator_.SerializePacket(); |
| 236 serialized = creator_.SerializeFec(); | |
| 237 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); | 305 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); |
| 238 ASSERT_EQ(2u, serialized.sequence_number); | |
| 239 | 306 |
| 240 { | 307 { |
| 241 InSequence s; | 308 InSequence s; |
| 309 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 310 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 311 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 312 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 313 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); |
| 314 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); |
| 315 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 316 } |
| 317 ProcessPacket(serialized.packet); |
| 318 delete serialized.packet; |
| 319 |
| 320 // Should return false since we do not have enough packets in the FEC group to |
| 321 // trigger an FEC packet. |
| 322 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); |
| 323 // Should return true since there are packets in the FEC group. |
| 324 ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); |
| 325 |
| 326 // Force generation of FEC packet. |
| 327 serialized = creator_.SerializeFec(); |
| 328 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); |
| 329 ASSERT_EQ(3u, serialized.sequence_number); |
| 330 |
| 331 { |
| 332 InSequence s; |
| 242 EXPECT_CALL(framer_visitor_, OnPacket()); | 333 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 243 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 334 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 244 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 335 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 245 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 336 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 246 EXPECT_CALL(framer_visitor_, OnFecData(_)); | 337 EXPECT_CALL(framer_visitor_, OnFecData(_)); |
| 247 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 338 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 248 } | 339 } |
| 249 ProcessPacket(serialized.packet); | 340 ProcessPacket(serialized.packet); |
| 250 delete serialized.packet; | 341 delete serialized.packet; |
| 251 | 342 |
| 252 // Ensure the next FEC group starts using the new sequence number length. | 343 // Ensure the next FEC group starts using the new sequence number length. |
| 253 serialized = creator_.SerializeAllFrames(frames_); | 344 serialized = creator_.SerializeAllFrames(frames_); |
| 254 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); | 345 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); |
| 255 delete frames_[0].ack_frame; | 346 delete frames_[0].ack_frame; |
| 256 delete serialized.packet; | 347 delete serialized.packet; |
| 257 } | 348 } |
| 258 | 349 |
| 259 TEST_F(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) { | 350 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) { |
| 260 // If the original packet sequence number length, the current sequence number | 351 // If the original packet sequence number length, the current sequence number |
| 261 // length, and the configured send sequence number length are different, the | 352 // length, and the configured send sequence number length are different, the |
| 262 // retransmit must sent with the original length and the others do not change. | 353 // retransmit must sent with the original length and the others do not change. |
| 263 creator_.options()->send_sequence_number_length = | 354 creator_.options()->send_sequence_number_length = |
| 264 PACKET_4BYTE_SEQUENCE_NUMBER; | 355 PACKET_4BYTE_SEQUENCE_NUMBER; |
| 265 QuicPacketCreatorPeer::SetSequenceNumberLength(&creator_, | 356 QuicPacketCreatorPeer::SetSequenceNumberLength(&creator_, |
| 266 PACKET_2BYTE_SEQUENCE_NUMBER); | 357 PACKET_2BYTE_SEQUENCE_NUMBER); |
| 267 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); | 358 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
| 268 SerializedPacket serialized = | 359 SerializedPacket serialized = |
| 269 creator_.ReserializeAllFrames(frames_, PACKET_1BYTE_SEQUENCE_NUMBER); | 360 creator_.ReserializeAllFrames(frames_, PACKET_1BYTE_SEQUENCE_NUMBER); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 280 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 371 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 281 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 372 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 282 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 373 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 283 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 374 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 284 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 375 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 285 } | 376 } |
| 286 ProcessPacket(serialized.packet); | 377 ProcessPacket(serialized.packet); |
| 287 delete serialized.packet; | 378 delete serialized.packet; |
| 288 } | 379 } |
| 289 | 380 |
| 290 TEST_F(QuicPacketCreatorTest, SerializeConnectionClose) { | 381 TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) { |
| 291 QuicConnectionCloseFrame frame; | 382 QuicConnectionCloseFrame frame; |
| 292 frame.error_code = QUIC_NO_ERROR; | 383 frame.error_code = QUIC_NO_ERROR; |
| 293 frame.error_details = "error"; | 384 frame.error_details = "error"; |
| 294 | 385 |
| 295 SerializedPacket serialized = creator_.SerializeConnectionClose(&frame); | 386 SerializedPacket serialized = creator_.SerializeConnectionClose(&frame); |
| 296 ASSERT_EQ(1u, serialized.sequence_number); | 387 ASSERT_EQ(1u, serialized.sequence_number); |
| 297 ASSERT_EQ(1u, creator_.sequence_number()); | 388 ASSERT_EQ(1u, creator_.sequence_number()); |
| 298 | 389 |
| 299 InSequence s; | 390 InSequence s; |
| 300 EXPECT_CALL(framer_visitor_, OnPacket()); | 391 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 301 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 392 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 302 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 393 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 303 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 394 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 304 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); | 395 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); |
| 305 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 396 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 306 | 397 |
| 307 ProcessPacket(serialized.packet); | 398 ProcessPacket(serialized.packet); |
| 308 delete serialized.packet; | 399 delete serialized.packet; |
| 309 } | 400 } |
| 310 | 401 |
| 311 TEST_F(QuicPacketCreatorTest, CreateStreamFrame) { | 402 TEST_P(QuicPacketCreatorTest, CreateStreamFrame) { |
| 312 QuicFrame frame; | 403 QuicFrame frame; |
| 313 size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u, | 404 size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u, |
| 314 false, &frame); | 405 false, &frame); |
| 315 EXPECT_EQ(4u, consumed); | 406 EXPECT_EQ(4u, consumed); |
| 316 CheckStreamFrame(frame, 1u, "test", 0u, false); | 407 CheckStreamFrame(frame, 1u, "test", 0u, false); |
| 317 delete frame.stream_frame; | 408 delete frame.stream_frame; |
| 318 } | 409 } |
| 319 | 410 |
| 320 TEST_F(QuicPacketCreatorTest, CreateStreamFrameFin) { | 411 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFin) { |
| 321 QuicFrame frame; | 412 QuicFrame frame; |
| 322 size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 10u, | 413 size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 10u, |
| 323 true, &frame); | 414 true, &frame); |
| 324 EXPECT_EQ(4u, consumed); | 415 EXPECT_EQ(4u, consumed); |
| 325 CheckStreamFrame(frame, 1u, "test", 10u, true); | 416 CheckStreamFrame(frame, 1u, "test", 10u, true); |
| 326 delete frame.stream_frame; | 417 delete frame.stream_frame; |
| 327 } | 418 } |
| 328 | 419 |
| 329 TEST_F(QuicPacketCreatorTest, CreateStreamFrameFinOnly) { | 420 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFinOnly) { |
| 330 QuicFrame frame; | 421 QuicFrame frame; |
| 331 size_t consumed = creator_.CreateStreamFrame(1u, IOVector(), 0u, true, | 422 size_t consumed = creator_.CreateStreamFrame(1u, IOVector(), 0u, true, |
| 332 &frame); | 423 &frame); |
| 333 EXPECT_EQ(0u, consumed); | 424 EXPECT_EQ(0u, consumed); |
| 334 CheckStreamFrame(frame, 1u, string(), 0u, true); | 425 CheckStreamFrame(frame, 1u, string(), 0u, true); |
| 335 delete frame.stream_frame; | 426 delete frame.stream_frame; |
| 336 } | 427 } |
| 337 | 428 |
| 338 TEST_F(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) { | 429 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) { |
| 339 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 430 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) |
| 340 + GetEncryptionOverhead(); | 431 + GetEncryptionOverhead(); |
| 341 for (size_t i = overhead; i < overhead + 100; ++i) { | 432 for (size_t i = overhead; i < overhead + 100; ++i) { |
| 342 creator_.options()->max_packet_length = i; | 433 creator_.options()->max_packet_length = i; |
| 343 const bool should_have_room = i > overhead + GetStreamFrameOverhead( | 434 const bool should_have_room = i > overhead + GetStreamFrameOverhead( |
| 344 NOT_IN_FEC_GROUP); | 435 NOT_IN_FEC_GROUP); |
| 345 ASSERT_EQ(should_have_room, | 436 ASSERT_EQ(should_have_room, |
| 346 creator_.HasRoomForStreamFrame(kStreamId, kOffset)); | 437 creator_.HasRoomForStreamFrame(kStreamId, kOffset)); |
| 347 if (should_have_room) { | 438 if (should_have_room) { |
| 348 QuicFrame frame; | 439 QuicFrame frame; |
| 349 size_t bytes_consumed = creator_.CreateStreamFrame( | 440 size_t bytes_consumed = creator_.CreateStreamFrame( |
| 350 kStreamId, MakeIOVector("testdata"), kOffset, false, &frame); | 441 kStreamId, MakeIOVector("testdata"), kOffset, false, &frame); |
| 351 EXPECT_LT(0u, bytes_consumed); | 442 EXPECT_LT(0u, bytes_consumed); |
| 352 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 443 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 353 SerializedPacket serialized_packet = creator_.SerializePacket(); | 444 SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 354 ASSERT_TRUE(serialized_packet.packet); | 445 ASSERT_TRUE(serialized_packet.packet); |
| 355 delete serialized_packet.packet; | 446 delete serialized_packet.packet; |
| 356 delete serialized_packet.retransmittable_frames; | 447 delete serialized_packet.retransmittable_frames; |
| 357 } | 448 } |
| 358 } | 449 } |
| 359 } | 450 } |
| 360 | 451 |
| 361 TEST_F(QuicPacketCreatorTest, StreamFrameConsumption) { | 452 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) { |
| 362 // Compute the total overhead for a single frame in packet. | 453 // Compute the total overhead for a single frame in packet. |
| 363 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 454 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) |
| 364 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | 455 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
| 365 size_t capacity = kDefaultMaxPacketSize - overhead; | 456 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 366 // Now, test various sizes around this size. | 457 // Now, test various sizes around this size. |
| 367 for (int delta = -5; delta <= 5; ++delta) { | 458 for (int delta = -5; delta <= 5; ++delta) { |
| 368 string data(capacity + delta, 'A'); | 459 string data(capacity + delta, 'A'); |
| 369 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 460 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 370 QuicFrame frame; | 461 QuicFrame frame; |
| 371 size_t bytes_consumed = creator_.CreateStreamFrame( | 462 size_t bytes_consumed = creator_.CreateStreamFrame( |
| 372 kStreamId, MakeIOVector(data), kOffset, false, &frame); | 463 kStreamId, MakeIOVector(data), kOffset, false, &frame); |
| 373 EXPECT_EQ(capacity - bytes_free, bytes_consumed); | 464 EXPECT_EQ(capacity - bytes_free, bytes_consumed); |
| 374 | 465 |
| 375 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 466 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 376 // BytesFree() returns bytes available for the next frame, which will | 467 // BytesFree() returns bytes available for the next frame, which will |
| 377 // be two bytes smaller since the stream frame would need to be grown. | 468 // be two bytes smaller since the stream frame would need to be grown. |
| 378 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame()); | 469 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame()); |
| 379 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2; | 470 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2; |
| 380 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; | 471 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; |
| 381 SerializedPacket serialized_packet = creator_.SerializePacket(); | 472 SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 382 ASSERT_TRUE(serialized_packet.packet); | 473 ASSERT_TRUE(serialized_packet.packet); |
| 383 delete serialized_packet.packet; | 474 delete serialized_packet.packet; |
| 384 delete serialized_packet.retransmittable_frames; | 475 delete serialized_packet.retransmittable_frames; |
| 385 } | 476 } |
| 386 } | 477 } |
| 387 | 478 |
| 388 TEST_F(QuicPacketCreatorTest, StreamFrameConsumptionInFecProtectedPacket) { | 479 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) { |
| 480 if (GetParam().version == QUIC_VERSION_13) { |
| 481 // Test below tests behavior with version 13. |
| 482 return; |
| 483 } |
| 389 // Turn on FEC protection. | 484 // Turn on FEC protection. |
| 390 creator_.options()->max_packets_per_fec_group = 6; | 485 creator_.options()->max_packets_per_fec_group = 6; |
| 391 // Compute the total overhead for a single frame in packet. | 486 // Compute the total overhead for a single frame in packet. |
| 392 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) | 487 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) |
| 393 + GetEncryptionOverhead() + GetStreamFrameOverhead(IN_FEC_GROUP); | 488 + GetEncryptionOverhead() + GetStreamFrameOverhead(IN_FEC_GROUP); |
| 394 size_t capacity = kDefaultMaxPacketSize - overhead; | 489 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 395 // Now, test various sizes around this size. | 490 // Now, test various sizes around this size. |
| 396 for (int delta = -5; delta <= 5; ++delta) { | 491 for (int delta = -5; delta <= 5; ++delta) { |
| 397 string data(capacity + delta, 'A'); | 492 string data(capacity + delta, 'A'); |
| 398 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 493 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 399 QuicFrame frame; | 494 QuicFrame frame; |
| 400 size_t bytes_consumed = creator_.CreateStreamFrame( | 495 size_t bytes_consumed = creator_.CreateStreamFrame( |
| 401 kStreamId, MakeIOVector(data), kOffset, false, &frame); | 496 kStreamId, MakeIOVector(data), kOffset, false, &frame); |
| 402 EXPECT_EQ(capacity - bytes_free, bytes_consumed); | 497 EXPECT_EQ(capacity - bytes_free, bytes_consumed); |
| 403 | 498 |
| 404 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 499 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 405 // BytesFree() returns bytes available for the next frame. Since stream | 500 // BytesFree() returns bytes available for the next frame. Since stream |
| 406 // frame does not grow for FEC protected packets, this should be the same | 501 // frame does not grow for FEC protected packets, this should be the same |
| 407 // as bytes_free (bound by 0). | 502 // as bytes_free (bound by 0). |
| 408 EXPECT_EQ(0u, creator_.ExpansionOnNewFrame()); | 503 EXPECT_EQ(0u, creator_.ExpansionOnNewFrame()); |
| 409 size_t expected_bytes_free = bytes_free > 0 ? bytes_free : 0; | 504 size_t expected_bytes_free = bytes_free > 0 ? bytes_free : 0; |
| 410 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; | 505 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; |
| 411 SerializedPacket serialized_packet = creator_.SerializePacket(); | 506 SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 412 ASSERT_TRUE(serialized_packet.packet); | 507 ASSERT_TRUE(serialized_packet.packet); |
| 413 delete serialized_packet.packet; | 508 delete serialized_packet.packet; |
| 414 delete serialized_packet.retransmittable_frames; | 509 delete serialized_packet.retransmittable_frames; |
| 415 } | 510 } |
| 416 } | 511 } |
| 417 | 512 |
| 418 TEST_F(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) { | 513 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFecOnlyVersion13) { |
| 514 if (GetParam().version != QUIC_VERSION_13) { |
| 515 return; |
| 516 } |
| 517 // Turn on FEC protection. Behavior should be exactly the same as if FEC was |
| 518 // NOT turned on. This test is the same as StreamFrameConsumption above. |
| 519 creator_.options()->max_packets_per_fec_group = 6; |
| 419 // Compute the total overhead for a single frame in packet. | 520 // Compute the total overhead for a single frame in packet. |
| 420 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 521 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) |
| 421 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | 522 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
| 523 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 524 // Now, test various sizes around this size. |
| 525 for (int delta = -5; delta <= 5; ++delta) { |
| 526 string data(capacity + delta, 'A'); |
| 527 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 528 QuicFrame frame; |
| 529 size_t bytes_consumed = creator_.CreateStreamFrame( |
| 530 kStreamId, MakeIOVector(data), kOffset, false, &frame); |
| 531 EXPECT_EQ(capacity - bytes_free, bytes_consumed); |
| 532 |
| 533 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 534 // BytesFree() returns bytes available for the next frame, which will |
| 535 // be two bytes smaller since the stream frame would need to be grown. |
| 536 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame()); |
| 537 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2; |
| 538 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; |
| 539 SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 540 ASSERT_TRUE(serialized_packet.packet); |
| 541 delete serialized_packet.packet; |
| 542 delete serialized_packet.retransmittable_frames; |
| 543 } |
| 544 } |
| 545 |
| 546 TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) { |
| 547 // Compute the total overhead for a single frame in packet. |
| 548 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) |
| 549 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
| 422 ASSERT_GT(kMaxPacketSize, overhead); | 550 ASSERT_GT(kMaxPacketSize, overhead); |
| 423 size_t capacity = kDefaultMaxPacketSize - overhead; | 551 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 424 // Now, test various sizes around this size. | 552 // Now, test various sizes around this size. |
| 425 for (int delta = -5; delta <= 5; ++delta) { | 553 for (int delta = -5; delta <= 5; ++delta) { |
| 426 string data(capacity + delta, 'A'); | 554 string data(capacity + delta, 'A'); |
| 427 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 555 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 428 | 556 |
| 429 QuicFrame frame; | 557 QuicFrame frame; |
| 430 size_t bytes_consumed = creator_.CreateStreamFrame( | 558 size_t bytes_consumed = creator_.CreateStreamFrame( |
| 431 kStreamId, MakeIOVector(data), kOffset, false, &frame); | 559 kStreamId, MakeIOVector(data), kOffset, false, &frame); |
| 432 EXPECT_LT(0u, bytes_consumed); | 560 EXPECT_LT(0u, bytes_consumed); |
| 433 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 561 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 434 SerializedPacket serialized_packet = creator_.SerializePacket(); | 562 SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 435 ASSERT_TRUE(serialized_packet.packet); | 563 ASSERT_TRUE(serialized_packet.packet); |
| 436 // If there is not enough space in the packet to fit a padding frame | 564 // If there is not enough space in the packet to fit a padding frame |
| 437 // (1 byte) and to expand the stream frame (another 2 bytes) the packet | 565 // (1 byte) and to expand the stream frame (another 2 bytes) the packet |
| 438 // will not be padded. | 566 // will not be padded. |
| 439 if (bytes_free < 3) { | 567 if (bytes_free < 3) { |
| 440 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize) | 568 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize) |
| 441 - bytes_free, serialized_packet.packet->length()); | 569 - bytes_free, serialized_packet.packet->length()); |
| 442 } else { | 570 } else { |
| 443 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize), | 571 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize), |
| 444 serialized_packet.packet->length()); | 572 serialized_packet.packet->length()); |
| 445 } | 573 } |
| 446 delete serialized_packet.packet; | 574 delete serialized_packet.packet; |
| 447 delete serialized_packet.retransmittable_frames; | 575 delete serialized_packet.retransmittable_frames; |
| 448 } | 576 } |
| 449 } | 577 } |
| 450 | 578 |
| 451 TEST_F(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) { | 579 TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) { |
| 452 // Compute the total overhead for a single frame in packet. | 580 // Compute the total overhead for a single frame in packet. |
| 453 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 581 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) |
| 454 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | 582 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
| 455 ASSERT_GT(kDefaultMaxPacketSize, overhead); | 583 ASSERT_GT(kDefaultMaxPacketSize, overhead); |
| 456 size_t capacity = kDefaultMaxPacketSize - overhead; | 584 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 457 // Now, test various sizes around this size. | 585 // Now, test various sizes around this size. |
| 458 for (int delta = -5; delta <= 5; ++delta) { | 586 for (int delta = -5; delta <= 5; ++delta) { |
| 459 string data(capacity + delta, 'A'); | 587 string data(capacity + delta, 'A'); |
| 460 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 588 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 461 | 589 |
| 462 QuicFrame frame; | 590 QuicFrame frame; |
| 463 size_t bytes_consumed = creator_.CreateStreamFrame( | 591 size_t bytes_consumed = creator_.CreateStreamFrame( |
| 464 kStreamId + 2, MakeIOVector(data), kOffset, false, &frame); | 592 kStreamId + 2, MakeIOVector(data), kOffset, false, &frame); |
| 465 EXPECT_LT(0u, bytes_consumed); | 593 EXPECT_LT(0u, bytes_consumed); |
| 466 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 594 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 467 SerializedPacket serialized_packet = creator_.SerializePacket(); | 595 SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 468 ASSERT_TRUE(serialized_packet.packet); | 596 ASSERT_TRUE(serialized_packet.packet); |
| 469 if (bytes_free > 0) { | 597 if (bytes_free > 0) { |
| 470 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize) | 598 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize) |
| 471 - bytes_free, serialized_packet.packet->length()); | 599 - bytes_free, serialized_packet.packet->length()); |
| 472 } else { | 600 } else { |
| 473 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize), | 601 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize), |
| 474 serialized_packet.packet->length()); | 602 serialized_packet.packet->length()); |
| 475 } | 603 } |
| 476 delete serialized_packet.packet; | 604 delete serialized_packet.packet; |
| 477 delete serialized_packet.retransmittable_frames; | 605 delete serialized_packet.retransmittable_frames; |
| 478 } | 606 } |
| 479 } | 607 } |
| 480 | 608 |
| 481 TEST_F(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) { | 609 TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) { |
| 482 QuicPacketCreatorPeer::SetIsServer(&creator_, true); | 610 QuicPacketCreatorPeer::SetIsServer(&creator_, true); |
| 483 QuicVersionVector versions; | 611 QuicVersionVector versions; |
| 484 versions.push_back(test::QuicVersionMax()); | 612 versions.push_back(test::QuicVersionMax()); |
| 485 scoped_ptr<QuicEncryptedPacket> encrypted( | 613 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 486 creator_.SerializeVersionNegotiationPacket(versions)); | 614 creator_.SerializeVersionNegotiationPacket(versions)); |
| 487 | 615 |
| 488 { | 616 { |
| 489 InSequence s; | 617 InSequence s; |
| 490 EXPECT_CALL(framer_visitor_, OnPacket()); | 618 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 491 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 619 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 492 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_)); | 620 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_)); |
| 493 } | 621 } |
| 494 client_framer_.ProcessPacket(*encrypted.get()); | 622 client_framer_.ProcessPacket(*encrypted.get()); |
| 495 } | 623 } |
| 496 | 624 |
| 497 TEST_F(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) { | 625 TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) { |
| 498 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, | 626 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
| 499 creator_.options()->send_sequence_number_length); | 627 creator_.options()->send_sequence_number_length); |
| 500 | 628 |
| 501 creator_.set_sequence_number(64); | 629 creator_.set_sequence_number(64); |
| 502 creator_.UpdateSequenceNumberLength(2, 10000); | 630 creator_.UpdateSequenceNumberLength(2, 10000); |
| 503 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, | 631 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
| 504 creator_.options()->send_sequence_number_length); | 632 creator_.options()->send_sequence_number_length); |
| 505 | 633 |
| 506 creator_.set_sequence_number(64 * 256); | 634 creator_.set_sequence_number(64 * 256); |
| 507 creator_.UpdateSequenceNumberLength(2, 10000); | 635 creator_.UpdateSequenceNumberLength(2, 10000); |
| 508 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, | 636 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, |
| 509 creator_.options()->send_sequence_number_length); | 637 creator_.options()->send_sequence_number_length); |
| 510 | 638 |
| 511 creator_.set_sequence_number(64 * 256 * 256); | 639 creator_.set_sequence_number(64 * 256 * 256); |
| 512 creator_.UpdateSequenceNumberLength(2, 10000); | 640 creator_.UpdateSequenceNumberLength(2, 10000); |
| 513 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, | 641 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, |
| 514 creator_.options()->send_sequence_number_length); | 642 creator_.options()->send_sequence_number_length); |
| 515 | 643 |
| 516 creator_.set_sequence_number(GG_UINT64_C(64) * 256 * 256 * 256 * 256); | 644 creator_.set_sequence_number(GG_UINT64_C(64) * 256 * 256 * 256 * 256); |
| 517 creator_.UpdateSequenceNumberLength(2, 10000); | 645 creator_.UpdateSequenceNumberLength(2, 10000); |
| 518 EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER, | 646 EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER, |
| 519 creator_.options()->send_sequence_number_length); | 647 creator_.options()->send_sequence_number_length); |
| 520 } | 648 } |
| 521 | 649 |
| 522 TEST_F(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthBandwidth) { | 650 TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthBandwidth) { |
| 523 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, | 651 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
| 524 creator_.options()->send_sequence_number_length); | 652 creator_.options()->send_sequence_number_length); |
| 525 | 653 |
| 526 creator_.UpdateSequenceNumberLength(1, 10000); | 654 creator_.UpdateSequenceNumberLength(1, 10000); |
| 527 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, | 655 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
| 528 creator_.options()->send_sequence_number_length); | 656 creator_.options()->send_sequence_number_length); |
| 529 | 657 |
| 530 creator_.UpdateSequenceNumberLength(1, 10000 * 256); | 658 creator_.UpdateSequenceNumberLength(1, 10000 * 256); |
| 531 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, | 659 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, |
| 532 creator_.options()->send_sequence_number_length); | 660 creator_.options()->send_sequence_number_length); |
| 533 | 661 |
| 534 creator_.UpdateSequenceNumberLength(1, 10000 * 256 * 256); | 662 creator_.UpdateSequenceNumberLength(1, 10000 * 256 * 256); |
| 535 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, | 663 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, |
| 536 creator_.options()->send_sequence_number_length); | 664 creator_.options()->send_sequence_number_length); |
| 537 | 665 |
| 538 creator_.UpdateSequenceNumberLength( | 666 creator_.UpdateSequenceNumberLength( |
| 539 1, GG_UINT64_C(1000) * 256 * 256 * 256 * 256); | 667 1, GG_UINT64_C(1000) * 256 * 256 * 256 * 256); |
| 540 EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER, | 668 EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER, |
| 541 creator_.options()->send_sequence_number_length); | 669 creator_.options()->send_sequence_number_length); |
| 542 } | 670 } |
| 543 | 671 |
| 544 TEST_F(QuicPacketCreatorTest, CreateStreamFrameWithNotifier) { | 672 TEST_P(QuicPacketCreatorTest, CreateStreamFrameWithNotifier) { |
| 545 // Ensure that if CreateStreamFrame does not consume any data (e.g. a FIN only | 673 // Ensure that if CreateStreamFrame does not consume any data (e.g. a FIN only |
| 546 // frame) then any QuicAckNotifier that is passed in still gets attached to | 674 // frame) then any QuicAckNotifier that is passed in still gets attached to |
| 547 // the frame. | 675 // the frame. |
| 548 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); | 676 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); |
| 549 QuicAckNotifier notifier(delegate.get()); | 677 QuicAckNotifier notifier(delegate.get()); |
| 550 QuicFrame frame; | 678 QuicFrame frame; |
| 551 IOVector empty_iovector; | 679 IOVector empty_iovector; |
| 552 bool fin = true; | 680 bool fin = true; |
| 553 size_t consumed_bytes = creator_.CreateStreamFrameWithNotifier( | 681 size_t consumed_bytes = creator_.CreateStreamFrameWithNotifier( |
| 554 1u, empty_iovector, 0u, fin, ¬ifier, &frame); | 682 1u, empty_iovector, 0u, fin, ¬ifier, &frame); |
| 555 EXPECT_EQ(0u, consumed_bytes); | 683 EXPECT_EQ(0u, consumed_bytes); |
| 556 EXPECT_EQ(¬ifier, frame.stream_frame->notifier); | 684 EXPECT_EQ(¬ifier, frame.stream_frame->notifier); |
| 557 delete frame.stream_frame; | 685 delete frame.stream_frame; |
| 558 } | 686 } |
| 559 | 687 |
| 560 INSTANTIATE_TEST_CASE_P(ToggleVersionSerialization, | |
| 561 QuicPacketCreatorTest, | |
| 562 ::testing::Values(false, true)); | |
| 563 | |
| 564 TEST_P(QuicPacketCreatorTest, SerializeFrame) { | 688 TEST_P(QuicPacketCreatorTest, SerializeFrame) { |
| 565 if (!GetParam()) { | 689 if (!GetParam().version_serialization) { |
| 566 creator_.StopSendingVersion(); | 690 creator_.StopSendingVersion(); |
| 567 } | 691 } |
| 568 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); | 692 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
| 569 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 693 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 570 delete frames_[0].stream_frame; | 694 delete frames_[0].stream_frame; |
| 571 | 695 |
| 572 QuicPacketHeader header; | 696 QuicPacketHeader header; |
| 573 { | 697 { |
| 574 InSequence s; | 698 InSequence s; |
| 575 EXPECT_CALL(framer_visitor_, OnPacket()); | 699 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 576 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 700 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 577 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 701 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 578 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce( | 702 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce( |
| 579 DoAll(SaveArg<0>(&header), Return(true))); | 703 DoAll(SaveArg<0>(&header), Return(true))); |
| 580 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 704 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 581 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 705 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 582 } | 706 } |
| 583 ProcessPacket(serialized.packet); | 707 ProcessPacket(serialized.packet); |
| 584 EXPECT_EQ(GetParam(), header.public_header.version_flag); | 708 EXPECT_EQ(GetParam().version_serialization, |
| 709 header.public_header.version_flag); |
| 585 delete serialized.packet; | 710 delete serialized.packet; |
| 586 } | 711 } |
| 587 | 712 |
| 588 TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) { | 713 TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) { |
| 589 if (!GetParam()) { | 714 if (!GetParam().version_serialization) { |
| 590 creator_.StopSendingVersion(); | 715 creator_.StopSendingVersion(); |
| 591 } | 716 } |
| 592 // A string larger than fits into a frame. | 717 // A string larger than fits into a frame. |
| 593 size_t payload_length; | 718 size_t payload_length; |
| 594 creator_.options()->max_packet_length = GetPacketLengthForOneStream( | 719 creator_.options()->max_packet_length = GetPacketLengthForOneStream( |
| 595 client_framer_.version(), | 720 client_framer_.version(), |
| 596 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), | 721 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
| 597 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP, &payload_length); | 722 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP, &payload_length); |
| 598 QuicFrame frame; | 723 QuicFrame frame; |
| 599 const string too_long_payload(payload_length * 2, 'a'); | 724 const string too_long_payload(payload_length * 2, 'a'); |
| 600 size_t consumed = creator_.CreateStreamFrame( | 725 size_t consumed = creator_.CreateStreamFrame( |
| 601 1u, MakeIOVector(too_long_payload), 0u, true, &frame); | 726 1u, MakeIOVector(too_long_payload), 0u, true, &frame); |
| 602 EXPECT_EQ(payload_length, consumed); | 727 EXPECT_EQ(payload_length, consumed); |
| 603 const string payload(payload_length, 'a'); | 728 const string payload(payload_length, 'a'); |
| 604 CheckStreamFrame(frame, 1u, payload, 0u, false); | 729 CheckStreamFrame(frame, 1u, payload, 0u, false); |
| 605 delete frame.stream_frame; | 730 delete frame.stream_frame; |
| 606 } | 731 } |
| 607 | 732 |
| 608 TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) { | 733 TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) { |
| 609 if (!GetParam()) { | 734 if (!GetParam().version_serialization) { |
| 610 creator_.StopSendingVersion(); | 735 creator_.StopSendingVersion(); |
| 611 } | 736 } |
| 612 const size_t max_plaintext_size = | 737 const size_t max_plaintext_size = |
| 613 client_framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length); | 738 client_framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length); |
| 614 EXPECT_FALSE(creator_.HasPendingFrames()); | 739 EXPECT_FALSE(creator_.HasPendingFrames()); |
| 615 EXPECT_EQ(max_plaintext_size - | 740 EXPECT_EQ(max_plaintext_size - |
| 616 GetPacketHeaderSize( | 741 GetPacketHeaderSize( |
| 617 creator_.options()->send_connection_id_length, | 742 creator_.options()->send_connection_id_length, |
| 618 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), | 743 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
| 619 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 744 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 EXPECT_FALSE(creator_.HasPendingFrames()); | 783 EXPECT_FALSE(creator_.HasPendingFrames()); |
| 659 EXPECT_EQ(max_plaintext_size - | 784 EXPECT_EQ(max_plaintext_size - |
| 660 GetPacketHeaderSize( | 785 GetPacketHeaderSize( |
| 661 creator_.options()->send_connection_id_length, | 786 creator_.options()->send_connection_id_length, |
| 662 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), | 787 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
| 663 PACKET_1BYTE_SEQUENCE_NUMBER, | 788 PACKET_1BYTE_SEQUENCE_NUMBER, |
| 664 NOT_IN_FEC_GROUP), | 789 NOT_IN_FEC_GROUP), |
| 665 creator_.BytesFree()); | 790 creator_.BytesFree()); |
| 666 } | 791 } |
| 667 | 792 |
| 668 TEST_F(QuicPacketCreatorTest, EntropyFlag) { | 793 TEST_P(QuicPacketCreatorTest, EntropyFlag) { |
| 669 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); | 794 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
| 670 | 795 |
| 671 for (int i = 0; i < 2; ++i) { | 796 for (int i = 0; i < 2; ++i) { |
| 672 for (int j = 0; j < 64; ++j) { | 797 for (int j = 0; j < 64; ++j) { |
| 673 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 798 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 674 // Verify both BoolSource and hash algorithm. | 799 // Verify both BoolSource and hash algorithm. |
| 675 bool expected_rand_bool = | 800 bool expected_rand_bool = |
| 676 (mock_random_.RandUint64() & (GG_UINT64_C(1) << j)) != 0; | 801 (mock_random_.RandUint64() & (GG_UINT64_C(1) << j)) != 0; |
| 677 bool observed_rand_bool = | 802 bool observed_rand_bool = |
| 678 (serialized.entropy_hash & (1 << ((j+1) % 8))) != 0; | 803 (serialized.entropy_hash & (1 << ((j+1) % 8))) != 0; |
| 679 uint8 rest_of_hash = serialized.entropy_hash & ~(1 << ((j+1) % 8)); | 804 uint8 rest_of_hash = serialized.entropy_hash & ~(1 << ((j+1) % 8)); |
| 680 EXPECT_EQ(expected_rand_bool, observed_rand_bool); | 805 EXPECT_EQ(expected_rand_bool, observed_rand_bool); |
| 681 EXPECT_EQ(0, rest_of_hash); | 806 EXPECT_EQ(0, rest_of_hash); |
| 682 delete serialized.packet; | 807 delete serialized.packet; |
| 683 } | 808 } |
| 684 // After 64 calls, BoolSource will refresh the bucket - make sure it does. | 809 // After 64 calls, BoolSource will refresh the bucket - make sure it does. |
| 685 mock_random_.ChangeValue(); | 810 mock_random_.ChangeValue(); |
| 686 } | 811 } |
| 687 | 812 |
| 688 delete frames_[0].stream_frame; | 813 delete frames_[0].stream_frame; |
| 689 } | 814 } |
| 690 | 815 |
| 691 } // namespace | 816 } // namespace |
| 692 } // namespace test | 817 } // namespace test |
| 693 } // namespace net | 818 } // namespace net |
| OLD | NEW |