| 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" |
| 10 #include "net/quic/crypto/quic_encrypter.h" |
| 11 #include "net/quic/crypto/quic_random.h" |
| 9 #include "net/quic/quic_utils.h" | 12 #include "net/quic/quic_utils.h" |
| 10 #include "net/quic/test_tools/quic_test_utils.h" | 13 #include "net/quic/test_tools/quic_test_utils.h" |
| 11 #include "testing/gmock/include/gmock/gmock.h" | 14 #include "testing/gmock/include/gmock/gmock.h" |
| 12 | 15 |
| 13 using base::StringPiece; | 16 using base::StringPiece; |
| 14 using std::string; | 17 using std::string; |
| 15 using std::vector; | 18 using std::vector; |
| 16 using testing::InSequence; | 19 using testing::InSequence; |
| 17 using testing::_; | 20 using testing::_; |
| 18 | 21 |
| 19 namespace net { | 22 namespace net { |
| 20 namespace test { | 23 namespace test { |
| 21 namespace { | 24 namespace { |
| 22 | 25 |
| 23 class QuicPacketCreatorTest : public ::testing::Test { | 26 class QuicPacketCreatorTest : public ::testing::Test { |
| 24 protected: | 27 protected: |
| 25 QuicPacketCreatorTest() | 28 QuicPacketCreatorTest() |
| 26 : framer_(QuicDecrypter::Create(kNULL), QuicEncrypter::Create(kNULL)), | 29 : framer_(QuicDecrypter::Create(kNULL), QuicEncrypter::Create(kNULL)), |
| 27 id_(1), | 30 id_(1), |
| 28 sequence_number_(0), | 31 sequence_number_(0), |
| 29 guid_(2), | 32 guid_(2), |
| 30 data_("foo"), | 33 data_("foo"), |
| 31 creator_(guid_, &framer_) { | 34 creator_(guid_, &framer_, QuicRandom::GetInstance()) { |
| 32 framer_.set_visitor(&framer_visitor_); | 35 framer_.set_visitor(&framer_visitor_); |
| 33 } | 36 } |
| 34 ~QuicPacketCreatorTest() { | 37 ~QuicPacketCreatorTest() { |
| 35 for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) { | |
| 36 QuicConnection::DeleteEnclosedFrame(&(*it)); | |
| 37 } | |
| 38 } | 38 } |
| 39 | 39 |
| 40 void ProcessPacket(QuicPacket* packet) { | 40 void ProcessPacket(QuicPacket* packet) { |
| 41 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(*packet)); | 41 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 42 framer_.EncryptPacket(sequence_number_, *packet)); |
| 42 framer_.ProcessPacket(*encrypted); | 43 framer_.ProcessPacket(*encrypted); |
| 43 } | 44 } |
| 44 | 45 |
| 45 void CheckStreamFrame(const QuicFrame& frame, QuicStreamId stream_id, | 46 void CheckStreamFrame(const QuicFrame& frame, QuicStreamId stream_id, |
| 46 const string& data, QuicStreamOffset offset, bool fin) { | 47 const string& data, QuicStreamOffset offset, bool fin) { |
| 47 EXPECT_EQ(STREAM_FRAME, frame.type); | 48 EXPECT_EQ(STREAM_FRAME, frame.type); |
| 48 ASSERT_TRUE(frame.stream_frame); | 49 ASSERT_TRUE(frame.stream_frame); |
| 49 EXPECT_EQ(stream_id, frame.stream_frame->stream_id); | 50 EXPECT_EQ(stream_id, frame.stream_frame->stream_id); |
| 50 EXPECT_EQ(data, frame.stream_frame->data); | 51 EXPECT_EQ(data, frame.stream_frame->data); |
| 51 EXPECT_EQ(offset, frame.stream_frame->offset); | 52 EXPECT_EQ(offset, frame.stream_frame->offset); |
| 52 EXPECT_EQ(fin, frame.stream_frame->fin); | 53 EXPECT_EQ(fin, frame.stream_frame->fin); |
| 53 } | 54 } |
| 54 | 55 |
| 55 QuicFrames frames_; | 56 QuicFrames frames_; |
| 56 QuicFramer framer_; | 57 QuicFramer framer_; |
| 57 testing::StrictMock<MockFramerVisitor> framer_visitor_; | 58 testing::StrictMock<MockFramerVisitor> framer_visitor_; |
| 58 QuicStreamId id_; | 59 QuicStreamId id_; |
| 59 QuicPacketSequenceNumber sequence_number_; | 60 QuicPacketSequenceNumber sequence_number_; |
| 60 QuicGuid guid_; | 61 QuicGuid guid_; |
| 61 string data_; | 62 string data_; |
| 62 QuicPacketCreator creator_; | 63 QuicPacketCreator creator_; |
| 63 }; | 64 }; |
| 64 | 65 |
| 65 TEST_F(QuicPacketCreatorTest, SerializeFrame) { | 66 TEST_F(QuicPacketCreatorTest, SerializeFrame) { |
| 66 frames_.push_back(QuicFrame(new QuicStreamFrame( | 67 frames_.push_back(QuicFrame(new QuicStreamFrame( |
| 67 0u, false, 0u, StringPiece("")))); | 68 0u, false, 0u, StringPiece("")))); |
| 68 PacketPair pair = creator_.SerializeAllFrames(frames_); | 69 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 70 delete frames_[0].stream_frame; |
| 69 | 71 |
| 70 { | 72 { |
| 71 InSequence s; | 73 InSequence s; |
| 72 EXPECT_CALL(framer_visitor_, OnPacket()); | 74 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 73 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 75 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 74 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 76 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 75 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 77 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 76 } | 78 } |
| 77 ProcessPacket(pair.second); | 79 ProcessPacket(serialized.packet); |
| 78 delete pair.second; | 80 delete serialized.packet; |
| 79 } | 81 } |
| 80 | 82 |
| 81 TEST_F(QuicPacketCreatorTest, SerializeFrames) { | 83 TEST_F(QuicPacketCreatorTest, SerializeFrames) { |
| 82 frames_.push_back(QuicFrame(new QuicAckFrame(0u, 0u))); | 84 frames_.push_back(QuicFrame(new QuicAckFrame(0u, 0u))); |
| 83 frames_.push_back(QuicFrame(new QuicStreamFrame( | 85 frames_.push_back(QuicFrame(new QuicStreamFrame( |
| 84 0u, false, 0u, StringPiece("")))); | 86 0u, false, 0u, StringPiece("")))); |
| 85 frames_.push_back(QuicFrame(new QuicStreamFrame( | 87 frames_.push_back(QuicFrame(new QuicStreamFrame( |
| 86 0u, true, 0u, StringPiece("")))); | 88 0u, true, 0u, StringPiece("")))); |
| 87 PacketPair pair = creator_.SerializeAllFrames(frames_); | 89 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 90 delete frames_[0].ack_frame; |
| 91 delete frames_[1].stream_frame; |
| 92 delete frames_[2].stream_frame; |
| 88 | 93 |
| 89 { | 94 { |
| 90 InSequence s; | 95 InSequence s; |
| 91 EXPECT_CALL(framer_visitor_, OnPacket()); | 96 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 92 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 97 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 93 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); | 98 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); |
| 94 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 99 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 95 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 100 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 96 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 101 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 97 } | 102 } |
| 98 ProcessPacket(pair.second); | 103 ProcessPacket(serialized.packet); |
| 99 delete pair.second; | 104 delete serialized.packet; |
| 100 } | 105 } |
| 101 | 106 |
| 102 TEST_F(QuicPacketCreatorTest, SerializeWithFEC) { | 107 TEST_F(QuicPacketCreatorTest, SerializeWithFEC) { |
| 103 creator_.options()->max_packets_per_fec_group = 6; | 108 creator_.options()->max_packets_per_fec_group = 6; |
| 104 ASSERT_FALSE(creator_.ShouldSendFec(false)); | 109 ASSERT_FALSE(creator_.ShouldSendFec(false)); |
| 105 creator_.MaybeStartFEC(); | 110 creator_.MaybeStartFEC(); |
| 106 | 111 |
| 107 frames_.push_back(QuicFrame(new QuicStreamFrame( | 112 frames_.push_back(QuicFrame(new QuicStreamFrame( |
| 108 0u, false, 0u, StringPiece("")))); | 113 0u, false, 0u, StringPiece("")))); |
| 109 PacketPair pair = creator_.SerializeAllFrames(frames_); | 114 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 115 delete frames_[0].stream_frame; |
| 110 | 116 |
| 111 { | 117 { |
| 112 InSequence s; | 118 InSequence s; |
| 113 EXPECT_CALL(framer_visitor_, OnPacket()); | 119 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 114 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 120 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 115 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); | 121 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); |
| 116 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 122 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 117 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 123 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 118 } | 124 } |
| 119 ProcessPacket(pair.second); | 125 ProcessPacket(serialized.packet); |
| 120 delete pair.second; | 126 delete serialized.packet; |
| 121 | 127 |
| 122 ASSERT_FALSE(creator_.ShouldSendFec(false)); | 128 ASSERT_FALSE(creator_.ShouldSendFec(false)); |
| 123 ASSERT_TRUE(creator_.ShouldSendFec(true)); | 129 ASSERT_TRUE(creator_.ShouldSendFec(true)); |
| 124 | 130 |
| 125 pair = creator_.SerializeFec(); | 131 serialized = creator_.SerializeFec(); |
| 126 ASSERT_EQ(2u, pair.first); | 132 ASSERT_EQ(2u, serialized.sequence_number); |
| 127 | 133 |
| 128 { | 134 { |
| 129 InSequence s; | 135 InSequence s; |
| 130 EXPECT_CALL(framer_visitor_, OnPacket()); | 136 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 131 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 137 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 132 EXPECT_CALL(framer_visitor_, OnFecData(_)); | 138 EXPECT_CALL(framer_visitor_, OnFecData(_)); |
| 133 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 139 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 134 } | 140 } |
| 135 ProcessPacket(pair.second); | 141 ProcessPacket(serialized.packet); |
| 136 delete pair.second; | 142 delete serialized.packet; |
| 137 } | 143 } |
| 138 | 144 |
| 139 TEST_F(QuicPacketCreatorTest, CloseConnection) { | 145 TEST_F(QuicPacketCreatorTest, SerializeConnectionClose) { |
| 140 QuicConnectionCloseFrame frame; | 146 QuicConnectionCloseFrame frame; |
| 141 frame.error_code = QUIC_NO_ERROR; | 147 frame.error_code = QUIC_NO_ERROR; |
| 142 frame.ack_frame = QuicAckFrame(0u, 0u); | 148 frame.ack_frame = QuicAckFrame(0u, 0u); |
| 143 | 149 |
| 144 PacketPair pair = creator_.CloseConnection(&frame); | 150 SerializedPacket serialized = creator_.SerializeConnectionClose(&frame); |
| 145 ASSERT_EQ(1u, pair.first); | 151 ASSERT_EQ(1u, serialized.sequence_number); |
| 146 ASSERT_EQ(1u, creator_.sequence_number()); | 152 ASSERT_EQ(1u, creator_.sequence_number()); |
| 147 | 153 |
| 148 InSequence s; | 154 InSequence s; |
| 149 EXPECT_CALL(framer_visitor_, OnPacket()); | 155 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 150 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 156 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 151 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); | 157 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); |
| 152 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); | 158 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); |
| 153 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 159 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 154 | 160 |
| 155 ProcessPacket(pair.second); | 161 ProcessPacket(serialized.packet); |
| 156 delete pair.second; | 162 delete serialized.packet; |
| 157 } | 163 } |
| 158 | 164 |
| 159 TEST_F(QuicPacketCreatorTest, CreateStreamFrame) { | 165 TEST_F(QuicPacketCreatorTest, CreateStreamFrame) { |
| 160 QuicFrame frame; | 166 QuicFrame frame; |
| 161 size_t consumed = creator_.CreateStreamFrame(1u, "test", 0u, false, &frame); | 167 size_t consumed = creator_.CreateStreamFrame(1u, "test", 0u, false, &frame); |
| 162 EXPECT_EQ(4u, consumed); | 168 EXPECT_EQ(4u, consumed); |
| 163 CheckStreamFrame(frame, 1u, "test", 0u, false); | 169 CheckStreamFrame(frame, 1u, "test", 0u, false); |
| 164 delete frame.stream_frame; | 170 delete frame.stream_frame; |
| 165 } | 171 } |
| 166 | 172 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 193 } | 199 } |
| 194 | 200 |
| 195 TEST_F(QuicPacketCreatorTest, AddFrameAndSerialize) { | 201 TEST_F(QuicPacketCreatorTest, AddFrameAndSerialize) { |
| 196 const size_t max_plaintext_size = | 202 const size_t max_plaintext_size = |
| 197 framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length); | 203 framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length); |
| 198 EXPECT_FALSE(creator_.HasPendingFrames()); | 204 EXPECT_FALSE(creator_.HasPendingFrames()); |
| 199 EXPECT_EQ(max_plaintext_size - kPacketHeaderSize, creator_.BytesFree()); | 205 EXPECT_EQ(max_plaintext_size - kPacketHeaderSize, creator_.BytesFree()); |
| 200 | 206 |
| 201 // Add a variety of frame types and then a padding frame. | 207 // Add a variety of frame types and then a padding frame. |
| 202 QuicAckFrame ack_frame; | 208 QuicAckFrame ack_frame; |
| 203 EXPECT_TRUE(creator_.AddFrame(QuicFrame(&ack_frame))); | 209 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
| 204 EXPECT_TRUE(creator_.HasPendingFrames()); | 210 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 205 | 211 |
| 206 QuicCongestionFeedbackFrame congestion_feedback; | 212 QuicCongestionFeedbackFrame congestion_feedback; |
| 207 congestion_feedback.type = kFixRate; | 213 congestion_feedback.type = kFixRate; |
| 208 EXPECT_TRUE(creator_.AddFrame(QuicFrame(&congestion_feedback))); | 214 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&congestion_feedback))); |
| 209 EXPECT_TRUE(creator_.HasPendingFrames()); | 215 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 210 | 216 |
| 211 QuicFrame frame; | 217 QuicFrame frame; |
| 212 size_t consumed = creator_.CreateStreamFrame(1u, "test", 0u, false, &frame); | 218 size_t consumed = creator_.CreateStreamFrame(1u, "test", 0u, false, &frame); |
| 213 EXPECT_EQ(4u, consumed); | 219 EXPECT_EQ(4u, consumed); |
| 214 ASSERT_TRUE(frame.stream_frame); | 220 ASSERT_TRUE(frame.stream_frame); |
| 215 EXPECT_TRUE(creator_.AddFrame(frame)); | 221 EXPECT_TRUE(creator_.AddSavedFrame(frame)); |
| 216 EXPECT_TRUE(creator_.HasPendingFrames()); | 222 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 217 | 223 |
| 218 QuicPaddingFrame padding_frame; | 224 QuicPaddingFrame padding_frame; |
| 219 EXPECT_TRUE(creator_.AddFrame(QuicFrame(&padding_frame))); | 225 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&padding_frame))); |
| 220 EXPECT_TRUE(creator_.HasPendingFrames()); | 226 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 221 EXPECT_EQ(0u, creator_.BytesFree()); | 227 EXPECT_EQ(0u, creator_.BytesFree()); |
| 222 | 228 |
| 223 EXPECT_FALSE(creator_.AddFrame(QuicFrame(&ack_frame))); | 229 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
| 224 | 230 |
| 225 // Ensure the packet is successfully created. | 231 // Ensure the packet is successfully created. |
| 226 QuicFrames retransmittable_frames; | 232 SerializedPacket serialized = creator_.SerializePacket(); |
| 227 PacketPair pair = creator_.SerializePacket(&retransmittable_frames); | 233 ASSERT_TRUE(serialized.packet); |
| 228 ASSERT_TRUE(pair.second); | 234 delete serialized.packet; |
| 229 delete pair.second; | 235 ASSERT_TRUE(serialized.retransmittable_frames); |
| 230 ASSERT_EQ(1u, retransmittable_frames.size()); | 236 RetransmittableFrames* retransmittable = serialized.retransmittable_frames; |
| 231 EXPECT_EQ(STREAM_FRAME, retransmittable_frames[0].type); | 237 ASSERT_EQ(1u, retransmittable->frames().size()); |
| 238 EXPECT_EQ(STREAM_FRAME, retransmittable->frames()[0].type); |
| 239 ASSERT_TRUE(retransmittable->frames()[0].stream_frame); |
| 240 delete serialized.retransmittable_frames; |
| 232 | 241 |
| 233 EXPECT_FALSE(creator_.HasPendingFrames()); | 242 EXPECT_FALSE(creator_.HasPendingFrames()); |
| 234 EXPECT_EQ(max_plaintext_size - kPacketHeaderSize, creator_.BytesFree()); | 243 EXPECT_EQ(max_plaintext_size - kPacketHeaderSize, creator_.BytesFree()); |
| 235 | |
| 236 delete frame.stream_frame; | |
| 237 } | 244 } |
| 238 | 245 |
| 239 } // namespace | 246 } // namespace |
| 240 } // namespace test | 247 } // namespace test |
| 241 } // namespace net | 248 } // namespace net |
| OLD | NEW |