blob: dbbacdd8ddcc64679ff9419efbaff2eeca7c2e59 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2018 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// gunit tests for the IETF-format framer --- generally does a simple test
6// for each framer; we generate the template object (eg
7// QuicIetfStreamFrame) with the correct stuff in it, ask that a frame
8// be serialized (call AppendIetf<mumble>) then deserialized (call
9// ProcessIetf<mumble>) and then check that the gazintas and gazoutas
10// are the same.
11//
12// We do minimal checking of the serialized frame
13//
14// We do look at various different values (resulting in different
15// length varints, etc)
16
17#include "net/third_party/quiche/src/quic/core/quic_framer.h"
18
19#include <algorithm>
20#include <cstdint>
21#include <map>
22#include <memory>
vasilvv872e7a32019-03-12 16:42:44 -070023#include <string>
QUICHE teama6ef0a62019-03-07 20:34:33 -050024#include <vector>
25
26#include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h"
27#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
28#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
29#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
30#include "net/third_party/quiche/src/quic/core/quic_data_reader.h"
31#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
32#include "net/third_party/quiche/src/quic/core/quic_packets.h"
33#include "net/third_party/quiche/src/quic/core/quic_utils.h"
34#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
35#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
36#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
37#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050038#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
39#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
40#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
41#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
42
43namespace quic {
44namespace test {
45namespace {
46
47const size_t kNormalPacketBufferSize = 1400;
48// Several different stream ids, should be encoded
49// in 8, 4, 2, and 1 byte, respectively. Last one
50// checks that value==0 works.
51// All stream IDs end in 0x0, so the client/server- initiated
52// and Uni/Bi-directional bits are available to alter, as any
53// given test may wish.
54const QuicIetfStreamId kStreamId8 = UINT64_C(0x3EDCBA9876543210);
55const QuicIetfStreamId kStreamId4 = UINT64_C(0x36543210);
56const QuicIetfStreamId kStreamId2 = UINT64_C(0x3210);
57const QuicIetfStreamId kStreamId1 = UINT64_C(0x10);
58const QuicIetfStreamId kStreamId0 = UINT64_C(0x00);
59
60// Ditto for the offsets.
61const QuicIetfStreamOffset kOffset8 = UINT64_C(0x3210BA9876543210);
62const QuicIetfStreamOffset kOffset4 = UINT64_C(0x32109876);
63const QuicIetfStreamOffset kOffset2 = UINT64_C(0x3456);
64const QuicIetfStreamOffset kOffset1 = UINT64_C(0x3f);
65const QuicIetfStreamOffset kOffset0 = UINT64_C(0x00);
66
67// Structures used to create various ack frames.
68
69// Defines an ack frame to feed through the framer/deframer.
70struct ack_frame {
71 uint64_t delay_time;
72 bool is_ack_ecn;
73 QuicPacketCount ect_0_count;
74 QuicPacketCount ect_1_count;
75 QuicPacketCount ecn_ce_count;
76 const std::vector<QuicAckBlock>& ranges;
77 uint64_t expected_frame_type;
78};
79
80class TestQuicVisitor : public QuicFramerVisitorInterface {
81 public:
82 TestQuicVisitor() {}
83
84 ~TestQuicVisitor() override {}
85
86 void OnError(QuicFramer* f) override {
87 QUIC_DLOG(INFO) << "QuicIetfFramer Error: "
88 << QuicErrorCodeToString(f->error()) << " (" << f->error()
89 << ")";
90 }
91
92 void OnPacket() override {}
93
dschinazi17d42422019-06-18 16:35:07 -070094 void OnPublicResetPacket(const QuicPublicResetPacket& /*packet*/) override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -050095
96 void OnVersionNegotiationPacket(
dschinazi17d42422019-06-18 16:35:07 -070097 const QuicVersionNegotiationPacket& /*packet*/) override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -050098
dschinazi17d42422019-06-18 16:35:07 -070099 void OnRetryPacket(QuicConnectionId /*original_connection_id*/,
100 QuicConnectionId /*new_connection_id*/,
101 QuicStringPiece /*retry_token*/) override {}
dschinazi244f6dc2019-05-06 15:45:16 -0700102
fayang8aba1ff2019-06-21 12:00:54 -0700103 bool OnProtocolVersionMismatch(
104 ParsedQuicVersion /*received_version*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500105 return true;
106 }
107
dschinazi17d42422019-06-18 16:35:07 -0700108 bool OnUnauthenticatedPublicHeader(
109 const QuicPacketHeader& /*header*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500110 return true;
111 }
112
dschinazi17d42422019-06-18 16:35:07 -0700113 bool OnUnauthenticatedHeader(const QuicPacketHeader& /*header*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500114 return true;
115 }
116
dschinazi17d42422019-06-18 16:35:07 -0700117 void OnDecryptedPacket(EncryptionLevel /*level*/) override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -0500118
dschinazi17d42422019-06-18 16:35:07 -0700119 bool OnPacketHeader(const QuicPacketHeader& /*header*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500120 return true;
121 }
122
dschinazi17d42422019-06-18 16:35:07 -0700123 void OnCoalescedPacket(const QuicEncryptedPacket& /*packet*/) override {}
124
125 bool OnStreamFrame(const QuicStreamFrame& /*frame*/) override { return true; }
126
127 bool OnCryptoFrame(const QuicCryptoFrame& /*frame*/) override { return true; }
128
129 bool OnAckFrameStart(QuicPacketNumber /*largest_acked*/,
130 QuicTime::Delta /*ack_delay_time*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500131 return true;
132 }
133
dschinazi17d42422019-06-18 16:35:07 -0700134 bool OnAckRange(QuicPacketNumber /*start*/,
135 QuicPacketNumber /*end*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500136 return true;
137 }
138
dschinazi17d42422019-06-18 16:35:07 -0700139 bool OnAckTimestamp(QuicPacketNumber /*packet_number*/,
140 QuicTime /*timestamp*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500141 return true;
142 }
143
dschinazi17d42422019-06-18 16:35:07 -0700144 bool OnAckFrameEnd(QuicPacketNumber /*start*/) override { return true; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500145
dschinazi17d42422019-06-18 16:35:07 -0700146 bool OnStopWaitingFrame(const QuicStopWaitingFrame& /*frame*/) override {
147 return true;
148 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500149
dschinazi17d42422019-06-18 16:35:07 -0700150 bool OnPaddingFrame(const QuicPaddingFrame& /*frame*/) override {
151 return true;
152 }
153
154 bool OnPingFrame(const QuicPingFrame& /*frame*/) override { return true; }
155
156 bool OnMessageFrame(const QuicMessageFrame& /*frame*/) override {
157 return true;
158 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500159
160 void OnPacketComplete() override {}
161
dschinazi17d42422019-06-18 16:35:07 -0700162 bool OnRstStreamFrame(const QuicRstStreamFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500163 return true;
164 }
165
dschinazi17d42422019-06-18 16:35:07 -0700166 bool OnConnectionCloseFrame(
167 const QuicConnectionCloseFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500168 return true;
169 }
170
dschinazi17d42422019-06-18 16:35:07 -0700171 bool OnStopSendingFrame(const QuicStopSendingFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500172 return true;
173 }
174
dschinazi17d42422019-06-18 16:35:07 -0700175 bool OnPathChallengeFrame(const QuicPathChallengeFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500176 return true;
177 }
dschinazi17d42422019-06-18 16:35:07 -0700178 bool OnPathResponseFrame(const QuicPathResponseFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500179 return true;
180 }
181
dschinazi17d42422019-06-18 16:35:07 -0700182 bool OnGoAwayFrame(const QuicGoAwayFrame& /*frame*/) override { return true; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500183
dschinazi17d42422019-06-18 16:35:07 -0700184 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500185 return true;
186 }
187
dschinazi17d42422019-06-18 16:35:07 -0700188 bool OnBlockedFrame(const QuicBlockedFrame& /*frame*/) override {
189 return true;
190 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500191
dschinazi17d42422019-06-18 16:35:07 -0700192 bool OnNewConnectionIdFrame(
193 const QuicNewConnectionIdFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500194 return true;
195 }
196
197 bool OnRetireConnectionIdFrame(
dschinazi17d42422019-06-18 16:35:07 -0700198 const QuicRetireConnectionIdFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500199 return true;
200 }
201
dschinazi17d42422019-06-18 16:35:07 -0700202 bool OnNewTokenFrame(const QuicNewTokenFrame& /*frame*/) override {
203 return true;
204 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500205
dschinazi17d42422019-06-18 16:35:07 -0700206 bool IsValidStatelessResetToken(QuicUint128 /*token*/) const override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500207 return true;
208 }
209
210 void OnAuthenticatedIetfStatelessResetPacket(
dschinazi17d42422019-06-18 16:35:07 -0700211 const QuicIetfStatelessResetPacket& /*packet*/) override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -0500212
dschinazi17d42422019-06-18 16:35:07 -0700213 bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500214 return true;
215 }
216
dschinazi17d42422019-06-18 16:35:07 -0700217 bool OnStreamsBlockedFrame(
218 const QuicStreamsBlockedFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500219 return true;
220 }
221};
222
223class QuicIetfFramerTest : public QuicTestWithParam<ParsedQuicVersion> {
224 public:
225 QuicIetfFramerTest()
226 : start_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(0x10)),
227 framer_(AllSupportedVersions(),
228 start_,
229 Perspective::IS_SERVER,
230 kQuicDefaultConnectionIdLength) {
231 framer_.set_visitor(&visitor_);
232 }
233
234 // Utility functions to do actual framing/deframing.
235 void TryStreamFrame(char* packet_buffer,
236 size_t packet_buffer_size,
237 const char* xmit_packet_data,
238 size_t xmit_packet_data_size,
239 QuicIetfStreamId stream_id,
240 QuicIetfStreamOffset offset,
241 bool fin_bit,
242 bool last_frame_bit,
243 QuicIetfFrameType frame_type) {
244 // initialize a writer so that the serialized packet is placed in
245 // packet_buffer.
246 QuicDataWriter writer(packet_buffer_size, packet_buffer,
247 NETWORK_BYTE_ORDER); // do not really care
248 // about endianness.
249 // set up to define the source frame we wish to send.
250 QuicStreamFrame source_stream_frame(
251 stream_id, fin_bit, offset, xmit_packet_data, xmit_packet_data_size);
252
253 // Write the frame to the packet buffer.
254 EXPECT_TRUE(QuicFramerPeer::AppendIetfStreamFrame(
255 &framer_, source_stream_frame, last_frame_bit, &writer));
256 // Better have something in the packet buffer.
257 EXPECT_NE(0u, writer.length());
258 // Now set up a reader to read in the frame.
259 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
260
261 // A StreamFrame to hold the results... we know the frame type,
262 // put it into the QuicIetfStreamFrame
263 QuicStreamFrame sink_stream_frame;
264 if (xmit_packet_data_size) {
265 EXPECT_EQ(sink_stream_frame.data_buffer, nullptr);
266 EXPECT_EQ(sink_stream_frame.data_length, 0u);
267 }
268
269 EXPECT_TRUE(QuicFramerPeer::ProcessIetfStreamFrame(
270 &framer_, &reader, frame_type, &sink_stream_frame));
271
272 // Now check that the streamid, fin-bit, offset, and
273 // data len all match the input.
274 EXPECT_EQ(sink_stream_frame.stream_id, source_stream_frame.stream_id);
275 EXPECT_EQ(sink_stream_frame.fin, source_stream_frame.fin);
276 EXPECT_EQ(sink_stream_frame.data_length, source_stream_frame.data_length);
277 if (frame_type & IETF_STREAM_FRAME_OFF_BIT) {
278 // There was an offset in the frame, see if xmit and rcv vales equal.
279 EXPECT_EQ(sink_stream_frame.offset, source_stream_frame.offset);
280 } else {
281 // Offset not in frame, so it better come out 0.
282 EXPECT_EQ(sink_stream_frame.offset, 0u);
283 }
284 if (xmit_packet_data_size) {
285 ASSERT_NE(sink_stream_frame.data_buffer, nullptr);
286 ASSERT_NE(source_stream_frame.data_buffer, nullptr);
287 EXPECT_EQ(strcmp(sink_stream_frame.data_buffer,
288 source_stream_frame.data_buffer),
289 0);
290 } else {
291 // No data in the frame.
292 EXPECT_EQ(source_stream_frame.data_length, 0u);
293 EXPECT_EQ(sink_stream_frame.data_length, 0u);
294 }
295 }
296
297 // Overall ack frame encode/decode/compare function
298 // Encodes an ack frame as specified at |*frame|
299 // Then decodes the frame,
300 // Then compares the two
301 // Does some basic checking:
302 // - did the writer write something?
303 // - did the reader read the entire packet?
304 // - did the things the reader read match what the writer wrote?
305 // Returns true if it all worked false if not.
306 bool TryAckFrame(char* packet_buffer,
dschinazi17d42422019-06-18 16:35:07 -0700307 size_t /*packet_buffer_size*/,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500308 struct ack_frame* frame) {
309 QuicAckFrame transmit_frame = InitAckFrame(frame->ranges);
310 if (frame->is_ack_ecn) {
311 transmit_frame.ecn_counters_populated = true;
312 transmit_frame.ect_0_count = frame->ect_0_count;
313 transmit_frame.ect_1_count = frame->ect_1_count;
314 transmit_frame.ecn_ce_count = frame->ecn_ce_count;
315 }
316 transmit_frame.ack_delay_time =
317 QuicTime::Delta::FromMicroseconds(frame->delay_time);
318 size_t expected_size =
319 QuicFramerPeer::GetIetfAckFrameSize(&framer_, transmit_frame);
320
321 // Make a writer so that the serialized packet is placed in
322 // packet_buffer.
323 QuicDataWriter writer(expected_size, packet_buffer, NETWORK_BYTE_ORDER);
324
325 // Write the frame to the packet buffer.
326 EXPECT_TRUE(QuicFramerPeer::AppendIetfAckFrameAndTypeByte(
327 &framer_, transmit_frame, &writer));
328
329 size_t expected_frame_length = QuicFramerPeer::ComputeFrameLength(
330 &framer_, QuicFrame(&transmit_frame), false,
331 static_cast<QuicPacketNumberLength>(123456u));
332
333 // Encoded length should match what ComputeFrameLength returns
334 EXPECT_EQ(expected_frame_length, writer.length());
335 // and what is in the buffer should be the expected size.
336 EXPECT_EQ(expected_size, writer.length()) << "Frame is " << transmit_frame;
337 // Now set up a reader to read in the frame.
338 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
339
340 // read in the frame type
341 uint8_t received_frame_type;
342 EXPECT_TRUE(reader.ReadUInt8(&received_frame_type));
343 EXPECT_EQ(frame->expected_frame_type, received_frame_type);
344
345 // an AckFrame to hold the results
346 QuicAckFrame receive_frame;
347
348 EXPECT_TRUE(QuicFramerPeer::ProcessIetfAckFrame(
349 &framer_, &reader, received_frame_type, &receive_frame));
350
351 if (frame->is_ack_ecn &&
352 (frame->ect_0_count || frame->ect_1_count || frame->ecn_ce_count)) {
353 EXPECT_TRUE(receive_frame.ecn_counters_populated);
354 EXPECT_EQ(receive_frame.ect_0_count, frame->ect_0_count);
355 EXPECT_EQ(receive_frame.ect_1_count, frame->ect_1_count);
356 EXPECT_EQ(receive_frame.ecn_ce_count, frame->ecn_ce_count);
357 } else {
358 EXPECT_FALSE(receive_frame.ecn_counters_populated);
359 EXPECT_EQ(receive_frame.ect_0_count, 0u);
360 EXPECT_EQ(receive_frame.ect_1_count, 0u);
361 EXPECT_EQ(receive_frame.ecn_ce_count, 0u);
362 }
363
364 // Now check that the received frame matches the sent frame.
365 EXPECT_EQ(transmit_frame.largest_acked, receive_frame.largest_acked);
366 // The ~0x7 needs some explaining. The ack frame format down shifts the
367 // delay time by 3 (divide by 8) to allow for greater ranges in delay time.
368 // Therefore, if we give the framer a delay time that is not an
369 // even multiple of 8, the value that the deframer produces will
370 // not be the same as what the framer got. The downshift on
371 // framing and upshift on deframing results in clearing the 3
372 // low-order bits ... The masking basically does the same thing,
373 // so the compare works properly.
374 return true;
375 }
376
377 // encode, decode, and check a Path Challenge frame.
378 bool TryPathChallengeFrame(char* packet_buffer,
379 size_t packet_buffer_size,
380 const QuicPathFrameBuffer& data) {
381 // Make a writer so that the serialized packet is placed in
382 // packet_buffer.
383 QuicDataWriter writer(packet_buffer_size, packet_buffer,
384 NETWORK_BYTE_ORDER);
385
386 QuicPathChallengeFrame transmit_frame(0, data);
387
388 // write the frame to the packet buffer.
389 EXPECT_TRUE(QuicFramerPeer::AppendPathChallengeFrame(
390 &framer_, transmit_frame, &writer));
391
392 // Check for correct length in the packet buffer.
393 EXPECT_EQ(kQuicPathChallengeFrameSize, writer.length());
394
395 // now set up a reader to read in the frame.
396 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
397
398 QuicPathChallengeFrame receive_frame;
399
400 EXPECT_TRUE(QuicFramerPeer::ProcessPathChallengeFrame(&framer_, &reader,
401 &receive_frame));
402
403 // Now check that the received frame matches the sent frame.
404 EXPECT_EQ(
405 0, memcmp(transmit_frame.data_buffer.data(),
406 receive_frame.data_buffer.data(), kQuicPathFrameBufferSize));
407 return true;
408 }
409
410 // encode, decode, and check a Path Response frame.
411 bool TryPathResponseFrame(char* packet_buffer,
412 size_t packet_buffer_size,
413 const QuicPathFrameBuffer& data) {
414 // Make a writer so that the serialized packet is placed in
415 // packet_buffer.
416 QuicDataWriter writer(packet_buffer_size, packet_buffer,
417 NETWORK_BYTE_ORDER);
418
419 QuicPathResponseFrame transmit_frame(0, data);
420
421 // Write the frame to the packet buffer.
422 EXPECT_TRUE(QuicFramerPeer::AppendPathResponseFrame(
423 &framer_, transmit_frame, &writer));
424
425 // Check for correct length in the packet buffer.
426 EXPECT_EQ(kQuicPathResponseFrameSize, writer.length());
427
428 // Set up a reader to read in the frame.
429 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
430
431 QuicPathResponseFrame receive_frame;
432
433 EXPECT_TRUE(QuicFramerPeer::ProcessPathResponseFrame(&framer_, &reader,
434 &receive_frame));
435
436 // Now check that the received frame matches the sent frame.
437 EXPECT_EQ(
438 0, memcmp(transmit_frame.data_buffer.data(),
439 receive_frame.data_buffer.data(), kQuicPathFrameBufferSize));
440 return true;
441 }
442
443 // Test the Serialization/deserialization of a Reset Stream Frame.
444 void TryResetFrame(char* packet_buffer,
445 size_t packet_buffer_size,
446 QuicStreamId stream_id,
447 uint16_t error_code,
448 QuicStreamOffset final_offset) {
449 // Initialize a writer so that the serialized packet is placed in
450 // packet_buffer.
451 QuicDataWriter writer(packet_buffer_size, packet_buffer,
452 NETWORK_BYTE_ORDER);
453
454 QuicRstStreamFrame transmit_frame(static_cast<QuicControlFrameId>(1),
455 stream_id, error_code, final_offset);
456
457 // Write the frame to the packet buffer.
458 EXPECT_TRUE(QuicFramerPeer::AppendIetfResetStreamFrame(
459 &framer_, transmit_frame, &writer));
fkastenholz07300e52019-07-16 11:51:37 -0700460 // Check that the size of the serialzed frame is in the allowed range (3 to
461 // 24 bytes, inclusive).
462 EXPECT_LT(2u, writer.length());
463 EXPECT_GT(25u, writer.length());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500464 // Now set up a reader to read in the thing in.
465 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
466
467 // A QuicRstStreamFrame to hold the results
468 QuicRstStreamFrame receive_frame;
469 EXPECT_TRUE(QuicFramerPeer::ProcessIetfResetStreamFrame(&framer_, &reader,
470 &receive_frame));
471
472 // Now check that the received values match the input.
473 EXPECT_EQ(receive_frame.stream_id, transmit_frame.stream_id);
474 EXPECT_EQ(receive_frame.ietf_error_code, transmit_frame.ietf_error_code);
475 EXPECT_EQ(receive_frame.byte_offset, transmit_frame.byte_offset);
476 }
477
fkastenholz3c4eabf2019-04-22 07:49:59 -0700478 void TryMaxStreamsFrame(QuicStreamCount stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500479 bool unidirectional,
480 bool stream_id_server_initiated) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500481 char packet_buffer[kNormalPacketBufferSize];
482 memset(packet_buffer, 0, sizeof(packet_buffer));
483
484 Perspective old_perspective = framer_.perspective();
fkastenholz3c4eabf2019-04-22 07:49:59 -0700485 // Set up the writer and transmit QuicMaxStreamsFrame
QUICHE teama6ef0a62019-03-07 20:34:33 -0500486 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
487 NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500488
489 // Set the perspective of the sender. If the stream id is supposed to
490 // be server-initiated, then the sender of the MAX_STREAMS should be
491 // a client, and vice versa. Do this prior to constructing the frame or
492 // generating the packet, so that any internal dependencies are satisfied.
493 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
494 ? Perspective::IS_CLIENT
495 : Perspective::IS_SERVER);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700496 QuicMaxStreamsFrame transmit_frame(0, stream_count, unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500497
498 // Add the frame.
499 EXPECT_TRUE(QuicFramerPeer::AppendMaxStreamsFrame(&framer_, transmit_frame,
500 &writer));
501
502 // Check that buffer length is in the expected range
503 EXPECT_LE(1u, writer.length());
504 EXPECT_GE(8u, writer.length());
505
506 // Set the perspective for the receiver.
507 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
508 ? Perspective::IS_SERVER
509 : Perspective::IS_CLIENT);
510
511 // Set up reader and empty receive QuicPaddingFrame.
512 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700513 QuicMaxStreamsFrame receive_frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500514
515 // Deframe it
516 EXPECT_TRUE(QuicFramerPeer::ProcessMaxStreamsFrame(
517 &framer_, &reader, &receive_frame,
518 (unidirectional) ? IETF_MAX_STREAMS_UNIDIRECTIONAL
519 : IETF_MAX_STREAMS_BIDIRECTIONAL))
520 << " Error: " << framer_.detailed_error();
521
522 // Now check that received and sent data are equivalent
fkastenholz3c4eabf2019-04-22 07:49:59 -0700523 EXPECT_EQ(stream_count, receive_frame.stream_count);
524 EXPECT_EQ(transmit_frame.stream_count, receive_frame.stream_count);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500525 QuicFramerPeer::SetPerspective(&framer_, old_perspective);
526 }
527
fkastenholz3c4eabf2019-04-22 07:49:59 -0700528 void TryStreamsBlockedFrame(QuicStreamCount stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500529 bool unidirectional,
530 bool stream_id_server_initiated) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500531 char packet_buffer[kNormalPacketBufferSize];
532 memset(packet_buffer, 0, sizeof(packet_buffer));
533
534 Perspective old_perspective = framer_.perspective();
fkastenholz3c4eabf2019-04-22 07:49:59 -0700535 // Set up the writer and transmit QuicStreamsBlockedFrame
QUICHE teama6ef0a62019-03-07 20:34:33 -0500536 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
537 NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500538
539 // Set the perspective of the sender. If the stream id is supposed to
fkastenholz3c4eabf2019-04-22 07:49:59 -0700540 // be server-initiated, then the sender of the STREAMS_BLOCKED should be
QUICHE teama6ef0a62019-03-07 20:34:33 -0500541 // a client, and vice versa. Do this prior to constructing the frame or
542 // generating the packet, so that any internal dependencies are satisfied.
543 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
544 ? Perspective::IS_SERVER
545 : Perspective::IS_CLIENT);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700546 QuicStreamsBlockedFrame transmit_frame(0, stream_count, unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500547
548 // Add the frame.
549 EXPECT_TRUE(QuicFramerPeer::AppendStreamsBlockedFrame(
550 &framer_, transmit_frame, &writer));
551
552 // Check that buffer length is in the expected range
553 EXPECT_LE(1u, writer.length());
554 EXPECT_GE(8u, writer.length());
555
556 // Set the perspective for the receiver.
557 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
558 ? Perspective::IS_CLIENT
559 : Perspective::IS_SERVER);
560
561 // Set up reader and empty receive QuicPaddingFrame.
562 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700563 QuicStreamsBlockedFrame receive_frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500564
565 // Deframe it
566 EXPECT_TRUE(QuicFramerPeer::ProcessStreamsBlockedFrame(
567 &framer_, &reader, &receive_frame,
568 (unidirectional) ? IETF_STREAMS_BLOCKED_UNIDIRECTIONAL
569 : IETF_STREAMS_BLOCKED_BIDIRECTIONAL));
570
571 // Now check that received and sent data are equivalent
fkastenholz3c4eabf2019-04-22 07:49:59 -0700572 EXPECT_EQ(stream_count, receive_frame.stream_count);
573 EXPECT_EQ(transmit_frame.stream_count, receive_frame.stream_count);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500574 QuicFramerPeer::SetPerspective(&framer_, old_perspective);
575 }
576
577 QuicTime start_;
578 QuicFramer framer_;
579 test::TestQuicVisitor visitor_;
580};
581
582struct stream_frame_variant {
583 QuicIetfStreamId stream_id;
584 QuicIetfStreamOffset offset;
585 bool fin_bit;
586 bool last_frame_bit;
587 uint8_t frame_type;
588} stream_frame_to_test[] = {
589#define IETF_STREAM0 (((uint8_t)IETF_STREAM))
590
591#define IETF_STREAM1 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_FIN_BIT)
592
593#define IETF_STREAM2 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_LEN_BIT)
594
595#define IETF_STREAM3 \
596 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_LEN_BIT | \
597 IETF_STREAM_FRAME_FIN_BIT)
598
599#define IETF_STREAM4 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT)
600
601#define IETF_STREAM5 \
602 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
603 IETF_STREAM_FRAME_FIN_BIT)
604
605#define IETF_STREAM6 \
606 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
607 IETF_STREAM_FRAME_LEN_BIT)
608
609#define IETF_STREAM7 \
610 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
611 IETF_STREAM_FRAME_LEN_BIT | IETF_STREAM_FRAME_FIN_BIT)
612
613 {kStreamId8, kOffset8, true, false, IETF_STREAM7},
614 {kStreamId8, kOffset8, false, false, IETF_STREAM6},
615 {kStreamId8, kOffset4, true, false, IETF_STREAM7},
616 {kStreamId8, kOffset4, false, false, IETF_STREAM6},
617 {kStreamId8, kOffset2, true, false, IETF_STREAM7},
618 {kStreamId8, kOffset2, false, false, IETF_STREAM6},
619 {kStreamId8, kOffset1, true, false, IETF_STREAM7},
620 {kStreamId8, kOffset1, false, false, IETF_STREAM6},
621 {kStreamId8, kOffset0, true, false, IETF_STREAM3},
622 {kStreamId8, kOffset0, false, false, IETF_STREAM2},
623 {kStreamId4, kOffset8, true, false, IETF_STREAM7},
624 {kStreamId4, kOffset8, false, false, IETF_STREAM6},
625 {kStreamId4, kOffset4, true, false, IETF_STREAM7},
626 {kStreamId4, kOffset4, false, false, IETF_STREAM6},
627 {kStreamId4, kOffset2, true, false, IETF_STREAM7},
628 {kStreamId4, kOffset2, false, false, IETF_STREAM6},
629 {kStreamId4, kOffset1, true, false, IETF_STREAM7},
630 {kStreamId4, kOffset1, false, false, IETF_STREAM6},
631 {kStreamId4, kOffset0, true, false, IETF_STREAM3},
632 {kStreamId4, kOffset0, false, false, IETF_STREAM2},
633 {kStreamId2, kOffset8, true, false, IETF_STREAM7},
634 {kStreamId2, kOffset8, false, false, IETF_STREAM6},
635 {kStreamId2, kOffset4, true, false, IETF_STREAM7},
636 {kStreamId2, kOffset4, false, false, IETF_STREAM6},
637 {kStreamId2, kOffset2, true, false, IETF_STREAM7},
638 {kStreamId2, kOffset2, false, false, IETF_STREAM6},
639 {kStreamId2, kOffset1, true, false, IETF_STREAM7},
640 {kStreamId2, kOffset1, false, false, IETF_STREAM6},
641 {kStreamId2, kOffset0, true, false, IETF_STREAM3},
642 {kStreamId2, kOffset0, false, false, IETF_STREAM2},
643 {kStreamId1, kOffset8, true, false, IETF_STREAM7},
644 {kStreamId1, kOffset8, false, false, IETF_STREAM6},
645 {kStreamId1, kOffset4, true, false, IETF_STREAM7},
646 {kStreamId1, kOffset4, false, false, IETF_STREAM6},
647 {kStreamId1, kOffset2, true, false, IETF_STREAM7},
648 {kStreamId1, kOffset2, false, false, IETF_STREAM6},
649 {kStreamId1, kOffset1, true, false, IETF_STREAM7},
650 {kStreamId1, kOffset1, false, false, IETF_STREAM6},
651 {kStreamId1, kOffset0, true, false, IETF_STREAM3},
652 {kStreamId1, kOffset0, false, false, IETF_STREAM2},
653 {kStreamId0, kOffset8, true, false, IETF_STREAM7},
654 {kStreamId0, kOffset8, false, false, IETF_STREAM6},
655 {kStreamId0, kOffset4, true, false, IETF_STREAM7},
656 {kStreamId0, kOffset4, false, false, IETF_STREAM6},
657 {kStreamId0, kOffset2, true, false, IETF_STREAM7},
658 {kStreamId0, kOffset2, false, false, IETF_STREAM6},
659 {kStreamId0, kOffset1, true, false, IETF_STREAM7},
660 {kStreamId0, kOffset1, false, false, IETF_STREAM6},
661 {kStreamId0, kOffset0, true, false, IETF_STREAM3},
662 {kStreamId0, kOffset0, false, false, IETF_STREAM2},
663
664 {kStreamId8, kOffset8, true, true, IETF_STREAM5},
665 {kStreamId8, kOffset8, false, true, IETF_STREAM4},
666 {kStreamId8, kOffset4, true, true, IETF_STREAM5},
667 {kStreamId8, kOffset4, false, true, IETF_STREAM4},
668 {kStreamId8, kOffset2, true, true, IETF_STREAM5},
669 {kStreamId8, kOffset2, false, true, IETF_STREAM4},
670 {kStreamId8, kOffset1, true, true, IETF_STREAM5},
671 {kStreamId8, kOffset1, false, true, IETF_STREAM4},
672 {kStreamId8, kOffset0, true, true, IETF_STREAM1},
673 {kStreamId8, kOffset0, false, true, IETF_STREAM0},
674 {kStreamId4, kOffset8, true, true, IETF_STREAM5},
675 {kStreamId4, kOffset8, false, true, IETF_STREAM4},
676 {kStreamId4, kOffset4, true, true, IETF_STREAM5},
677 {kStreamId4, kOffset4, false, true, IETF_STREAM4},
678 {kStreamId4, kOffset2, true, true, IETF_STREAM5},
679 {kStreamId4, kOffset2, false, true, IETF_STREAM4},
680 {kStreamId4, kOffset1, true, true, IETF_STREAM5},
681 {kStreamId4, kOffset1, false, true, IETF_STREAM4},
682 {kStreamId4, kOffset0, true, true, IETF_STREAM1},
683 {kStreamId4, kOffset0, false, true, IETF_STREAM0},
684 {kStreamId2, kOffset8, true, true, IETF_STREAM5},
685 {kStreamId2, kOffset8, false, true, IETF_STREAM4},
686 {kStreamId2, kOffset4, true, true, IETF_STREAM5},
687 {kStreamId2, kOffset4, false, true, IETF_STREAM4},
688 {kStreamId2, kOffset2, true, true, IETF_STREAM5},
689 {kStreamId2, kOffset2, false, true, IETF_STREAM4},
690 {kStreamId2, kOffset1, true, true, IETF_STREAM5},
691 {kStreamId2, kOffset1, false, true, IETF_STREAM4},
692 {kStreamId2, kOffset0, true, true, IETF_STREAM1},
693 {kStreamId2, kOffset0, false, true, IETF_STREAM0},
694 {kStreamId1, kOffset8, true, true, IETF_STREAM5},
695 {kStreamId1, kOffset8, false, true, IETF_STREAM4},
696 {kStreamId1, kOffset4, true, true, IETF_STREAM5},
697 {kStreamId1, kOffset4, false, true, IETF_STREAM4},
698 {kStreamId1, kOffset2, true, true, IETF_STREAM5},
699 {kStreamId1, kOffset2, false, true, IETF_STREAM4},
700 {kStreamId1, kOffset1, true, true, IETF_STREAM5},
701 {kStreamId1, kOffset1, false, true, IETF_STREAM4},
702 {kStreamId1, kOffset0, true, true, IETF_STREAM1},
703 {kStreamId1, kOffset0, false, true, IETF_STREAM0},
704 {kStreamId0, kOffset8, true, true, IETF_STREAM5},
705 {kStreamId0, kOffset8, false, true, IETF_STREAM4},
706 {kStreamId0, kOffset4, true, true, IETF_STREAM5},
707 {kStreamId0, kOffset4, false, true, IETF_STREAM4},
708 {kStreamId0, kOffset2, true, true, IETF_STREAM5},
709 {kStreamId0, kOffset2, false, true, IETF_STREAM4},
710 {kStreamId0, kOffset1, true, true, IETF_STREAM5},
711 {kStreamId0, kOffset1, false, true, IETF_STREAM4},
712 {kStreamId0, kOffset0, true, true, IETF_STREAM1},
713 {kStreamId0, kOffset0, false, true, IETF_STREAM0},
714};
715
716TEST_F(QuicIetfFramerTest, StreamFrame) {
717 char packet_buffer[kNormalPacketBufferSize];
718 const char* transmit_packet_data =
719 "this is a test of some packet data, "
720 "can do a simple strcmp to see if the "
721 "input and output are the same!";
722
723 size_t transmit_packet_data_len = strlen(transmit_packet_data) + 1;
724 for (size_t i = 0; i < QUIC_ARRAYSIZE(stream_frame_to_test); ++i) {
725 SCOPED_TRACE(i);
726 struct stream_frame_variant* variant = &stream_frame_to_test[i];
727 TryStreamFrame(packet_buffer, sizeof(packet_buffer), transmit_packet_data,
728 transmit_packet_data_len, variant->stream_id,
729 variant->offset, variant->fin_bit, variant->last_frame_bit,
730 static_cast<QuicIetfFrameType>(variant->frame_type));
731 }
732}
733// As the previous test, but with no data.
734TEST_F(QuicIetfFramerTest, ZeroLengthStreamFrame) {
735 char packet_buffer[kNormalPacketBufferSize];
736
737 for (size_t i = 0; i < QUIC_ARRAYSIZE(stream_frame_to_test); ++i) {
738 SCOPED_TRACE(i);
739 struct stream_frame_variant* variant = &stream_frame_to_test[i];
740 TryStreamFrame(packet_buffer, sizeof(packet_buffer),
741 /* xmit_packet_data = */ NULL,
742 /* xmit_packet_data_size = */ 0, variant->stream_id,
743 variant->offset, variant->fin_bit, variant->last_frame_bit,
744 static_cast<QuicIetfFrameType>(variant->frame_type));
745 }
746}
747
748TEST_F(QuicIetfFramerTest, CryptoFrame) {
749 SimpleDataProducer data_producer;
750 framer_.set_data_producer(&data_producer);
751 char packet_buffer[kNormalPacketBufferSize];
752
753 QuicStringPiece frame_data("This is a CRYPTO frame.");
754
755 QuicStreamOffset offsets[] = {kOffset8, kOffset4, kOffset2, kOffset1,
756 kOffset0};
757 for (QuicStreamOffset offset : offsets) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700758 QuicCryptoFrame frame(ENCRYPTION_INITIAL, offset, frame_data.length());
759 data_producer.SaveCryptoData(ENCRYPTION_INITIAL, offset, frame_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500760
761 QuicDataWriter writer(QUIC_ARRAYSIZE(packet_buffer), packet_buffer,
762 NETWORK_BYTE_ORDER);
763
764 // Write the frame.
765 EXPECT_TRUE(QuicFramerPeer::AppendCryptoFrame(&framer_, frame, &writer));
766 EXPECT_NE(0u, writer.length());
767 // Read it back.
768 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
769 QuicCryptoFrame read_frame;
770 EXPECT_TRUE(
771 QuicFramerPeer::ProcessCryptoFrame(&framer_, &reader, &read_frame));
772
773 // Check that the frames match:
774 QuicStringPiece read_data(read_frame.data_buffer, read_frame.data_length);
775 EXPECT_EQ(read_frame.data_length, frame.data_length);
776 EXPECT_EQ(read_frame.offset, frame.offset);
777 EXPECT_EQ(read_data, frame_data);
778 }
779}
780
781TEST_F(QuicIetfFramerTest, ConnectionCloseEmptyString) {
782 char packet_buffer[kNormalPacketBufferSize];
783
784 // initialize a writer so that the serialized packet is placed in
785 // packet_buffer.
786 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
787 NETWORK_BYTE_ORDER);
788
789 // empty string,
vasilvvc48c8712019-03-11 13:38:16 -0700790 std::string test_string = "Ich Bin Ein Jelly Donut?";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500791 QuicConnectionCloseFrame sent_frame;
fkastenholze9d71a82019-04-09 05:12:13 -0700792 sent_frame.quic_error_code = static_cast<QuicErrorCode>(0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500793 sent_frame.error_details = test_string;
fkastenholze9d71a82019-04-09 05:12:13 -0700794 sent_frame.transport_close_frame_type = 123;
fkastenholz72f509b2019-04-10 09:17:49 -0700795 sent_frame.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500796 // write the frame to the packet buffer.
797 EXPECT_TRUE(QuicFramerPeer::AppendIetfConnectionCloseFrame(
798 &framer_, sent_frame, &writer));
799
800 // better have something in the packet buffer.
801 EXPECT_NE(0u, writer.length());
802
803 // now set up a reader to read in the frame.
804 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
805
806 // a QuicConnectionCloseFrame to hold the results.
807 QuicConnectionCloseFrame sink_frame;
808
fkastenholze9d71a82019-04-09 05:12:13 -0700809 EXPECT_TRUE(QuicFramerPeer::ProcessIetfConnectionCloseFrame(
810 &framer_, &reader, IETF_QUIC_TRANSPORT_CONNECTION_CLOSE, &sink_frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500811
812 // Now check that received == sent
fkastenholz72f509b2019-04-10 09:17:49 -0700813 EXPECT_EQ(sent_frame.quic_error_code, sink_frame.quic_error_code);
fkastenholze9d71a82019-04-09 05:12:13 -0700814 EXPECT_EQ(sink_frame.quic_error_code, static_cast<QuicErrorCode>(0));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500815 EXPECT_EQ(sink_frame.error_details, test_string);
fkastenholz72f509b2019-04-10 09:17:49 -0700816 EXPECT_EQ(sink_frame.close_type, sent_frame.close_type);
817 EXPECT_EQ(sent_frame.close_type, IETF_QUIC_TRANSPORT_CONNECTION_CLOSE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500818}
819
820TEST_F(QuicIetfFramerTest, ApplicationCloseEmptyString) {
821 char packet_buffer[kNormalPacketBufferSize];
822
823 // initialize a writer so that the serialized packet is placed in
824 // packet_buffer.
825 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
826 NETWORK_BYTE_ORDER);
827
828 // empty string,
vasilvvc48c8712019-03-11 13:38:16 -0700829 std::string test_string = "Ich Bin Ein Jelly Donut?";
fkastenholz72f509b2019-04-10 09:17:49 -0700830 QuicConnectionCloseFrame sent_frame;
831 sent_frame.quic_error_code = static_cast<QuicErrorCode>(0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500832 sent_frame.error_details = test_string;
fkastenholz72f509b2019-04-10 09:17:49 -0700833 sent_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500834 // write the frame to the packet buffer.
fkastenholz72f509b2019-04-10 09:17:49 -0700835 EXPECT_TRUE(QuicFramerPeer::AppendIetfConnectionCloseFrame(
836 &framer_, sent_frame, &writer));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500837
838 // better have something in the packet buffer.
839 EXPECT_NE(0u, writer.length());
840
841 // now set up a reader to read in the frame.
842 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
843
844 // a QuicConnectionCloseFrame to hold the results.
fkastenholz72f509b2019-04-10 09:17:49 -0700845 QuicConnectionCloseFrame sink_frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500846
fkastenholz72f509b2019-04-10 09:17:49 -0700847 EXPECT_TRUE(QuicFramerPeer::ProcessIetfConnectionCloseFrame(
848 &framer_, &reader, IETF_QUIC_APPLICATION_CONNECTION_CLOSE, &sink_frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500849
850 // Now check that received == sent
fkastenholz72f509b2019-04-10 09:17:49 -0700851 EXPECT_EQ(sink_frame.quic_error_code, static_cast<QuicErrorCode>(0));
852 EXPECT_EQ(sent_frame.quic_error_code, sink_frame.quic_error_code);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500853 EXPECT_EQ(sink_frame.error_details, test_string);
fkastenholz72f509b2019-04-10 09:17:49 -0700854 EXPECT_EQ(sent_frame.close_type, IETF_QUIC_APPLICATION_CONNECTION_CLOSE);
855 EXPECT_EQ(sent_frame.close_type, sink_frame.close_type);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500856}
857
858// Testing for the IETF ACK framer.
859// clang-format off
860struct ack_frame ack_frame_variants[] = {
861 {90000,
862 false,
863 0,
864 0,
865 0,
866 {{QuicPacketNumber(1000), QuicPacketNumber(2001)}},
867 IETF_ACK},
868 {0,
869 false,
870 0,
871 0,
872 0,
873 {{QuicPacketNumber(1000), QuicPacketNumber(2001)}},
874 IETF_ACK},
875 {1,
876 false,
877 0,
878 0,
879 0,
880 {{QuicPacketNumber(1), QuicPacketNumber(2)},
881 {QuicPacketNumber(5), QuicPacketNumber(6)}},
882 IETF_ACK},
883 {63,
884 false,
885 0,
886 0,
887 0,
888 {{QuicPacketNumber(1), QuicPacketNumber(2)},
889 {QuicPacketNumber(5), QuicPacketNumber(6)}},
890 IETF_ACK},
891 {64,
892 false,
893 0,
894 0,
895 0,
896 {{QuicPacketNumber(1), QuicPacketNumber(2)},
897 {QuicPacketNumber(3), QuicPacketNumber(4)},
898 {QuicPacketNumber(5), QuicPacketNumber(6)},
899 {QuicPacketNumber(7), QuicPacketNumber(8)},
900 {QuicPacketNumber(9), QuicPacketNumber(10)},
901 {QuicPacketNumber(11), QuicPacketNumber(12)}},
902 IETF_ACK},
903 {10000,
904 false,
905 0,
906 0,
907 0,
908 {{QuicPacketNumber(1), QuicPacketNumber(2)},
909 {QuicPacketNumber(3), QuicPacketNumber(4)},
910 {QuicPacketNumber(5), QuicPacketNumber(6)},
911 {QuicPacketNumber(7), QuicPacketNumber(8)},
912 {QuicPacketNumber(9), QuicPacketNumber(10)},
913 {QuicPacketNumber(11), QuicPacketNumber(12)}},
914 IETF_ACK},
915 {100000000,
916 false,
917 0,
918 0,
919 0,
920 {{QuicPacketNumber(1), QuicPacketNumber(2)},
921 {QuicPacketNumber(3), QuicPacketNumber(4)},
922 {QuicPacketNumber(5), QuicPacketNumber(6)},
923 {QuicPacketNumber(7), QuicPacketNumber(8)},
924 {QuicPacketNumber(9), QuicPacketNumber(10)},
925 {QuicPacketNumber(11), QuicPacketNumber(12)}},
926 IETF_ACK},
927 {0,
928 false,
929 0,
930 0,
931 0,
932 {{QuicPacketNumber(1), QuicPacketNumber(65)}},
933 IETF_ACK},
934 {9223372036854775807,
935 false,
936 0,
937 0,
938 0,
939 {{QuicPacketNumber(1), QuicPacketNumber(11)},
940 {QuicPacketNumber(74), QuicPacketNumber(138)}},
941 IETF_ACK},
942 // This ack is for packets 60 & 125. There are 64 packets in the gap.
943 // The encoded value is gap_size - 1, or 63. Crosses a VarInt62 encoding
944 // boundary...
945 {1,
946 false,
947 0,
948 0,
949 0,
950 {{QuicPacketNumber(60), QuicPacketNumber(61)},
951 {QuicPacketNumber(125), QuicPacketNumber(126)}},
952 IETF_ACK},
953 {2,
954 false,
955 0,
956 0,
957 0,
958 {{QuicPacketNumber(1), QuicPacketNumber(65)},
959 {QuicPacketNumber(129), QuicPacketNumber(130)}},
960 IETF_ACK},
961 {3,
962 false,
963 0,
964 0,
965 0,
966 {{QuicPacketNumber(1), QuicPacketNumber(65)},
967 {QuicPacketNumber(129), QuicPacketNumber(195)}},
968 IETF_ACK},
969 {4,
970 false,
971 0,
972 0,
973 0,
974 {{QuicPacketNumber(1), QuicPacketNumber(65)},
975 {QuicPacketNumber(129), QuicPacketNumber(194)}},
976 IETF_ACK},
977 {5,
978 false,
979 0,
980 0,
981 0,
982 {{QuicPacketNumber(1), QuicPacketNumber(65)},
983 {QuicPacketNumber(129), QuicPacketNumber(193)}},
984 IETF_ACK},
985 {6,
986 false,
987 0,
988 0,
989 0,
990 {{QuicPacketNumber(1), QuicPacketNumber(65)},
991 {QuicPacketNumber(129), QuicPacketNumber(192)}},
992 IETF_ACK},
993 // declare some ack_ecn frames to try.
994 {6,
995 false,
996 100,
997 200,
998 300,
999 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1000 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1001 IETF_ACK},
1002 {6,
1003 true,
1004 100,
1005 200,
1006 300,
1007 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1008 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1009 IETF_ACK_ECN},
1010 {6,
1011 true,
1012 100,
1013 0,
1014 0,
1015 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1016 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1017 IETF_ACK_ECN},
1018 {6,
1019 true,
1020 0,
1021 200,
1022 0,
1023 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1024 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1025 IETF_ACK_ECN},
1026 {6,
1027 true,
1028 0,
1029 0,
1030 300,
1031 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1032 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1033 IETF_ACK_ECN},
1034 {6,
1035 true,
1036 0,
1037 0,
1038 0,
1039 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1040 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1041 IETF_ACK},
1042};
1043// clang-format on
1044
1045TEST_F(QuicIetfFramerTest, AckFrame) {
1046 char packet_buffer[kNormalPacketBufferSize];
1047 for (auto ack_frame_variant : ack_frame_variants) {
1048 EXPECT_TRUE(
1049 TryAckFrame(packet_buffer, sizeof(packet_buffer), &ack_frame_variant));
1050 }
1051}
1052
1053// Test the case of having a QuicAckFrame with no ranges in it. By
1054// examination of the Google Quic Ack code and tests, this case should
1055// be handled as an ack with no "ranges after the first"; the
1056// AckBlockCount should be 0 and the FirstAckBlock should be
1057// |LargestAcked| - 1 (number of packets preceding the LargestAcked.
1058TEST_F(QuicIetfFramerTest, AckFrameNoRanges) {
1059 char packet_buffer[kNormalPacketBufferSize];
1060
1061 // Make a writer so that the serialized packet is placed in
1062 // packet_buffer.
1063 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1064 NETWORK_BYTE_ORDER);
1065
1066 QuicAckFrame transmit_frame;
1067 transmit_frame.largest_acked = QuicPacketNumber(1);
1068 transmit_frame.ack_delay_time = QuicTime::Delta::FromMicroseconds(0);
1069
1070 size_t expected_size =
1071 QuicFramerPeer::GetIetfAckFrameSize(&framer_, transmit_frame);
1072 // Write the frame to the packet buffer.
1073 EXPECT_TRUE(QuicFramerPeer::AppendIetfAckFrameAndTypeByte(
1074 &framer_, transmit_frame, &writer));
1075
1076 uint8_t packet[] = {
1077 0x02, // type, IETF_ACK
1078 0x01, // largest_acked,
1079 0x00, // delay
1080 0x00, // count of additional ack blocks
1081 0x00, // size of first ack block (packets preceding largest_acked)
1082 };
1083 EXPECT_EQ(expected_size, sizeof(packet));
1084 EXPECT_EQ(sizeof(packet), writer.length());
1085 EXPECT_EQ(0, memcmp(packet, packet_buffer, writer.length()));
1086
1087 // Now set up a reader to read in the frame.
1088 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1089
1090 // an AckFrame to hold the results
1091 QuicAckFrame receive_frame;
1092
1093 // read in the frame type
1094 uint8_t received_frame_type;
1095 EXPECT_TRUE(reader.ReadUInt8(&received_frame_type));
1096 EXPECT_EQ(received_frame_type, IETF_ACK);
1097
1098 EXPECT_TRUE(QuicFramerPeer::ProcessIetfAckFrame(&framer_, &reader, IETF_ACK,
1099 &receive_frame));
1100
1101 // Now check that the received frame matches the sent frame.
1102 EXPECT_EQ(transmit_frame.largest_acked, receive_frame.largest_acked);
1103}
1104
1105TEST_F(QuicIetfFramerTest, PathChallengeFrame) {
1106 // Double-braces needed on some platforms due to
1107 // https://bugs.llvm.org/show_bug.cgi?id=21629
1108 QuicPathFrameBuffer buffer0 = {{0, 0, 0, 0, 0, 0, 0, 0}};
1109 QuicPathFrameBuffer buffer1 = {
1110 {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
1111 char packet_buffer[kNormalPacketBufferSize];
1112 EXPECT_TRUE(
1113 TryPathChallengeFrame(packet_buffer, sizeof(packet_buffer), buffer0));
1114 EXPECT_TRUE(
1115 TryPathChallengeFrame(packet_buffer, sizeof(packet_buffer), buffer1));
1116}
1117
1118TEST_F(QuicIetfFramerTest, PathResponseFrame) {
1119 // Double-braces needed on some platforms due to
1120 // https://bugs.llvm.org/show_bug.cgi?id=21629
1121 QuicPathFrameBuffer buffer0 = {{0, 0, 0, 0, 0, 0, 0, 0}};
1122 QuicPathFrameBuffer buffer1 = {
1123 {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
1124 char packet_buffer[kNormalPacketBufferSize];
1125 EXPECT_TRUE(
1126 TryPathResponseFrame(packet_buffer, sizeof(packet_buffer), buffer0));
1127 EXPECT_TRUE(
1128 TryPathResponseFrame(packet_buffer, sizeof(packet_buffer), buffer1));
1129}
1130
1131TEST_F(QuicIetfFramerTest, ResetStreamFrame) {
1132 char packet_buffer[kNormalPacketBufferSize];
1133 struct resets {
1134 QuicStreamId stream_id;
1135 uint16_t error_code;
1136 QuicStreamOffset final_offset;
1137 } reset_frames[] = {
1138 {0, 55, 0},
1139 {0x10, 73, 0x300},
1140 };
1141 for (auto reset : reset_frames) {
1142 TryResetFrame(packet_buffer, sizeof(packet_buffer), reset.stream_id,
1143 reset.error_code, reset.final_offset);
1144 }
1145}
1146
1147TEST_F(QuicIetfFramerTest, StopSendingFrame) {
1148 char packet_buffer[kNormalPacketBufferSize];
1149
1150 // Make a writer so that the serialized packet is placed in
1151 // packet_buffer.
1152 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1153 NETWORK_BYTE_ORDER);
1154
1155 QuicStopSendingFrame transmit_frame;
1156 transmit_frame.stream_id = 12345;
1157 transmit_frame.application_error_code = 543;
1158
1159 // Write the frame to the packet buffer.
1160 EXPECT_TRUE(QuicFramerPeer::AppendStopSendingFrame(&framer_, transmit_frame,
1161 &writer));
1162 // Check that the number of bytes in the buffer is in the
1163 // allowed range.
1164 EXPECT_LE(3u, writer.length());
1165 EXPECT_GE(10u, writer.length());
1166
1167 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1168
1169 // A frame to hold the results
1170 QuicStopSendingFrame receive_frame;
1171
1172 EXPECT_TRUE(QuicFramerPeer::ProcessStopSendingFrame(&framer_, &reader,
1173 &receive_frame));
1174
1175 // Verify that the transmitted and received values are the same.
1176 EXPECT_EQ(receive_frame.stream_id, 12345u);
1177 EXPECT_EQ(receive_frame.application_error_code, 543u);
1178 EXPECT_EQ(receive_frame.stream_id, transmit_frame.stream_id);
1179 EXPECT_EQ(receive_frame.application_error_code,
1180 transmit_frame.application_error_code);
1181}
1182
1183TEST_F(QuicIetfFramerTest, MaxDataFrame) {
1184 char packet_buffer[kNormalPacketBufferSize];
1185 QuicStreamOffset window_sizes[] = {0, 1, 2, 5, 10,
1186 20, 50, 100, 200, 500,
1187 1000000, kOffset8, kOffset4, kOffset2};
1188 for (QuicStreamOffset window_size : window_sizes) {
1189 memset(packet_buffer, 0, sizeof(packet_buffer));
1190
1191 // Set up the writer and transmit QuicWindowUpdateFrame
1192 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1193 NETWORK_BYTE_ORDER);
1194 QuicWindowUpdateFrame transmit_frame(0, 99, window_size);
1195
1196 // Add the frame.
1197 EXPECT_TRUE(
1198 QuicFramerPeer::AppendMaxDataFrame(&framer_, transmit_frame, &writer));
1199
1200 // Check that the number of bytes in the buffer is in the expected range.
1201 EXPECT_LE(1u, writer.length());
1202 EXPECT_GE(8u, writer.length());
1203
1204 // Set up reader and an empty QuicWindowUpdateFrame
1205 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1206 QuicWindowUpdateFrame receive_frame;
1207
1208 // Deframe it
1209 EXPECT_TRUE(
1210 QuicFramerPeer::ProcessMaxDataFrame(&framer_, &reader, &receive_frame));
1211
1212 // Now check that the received data equals the sent data.
1213 EXPECT_EQ(transmit_frame.byte_offset, window_size);
1214 EXPECT_EQ(transmit_frame.byte_offset, receive_frame.byte_offset);
1215 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
1216 receive_frame.stream_id);
1217 }
1218}
1219
1220TEST_F(QuicIetfFramerTest, MaxStreamDataFrame) {
1221 char packet_buffer[kNormalPacketBufferSize];
1222 QuicStreamOffset window_sizes[] = {0, 1, 2, 5, 10,
1223 20, 50, 100, 200, 500,
1224 1000000, kOffset8, kOffset4, kOffset2};
1225 QuicIetfStreamId stream_ids[] = {kStreamId4, kStreamId2, kStreamId1,
1226 kStreamId0};
1227
1228 for (QuicIetfStreamId stream_id : stream_ids) {
1229 for (QuicStreamOffset window_size : window_sizes) {
1230 memset(packet_buffer, 0, sizeof(packet_buffer));
1231
1232 // Set up the writer and transmit QuicWindowUpdateFrame
1233 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1234 NETWORK_BYTE_ORDER);
1235 QuicWindowUpdateFrame transmit_frame(0, stream_id, window_size);
1236
1237 // Add the frame.
1238 EXPECT_TRUE(QuicFramerPeer::AppendMaxStreamDataFrame(
1239 &framer_, transmit_frame, &writer));
1240
1241 // Check that number of bytes in the buffer is in the expected range.
1242 EXPECT_LE(2u, writer.length());
1243 EXPECT_GE(16u, writer.length());
1244
1245 // Set up reader and empty receive QuicPaddingFrame.
1246 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1247 QuicWindowUpdateFrame receive_frame;
1248
1249 // Deframe it
1250 EXPECT_TRUE(QuicFramerPeer::ProcessMaxStreamDataFrame(&framer_, &reader,
1251 &receive_frame));
1252
1253 // Now check that received data and sent data are equal.
1254 EXPECT_EQ(transmit_frame.byte_offset, window_size);
1255 EXPECT_EQ(transmit_frame.byte_offset, receive_frame.byte_offset);
1256 EXPECT_EQ(stream_id, receive_frame.stream_id);
1257 EXPECT_EQ(transmit_frame.stream_id, receive_frame.stream_id);
1258 }
1259 }
1260}
1261
1262TEST_F(QuicIetfFramerTest, MaxStreamsFrame) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07001263 QuicStreamCount stream_counts[] = {0x3fffffff, 0x3fff, 0x3f, 0x1};
QUICHE teama6ef0a62019-03-07 20:34:33 -05001264
fkastenholz3c4eabf2019-04-22 07:49:59 -07001265 for (QuicStreamCount stream_count : stream_counts) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001266 // Cover all four combinations of uni/bi-directional and
1267 // server-/client- initiation.
fkastenholz3c4eabf2019-04-22 07:49:59 -07001268 TryMaxStreamsFrame(stream_count, /*unidirectional=*/true,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001269 /*stream_id_server_initiated=*/true);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001270 TryMaxStreamsFrame(stream_count, /*unidirectional=*/true,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001271 /*stream_id_server_initiated=*/false);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001272 TryMaxStreamsFrame(stream_count, /*unidirectional=*/false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001273 /*stream_id_server_initiated=*/true);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001274 TryMaxStreamsFrame(stream_count, /*unidirectional=*/false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001275 /*stream_id_server_initiated=*/false);
1276 }
1277}
1278
1279TEST_F(QuicIetfFramerTest, BlockedFrame) {
1280 char packet_buffer[kNormalPacketBufferSize];
1281 QuicStreamOffset offsets[] = {kOffset8, kOffset4, kOffset2, kOffset1,
1282 kOffset0};
1283
1284 for (QuicStreamOffset offset : offsets) {
1285 memset(packet_buffer, 0, sizeof(packet_buffer));
1286
1287 // Set up the writer and transmit QuicBlockedFrame
1288 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1289 NETWORK_BYTE_ORDER);
1290 QuicBlockedFrame transmit_frame(
1291 0, QuicUtils::GetInvalidStreamId(framer_.transport_version()), offset);
1292
1293 // Add the frame.
1294 EXPECT_TRUE(QuicFramerPeer::AppendIetfBlockedFrame(&framer_, transmit_frame,
1295 &writer));
1296
1297 // Check that buffer length is in the expected range
1298 EXPECT_LE(1u, writer.length());
1299 EXPECT_GE(8u, writer.length());
1300
1301 // Set up reader and empty receive QuicFrame.
1302 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1303 QuicBlockedFrame receive_frame;
1304
1305 // Deframe it
1306 EXPECT_TRUE(QuicFramerPeer::ProcessIetfBlockedFrame(&framer_, &reader,
1307 &receive_frame));
1308
1309 // Check that received and sent data are equivalent
1310 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
1311 receive_frame.stream_id);
1312 EXPECT_EQ(offset, receive_frame.offset);
1313 EXPECT_EQ(transmit_frame.offset, receive_frame.offset);
1314 }
1315}
1316
1317TEST_F(QuicIetfFramerTest, StreamBlockedFrame) {
1318 char packet_buffer[kNormalPacketBufferSize];
1319 QuicStreamOffset offsets[] = {0, 1, 2, 5, 10,
1320 20, 50, 100, 200, 500,
1321 1000000, kOffset8, kOffset4, kOffset2};
1322 QuicIetfStreamId stream_ids[] = {kStreamId4, kStreamId2, kStreamId1,
1323 kStreamId0};
1324
1325 for (QuicIetfStreamId stream_id : stream_ids) {
1326 for (QuicStreamOffset offset : offsets) {
1327 memset(packet_buffer, 0, sizeof(packet_buffer));
1328
1329 // Set up the writer and transmit QuicWindowUpdateFrame
1330 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1331 NETWORK_BYTE_ORDER);
1332 QuicBlockedFrame transmit_frame(0, stream_id, offset);
1333
1334 // Add the frame.
1335 EXPECT_TRUE(QuicFramerPeer::AppendStreamBlockedFrame(
1336 &framer_, transmit_frame, &writer));
1337
1338 // Check that number of bytes in the buffer is in the expected range.
1339 EXPECT_LE(2u, writer.length());
1340 EXPECT_GE(16u, writer.length());
1341
1342 // Set up reader and empty receive QuicPaddingFrame.
1343 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1344 QuicBlockedFrame receive_frame;
1345
1346 // Deframe it
1347 EXPECT_TRUE(QuicFramerPeer::ProcessStreamBlockedFrame(&framer_, &reader,
1348 &receive_frame));
1349
1350 // Now check that received == sent
1351 EXPECT_EQ(transmit_frame.offset, offset);
1352 EXPECT_EQ(transmit_frame.offset, receive_frame.offset);
1353 EXPECT_EQ(stream_id, receive_frame.stream_id);
1354 EXPECT_EQ(transmit_frame.stream_id, receive_frame.stream_id);
1355 }
1356 }
1357}
1358
1359TEST_F(QuicIetfFramerTest, StreamsBlockedFrame) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07001360 QuicStreamCount stream_counts[] = {0x3fffffff, 0x3fff, 0x3f, 0x1};
QUICHE teama6ef0a62019-03-07 20:34:33 -05001361
fkastenholz3c4eabf2019-04-22 07:49:59 -07001362 for (QuicStreamCount stream_count : stream_counts) {
1363 TryStreamsBlockedFrame(stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001364 /*unidirectional=*/false,
1365 /*stream_id_server_initiated=*/false);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001366 TryStreamsBlockedFrame(stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001367 /*unidirectional=*/false,
1368 /*stream_id_server_initiated=*/true);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001369 TryStreamsBlockedFrame(stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001370 /*unidirectional=*/true,
1371 /*stream_id_server_initiated=*/false);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001372 TryStreamsBlockedFrame(stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001373 /*unidirectional=*/true,
1374 /*stream_id_server_initiated=*/true);
1375 }
1376}
1377
1378TEST_F(QuicIetfFramerTest, NewConnectionIdFrame) {
1379 char packet_buffer[kNormalPacketBufferSize];
1380
1381 QuicNewConnectionIdFrame transmit_frame;
1382 transmit_frame.connection_id = TestConnectionId(UINT64_C(0x0edcba9876543201));
1383 transmit_frame.sequence_number = 0x01020304;
fkastenholz1c19fc22019-07-12 11:06:19 -07001384 transmit_frame.retire_prior_to = 0x00020304;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001385 // The token is defined as a uint128 -- a 16-byte integer.
1386 // The value is set in this manner because we want each
1387 // byte to have a specific value so that the binary
1388 // packet check (below) is good. If we used integer
1389 // operations (eg. "token = 0x12345...") then the bytes
1390 // would be set in host order.
1391 unsigned char token_bytes[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
1392 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
1393 0x0c, 0x0d, 0x0e, 0x0f};
1394 memcpy(&transmit_frame.stateless_reset_token, token_bytes,
1395 sizeof(transmit_frame.stateless_reset_token));
1396
1397 memset(packet_buffer, 0, sizeof(packet_buffer));
1398
fkastenholz3c4eabf2019-04-22 07:49:59 -07001399 // Set up the writer and transmit a QuicNewConnectionIdFrame
QUICHE teama6ef0a62019-03-07 20:34:33 -05001400 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1401 NETWORK_BYTE_ORDER);
1402
1403 // Add the frame.
1404 EXPECT_TRUE(QuicFramerPeer::AppendNewConnectionIdFrame(
1405 &framer_, transmit_frame, &writer));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001406 // clang-format off
1407 uint8_t packet[] = {
1408 // sequence number, 0x80 for varint62 encoding
1409 0x80 + 0x01, 0x02, 0x03, 0x04,
fkastenholz1c19fc22019-07-12 11:06:19 -07001410 // retire_prior_to, 0x80 for varint62 encoding
1411 0x80 + 0x00, 0x02, 0x03, 0x04,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001412 // new connection id length, is not varint62 encoded.
1413 0x08,
1414 // new connection id, is not varint62 encoded.
1415 0x0E, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x01,
1416 // the reset token:
1417 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1418 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
1419 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001420 // clang-format on
fkastenholz1c19fc22019-07-12 11:06:19 -07001421
1422 // Check that buffer length is correct
1423 EXPECT_EQ(sizeof(packet), writer.length());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001424 EXPECT_EQ(0, memcmp(packet_buffer, packet, sizeof(packet)));
1425
1426 // Set up reader and empty receive QuicPaddingFrame.
1427 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1428 QuicNewConnectionIdFrame receive_frame;
1429
1430 // Deframe it
1431 EXPECT_TRUE(QuicFramerPeer::ProcessNewConnectionIdFrame(&framer_, &reader,
1432 &receive_frame));
1433
1434 // Now check that received == sent
1435 EXPECT_EQ(transmit_frame.connection_id, receive_frame.connection_id);
1436 EXPECT_EQ(transmit_frame.sequence_number, receive_frame.sequence_number);
fkastenholz1c19fc22019-07-12 11:06:19 -07001437 EXPECT_EQ(transmit_frame.retire_prior_to, receive_frame.retire_prior_to);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001438 EXPECT_EQ(transmit_frame.stateless_reset_token,
1439 receive_frame.stateless_reset_token);
1440}
1441
1442TEST_F(QuicIetfFramerTest, RetireConnectionIdFrame) {
1443 char packet_buffer[kNormalPacketBufferSize];
1444
1445 QuicRetireConnectionIdFrame transmit_frame;
1446 transmit_frame.sequence_number = 0x01020304;
1447
1448 memset(packet_buffer, 0, sizeof(packet_buffer));
1449
fkastenholz3c4eabf2019-04-22 07:49:59 -07001450 // Set up the writer and transmit QuicRetireConnectionIdFrame
QUICHE teama6ef0a62019-03-07 20:34:33 -05001451 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1452 NETWORK_BYTE_ORDER);
1453
1454 // Add the frame.
1455 EXPECT_TRUE(QuicFramerPeer::AppendRetireConnectionIdFrame(
1456 &framer_, transmit_frame, &writer));
1457 // Check that buffer length is correct
1458 EXPECT_EQ(4u, writer.length());
1459 // clang-format off
1460 uint8_t packet[] = {
1461 // sequence number, 0x80 for varint62 encoding
1462 0x80 + 0x01, 0x02, 0x03, 0x04,
1463 };
1464
1465 // clang-format on
1466 EXPECT_EQ(0, memcmp(packet_buffer, packet, sizeof(packet)));
1467
1468 // Set up reader and empty receive QuicPaddingFrame.
1469 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1470 QuicRetireConnectionIdFrame receive_frame;
1471
1472 // Deframe it
1473 EXPECT_TRUE(QuicFramerPeer::ProcessRetireConnectionIdFrame(&framer_, &reader,
1474 &receive_frame));
1475
1476 // Now check that received == sent
1477 EXPECT_EQ(transmit_frame.sequence_number, receive_frame.sequence_number);
1478}
1479
1480} // namespace
1481} // namespace test
1482} // namespace quic