[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 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 |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "net/quic/quic_packet_creator.h" |
| 6 | |
| 7 | #include "base/stl_util.h" |
| 8 | #include "net/quic/crypto/null_encrypter.h" |
[email protected] | 9db44391 | 2013-02-25 05:27:03 | [diff] [blame] | 9 | #include "net/quic/crypto/quic_decrypter.h" |
| 10 | #include "net/quic/crypto/quic_encrypter.h" |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 11 | #include "net/quic/quic_utils.h" |
[email protected] | 457d695 | 2013-12-13 09:24:58 | [diff] [blame] | 12 | #include "net/quic/test_tools/mock_random.h" |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 13 | #include "net/quic/test_tools/quic_packet_creator_peer.h" |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 14 | #include "net/quic/test_tools/quic_test_utils.h" |
| 15 | #include "testing/gmock/include/gmock/gmock.h" |
| 16 | |
[email protected] | c995c57 | 2013-01-18 05:43:20 | [diff] [blame] | 17 | using base::StringPiece; |
| 18 | using std::string; |
| 19 | using std::vector; |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 20 | using testing::DoAll; |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 21 | using testing::InSequence; |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 22 | using testing::Return; |
| 23 | using testing::SaveArg; |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 24 | using testing::_; |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 25 | |
| 26 | namespace net { |
| 27 | namespace test { |
| 28 | namespace { |
| 29 | |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 30 | class QuicPacketCreatorTest : public ::testing::TestWithParam<bool> { |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 31 | protected: |
| 32 | QuicPacketCreatorTest() |
[email protected] | b007e63 | 2013-10-28 08:39:25 | [diff] [blame] | 33 | : server_framer_(QuicSupportedVersions(), QuicTime::Zero(), true), |
| 34 | client_framer_(QuicSupportedVersions(), QuicTime::Zero(), false), |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 35 | sequence_number_(0), |
| 36 | guid_(2), |
| 37 | data_("foo"), |
[email protected] | 457d695 | 2013-12-13 09:24:58 | [diff] [blame] | 38 | creator_(guid_, &client_framer_, &mock_random_, false) { |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 39 | client_framer_.set_visitor(&framer_visitor_); |
| 40 | server_framer_.set_visitor(&framer_visitor_); |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 41 | } |
| 42 | ~QuicPacketCreatorTest() { |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 43 | } |
| 44 | |
[email protected] | c995c57 | 2013-01-18 05:43:20 | [diff] [blame] | 45 | void ProcessPacket(QuicPacket* packet) { |
[email protected] | 9db44391 | 2013-02-25 05:27:03 | [diff] [blame] | 46 | scoped_ptr<QuicEncryptedPacket> encrypted( |
[email protected] | 8ba8121 | 2013-05-03 13:11:48 | [diff] [blame] | 47 | server_framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number_, |
| 48 | *packet)); |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 49 | server_framer_.ProcessPacket(*encrypted); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 50 | } |
| 51 | |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 52 | void CheckStreamFrame(const QuicFrame& frame, |
| 53 | QuicStreamId stream_id, |
| 54 | const string& data, |
| 55 | QuicStreamOffset offset, |
| 56 | bool fin) { |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 57 | EXPECT_EQ(STREAM_FRAME, frame.type); |
| 58 | ASSERT_TRUE(frame.stream_frame); |
| 59 | EXPECT_EQ(stream_id, frame.stream_frame->stream_id); |
[email protected] | 5dafdb6 | 2013-11-14 01:24:26 | [diff] [blame] | 60 | scoped_ptr<string> frame_data(frame.stream_frame->GetDataAsString()); |
| 61 | EXPECT_EQ(data, *frame_data); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 62 | EXPECT_EQ(offset, frame.stream_frame->offset); |
| 63 | EXPECT_EQ(fin, frame.stream_frame->fin); |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 64 | } |
| 65 | |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 66 | // Returns the number of bytes consumed by the header of packet, including |
| 67 | // the version, that is not in an FEC group. |
| 68 | size_t GetPacketHeaderOverhead() { |
| 69 | return GetPacketHeaderSize(creator_.options()->send_guid_length, |
| 70 | kIncludeVersion, |
| 71 | creator_.options()->send_sequence_number_length, |
| 72 | NOT_IN_FEC_GROUP); |
| 73 | } |
| 74 | |
| 75 | // Returns the number of bytes of overhead that will be added to a packet |
| 76 | // of maximum length. |
| 77 | size_t GetEncryptionOverhead() { |
| 78 | return creator_.options()->max_packet_length - |
| 79 | client_framer_.GetMaxPlaintextSize( |
| 80 | creator_.options()->max_packet_length); |
| 81 | } |
| 82 | |
| 83 | // Returns the number of bytes consumed by the non-data fields of a stream |
| 84 | // frame, assuming it is the last frame in the packet |
| 85 | size_t GetStreamFrameOverhead() { |
| 86 | return QuicFramer::GetMinStreamFrameSize( |
| 87 | client_framer_.version(), kStreamId, kOffset, true); |
| 88 | } |
| 89 | |
| 90 | static const QuicStreamId kStreamId = 1u; |
| 91 | static const QuicStreamOffset kOffset = 1u; |
| 92 | |
[email protected] | 701bc89 | 2013-01-17 04:51:54 | [diff] [blame] | 93 | QuicFrames frames_; |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 94 | QuicFramer server_framer_; |
| 95 | QuicFramer client_framer_; |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 96 | testing::StrictMock<MockFramerVisitor> framer_visitor_; |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 97 | QuicPacketSequenceNumber sequence_number_; |
| 98 | QuicGuid guid_; |
| 99 | string data_; |
[email protected] | 457d695 | 2013-12-13 09:24:58 | [diff] [blame] | 100 | MockRandom mock_random_; |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 101 | QuicPacketCreator creator_; |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 102 | }; |
| 103 | |
[email protected] | c995c57 | 2013-01-18 05:43:20 | [diff] [blame] | 104 | TEST_F(QuicPacketCreatorTest, SerializeFrames) { |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 105 | frames_.push_back(QuicFrame(new QuicAckFrame(0u, QuicTime::Zero(), 0u))); |
[email protected] | 5dafdb6 | 2013-11-14 01:24:26 | [diff] [blame] | 106 | frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
| 107 | frames_.push_back(QuicFrame(new QuicStreamFrame(0u, true, 0u, IOVector()))); |
[email protected] | 9db44391 | 2013-02-25 05:27:03 | [diff] [blame] | 108 | SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 109 | delete frames_[0].ack_frame; |
| 110 | delete frames_[1].stream_frame; |
| 111 | delete frames_[2].stream_frame; |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 112 | |
[email protected] | c995c57 | 2013-01-18 05:43:20 | [diff] [blame] | 113 | { |
| 114 | InSequence s; |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 115 | EXPECT_CALL(framer_visitor_, OnPacket()); |
[email protected] | 066d818 | 2014-01-04 02:02:45 | [diff] [blame] | 116 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
[email protected] | ec86d546 | 2013-11-17 16:04:49 | [diff] [blame] | 117 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
[email protected] | c995c57 | 2013-01-18 05:43:20 | [diff] [blame] | 118 | EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 119 | EXPECT_CALL(framer_visitor_, OnAckFrame(_)); |
| 120 | EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 121 | EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 122 | EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 123 | } |
[email protected] | 9db44391 | 2013-02-25 05:27:03 | [diff] [blame] | 124 | ProcessPacket(serialized.packet); |
| 125 | delete serialized.packet; |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 126 | } |
| 127 | |
[email protected] | c995c57 | 2013-01-18 05:43:20 | [diff] [blame] | 128 | TEST_F(QuicPacketCreatorTest, SerializeWithFEC) { |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 129 | creator_.options()->max_packets_per_fec_group = 6; |
| 130 | ASSERT_FALSE(creator_.ShouldSendFec(false)); |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 131 | |
[email protected] | 5dafdb6 | 2013-11-14 01:24:26 | [diff] [blame] | 132 | frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
[email protected] | 9db44391 | 2013-02-25 05:27:03 | [diff] [blame] | 133 | SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 134 | delete frames_[0].stream_frame; |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 135 | |
[email protected] | c995c57 | 2013-01-18 05:43:20 | [diff] [blame] | 136 | { |
| 137 | InSequence s; |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 138 | EXPECT_CALL(framer_visitor_, OnPacket()); |
[email protected] | 066d818 | 2014-01-04 02:02:45 | [diff] [blame] | 139 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
[email protected] | ec86d546 | 2013-11-17 16:04:49 | [diff] [blame] | 140 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
[email protected] | c995c57 | 2013-01-18 05:43:20 | [diff] [blame] | 141 | EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 142 | EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); |
| 143 | EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 144 | EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 145 | } |
[email protected] | 9db44391 | 2013-02-25 05:27:03 | [diff] [blame] | 146 | ProcessPacket(serialized.packet); |
| 147 | delete serialized.packet; |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 148 | |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 149 | ASSERT_FALSE(creator_.ShouldSendFec(false)); |
| 150 | ASSERT_TRUE(creator_.ShouldSendFec(true)); |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 151 | |
[email protected] | 9db44391 | 2013-02-25 05:27:03 | [diff] [blame] | 152 | serialized = creator_.SerializeFec(); |
| 153 | ASSERT_EQ(2u, serialized.sequence_number); |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 154 | |
[email protected] | c995c57 | 2013-01-18 05:43:20 | [diff] [blame] | 155 | { |
| 156 | InSequence s; |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 157 | EXPECT_CALL(framer_visitor_, OnPacket()); |
[email protected] | 066d818 | 2014-01-04 02:02:45 | [diff] [blame] | 158 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
[email protected] | ec86d546 | 2013-11-17 16:04:49 | [diff] [blame] | 159 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
[email protected] | c995c57 | 2013-01-18 05:43:20 | [diff] [blame] | 160 | EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 161 | EXPECT_CALL(framer_visitor_, OnFecData(_)); |
| 162 | EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 163 | } |
[email protected] | 9db44391 | 2013-02-25 05:27:03 | [diff] [blame] | 164 | ProcessPacket(serialized.packet); |
| 165 | delete serialized.packet; |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 166 | } |
| 167 | |
[email protected] | ea825e0 | 2013-08-21 18:12:45 | [diff] [blame] | 168 | TEST_F(QuicPacketCreatorTest, SerializeChangingSequenceNumberLength) { |
| 169 | frames_.push_back(QuicFrame(new QuicAckFrame(0u, QuicTime::Zero(), 0u))); |
| 170 | creator_.AddSavedFrame(frames_[0]); |
| 171 | creator_.options()->send_sequence_number_length = |
| 172 | PACKET_4BYTE_SEQUENCE_NUMBER; |
| 173 | SerializedPacket serialized = creator_.SerializePacket(); |
| 174 | // The sequence number length will not change mid-packet. |
| 175 | EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); |
| 176 | |
| 177 | { |
| 178 | InSequence s; |
| 179 | EXPECT_CALL(framer_visitor_, OnPacket()); |
[email protected] | 066d818 | 2014-01-04 02:02:45 | [diff] [blame] | 180 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
[email protected] | ec86d546 | 2013-11-17 16:04:49 | [diff] [blame] | 181 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
[email protected] | ea825e0 | 2013-08-21 18:12:45 | [diff] [blame] | 182 | EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 183 | EXPECT_CALL(framer_visitor_, OnAckFrame(_)); |
| 184 | EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 185 | } |
| 186 | ProcessPacket(serialized.packet); |
| 187 | delete serialized.packet; |
| 188 | |
| 189 | creator_.AddSavedFrame(frames_[0]); |
| 190 | serialized = creator_.SerializePacket(); |
| 191 | // Now the actual sequence number length should have changed. |
| 192 | EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); |
| 193 | delete frames_[0].ack_frame; |
| 194 | |
| 195 | { |
| 196 | InSequence s; |
| 197 | EXPECT_CALL(framer_visitor_, OnPacket()); |
[email protected] | 066d818 | 2014-01-04 02:02:45 | [diff] [blame] | 198 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
[email protected] | ec86d546 | 2013-11-17 16:04:49 | [diff] [blame] | 199 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
[email protected] | ea825e0 | 2013-08-21 18:12:45 | [diff] [blame] | 200 | EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 201 | EXPECT_CALL(framer_visitor_, OnAckFrame(_)); |
| 202 | EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 203 | } |
| 204 | ProcessPacket(serialized.packet); |
| 205 | delete serialized.packet; |
| 206 | } |
| 207 | |
| 208 | TEST_F(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) { |
| 209 | creator_.options()->max_packets_per_fec_group = 6; |
| 210 | ASSERT_FALSE(creator_.ShouldSendFec(false)); |
[email protected] | ea825e0 | 2013-08-21 18:12:45 | [diff] [blame] | 211 | |
| 212 | frames_.push_back(QuicFrame(new QuicAckFrame(0u, QuicTime::Zero(), 0u))); |
| 213 | creator_.AddSavedFrame(frames_[0]); |
| 214 | // Change the sequence number length mid-FEC group and it should not change. |
| 215 | creator_.options()->send_sequence_number_length = |
| 216 | PACKET_4BYTE_SEQUENCE_NUMBER; |
| 217 | SerializedPacket serialized = creator_.SerializePacket(); |
| 218 | EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); |
| 219 | |
| 220 | { |
| 221 | InSequence s; |
| 222 | EXPECT_CALL(framer_visitor_, OnPacket()); |
[email protected] | 066d818 | 2014-01-04 02:02:45 | [diff] [blame] | 223 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
[email protected] | ec86d546 | 2013-11-17 16:04:49 | [diff] [blame] | 224 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
[email protected] | ea825e0 | 2013-08-21 18:12:45 | [diff] [blame] | 225 | EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 226 | EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); |
| 227 | EXPECT_CALL(framer_visitor_, OnAckFrame(_)); |
| 228 | EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 229 | } |
| 230 | ProcessPacket(serialized.packet); |
| 231 | delete serialized.packet; |
| 232 | |
| 233 | ASSERT_FALSE(creator_.ShouldSendFec(false)); |
| 234 | ASSERT_TRUE(creator_.ShouldSendFec(true)); |
| 235 | |
| 236 | serialized = creator_.SerializeFec(); |
| 237 | EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); |
| 238 | ASSERT_EQ(2u, serialized.sequence_number); |
| 239 | |
| 240 | { |
| 241 | InSequence s; |
| 242 | EXPECT_CALL(framer_visitor_, OnPacket()); |
[email protected] | 066d818 | 2014-01-04 02:02:45 | [diff] [blame] | 243 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
[email protected] | ec86d546 | 2013-11-17 16:04:49 | [diff] [blame] | 244 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
[email protected] | ea825e0 | 2013-08-21 18:12:45 | [diff] [blame] | 245 | EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 246 | EXPECT_CALL(framer_visitor_, OnFecData(_)); |
| 247 | EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 248 | } |
| 249 | ProcessPacket(serialized.packet); |
| 250 | delete serialized.packet; |
| 251 | |
| 252 | // Ensure the next FEC group starts using the new sequence number length. |
| 253 | serialized = creator_.SerializeAllFrames(frames_); |
| 254 | EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); |
[email protected] | 8e01c06 | 2013-10-31 07:35:31 | [diff] [blame] | 255 | delete frames_[0].ack_frame; |
[email protected] | ea825e0 | 2013-08-21 18:12:45 | [diff] [blame] | 256 | delete serialized.packet; |
| 257 | } |
| 258 | |
| 259 | TEST_F(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) { |
| 260 | // If the original packet sequence number length, the current sequence number |
| 261 | // 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. |
| 263 | creator_.options()->send_sequence_number_length = |
| 264 | PACKET_4BYTE_SEQUENCE_NUMBER; |
| 265 | QuicPacketCreatorPeer::SetSequenceNumberLength(&creator_, |
| 266 | PACKET_2BYTE_SEQUENCE_NUMBER); |
[email protected] | 5dafdb6 | 2013-11-14 01:24:26 | [diff] [blame] | 267 | frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
[email protected] | ea825e0 | 2013-08-21 18:12:45 | [diff] [blame] | 268 | SerializedPacket serialized = |
| 269 | creator_.ReserializeAllFrames(frames_, PACKET_1BYTE_SEQUENCE_NUMBER); |
| 270 | EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, |
| 271 | creator_.options()->send_sequence_number_length); |
| 272 | EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, |
| 273 | QuicPacketCreatorPeer::GetSequenceNumberLength(&creator_)); |
| 274 | EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length); |
| 275 | delete frames_[0].stream_frame; |
| 276 | |
| 277 | { |
| 278 | InSequence s; |
| 279 | EXPECT_CALL(framer_visitor_, OnPacket()); |
[email protected] | 066d818 | 2014-01-04 02:02:45 | [diff] [blame] | 280 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
[email protected] | ec86d546 | 2013-11-17 16:04:49 | [diff] [blame] | 281 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
[email protected] | ea825e0 | 2013-08-21 18:12:45 | [diff] [blame] | 282 | EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 283 | EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 284 | EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 285 | } |
| 286 | ProcessPacket(serialized.packet); |
| 287 | delete serialized.packet; |
| 288 | } |
| 289 | |
[email protected] | 8e01c06 | 2013-10-31 07:35:31 | [diff] [blame] | 290 | TEST_F(QuicPacketCreatorTest, SerializeConnectionClose) { |
[email protected] | 8e01c06 | 2013-10-31 07:35:31 | [diff] [blame] | 291 | QuicConnectionCloseFrame frame; |
| 292 | frame.error_code = QUIC_NO_ERROR; |
| 293 | frame.error_details = "error"; |
[email protected] | 8e01c06 | 2013-10-31 07:35:31 | [diff] [blame] | 294 | |
| 295 | SerializedPacket serialized = creator_.SerializeConnectionClose(&frame); |
| 296 | ASSERT_EQ(1u, serialized.sequence_number); |
| 297 | ASSERT_EQ(1u, creator_.sequence_number()); |
| 298 | |
| 299 | InSequence s; |
| 300 | EXPECT_CALL(framer_visitor_, OnPacket()); |
[email protected] | 066d818 | 2014-01-04 02:02:45 | [diff] [blame] | 301 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
[email protected] | ec86d546 | 2013-11-17 16:04:49 | [diff] [blame] | 302 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
[email protected] | 8e01c06 | 2013-10-31 07:35:31 | [diff] [blame] | 303 | EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 304 | EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); |
| 305 | EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 306 | |
| 307 | ProcessPacket(serialized.packet); |
| 308 | delete serialized.packet; |
| 309 | } |
| 310 | |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 311 | TEST_F(QuicPacketCreatorTest, CreateStreamFrame) { |
| 312 | QuicFrame frame; |
[email protected] | 5dafdb6 | 2013-11-14 01:24:26 | [diff] [blame] | 313 | size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u, |
| 314 | false, &frame); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 315 | EXPECT_EQ(4u, consumed); |
| 316 | CheckStreamFrame(frame, 1u, "test", 0u, false); |
| 317 | delete frame.stream_frame; |
| 318 | } |
| 319 | |
| 320 | TEST_F(QuicPacketCreatorTest, CreateStreamFrameFin) { |
| 321 | QuicFrame frame; |
[email protected] | 5dafdb6 | 2013-11-14 01:24:26 | [diff] [blame] | 322 | size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 10u, |
| 323 | true, &frame); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 324 | EXPECT_EQ(4u, consumed); |
| 325 | CheckStreamFrame(frame, 1u, "test", 10u, true); |
| 326 | delete frame.stream_frame; |
| 327 | } |
| 328 | |
| 329 | TEST_F(QuicPacketCreatorTest, CreateStreamFrameFinOnly) { |
| 330 | QuicFrame frame; |
[email protected] | 5dafdb6 | 2013-11-14 01:24:26 | [diff] [blame] | 331 | size_t consumed = creator_.CreateStreamFrame(1u, IOVector(), 0u, true, |
| 332 | &frame); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 333 | EXPECT_EQ(0u, consumed); |
[email protected] | 0bbeb697 | 2013-05-23 04:10:21 | [diff] [blame] | 334 | CheckStreamFrame(frame, 1u, string(), 0u, true); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 335 | delete frame.stream_frame; |
| 336 | } |
| 337 | |
[email protected] | 3e60db8 | 2013-08-05 19:43:06 | [diff] [blame] | 338 | TEST_F(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) { |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 339 | const size_t overhead = GetPacketHeaderOverhead() + GetEncryptionOverhead(); |
| 340 | for (size_t i = overhead; i < overhead + 100; ++i) { |
[email protected] | 3e60db8 | 2013-08-05 19:43:06 | [diff] [blame] | 341 | creator_.options()->max_packet_length = i; |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 342 | const bool should_have_room = i > overhead + GetStreamFrameOverhead(); |
[email protected] | 3e60db8 | 2013-08-05 19:43:06 | [diff] [blame] | 343 | ASSERT_EQ(should_have_room, |
| 344 | creator_.HasRoomForStreamFrame(kStreamId, kOffset)); |
| 345 | if (should_have_room) { |
| 346 | QuicFrame frame; |
| 347 | size_t bytes_consumed = creator_.CreateStreamFrame( |
[email protected] | 5dafdb6 | 2013-11-14 01:24:26 | [diff] [blame] | 348 | kStreamId, MakeIOVector("testdata"), kOffset, false, &frame); |
[email protected] | 3e60db8 | 2013-08-05 19:43:06 | [diff] [blame] | 349 | EXPECT_LT(0u, bytes_consumed); |
| 350 | ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 351 | SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 352 | ASSERT_TRUE(serialized_packet.packet); |
| 353 | delete serialized_packet.packet; |
| 354 | delete serialized_packet.retransmittable_frames; |
| 355 | } |
| 356 | } |
| 357 | } |
| 358 | |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 359 | TEST_F(QuicPacketCreatorTest, StreamFrameConsumption) { |
| 360 | // Compute the total overhead for a single frame in packet. |
| 361 | const size_t overhead = GetPacketHeaderOverhead() + GetEncryptionOverhead() |
| 362 | + GetStreamFrameOverhead(); |
[email protected] | 8e01c06 | 2013-10-31 07:35:31 | [diff] [blame] | 363 | size_t capacity = kDefaultMaxPacketSize - overhead; |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 364 | // Now, test various sizes around this size. |
| 365 | for (int delta = -5; delta <= 5; ++delta) { |
| 366 | string data(capacity + delta, 'A'); |
| 367 | size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 368 | QuicFrame frame; |
| 369 | size_t bytes_consumed = creator_.CreateStreamFrame( |
[email protected] | 5dafdb6 | 2013-11-14 01:24:26 | [diff] [blame] | 370 | kStreamId, MakeIOVector(data), kOffset, false, &frame); |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 371 | EXPECT_EQ(capacity - bytes_free, bytes_consumed); |
| 372 | |
| 373 | ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 374 | // BytesFree() returns bytes available for the next frame, which will |
| 375 | // be two bytes smaller since the stream frame would need to be grown. |
| 376 | size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2; |
| 377 | EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; |
| 378 | SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 379 | ASSERT_TRUE(serialized_packet.packet); |
| 380 | delete serialized_packet.packet; |
| 381 | delete serialized_packet.retransmittable_frames; |
| 382 | } |
| 383 | } |
| 384 | |
| 385 | TEST_F(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) { |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 386 | // Compute the total overhead for a single frame in packet. |
| 387 | const size_t overhead = GetPacketHeaderOverhead() + GetEncryptionOverhead() |
| 388 | + GetStreamFrameOverhead(); |
| 389 | ASSERT_GT(kMaxPacketSize, overhead); |
[email protected] | 8e01c06 | 2013-10-31 07:35:31 | [diff] [blame] | 390 | size_t capacity = kDefaultMaxPacketSize - overhead; |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 391 | // Now, test various sizes around this size. |
| 392 | for (int delta = -5; delta <= 5; ++delta) { |
| 393 | string data(capacity + delta, 'A'); |
| 394 | size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 395 | |
| 396 | QuicFrame frame; |
| 397 | size_t bytes_consumed = creator_.CreateStreamFrame( |
[email protected] | 5dafdb6 | 2013-11-14 01:24:26 | [diff] [blame] | 398 | kStreamId, MakeIOVector(data), kOffset, false, &frame); |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 399 | EXPECT_LT(0u, bytes_consumed); |
| 400 | ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 401 | SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 402 | ASSERT_TRUE(serialized_packet.packet); |
| 403 | // If there is not enough space in the packet to fit a padding frame |
| 404 | // (1 byte) and to expand the stream frame (another 2 bytes) the packet |
| 405 | // will not be padded. |
| 406 | if (bytes_free < 3) { |
[email protected] | 8e01c06 | 2013-10-31 07:35:31 | [diff] [blame] | 407 | EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize) |
| 408 | - bytes_free, serialized_packet.packet->length()); |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 409 | } else { |
[email protected] | 8e01c06 | 2013-10-31 07:35:31 | [diff] [blame] | 410 | EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize), |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 411 | serialized_packet.packet->length()); |
| 412 | } |
| 413 | delete serialized_packet.packet; |
| 414 | delete serialized_packet.retransmittable_frames; |
| 415 | } |
| 416 | } |
| 417 | |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 418 | TEST_F(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) { |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 419 | // Compute the total overhead for a single frame in packet. |
| 420 | const size_t overhead = GetPacketHeaderOverhead() + GetEncryptionOverhead() |
| 421 | + GetStreamFrameOverhead(); |
[email protected] | 8e01c06 | 2013-10-31 07:35:31 | [diff] [blame] | 422 | ASSERT_GT(kDefaultMaxPacketSize, overhead); |
| 423 | size_t capacity = kDefaultMaxPacketSize - overhead; |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 424 | // Now, test various sizes around this size. |
| 425 | for (int delta = -5; delta <= 5; ++delta) { |
| 426 | string data(capacity + delta, 'A'); |
| 427 | size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 428 | |
| 429 | QuicFrame frame; |
| 430 | size_t bytes_consumed = creator_.CreateStreamFrame( |
[email protected] | 5dafdb6 | 2013-11-14 01:24:26 | [diff] [blame] | 431 | kStreamId + 2, MakeIOVector(data), kOffset, false, &frame); |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 432 | EXPECT_LT(0u, bytes_consumed); |
| 433 | ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 434 | SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 435 | ASSERT_TRUE(serialized_packet.packet); |
| 436 | if (bytes_free > 0) { |
[email protected] | 8e01c06 | 2013-10-31 07:35:31 | [diff] [blame] | 437 | EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize) |
| 438 | - bytes_free, serialized_packet.packet->length()); |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 439 | } else { |
[email protected] | 8e01c06 | 2013-10-31 07:35:31 | [diff] [blame] | 440 | EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize), |
[email protected] | 583bcbcf | 2013-10-28 01:51:15 | [diff] [blame] | 441 | serialized_packet.packet->length()); |
| 442 | } |
| 443 | delete serialized_packet.packet; |
| 444 | delete serialized_packet.retransmittable_frames; |
| 445 | } |
| 446 | } |
| 447 | |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 448 | TEST_F(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) { |
[email protected] | 74bda14 | 2013-03-31 02:49:11 | [diff] [blame] | 449 | QuicPacketCreatorPeer::SetIsServer(&creator_, true); |
[email protected] | 4887809 | 2013-07-26 14:51:56 | [diff] [blame] | 450 | QuicVersionVector versions; |
[email protected] | b007e63 | 2013-10-28 08:39:25 | [diff] [blame] | 451 | versions.push_back(test::QuicVersionMax()); |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 452 | scoped_ptr<QuicEncryptedPacket> encrypted( |
| 453 | creator_.SerializeVersionNegotiationPacket(versions)); |
| 454 | |
| 455 | { |
| 456 | InSequence s; |
| 457 | EXPECT_CALL(framer_visitor_, OnPacket()); |
[email protected] | 066d818 | 2014-01-04 02:02:45 | [diff] [blame] | 458 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 459 | EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_)); |
| 460 | } |
| 461 | client_framer_.ProcessPacket(*encrypted.get()); |
| 462 | } |
| 463 | |
[email protected] | 24e5bc5 | 2013-09-18 15:36:58 | [diff] [blame] | 464 | TEST_F(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) { |
| 465 | EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
| 466 | creator_.options()->send_sequence_number_length); |
| 467 | |
| 468 | creator_.set_sequence_number(64); |
| 469 | creator_.UpdateSequenceNumberLength(2, 10000); |
| 470 | EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
| 471 | creator_.options()->send_sequence_number_length); |
| 472 | |
| 473 | creator_.set_sequence_number(64 * 256); |
| 474 | creator_.UpdateSequenceNumberLength(2, 10000); |
| 475 | EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, |
| 476 | creator_.options()->send_sequence_number_length); |
| 477 | |
| 478 | creator_.set_sequence_number(64 * 256 * 256); |
| 479 | creator_.UpdateSequenceNumberLength(2, 10000); |
| 480 | EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, |
| 481 | creator_.options()->send_sequence_number_length); |
| 482 | |
| 483 | creator_.set_sequence_number(GG_UINT64_C(64) * 256 * 256 * 256 * 256); |
| 484 | creator_.UpdateSequenceNumberLength(2, 10000); |
| 485 | EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER, |
| 486 | creator_.options()->send_sequence_number_length); |
| 487 | } |
| 488 | |
| 489 | TEST_F(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthBandwidth) { |
| 490 | EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
| 491 | creator_.options()->send_sequence_number_length); |
| 492 | |
| 493 | creator_.UpdateSequenceNumberLength(1, 10000); |
| 494 | EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
| 495 | creator_.options()->send_sequence_number_length); |
| 496 | |
| 497 | creator_.UpdateSequenceNumberLength(1, 10000 * 256); |
| 498 | EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, |
| 499 | creator_.options()->send_sequence_number_length); |
| 500 | |
| 501 | creator_.UpdateSequenceNumberLength(1, 10000 * 256 * 256); |
| 502 | EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, |
| 503 | creator_.options()->send_sequence_number_length); |
| 504 | |
| 505 | creator_.UpdateSequenceNumberLength( |
| 506 | 1, GG_UINT64_C(1000) * 256 * 256 * 256 * 256); |
| 507 | EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER, |
| 508 | creator_.options()->send_sequence_number_length); |
| 509 | } |
| 510 | |
[email protected] | e6ccc1a6 | 2013-12-02 07:02:12 | [diff] [blame] | 511 | TEST_F(QuicPacketCreatorTest, CreateStreamFrameWithNotifier) { |
| 512 | // Ensure that if CreateStreamFrame does not consume any data (e.g. a FIN only |
| 513 | // frame) then any QuicAckNotifier that is passed in still gets attached to |
| 514 | // the frame. |
[email protected] | 14a9575 | 2014-01-08 19:01:52 | [diff] [blame^] | 515 | scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); |
| 516 | QuicAckNotifier notifier(delegate.get()); |
[email protected] | e6ccc1a6 | 2013-12-02 07:02:12 | [diff] [blame] | 517 | QuicFrame frame; |
| 518 | IOVector empty_iovector; |
| 519 | bool fin = true; |
| 520 | size_t consumed_bytes = creator_.CreateStreamFrameWithNotifier( |
| 521 | 1u, empty_iovector, 0u, fin, ¬ifier, &frame); |
| 522 | EXPECT_EQ(0u, consumed_bytes); |
| 523 | EXPECT_EQ(¬ifier, frame.stream_frame->notifier); |
| 524 | delete frame.stream_frame; |
| 525 | } |
| 526 | |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 527 | INSTANTIATE_TEST_CASE_P(ToggleVersionSerialization, |
| 528 | QuicPacketCreatorTest, |
| 529 | ::testing::Values(false, true)); |
| 530 | |
| 531 | TEST_P(QuicPacketCreatorTest, SerializeFrame) { |
| 532 | if (!GetParam()) { |
| 533 | creator_.StopSendingVersion(); |
| 534 | } |
[email protected] | 5dafdb6 | 2013-11-14 01:24:26 | [diff] [blame] | 535 | frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 536 | SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 537 | delete frames_[0].stream_frame; |
| 538 | |
| 539 | QuicPacketHeader header; |
| 540 | { |
| 541 | InSequence s; |
| 542 | EXPECT_CALL(framer_visitor_, OnPacket()); |
[email protected] | 066d818 | 2014-01-04 02:02:45 | [diff] [blame] | 543 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
[email protected] | ec86d546 | 2013-11-17 16:04:49 | [diff] [blame] | 544 | EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 545 | EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce( |
| 546 | DoAll(SaveArg<0>(&header), Return(true))); |
| 547 | EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 548 | EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 549 | } |
| 550 | ProcessPacket(serialized.packet); |
| 551 | EXPECT_EQ(GetParam(), header.public_header.version_flag); |
| 552 | delete serialized.packet; |
| 553 | } |
| 554 | |
| 555 | TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) { |
| 556 | if (!GetParam()) { |
| 557 | creator_.StopSendingVersion(); |
| 558 | } |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 559 | // A string larger than fits into a frame. |
[email protected] | f62262b | 2013-07-05 20:57:30 | [diff] [blame] | 560 | size_t payload_length; |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 561 | creator_.options()->max_packet_length = GetPacketLengthForOneStream( |
[email protected] | 3e60db8 | 2013-08-05 19:43:06 | [diff] [blame] | 562 | client_framer_.version(), |
[email protected] | b06431078 | 2013-05-30 21:12:17 | [diff] [blame] | 563 | QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
[email protected] | ea825e0 | 2013-08-21 18:12:45 | [diff] [blame] | 564 | PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP, &payload_length); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 565 | QuicFrame frame; |
[email protected] | f62262b | 2013-07-05 20:57:30 | [diff] [blame] | 566 | const string too_long_payload(payload_length * 2, 'a'); |
| 567 | size_t consumed = creator_.CreateStreamFrame( |
[email protected] | 5dafdb6 | 2013-11-14 01:24:26 | [diff] [blame] | 568 | 1u, MakeIOVector(too_long_payload), 0u, true, &frame); |
[email protected] | f62262b | 2013-07-05 20:57:30 | [diff] [blame] | 569 | EXPECT_EQ(payload_length, consumed); |
| 570 | const string payload(payload_length, 'a'); |
| 571 | CheckStreamFrame(frame, 1u, payload, 0u, false); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 572 | delete frame.stream_frame; |
| 573 | } |
| 574 | |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 575 | TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) { |
| 576 | if (!GetParam()) { |
| 577 | creator_.StopSendingVersion(); |
| 578 | } |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 579 | const size_t max_plaintext_size = |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 580 | client_framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 581 | EXPECT_FALSE(creator_.HasPendingFrames()); |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 582 | EXPECT_EQ(max_plaintext_size - |
| 583 | GetPacketHeaderSize( |
[email protected] | b06431078 | 2013-05-30 21:12:17 | [diff] [blame] | 584 | creator_.options()->send_guid_length, |
| 585 | QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
[email protected] | ea825e0 | 2013-08-21 18:12:45 | [diff] [blame] | 586 | PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
[email protected] | 5351cc4b | 2013-03-03 07:22:41 | [diff] [blame] | 587 | creator_.BytesFree()); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 588 | |
| 589 | // Add a variety of frame types and then a padding frame. |
[email protected] | 8e01c06 | 2013-10-31 07:35:31 | [diff] [blame] | 590 | QuicAckFrame ack_frame(0u, QuicTime::Zero(), 0u); |
[email protected] | 9db44391 | 2013-02-25 05:27:03 | [diff] [blame] | 591 | EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 592 | EXPECT_TRUE(creator_.HasPendingFrames()); |
| 593 | |
| 594 | QuicCongestionFeedbackFrame congestion_feedback; |
| 595 | congestion_feedback.type = kFixRate; |
[email protected] | 9db44391 | 2013-02-25 05:27:03 | [diff] [blame] | 596 | EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&congestion_feedback))); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 597 | EXPECT_TRUE(creator_.HasPendingFrames()); |
| 598 | |
| 599 | QuicFrame frame; |
[email protected] | 5dafdb6 | 2013-11-14 01:24:26 | [diff] [blame] | 600 | size_t consumed = creator_.CreateStreamFrame( |
| 601 | 1u, MakeIOVector("test"), 0u, false, &frame); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 602 | EXPECT_EQ(4u, consumed); |
| 603 | ASSERT_TRUE(frame.stream_frame); |
[email protected] | 9db44391 | 2013-02-25 05:27:03 | [diff] [blame] | 604 | EXPECT_TRUE(creator_.AddSavedFrame(frame)); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 605 | EXPECT_TRUE(creator_.HasPendingFrames()); |
| 606 | |
| 607 | QuicPaddingFrame padding_frame; |
[email protected] | 9db44391 | 2013-02-25 05:27:03 | [diff] [blame] | 608 | EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&padding_frame))); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 609 | EXPECT_TRUE(creator_.HasPendingFrames()); |
| 610 | EXPECT_EQ(0u, creator_.BytesFree()); |
| 611 | |
[email protected] | 9db44391 | 2013-02-25 05:27:03 | [diff] [blame] | 612 | EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 613 | |
| 614 | // Ensure the packet is successfully created. |
[email protected] | 9db44391 | 2013-02-25 05:27:03 | [diff] [blame] | 615 | SerializedPacket serialized = creator_.SerializePacket(); |
| 616 | ASSERT_TRUE(serialized.packet); |
| 617 | delete serialized.packet; |
| 618 | ASSERT_TRUE(serialized.retransmittable_frames); |
| 619 | RetransmittableFrames* retransmittable = serialized.retransmittable_frames; |
| 620 | ASSERT_EQ(1u, retransmittable->frames().size()); |
| 621 | EXPECT_EQ(STREAM_FRAME, retransmittable->frames()[0].type); |
| 622 | ASSERT_TRUE(retransmittable->frames()[0].stream_frame); |
| 623 | delete serialized.retransmittable_frames; |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 624 | |
| 625 | EXPECT_FALSE(creator_.HasPendingFrames()); |
[email protected] | 14e8106c | 2013-03-14 16:25:33 | [diff] [blame] | 626 | EXPECT_EQ(max_plaintext_size - |
| 627 | GetPacketHeaderSize( |
[email protected] | b06431078 | 2013-05-30 21:12:17 | [diff] [blame] | 628 | creator_.options()->send_guid_length, |
| 629 | QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
[email protected] | ea825e0 | 2013-08-21 18:12:45 | [diff] [blame] | 630 | PACKET_1BYTE_SEQUENCE_NUMBER, |
[email protected] | b06431078 | 2013-05-30 21:12:17 | [diff] [blame] | 631 | NOT_IN_FEC_GROUP), |
[email protected] | 5351cc4b | 2013-03-03 07:22:41 | [diff] [blame] | 632 | creator_.BytesFree()); |
[email protected] | fee17f7 | 2013-02-03 07:47:41 | [diff] [blame] | 633 | } |
| 634 | |
[email protected] | 457d695 | 2013-12-13 09:24:58 | [diff] [blame] | 635 | TEST_F(QuicPacketCreatorTest, EntropyFlag) { |
| 636 | frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
| 637 | |
| 638 | for (int i = 0; i < 2; ++i) { |
| 639 | for (int j = 0; j < 64; ++j) { |
| 640 | SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 641 | // Verify both BoolSource and hash algorithm. |
| 642 | bool expected_rand_bool = |
| 643 | (mock_random_.RandUint64() & (GG_UINT64_C(1) << j)) != 0; |
| 644 | bool observed_rand_bool = |
| 645 | (serialized.entropy_hash & (1 << ((j+1) % 8))) != 0; |
| 646 | uint8 rest_of_hash = serialized.entropy_hash & ~(1 << ((j+1) % 8)); |
| 647 | EXPECT_EQ(expected_rand_bool, observed_rand_bool); |
| 648 | EXPECT_EQ(0, rest_of_hash); |
| 649 | delete serialized.packet; |
| 650 | } |
| 651 | // After 64 calls, BoolSource will refresh the bucket - make sure it does. |
| 652 | mock_random_.ChangeValue(); |
| 653 | } |
| 654 | |
| 655 | delete frames_[0].stream_frame; |
| 656 | } |
| 657 | |
[email protected] | a506124 | 2012-10-23 23:29:37 | [diff] [blame] | 658 | } // namespace |
| 659 | } // namespace test |
| 660 | } // namespace net |