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/crypto/quic_random.h" | 11 #include "net/quic/crypto/quic_random.h" |
12 #include "net/quic/quic_utils.h" | 12 #include "net/quic/quic_utils.h" |
| 13 #include "net/quic/test_tools/quic_packet_creator_peer.h" |
13 #include "net/quic/test_tools/quic_test_utils.h" | 14 #include "net/quic/test_tools/quic_test_utils.h" |
14 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
15 | 16 |
16 using base::StringPiece; | 17 using base::StringPiece; |
17 using std::string; | 18 using std::string; |
18 using std::vector; | 19 using std::vector; |
| 20 using testing::DoAll; |
19 using testing::InSequence; | 21 using testing::InSequence; |
| 22 using testing::Return; |
| 23 using testing::SaveArg; |
20 using testing::_; | 24 using testing::_; |
21 | 25 |
22 namespace net { | 26 namespace net { |
23 namespace test { | 27 namespace test { |
24 namespace { | 28 namespace { |
25 | 29 |
26 class QuicPacketCreatorTest : public ::testing::Test { | 30 class QuicPacketCreatorTest : public ::testing::TestWithParam<bool> { |
27 protected: | 31 protected: |
28 QuicPacketCreatorTest() | 32 QuicPacketCreatorTest() |
29 : framer_(kQuicVersion1, | 33 : server_framer_(kQuicVersion1, |
30 QuicDecrypter::Create(kNULL), | 34 QuicDecrypter::Create(kNULL), |
31 QuicEncrypter::Create(kNULL)), | 35 QuicEncrypter::Create(kNULL), |
| 36 true), |
| 37 client_framer_(kQuicVersion1, |
| 38 QuicDecrypter::Create(kNULL), |
| 39 QuicEncrypter::Create(kNULL), |
| 40 false), |
32 id_(1), | 41 id_(1), |
33 sequence_number_(0), | 42 sequence_number_(0), |
34 guid_(2), | 43 guid_(2), |
35 data_("foo"), | 44 data_("foo"), |
36 creator_(guid_, &framer_, QuicRandom::GetInstance()) { | 45 creator_(guid_, &client_framer_, QuicRandom::GetInstance(), false) { |
37 framer_.set_visitor(&framer_visitor_); | 46 client_framer_.set_visitor(&framer_visitor_); |
| 47 server_framer_.set_visitor(&framer_visitor_); |
38 } | 48 } |
39 ~QuicPacketCreatorTest() { | 49 ~QuicPacketCreatorTest() { |
40 } | 50 } |
41 | 51 |
42 void ProcessPacket(QuicPacket* packet) { | 52 void ProcessPacket(QuicPacket* packet) { |
43 scoped_ptr<QuicEncryptedPacket> encrypted( | 53 scoped_ptr<QuicEncryptedPacket> encrypted( |
44 framer_.EncryptPacket(sequence_number_, *packet)); | 54 server_framer_.EncryptPacket(sequence_number_, *packet)); |
45 framer_.ProcessPacket(*encrypted); | 55 server_framer_.ProcessPacket(*encrypted); |
46 } | 56 } |
47 | 57 |
48 void CheckStreamFrame(const QuicFrame& frame, QuicStreamId stream_id, | 58 void CheckStreamFrame(const QuicFrame& frame, QuicStreamId stream_id, |
49 const string& data, QuicStreamOffset offset, bool fin) { | 59 const string& data, QuicStreamOffset offset, bool fin) { |
50 EXPECT_EQ(STREAM_FRAME, frame.type); | 60 EXPECT_EQ(STREAM_FRAME, frame.type); |
51 ASSERT_TRUE(frame.stream_frame); | 61 ASSERT_TRUE(frame.stream_frame); |
52 EXPECT_EQ(stream_id, frame.stream_frame->stream_id); | 62 EXPECT_EQ(stream_id, frame.stream_frame->stream_id); |
53 EXPECT_EQ(data, frame.stream_frame->data); | 63 EXPECT_EQ(data, frame.stream_frame->data); |
54 EXPECT_EQ(offset, frame.stream_frame->offset); | 64 EXPECT_EQ(offset, frame.stream_frame->offset); |
55 EXPECT_EQ(fin, frame.stream_frame->fin); | 65 EXPECT_EQ(fin, frame.stream_frame->fin); |
56 } | 66 } |
57 | 67 |
58 QuicFrames frames_; | 68 QuicFrames frames_; |
59 QuicFramer framer_; | 69 QuicFramer server_framer_; |
| 70 QuicFramer client_framer_; |
60 testing::StrictMock<MockFramerVisitor> framer_visitor_; | 71 testing::StrictMock<MockFramerVisitor> framer_visitor_; |
61 QuicStreamId id_; | 72 QuicStreamId id_; |
62 QuicPacketSequenceNumber sequence_number_; | 73 QuicPacketSequenceNumber sequence_number_; |
63 QuicGuid guid_; | 74 QuicGuid guid_; |
64 string data_; | 75 string data_; |
65 QuicPacketCreator creator_; | 76 QuicPacketCreator creator_; |
66 }; | 77 }; |
67 | 78 |
68 TEST_F(QuicPacketCreatorTest, SerializeFrame) { | |
69 frames_.push_back(QuicFrame(new QuicStreamFrame( | |
70 0u, false, 0u, StringPiece("")))); | |
71 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | |
72 delete frames_[0].stream_frame; | |
73 | |
74 { | |
75 InSequence s; | |
76 EXPECT_CALL(framer_visitor_, OnPacket()); | |
77 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | |
78 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | |
79 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | |
80 } | |
81 ProcessPacket(serialized.packet); | |
82 delete serialized.packet; | |
83 } | |
84 | |
85 TEST_F(QuicPacketCreatorTest, SerializeFrames) { | 79 TEST_F(QuicPacketCreatorTest, SerializeFrames) { |
86 frames_.push_back(QuicFrame(new QuicAckFrame(0u, 0u))); | 80 frames_.push_back(QuicFrame(new QuicAckFrame(0u, QuicTime::Zero(), 0u))); |
87 frames_.push_back(QuicFrame(new QuicStreamFrame( | 81 frames_.push_back(QuicFrame(new QuicStreamFrame( |
88 0u, false, 0u, StringPiece("")))); | 82 0u, false, 0u, StringPiece("")))); |
89 frames_.push_back(QuicFrame(new QuicStreamFrame( | 83 frames_.push_back(QuicFrame(new QuicStreamFrame( |
90 0u, true, 0u, StringPiece("")))); | 84 0u, true, 0u, StringPiece("")))); |
91 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 85 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
92 delete frames_[0].ack_frame; | 86 delete frames_[0].ack_frame; |
93 delete frames_[1].stream_frame; | 87 delete frames_[1].stream_frame; |
94 delete frames_[2].stream_frame; | 88 delete frames_[2].stream_frame; |
95 | 89 |
96 { | 90 { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 EXPECT_CALL(framer_visitor_, OnFecData(_)); | 134 EXPECT_CALL(framer_visitor_, OnFecData(_)); |
141 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 135 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
142 } | 136 } |
143 ProcessPacket(serialized.packet); | 137 ProcessPacket(serialized.packet); |
144 delete serialized.packet; | 138 delete serialized.packet; |
145 } | 139 } |
146 | 140 |
147 TEST_F(QuicPacketCreatorTest, SerializeConnectionClose) { | 141 TEST_F(QuicPacketCreatorTest, SerializeConnectionClose) { |
148 QuicConnectionCloseFrame frame; | 142 QuicConnectionCloseFrame frame; |
149 frame.error_code = QUIC_NO_ERROR; | 143 frame.error_code = QUIC_NO_ERROR; |
150 frame.ack_frame = QuicAckFrame(0u, 0u); | 144 frame.ack_frame = QuicAckFrame(0u, QuicTime::Zero(), 0u); |
151 | 145 |
152 SerializedPacket serialized = creator_.SerializeConnectionClose(&frame); | 146 SerializedPacket serialized = creator_.SerializeConnectionClose(&frame); |
153 ASSERT_EQ(1u, serialized.sequence_number); | 147 ASSERT_EQ(1u, serialized.sequence_number); |
154 ASSERT_EQ(1u, creator_.sequence_number()); | 148 ASSERT_EQ(1u, creator_.sequence_number()); |
155 | 149 |
156 InSequence s; | 150 InSequence s; |
157 EXPECT_CALL(framer_visitor_, OnPacket()); | 151 EXPECT_CALL(framer_visitor_, OnPacket()); |
158 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 152 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
159 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); | 153 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); |
160 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); | 154 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); |
(...skipping 20 matching lines...) Expand all Loading... |
181 } | 175 } |
182 | 176 |
183 TEST_F(QuicPacketCreatorTest, CreateStreamFrameFinOnly) { | 177 TEST_F(QuicPacketCreatorTest, CreateStreamFrameFinOnly) { |
184 QuicFrame frame; | 178 QuicFrame frame; |
185 size_t consumed = creator_.CreateStreamFrame(1u, "", 0u, true, &frame); | 179 size_t consumed = creator_.CreateStreamFrame(1u, "", 0u, true, &frame); |
186 EXPECT_EQ(0u, consumed); | 180 EXPECT_EQ(0u, consumed); |
187 CheckStreamFrame(frame, 1u, "", 0u, true); | 181 CheckStreamFrame(frame, 1u, "", 0u, true); |
188 delete frame.stream_frame; | 182 delete frame.stream_frame; |
189 } | 183 } |
190 | 184 |
191 TEST_F(QuicPacketCreatorTest, CreateStreamFrameTooLarge) { | 185 TEST_F(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) { |
| 186 QuicVersionTagList versions; |
| 187 versions.push_back(kQuicVersion1); |
| 188 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 189 creator_.SerializeVersionNegotiationPacket(versions)); |
| 190 |
| 191 { |
| 192 InSequence s; |
| 193 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 194 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_)); |
| 195 } |
| 196 client_framer_.ProcessPacket(*encrypted.get()); |
| 197 } |
| 198 |
| 199 INSTANTIATE_TEST_CASE_P(ToggleVersionSerialization, |
| 200 QuicPacketCreatorTest, |
| 201 ::testing::Values(false, true)); |
| 202 |
| 203 TEST_P(QuicPacketCreatorTest, SerializeFrame) { |
| 204 if (!GetParam()) { |
| 205 creator_.StopSendingVersion(); |
| 206 } |
| 207 frames_.push_back(QuicFrame(new QuicStreamFrame( |
| 208 0u, false, 0u, StringPiece("")))); |
| 209 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 210 delete frames_[0].stream_frame; |
| 211 |
| 212 QuicPacketHeader header; |
| 213 { |
| 214 InSequence s; |
| 215 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 216 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce( |
| 217 DoAll(SaveArg<0>(&header), Return(true))); |
| 218 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 219 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 220 } |
| 221 ProcessPacket(serialized.packet); |
| 222 EXPECT_EQ(GetParam(), header.public_header.version_flag); |
| 223 delete serialized.packet; |
| 224 } |
| 225 |
| 226 TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) { |
| 227 if (!GetParam()) { |
| 228 creator_.StopSendingVersion(); |
| 229 } |
192 // A string larger than fits into a frame. | 230 // A string larger than fits into a frame. |
193 size_t ciphertext_size = NullEncrypter().GetCiphertextSize(1); | 231 creator_.options()->max_packet_length = GetPacketLengthForOneStream( |
194 creator_.options()->max_packet_length = ciphertext_size + | 232 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), 1); |
195 QuicPacketCreator::StreamFramePacketOverhead(1, !kIncludeVersion); | |
196 QuicFrame frame; | 233 QuicFrame frame; |
197 size_t consumed = creator_.CreateStreamFrame(1u, "test", 0u, true, &frame); | 234 size_t consumed = creator_.CreateStreamFrame(1u, "test", 0u, true, &frame); |
198 EXPECT_EQ(1u, consumed); | 235 EXPECT_EQ(1u, consumed); |
199 CheckStreamFrame(frame, 1u, "t", 0u, false); | 236 CheckStreamFrame(frame, 1u, "t", 0u, false); |
200 delete frame.stream_frame; | 237 delete frame.stream_frame; |
201 } | 238 } |
202 | 239 |
203 TEST_F(QuicPacketCreatorTest, AddFrameAndSerialize) { | 240 TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) { |
| 241 if (!GetParam()) { |
| 242 creator_.StopSendingVersion(); |
| 243 } |
204 const size_t max_plaintext_size = | 244 const size_t max_plaintext_size = |
205 framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length); | 245 client_framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length); |
206 EXPECT_FALSE(creator_.HasPendingFrames()); | 246 EXPECT_FALSE(creator_.HasPendingFrames()); |
207 EXPECT_EQ(max_plaintext_size - GetPacketHeaderSize(!kIncludeVersion), | 247 EXPECT_EQ(max_plaintext_size - |
| 248 GetPacketHeaderSize( |
| 249 QuicPacketCreatorPeer::SendVersionInPacket(&creator_)), |
208 creator_.BytesFree()); | 250 creator_.BytesFree()); |
209 | 251 |
210 // Add a variety of frame types and then a padding frame. | 252 // Add a variety of frame types and then a padding frame. |
211 QuicAckFrame ack_frame; | 253 QuicAckFrame ack_frame; |
212 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); | 254 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
213 EXPECT_TRUE(creator_.HasPendingFrames()); | 255 EXPECT_TRUE(creator_.HasPendingFrames()); |
214 | 256 |
215 QuicCongestionFeedbackFrame congestion_feedback; | 257 QuicCongestionFeedbackFrame congestion_feedback; |
216 congestion_feedback.type = kFixRate; | 258 congestion_feedback.type = kFixRate; |
217 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&congestion_feedback))); | 259 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&congestion_feedback))); |
(...skipping 18 matching lines...) Expand all Loading... |
236 ASSERT_TRUE(serialized.packet); | 278 ASSERT_TRUE(serialized.packet); |
237 delete serialized.packet; | 279 delete serialized.packet; |
238 ASSERT_TRUE(serialized.retransmittable_frames); | 280 ASSERT_TRUE(serialized.retransmittable_frames); |
239 RetransmittableFrames* retransmittable = serialized.retransmittable_frames; | 281 RetransmittableFrames* retransmittable = serialized.retransmittable_frames; |
240 ASSERT_EQ(1u, retransmittable->frames().size()); | 282 ASSERT_EQ(1u, retransmittable->frames().size()); |
241 EXPECT_EQ(STREAM_FRAME, retransmittable->frames()[0].type); | 283 EXPECT_EQ(STREAM_FRAME, retransmittable->frames()[0].type); |
242 ASSERT_TRUE(retransmittable->frames()[0].stream_frame); | 284 ASSERT_TRUE(retransmittable->frames()[0].stream_frame); |
243 delete serialized.retransmittable_frames; | 285 delete serialized.retransmittable_frames; |
244 | 286 |
245 EXPECT_FALSE(creator_.HasPendingFrames()); | 287 EXPECT_FALSE(creator_.HasPendingFrames()); |
246 EXPECT_EQ(max_plaintext_size - GetPacketHeaderSize(!kIncludeVersion), | 288 EXPECT_EQ(max_plaintext_size - |
| 289 GetPacketHeaderSize( |
| 290 QuicPacketCreatorPeer::SendVersionInPacket(&creator_)), |
247 creator_.BytesFree()); | 291 creator_.BytesFree()); |
248 } | 292 } |
249 | 293 |
250 } // namespace | 294 } // namespace |
251 } // namespace test | 295 } // namespace test |
252 } // namespace net | 296 } // namespace net |
OLD | NEW |