blob: 9d07e49dde52ed35f9bd6f12321f6d17e259cf88 [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));
460 // Check that the size of the serialzed frame is in the allowed range.
461 EXPECT_LT(3u, writer.length());
462 EXPECT_GT(19u, writer.length());
463 // Now set up a reader to read in the thing in.
464 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
465
466 // A QuicRstStreamFrame to hold the results
467 QuicRstStreamFrame receive_frame;
468 EXPECT_TRUE(QuicFramerPeer::ProcessIetfResetStreamFrame(&framer_, &reader,
469 &receive_frame));
470
471 // Now check that the received values match the input.
472 EXPECT_EQ(receive_frame.stream_id, transmit_frame.stream_id);
473 EXPECT_EQ(receive_frame.ietf_error_code, transmit_frame.ietf_error_code);
474 EXPECT_EQ(receive_frame.byte_offset, transmit_frame.byte_offset);
475 }
476
fkastenholz3c4eabf2019-04-22 07:49:59 -0700477 void TryMaxStreamsFrame(QuicStreamCount stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500478 bool unidirectional,
479 bool stream_id_server_initiated) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500480 char packet_buffer[kNormalPacketBufferSize];
481 memset(packet_buffer, 0, sizeof(packet_buffer));
482
483 Perspective old_perspective = framer_.perspective();
fkastenholz3c4eabf2019-04-22 07:49:59 -0700484 // Set up the writer and transmit QuicMaxStreamsFrame
QUICHE teama6ef0a62019-03-07 20:34:33 -0500485 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
486 NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500487
488 // Set the perspective of the sender. If the stream id is supposed to
489 // be server-initiated, then the sender of the MAX_STREAMS should be
490 // a client, and vice versa. Do this prior to constructing the frame or
491 // generating the packet, so that any internal dependencies are satisfied.
492 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
493 ? Perspective::IS_CLIENT
494 : Perspective::IS_SERVER);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700495 QuicMaxStreamsFrame transmit_frame(0, stream_count, unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500496
497 // Add the frame.
498 EXPECT_TRUE(QuicFramerPeer::AppendMaxStreamsFrame(&framer_, transmit_frame,
499 &writer));
500
501 // Check that buffer length is in the expected range
502 EXPECT_LE(1u, writer.length());
503 EXPECT_GE(8u, writer.length());
504
505 // Set the perspective for the receiver.
506 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
507 ? Perspective::IS_SERVER
508 : Perspective::IS_CLIENT);
509
510 // Set up reader and empty receive QuicPaddingFrame.
511 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700512 QuicMaxStreamsFrame receive_frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500513
514 // Deframe it
515 EXPECT_TRUE(QuicFramerPeer::ProcessMaxStreamsFrame(
516 &framer_, &reader, &receive_frame,
517 (unidirectional) ? IETF_MAX_STREAMS_UNIDIRECTIONAL
518 : IETF_MAX_STREAMS_BIDIRECTIONAL))
519 << " Error: " << framer_.detailed_error();
520
521 // Now check that received and sent data are equivalent
fkastenholz3c4eabf2019-04-22 07:49:59 -0700522 EXPECT_EQ(stream_count, receive_frame.stream_count);
523 EXPECT_EQ(transmit_frame.stream_count, receive_frame.stream_count);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500524 QuicFramerPeer::SetPerspective(&framer_, old_perspective);
525 }
526
fkastenholz3c4eabf2019-04-22 07:49:59 -0700527 void TryStreamsBlockedFrame(QuicStreamCount stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500528 bool unidirectional,
529 bool stream_id_server_initiated) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500530 char packet_buffer[kNormalPacketBufferSize];
531 memset(packet_buffer, 0, sizeof(packet_buffer));
532
533 Perspective old_perspective = framer_.perspective();
fkastenholz3c4eabf2019-04-22 07:49:59 -0700534 // Set up the writer and transmit QuicStreamsBlockedFrame
QUICHE teama6ef0a62019-03-07 20:34:33 -0500535 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
536 NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500537
538 // Set the perspective of the sender. If the stream id is supposed to
fkastenholz3c4eabf2019-04-22 07:49:59 -0700539 // be server-initiated, then the sender of the STREAMS_BLOCKED should be
QUICHE teama6ef0a62019-03-07 20:34:33 -0500540 // a client, and vice versa. Do this prior to constructing the frame or
541 // generating the packet, so that any internal dependencies are satisfied.
542 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
543 ? Perspective::IS_SERVER
544 : Perspective::IS_CLIENT);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700545 QuicStreamsBlockedFrame transmit_frame(0, stream_count, unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500546
547 // Add the frame.
548 EXPECT_TRUE(QuicFramerPeer::AppendStreamsBlockedFrame(
549 &framer_, transmit_frame, &writer));
550
551 // Check that buffer length is in the expected range
552 EXPECT_LE(1u, writer.length());
553 EXPECT_GE(8u, writer.length());
554
555 // Set the perspective for the receiver.
556 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
557 ? Perspective::IS_CLIENT
558 : Perspective::IS_SERVER);
559
560 // Set up reader and empty receive QuicPaddingFrame.
561 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700562 QuicStreamsBlockedFrame receive_frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500563
564 // Deframe it
565 EXPECT_TRUE(QuicFramerPeer::ProcessStreamsBlockedFrame(
566 &framer_, &reader, &receive_frame,
567 (unidirectional) ? IETF_STREAMS_BLOCKED_UNIDIRECTIONAL
568 : IETF_STREAMS_BLOCKED_BIDIRECTIONAL));
569
570 // Now check that received and sent data are equivalent
fkastenholz3c4eabf2019-04-22 07:49:59 -0700571 EXPECT_EQ(stream_count, receive_frame.stream_count);
572 EXPECT_EQ(transmit_frame.stream_count, receive_frame.stream_count);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500573 QuicFramerPeer::SetPerspective(&framer_, old_perspective);
574 }
575
576 QuicTime start_;
577 QuicFramer framer_;
578 test::TestQuicVisitor visitor_;
579};
580
581struct stream_frame_variant {
582 QuicIetfStreamId stream_id;
583 QuicIetfStreamOffset offset;
584 bool fin_bit;
585 bool last_frame_bit;
586 uint8_t frame_type;
587} stream_frame_to_test[] = {
588#define IETF_STREAM0 (((uint8_t)IETF_STREAM))
589
590#define IETF_STREAM1 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_FIN_BIT)
591
592#define IETF_STREAM2 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_LEN_BIT)
593
594#define IETF_STREAM3 \
595 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_LEN_BIT | \
596 IETF_STREAM_FRAME_FIN_BIT)
597
598#define IETF_STREAM4 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT)
599
600#define IETF_STREAM5 \
601 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
602 IETF_STREAM_FRAME_FIN_BIT)
603
604#define IETF_STREAM6 \
605 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
606 IETF_STREAM_FRAME_LEN_BIT)
607
608#define IETF_STREAM7 \
609 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
610 IETF_STREAM_FRAME_LEN_BIT | IETF_STREAM_FRAME_FIN_BIT)
611
612 {kStreamId8, kOffset8, true, false, IETF_STREAM7},
613 {kStreamId8, kOffset8, false, false, IETF_STREAM6},
614 {kStreamId8, kOffset4, true, false, IETF_STREAM7},
615 {kStreamId8, kOffset4, false, false, IETF_STREAM6},
616 {kStreamId8, kOffset2, true, false, IETF_STREAM7},
617 {kStreamId8, kOffset2, false, false, IETF_STREAM6},
618 {kStreamId8, kOffset1, true, false, IETF_STREAM7},
619 {kStreamId8, kOffset1, false, false, IETF_STREAM6},
620 {kStreamId8, kOffset0, true, false, IETF_STREAM3},
621 {kStreamId8, kOffset0, false, false, IETF_STREAM2},
622 {kStreamId4, kOffset8, true, false, IETF_STREAM7},
623 {kStreamId4, kOffset8, false, false, IETF_STREAM6},
624 {kStreamId4, kOffset4, true, false, IETF_STREAM7},
625 {kStreamId4, kOffset4, false, false, IETF_STREAM6},
626 {kStreamId4, kOffset2, true, false, IETF_STREAM7},
627 {kStreamId4, kOffset2, false, false, IETF_STREAM6},
628 {kStreamId4, kOffset1, true, false, IETF_STREAM7},
629 {kStreamId4, kOffset1, false, false, IETF_STREAM6},
630 {kStreamId4, kOffset0, true, false, IETF_STREAM3},
631 {kStreamId4, kOffset0, false, false, IETF_STREAM2},
632 {kStreamId2, kOffset8, true, false, IETF_STREAM7},
633 {kStreamId2, kOffset8, false, false, IETF_STREAM6},
634 {kStreamId2, kOffset4, true, false, IETF_STREAM7},
635 {kStreamId2, kOffset4, false, false, IETF_STREAM6},
636 {kStreamId2, kOffset2, true, false, IETF_STREAM7},
637 {kStreamId2, kOffset2, false, false, IETF_STREAM6},
638 {kStreamId2, kOffset1, true, false, IETF_STREAM7},
639 {kStreamId2, kOffset1, false, false, IETF_STREAM6},
640 {kStreamId2, kOffset0, true, false, IETF_STREAM3},
641 {kStreamId2, kOffset0, false, false, IETF_STREAM2},
642 {kStreamId1, kOffset8, true, false, IETF_STREAM7},
643 {kStreamId1, kOffset8, false, false, IETF_STREAM6},
644 {kStreamId1, kOffset4, true, false, IETF_STREAM7},
645 {kStreamId1, kOffset4, false, false, IETF_STREAM6},
646 {kStreamId1, kOffset2, true, false, IETF_STREAM7},
647 {kStreamId1, kOffset2, false, false, IETF_STREAM6},
648 {kStreamId1, kOffset1, true, false, IETF_STREAM7},
649 {kStreamId1, kOffset1, false, false, IETF_STREAM6},
650 {kStreamId1, kOffset0, true, false, IETF_STREAM3},
651 {kStreamId1, kOffset0, false, false, IETF_STREAM2},
652 {kStreamId0, kOffset8, true, false, IETF_STREAM7},
653 {kStreamId0, kOffset8, false, false, IETF_STREAM6},
654 {kStreamId0, kOffset4, true, false, IETF_STREAM7},
655 {kStreamId0, kOffset4, false, false, IETF_STREAM6},
656 {kStreamId0, kOffset2, true, false, IETF_STREAM7},
657 {kStreamId0, kOffset2, false, false, IETF_STREAM6},
658 {kStreamId0, kOffset1, true, false, IETF_STREAM7},
659 {kStreamId0, kOffset1, false, false, IETF_STREAM6},
660 {kStreamId0, kOffset0, true, false, IETF_STREAM3},
661 {kStreamId0, kOffset0, false, false, IETF_STREAM2},
662
663 {kStreamId8, kOffset8, true, true, IETF_STREAM5},
664 {kStreamId8, kOffset8, false, true, IETF_STREAM4},
665 {kStreamId8, kOffset4, true, true, IETF_STREAM5},
666 {kStreamId8, kOffset4, false, true, IETF_STREAM4},
667 {kStreamId8, kOffset2, true, true, IETF_STREAM5},
668 {kStreamId8, kOffset2, false, true, IETF_STREAM4},
669 {kStreamId8, kOffset1, true, true, IETF_STREAM5},
670 {kStreamId8, kOffset1, false, true, IETF_STREAM4},
671 {kStreamId8, kOffset0, true, true, IETF_STREAM1},
672 {kStreamId8, kOffset0, false, true, IETF_STREAM0},
673 {kStreamId4, kOffset8, true, true, IETF_STREAM5},
674 {kStreamId4, kOffset8, false, true, IETF_STREAM4},
675 {kStreamId4, kOffset4, true, true, IETF_STREAM5},
676 {kStreamId4, kOffset4, false, true, IETF_STREAM4},
677 {kStreamId4, kOffset2, true, true, IETF_STREAM5},
678 {kStreamId4, kOffset2, false, true, IETF_STREAM4},
679 {kStreamId4, kOffset1, true, true, IETF_STREAM5},
680 {kStreamId4, kOffset1, false, true, IETF_STREAM4},
681 {kStreamId4, kOffset0, true, true, IETF_STREAM1},
682 {kStreamId4, kOffset0, false, true, IETF_STREAM0},
683 {kStreamId2, kOffset8, true, true, IETF_STREAM5},
684 {kStreamId2, kOffset8, false, true, IETF_STREAM4},
685 {kStreamId2, kOffset4, true, true, IETF_STREAM5},
686 {kStreamId2, kOffset4, false, true, IETF_STREAM4},
687 {kStreamId2, kOffset2, true, true, IETF_STREAM5},
688 {kStreamId2, kOffset2, false, true, IETF_STREAM4},
689 {kStreamId2, kOffset1, true, true, IETF_STREAM5},
690 {kStreamId2, kOffset1, false, true, IETF_STREAM4},
691 {kStreamId2, kOffset0, true, true, IETF_STREAM1},
692 {kStreamId2, kOffset0, false, true, IETF_STREAM0},
693 {kStreamId1, kOffset8, true, true, IETF_STREAM5},
694 {kStreamId1, kOffset8, false, true, IETF_STREAM4},
695 {kStreamId1, kOffset4, true, true, IETF_STREAM5},
696 {kStreamId1, kOffset4, false, true, IETF_STREAM4},
697 {kStreamId1, kOffset2, true, true, IETF_STREAM5},
698 {kStreamId1, kOffset2, false, true, IETF_STREAM4},
699 {kStreamId1, kOffset1, true, true, IETF_STREAM5},
700 {kStreamId1, kOffset1, false, true, IETF_STREAM4},
701 {kStreamId1, kOffset0, true, true, IETF_STREAM1},
702 {kStreamId1, kOffset0, false, true, IETF_STREAM0},
703 {kStreamId0, kOffset8, true, true, IETF_STREAM5},
704 {kStreamId0, kOffset8, false, true, IETF_STREAM4},
705 {kStreamId0, kOffset4, true, true, IETF_STREAM5},
706 {kStreamId0, kOffset4, false, true, IETF_STREAM4},
707 {kStreamId0, kOffset2, true, true, IETF_STREAM5},
708 {kStreamId0, kOffset2, false, true, IETF_STREAM4},
709 {kStreamId0, kOffset1, true, true, IETF_STREAM5},
710 {kStreamId0, kOffset1, false, true, IETF_STREAM4},
711 {kStreamId0, kOffset0, true, true, IETF_STREAM1},
712 {kStreamId0, kOffset0, false, true, IETF_STREAM0},
713};
714
715TEST_F(QuicIetfFramerTest, StreamFrame) {
716 char packet_buffer[kNormalPacketBufferSize];
717 const char* transmit_packet_data =
718 "this is a test of some packet data, "
719 "can do a simple strcmp to see if the "
720 "input and output are the same!";
721
722 size_t transmit_packet_data_len = strlen(transmit_packet_data) + 1;
723 for (size_t i = 0; i < QUIC_ARRAYSIZE(stream_frame_to_test); ++i) {
724 SCOPED_TRACE(i);
725 struct stream_frame_variant* variant = &stream_frame_to_test[i];
726 TryStreamFrame(packet_buffer, sizeof(packet_buffer), transmit_packet_data,
727 transmit_packet_data_len, variant->stream_id,
728 variant->offset, variant->fin_bit, variant->last_frame_bit,
729 static_cast<QuicIetfFrameType>(variant->frame_type));
730 }
731}
732// As the previous test, but with no data.
733TEST_F(QuicIetfFramerTest, ZeroLengthStreamFrame) {
734 char packet_buffer[kNormalPacketBufferSize];
735
736 for (size_t i = 0; i < QUIC_ARRAYSIZE(stream_frame_to_test); ++i) {
737 SCOPED_TRACE(i);
738 struct stream_frame_variant* variant = &stream_frame_to_test[i];
739 TryStreamFrame(packet_buffer, sizeof(packet_buffer),
740 /* xmit_packet_data = */ NULL,
741 /* xmit_packet_data_size = */ 0, variant->stream_id,
742 variant->offset, variant->fin_bit, variant->last_frame_bit,
743 static_cast<QuicIetfFrameType>(variant->frame_type));
744 }
745}
746
747TEST_F(QuicIetfFramerTest, CryptoFrame) {
748 SimpleDataProducer data_producer;
749 framer_.set_data_producer(&data_producer);
750 char packet_buffer[kNormalPacketBufferSize];
751
752 QuicStringPiece frame_data("This is a CRYPTO frame.");
753
754 QuicStreamOffset offsets[] = {kOffset8, kOffset4, kOffset2, kOffset1,
755 kOffset0};
756 for (QuicStreamOffset offset : offsets) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700757 QuicCryptoFrame frame(ENCRYPTION_INITIAL, offset, frame_data.length());
758 data_producer.SaveCryptoData(ENCRYPTION_INITIAL, offset, frame_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500759
760 QuicDataWriter writer(QUIC_ARRAYSIZE(packet_buffer), packet_buffer,
761 NETWORK_BYTE_ORDER);
762
763 // Write the frame.
764 EXPECT_TRUE(QuicFramerPeer::AppendCryptoFrame(&framer_, frame, &writer));
765 EXPECT_NE(0u, writer.length());
766 // Read it back.
767 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
768 QuicCryptoFrame read_frame;
769 EXPECT_TRUE(
770 QuicFramerPeer::ProcessCryptoFrame(&framer_, &reader, &read_frame));
771
772 // Check that the frames match:
773 QuicStringPiece read_data(read_frame.data_buffer, read_frame.data_length);
774 EXPECT_EQ(read_frame.data_length, frame.data_length);
775 EXPECT_EQ(read_frame.offset, frame.offset);
776 EXPECT_EQ(read_data, frame_data);
777 }
778}
779
780TEST_F(QuicIetfFramerTest, ConnectionCloseEmptyString) {
781 char packet_buffer[kNormalPacketBufferSize];
782
783 // initialize a writer so that the serialized packet is placed in
784 // packet_buffer.
785 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
786 NETWORK_BYTE_ORDER);
787
788 // empty string,
vasilvvc48c8712019-03-11 13:38:16 -0700789 std::string test_string = "Ich Bin Ein Jelly Donut?";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500790 QuicConnectionCloseFrame sent_frame;
fkastenholze9d71a82019-04-09 05:12:13 -0700791 sent_frame.quic_error_code = static_cast<QuicErrorCode>(0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500792 sent_frame.error_details = test_string;
fkastenholze9d71a82019-04-09 05:12:13 -0700793 sent_frame.transport_close_frame_type = 123;
fkastenholz72f509b2019-04-10 09:17:49 -0700794 sent_frame.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500795 // write the frame to the packet buffer.
796 EXPECT_TRUE(QuicFramerPeer::AppendIetfConnectionCloseFrame(
797 &framer_, sent_frame, &writer));
798
799 // better have something in the packet buffer.
800 EXPECT_NE(0u, writer.length());
801
802 // now set up a reader to read in the frame.
803 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
804
805 // a QuicConnectionCloseFrame to hold the results.
806 QuicConnectionCloseFrame sink_frame;
807
fkastenholze9d71a82019-04-09 05:12:13 -0700808 EXPECT_TRUE(QuicFramerPeer::ProcessIetfConnectionCloseFrame(
809 &framer_, &reader, IETF_QUIC_TRANSPORT_CONNECTION_CLOSE, &sink_frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500810
811 // Now check that received == sent
fkastenholz72f509b2019-04-10 09:17:49 -0700812 EXPECT_EQ(sent_frame.quic_error_code, sink_frame.quic_error_code);
fkastenholze9d71a82019-04-09 05:12:13 -0700813 EXPECT_EQ(sink_frame.quic_error_code, static_cast<QuicErrorCode>(0));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500814 EXPECT_EQ(sink_frame.error_details, test_string);
fkastenholz72f509b2019-04-10 09:17:49 -0700815 EXPECT_EQ(sink_frame.close_type, sent_frame.close_type);
816 EXPECT_EQ(sent_frame.close_type, IETF_QUIC_TRANSPORT_CONNECTION_CLOSE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500817}
818
819TEST_F(QuicIetfFramerTest, ApplicationCloseEmptyString) {
820 char packet_buffer[kNormalPacketBufferSize];
821
822 // initialize a writer so that the serialized packet is placed in
823 // packet_buffer.
824 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
825 NETWORK_BYTE_ORDER);
826
827 // empty string,
vasilvvc48c8712019-03-11 13:38:16 -0700828 std::string test_string = "Ich Bin Ein Jelly Donut?";
fkastenholz72f509b2019-04-10 09:17:49 -0700829 QuicConnectionCloseFrame sent_frame;
830 sent_frame.quic_error_code = static_cast<QuicErrorCode>(0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500831 sent_frame.error_details = test_string;
fkastenholz72f509b2019-04-10 09:17:49 -0700832 sent_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500833 // write the frame to the packet buffer.
fkastenholz72f509b2019-04-10 09:17:49 -0700834 EXPECT_TRUE(QuicFramerPeer::AppendIetfConnectionCloseFrame(
835 &framer_, sent_frame, &writer));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500836
837 // better have something in the packet buffer.
838 EXPECT_NE(0u, writer.length());
839
840 // now set up a reader to read in the frame.
841 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
842
843 // a QuicConnectionCloseFrame to hold the results.
fkastenholz72f509b2019-04-10 09:17:49 -0700844 QuicConnectionCloseFrame sink_frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500845
fkastenholz72f509b2019-04-10 09:17:49 -0700846 EXPECT_TRUE(QuicFramerPeer::ProcessIetfConnectionCloseFrame(
847 &framer_, &reader, IETF_QUIC_APPLICATION_CONNECTION_CLOSE, &sink_frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500848
849 // Now check that received == sent
fkastenholz72f509b2019-04-10 09:17:49 -0700850 EXPECT_EQ(sink_frame.quic_error_code, static_cast<QuicErrorCode>(0));
851 EXPECT_EQ(sent_frame.quic_error_code, sink_frame.quic_error_code);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500852 EXPECT_EQ(sink_frame.error_details, test_string);
fkastenholz72f509b2019-04-10 09:17:49 -0700853 EXPECT_EQ(sent_frame.close_type, IETF_QUIC_APPLICATION_CONNECTION_CLOSE);
854 EXPECT_EQ(sent_frame.close_type, sink_frame.close_type);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500855}
856
857// Testing for the IETF ACK framer.
858// clang-format off
859struct ack_frame ack_frame_variants[] = {
860 {90000,
861 false,
862 0,
863 0,
864 0,
865 {{QuicPacketNumber(1000), QuicPacketNumber(2001)}},
866 IETF_ACK},
867 {0,
868 false,
869 0,
870 0,
871 0,
872 {{QuicPacketNumber(1000), QuicPacketNumber(2001)}},
873 IETF_ACK},
874 {1,
875 false,
876 0,
877 0,
878 0,
879 {{QuicPacketNumber(1), QuicPacketNumber(2)},
880 {QuicPacketNumber(5), QuicPacketNumber(6)}},
881 IETF_ACK},
882 {63,
883 false,
884 0,
885 0,
886 0,
887 {{QuicPacketNumber(1), QuicPacketNumber(2)},
888 {QuicPacketNumber(5), QuicPacketNumber(6)}},
889 IETF_ACK},
890 {64,
891 false,
892 0,
893 0,
894 0,
895 {{QuicPacketNumber(1), QuicPacketNumber(2)},
896 {QuicPacketNumber(3), QuicPacketNumber(4)},
897 {QuicPacketNumber(5), QuicPacketNumber(6)},
898 {QuicPacketNumber(7), QuicPacketNumber(8)},
899 {QuicPacketNumber(9), QuicPacketNumber(10)},
900 {QuicPacketNumber(11), QuicPacketNumber(12)}},
901 IETF_ACK},
902 {10000,
903 false,
904 0,
905 0,
906 0,
907 {{QuicPacketNumber(1), QuicPacketNumber(2)},
908 {QuicPacketNumber(3), QuicPacketNumber(4)},
909 {QuicPacketNumber(5), QuicPacketNumber(6)},
910 {QuicPacketNumber(7), QuicPacketNumber(8)},
911 {QuicPacketNumber(9), QuicPacketNumber(10)},
912 {QuicPacketNumber(11), QuicPacketNumber(12)}},
913 IETF_ACK},
914 {100000000,
915 false,
916 0,
917 0,
918 0,
919 {{QuicPacketNumber(1), QuicPacketNumber(2)},
920 {QuicPacketNumber(3), QuicPacketNumber(4)},
921 {QuicPacketNumber(5), QuicPacketNumber(6)},
922 {QuicPacketNumber(7), QuicPacketNumber(8)},
923 {QuicPacketNumber(9), QuicPacketNumber(10)},
924 {QuicPacketNumber(11), QuicPacketNumber(12)}},
925 IETF_ACK},
926 {0,
927 false,
928 0,
929 0,
930 0,
931 {{QuicPacketNumber(1), QuicPacketNumber(65)}},
932 IETF_ACK},
933 {9223372036854775807,
934 false,
935 0,
936 0,
937 0,
938 {{QuicPacketNumber(1), QuicPacketNumber(11)},
939 {QuicPacketNumber(74), QuicPacketNumber(138)}},
940 IETF_ACK},
941 // This ack is for packets 60 & 125. There are 64 packets in the gap.
942 // The encoded value is gap_size - 1, or 63. Crosses a VarInt62 encoding
943 // boundary...
944 {1,
945 false,
946 0,
947 0,
948 0,
949 {{QuicPacketNumber(60), QuicPacketNumber(61)},
950 {QuicPacketNumber(125), QuicPacketNumber(126)}},
951 IETF_ACK},
952 {2,
953 false,
954 0,
955 0,
956 0,
957 {{QuicPacketNumber(1), QuicPacketNumber(65)},
958 {QuicPacketNumber(129), QuicPacketNumber(130)}},
959 IETF_ACK},
960 {3,
961 false,
962 0,
963 0,
964 0,
965 {{QuicPacketNumber(1), QuicPacketNumber(65)},
966 {QuicPacketNumber(129), QuicPacketNumber(195)}},
967 IETF_ACK},
968 {4,
969 false,
970 0,
971 0,
972 0,
973 {{QuicPacketNumber(1), QuicPacketNumber(65)},
974 {QuicPacketNumber(129), QuicPacketNumber(194)}},
975 IETF_ACK},
976 {5,
977 false,
978 0,
979 0,
980 0,
981 {{QuicPacketNumber(1), QuicPacketNumber(65)},
982 {QuicPacketNumber(129), QuicPacketNumber(193)}},
983 IETF_ACK},
984 {6,
985 false,
986 0,
987 0,
988 0,
989 {{QuicPacketNumber(1), QuicPacketNumber(65)},
990 {QuicPacketNumber(129), QuicPacketNumber(192)}},
991 IETF_ACK},
992 // declare some ack_ecn frames to try.
993 {6,
994 false,
995 100,
996 200,
997 300,
998 {{QuicPacketNumber(1), QuicPacketNumber(65)},
999 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1000 IETF_ACK},
1001 {6,
1002 true,
1003 100,
1004 200,
1005 300,
1006 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1007 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1008 IETF_ACK_ECN},
1009 {6,
1010 true,
1011 100,
1012 0,
1013 0,
1014 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1015 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1016 IETF_ACK_ECN},
1017 {6,
1018 true,
1019 0,
1020 200,
1021 0,
1022 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1023 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1024 IETF_ACK_ECN},
1025 {6,
1026 true,
1027 0,
1028 0,
1029 300,
1030 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1031 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1032 IETF_ACK_ECN},
1033 {6,
1034 true,
1035 0,
1036 0,
1037 0,
1038 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1039 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1040 IETF_ACK},
1041};
1042// clang-format on
1043
1044TEST_F(QuicIetfFramerTest, AckFrame) {
1045 char packet_buffer[kNormalPacketBufferSize];
1046 for (auto ack_frame_variant : ack_frame_variants) {
1047 EXPECT_TRUE(
1048 TryAckFrame(packet_buffer, sizeof(packet_buffer), &ack_frame_variant));
1049 }
1050}
1051
1052// Test the case of having a QuicAckFrame with no ranges in it. By
1053// examination of the Google Quic Ack code and tests, this case should
1054// be handled as an ack with no "ranges after the first"; the
1055// AckBlockCount should be 0 and the FirstAckBlock should be
1056// |LargestAcked| - 1 (number of packets preceding the LargestAcked.
1057TEST_F(QuicIetfFramerTest, AckFrameNoRanges) {
1058 char packet_buffer[kNormalPacketBufferSize];
1059
1060 // Make a writer so that the serialized packet is placed in
1061 // packet_buffer.
1062 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1063 NETWORK_BYTE_ORDER);
1064
1065 QuicAckFrame transmit_frame;
1066 transmit_frame.largest_acked = QuicPacketNumber(1);
1067 transmit_frame.ack_delay_time = QuicTime::Delta::FromMicroseconds(0);
1068
1069 size_t expected_size =
1070 QuicFramerPeer::GetIetfAckFrameSize(&framer_, transmit_frame);
1071 // Write the frame to the packet buffer.
1072 EXPECT_TRUE(QuicFramerPeer::AppendIetfAckFrameAndTypeByte(
1073 &framer_, transmit_frame, &writer));
1074
1075 uint8_t packet[] = {
1076 0x02, // type, IETF_ACK
1077 0x01, // largest_acked,
1078 0x00, // delay
1079 0x00, // count of additional ack blocks
1080 0x00, // size of first ack block (packets preceding largest_acked)
1081 };
1082 EXPECT_EQ(expected_size, sizeof(packet));
1083 EXPECT_EQ(sizeof(packet), writer.length());
1084 EXPECT_EQ(0, memcmp(packet, packet_buffer, writer.length()));
1085
1086 // Now set up a reader to read in the frame.
1087 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1088
1089 // an AckFrame to hold the results
1090 QuicAckFrame receive_frame;
1091
1092 // read in the frame type
1093 uint8_t received_frame_type;
1094 EXPECT_TRUE(reader.ReadUInt8(&received_frame_type));
1095 EXPECT_EQ(received_frame_type, IETF_ACK);
1096
1097 EXPECT_TRUE(QuicFramerPeer::ProcessIetfAckFrame(&framer_, &reader, IETF_ACK,
1098 &receive_frame));
1099
1100 // Now check that the received frame matches the sent frame.
1101 EXPECT_EQ(transmit_frame.largest_acked, receive_frame.largest_acked);
1102}
1103
1104TEST_F(QuicIetfFramerTest, PathChallengeFrame) {
1105 // Double-braces needed on some platforms due to
1106 // https://bugs.llvm.org/show_bug.cgi?id=21629
1107 QuicPathFrameBuffer buffer0 = {{0, 0, 0, 0, 0, 0, 0, 0}};
1108 QuicPathFrameBuffer buffer1 = {
1109 {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
1110 char packet_buffer[kNormalPacketBufferSize];
1111 EXPECT_TRUE(
1112 TryPathChallengeFrame(packet_buffer, sizeof(packet_buffer), buffer0));
1113 EXPECT_TRUE(
1114 TryPathChallengeFrame(packet_buffer, sizeof(packet_buffer), buffer1));
1115}
1116
1117TEST_F(QuicIetfFramerTest, PathResponseFrame) {
1118 // Double-braces needed on some platforms due to
1119 // https://bugs.llvm.org/show_bug.cgi?id=21629
1120 QuicPathFrameBuffer buffer0 = {{0, 0, 0, 0, 0, 0, 0, 0}};
1121 QuicPathFrameBuffer buffer1 = {
1122 {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
1123 char packet_buffer[kNormalPacketBufferSize];
1124 EXPECT_TRUE(
1125 TryPathResponseFrame(packet_buffer, sizeof(packet_buffer), buffer0));
1126 EXPECT_TRUE(
1127 TryPathResponseFrame(packet_buffer, sizeof(packet_buffer), buffer1));
1128}
1129
1130TEST_F(QuicIetfFramerTest, ResetStreamFrame) {
1131 char packet_buffer[kNormalPacketBufferSize];
1132 struct resets {
1133 QuicStreamId stream_id;
1134 uint16_t error_code;
1135 QuicStreamOffset final_offset;
1136 } reset_frames[] = {
1137 {0, 55, 0},
1138 {0x10, 73, 0x300},
1139 };
1140 for (auto reset : reset_frames) {
1141 TryResetFrame(packet_buffer, sizeof(packet_buffer), reset.stream_id,
1142 reset.error_code, reset.final_offset);
1143 }
1144}
1145
1146TEST_F(QuicIetfFramerTest, StopSendingFrame) {
1147 char packet_buffer[kNormalPacketBufferSize];
1148
1149 // Make a writer so that the serialized packet is placed in
1150 // packet_buffer.
1151 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1152 NETWORK_BYTE_ORDER);
1153
1154 QuicStopSendingFrame transmit_frame;
1155 transmit_frame.stream_id = 12345;
1156 transmit_frame.application_error_code = 543;
1157
1158 // Write the frame to the packet buffer.
1159 EXPECT_TRUE(QuicFramerPeer::AppendStopSendingFrame(&framer_, transmit_frame,
1160 &writer));
1161 // Check that the number of bytes in the buffer is in the
1162 // allowed range.
1163 EXPECT_LE(3u, writer.length());
1164 EXPECT_GE(10u, writer.length());
1165
1166 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1167
1168 // A frame to hold the results
1169 QuicStopSendingFrame receive_frame;
1170
1171 EXPECT_TRUE(QuicFramerPeer::ProcessStopSendingFrame(&framer_, &reader,
1172 &receive_frame));
1173
1174 // Verify that the transmitted and received values are the same.
1175 EXPECT_EQ(receive_frame.stream_id, 12345u);
1176 EXPECT_EQ(receive_frame.application_error_code, 543u);
1177 EXPECT_EQ(receive_frame.stream_id, transmit_frame.stream_id);
1178 EXPECT_EQ(receive_frame.application_error_code,
1179 transmit_frame.application_error_code);
1180}
1181
1182TEST_F(QuicIetfFramerTest, MaxDataFrame) {
1183 char packet_buffer[kNormalPacketBufferSize];
1184 QuicStreamOffset window_sizes[] = {0, 1, 2, 5, 10,
1185 20, 50, 100, 200, 500,
1186 1000000, kOffset8, kOffset4, kOffset2};
1187 for (QuicStreamOffset window_size : window_sizes) {
1188 memset(packet_buffer, 0, sizeof(packet_buffer));
1189
1190 // Set up the writer and transmit QuicWindowUpdateFrame
1191 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1192 NETWORK_BYTE_ORDER);
1193 QuicWindowUpdateFrame transmit_frame(0, 99, window_size);
1194
1195 // Add the frame.
1196 EXPECT_TRUE(
1197 QuicFramerPeer::AppendMaxDataFrame(&framer_, transmit_frame, &writer));
1198
1199 // Check that the number of bytes in the buffer is in the expected range.
1200 EXPECT_LE(1u, writer.length());
1201 EXPECT_GE(8u, writer.length());
1202
1203 // Set up reader and an empty QuicWindowUpdateFrame
1204 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1205 QuicWindowUpdateFrame receive_frame;
1206
1207 // Deframe it
1208 EXPECT_TRUE(
1209 QuicFramerPeer::ProcessMaxDataFrame(&framer_, &reader, &receive_frame));
1210
1211 // Now check that the received data equals the sent data.
1212 EXPECT_EQ(transmit_frame.byte_offset, window_size);
1213 EXPECT_EQ(transmit_frame.byte_offset, receive_frame.byte_offset);
1214 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
1215 receive_frame.stream_id);
1216 }
1217}
1218
1219TEST_F(QuicIetfFramerTest, MaxStreamDataFrame) {
1220 char packet_buffer[kNormalPacketBufferSize];
1221 QuicStreamOffset window_sizes[] = {0, 1, 2, 5, 10,
1222 20, 50, 100, 200, 500,
1223 1000000, kOffset8, kOffset4, kOffset2};
1224 QuicIetfStreamId stream_ids[] = {kStreamId4, kStreamId2, kStreamId1,
1225 kStreamId0};
1226
1227 for (QuicIetfStreamId stream_id : stream_ids) {
1228 for (QuicStreamOffset window_size : window_sizes) {
1229 memset(packet_buffer, 0, sizeof(packet_buffer));
1230
1231 // Set up the writer and transmit QuicWindowUpdateFrame
1232 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1233 NETWORK_BYTE_ORDER);
1234 QuicWindowUpdateFrame transmit_frame(0, stream_id, window_size);
1235
1236 // Add the frame.
1237 EXPECT_TRUE(QuicFramerPeer::AppendMaxStreamDataFrame(
1238 &framer_, transmit_frame, &writer));
1239
1240 // Check that number of bytes in the buffer is in the expected range.
1241 EXPECT_LE(2u, writer.length());
1242 EXPECT_GE(16u, writer.length());
1243
1244 // Set up reader and empty receive QuicPaddingFrame.
1245 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1246 QuicWindowUpdateFrame receive_frame;
1247
1248 // Deframe it
1249 EXPECT_TRUE(QuicFramerPeer::ProcessMaxStreamDataFrame(&framer_, &reader,
1250 &receive_frame));
1251
1252 // Now check that received data and sent data are equal.
1253 EXPECT_EQ(transmit_frame.byte_offset, window_size);
1254 EXPECT_EQ(transmit_frame.byte_offset, receive_frame.byte_offset);
1255 EXPECT_EQ(stream_id, receive_frame.stream_id);
1256 EXPECT_EQ(transmit_frame.stream_id, receive_frame.stream_id);
1257 }
1258 }
1259}
1260
1261TEST_F(QuicIetfFramerTest, MaxStreamsFrame) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07001262 QuicStreamCount stream_counts[] = {0x3fffffff, 0x3fff, 0x3f, 0x1};
QUICHE teama6ef0a62019-03-07 20:34:33 -05001263
fkastenholz3c4eabf2019-04-22 07:49:59 -07001264 for (QuicStreamCount stream_count : stream_counts) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001265 // Cover all four combinations of uni/bi-directional and
1266 // server-/client- initiation.
fkastenholz3c4eabf2019-04-22 07:49:59 -07001267 TryMaxStreamsFrame(stream_count, /*unidirectional=*/true,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001268 /*stream_id_server_initiated=*/true);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001269 TryMaxStreamsFrame(stream_count, /*unidirectional=*/true,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001270 /*stream_id_server_initiated=*/false);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001271 TryMaxStreamsFrame(stream_count, /*unidirectional=*/false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001272 /*stream_id_server_initiated=*/true);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001273 TryMaxStreamsFrame(stream_count, /*unidirectional=*/false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001274 /*stream_id_server_initiated=*/false);
1275 }
1276}
1277
1278TEST_F(QuicIetfFramerTest, BlockedFrame) {
1279 char packet_buffer[kNormalPacketBufferSize];
1280 QuicStreamOffset offsets[] = {kOffset8, kOffset4, kOffset2, kOffset1,
1281 kOffset0};
1282
1283 for (QuicStreamOffset offset : offsets) {
1284 memset(packet_buffer, 0, sizeof(packet_buffer));
1285
1286 // Set up the writer and transmit QuicBlockedFrame
1287 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1288 NETWORK_BYTE_ORDER);
1289 QuicBlockedFrame transmit_frame(
1290 0, QuicUtils::GetInvalidStreamId(framer_.transport_version()), offset);
1291
1292 // Add the frame.
1293 EXPECT_TRUE(QuicFramerPeer::AppendIetfBlockedFrame(&framer_, transmit_frame,
1294 &writer));
1295
1296 // Check that buffer length is in the expected range
1297 EXPECT_LE(1u, writer.length());
1298 EXPECT_GE(8u, writer.length());
1299
1300 // Set up reader and empty receive QuicFrame.
1301 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1302 QuicBlockedFrame receive_frame;
1303
1304 // Deframe it
1305 EXPECT_TRUE(QuicFramerPeer::ProcessIetfBlockedFrame(&framer_, &reader,
1306 &receive_frame));
1307
1308 // Check that received and sent data are equivalent
1309 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
1310 receive_frame.stream_id);
1311 EXPECT_EQ(offset, receive_frame.offset);
1312 EXPECT_EQ(transmit_frame.offset, receive_frame.offset);
1313 }
1314}
1315
1316TEST_F(QuicIetfFramerTest, StreamBlockedFrame) {
1317 char packet_buffer[kNormalPacketBufferSize];
1318 QuicStreamOffset offsets[] = {0, 1, 2, 5, 10,
1319 20, 50, 100, 200, 500,
1320 1000000, kOffset8, kOffset4, kOffset2};
1321 QuicIetfStreamId stream_ids[] = {kStreamId4, kStreamId2, kStreamId1,
1322 kStreamId0};
1323
1324 for (QuicIetfStreamId stream_id : stream_ids) {
1325 for (QuicStreamOffset offset : offsets) {
1326 memset(packet_buffer, 0, sizeof(packet_buffer));
1327
1328 // Set up the writer and transmit QuicWindowUpdateFrame
1329 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1330 NETWORK_BYTE_ORDER);
1331 QuicBlockedFrame transmit_frame(0, stream_id, offset);
1332
1333 // Add the frame.
1334 EXPECT_TRUE(QuicFramerPeer::AppendStreamBlockedFrame(
1335 &framer_, transmit_frame, &writer));
1336
1337 // Check that number of bytes in the buffer is in the expected range.
1338 EXPECT_LE(2u, writer.length());
1339 EXPECT_GE(16u, writer.length());
1340
1341 // Set up reader and empty receive QuicPaddingFrame.
1342 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1343 QuicBlockedFrame receive_frame;
1344
1345 // Deframe it
1346 EXPECT_TRUE(QuicFramerPeer::ProcessStreamBlockedFrame(&framer_, &reader,
1347 &receive_frame));
1348
1349 // Now check that received == sent
1350 EXPECT_EQ(transmit_frame.offset, offset);
1351 EXPECT_EQ(transmit_frame.offset, receive_frame.offset);
1352 EXPECT_EQ(stream_id, receive_frame.stream_id);
1353 EXPECT_EQ(transmit_frame.stream_id, receive_frame.stream_id);
1354 }
1355 }
1356}
1357
1358TEST_F(QuicIetfFramerTest, StreamsBlockedFrame) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07001359 QuicStreamCount stream_counts[] = {0x3fffffff, 0x3fff, 0x3f, 0x1};
QUICHE teama6ef0a62019-03-07 20:34:33 -05001360
fkastenholz3c4eabf2019-04-22 07:49:59 -07001361 for (QuicStreamCount stream_count : stream_counts) {
1362 TryStreamsBlockedFrame(stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001363 /*unidirectional=*/false,
1364 /*stream_id_server_initiated=*/false);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001365 TryStreamsBlockedFrame(stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001366 /*unidirectional=*/false,
1367 /*stream_id_server_initiated=*/true);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001368 TryStreamsBlockedFrame(stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001369 /*unidirectional=*/true,
1370 /*stream_id_server_initiated=*/false);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001371 TryStreamsBlockedFrame(stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001372 /*unidirectional=*/true,
1373 /*stream_id_server_initiated=*/true);
1374 }
1375}
1376
1377TEST_F(QuicIetfFramerTest, NewConnectionIdFrame) {
1378 char packet_buffer[kNormalPacketBufferSize];
1379
1380 QuicNewConnectionIdFrame transmit_frame;
1381 transmit_frame.connection_id = TestConnectionId(UINT64_C(0x0edcba9876543201));
1382 transmit_frame.sequence_number = 0x01020304;
fkastenholz1c19fc22019-07-12 11:06:19 -07001383 transmit_frame.retire_prior_to = 0x00020304;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001384 // The token is defined as a uint128 -- a 16-byte integer.
1385 // The value is set in this manner because we want each
1386 // byte to have a specific value so that the binary
1387 // packet check (below) is good. If we used integer
1388 // operations (eg. "token = 0x12345...") then the bytes
1389 // would be set in host order.
1390 unsigned char token_bytes[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
1391 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
1392 0x0c, 0x0d, 0x0e, 0x0f};
1393 memcpy(&transmit_frame.stateless_reset_token, token_bytes,
1394 sizeof(transmit_frame.stateless_reset_token));
1395
1396 memset(packet_buffer, 0, sizeof(packet_buffer));
1397
fkastenholz3c4eabf2019-04-22 07:49:59 -07001398 // Set up the writer and transmit a QuicNewConnectionIdFrame
QUICHE teama6ef0a62019-03-07 20:34:33 -05001399 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1400 NETWORK_BYTE_ORDER);
1401
1402 // Add the frame.
1403 EXPECT_TRUE(QuicFramerPeer::AppendNewConnectionIdFrame(
1404 &framer_, transmit_frame, &writer));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001405 // clang-format off
1406 uint8_t packet[] = {
1407 // sequence number, 0x80 for varint62 encoding
1408 0x80 + 0x01, 0x02, 0x03, 0x04,
fkastenholz1c19fc22019-07-12 11:06:19 -07001409 // retire_prior_to, 0x80 for varint62 encoding
1410 0x80 + 0x00, 0x02, 0x03, 0x04,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001411 // new connection id length, is not varint62 encoded.
1412 0x08,
1413 // new connection id, is not varint62 encoded.
1414 0x0E, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x01,
1415 // the reset token:
1416 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1417 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
1418 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001419 // clang-format on
fkastenholz1c19fc22019-07-12 11:06:19 -07001420
1421 // Check that buffer length is correct
1422 EXPECT_EQ(sizeof(packet), writer.length());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001423 EXPECT_EQ(0, memcmp(packet_buffer, packet, sizeof(packet)));
1424
1425 // Set up reader and empty receive QuicPaddingFrame.
1426 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1427 QuicNewConnectionIdFrame receive_frame;
1428
1429 // Deframe it
1430 EXPECT_TRUE(QuicFramerPeer::ProcessNewConnectionIdFrame(&framer_, &reader,
1431 &receive_frame));
1432
1433 // Now check that received == sent
1434 EXPECT_EQ(transmit_frame.connection_id, receive_frame.connection_id);
1435 EXPECT_EQ(transmit_frame.sequence_number, receive_frame.sequence_number);
fkastenholz1c19fc22019-07-12 11:06:19 -07001436 EXPECT_EQ(transmit_frame.retire_prior_to, receive_frame.retire_prior_to);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001437 EXPECT_EQ(transmit_frame.stateless_reset_token,
1438 receive_frame.stateless_reset_token);
1439}
1440
1441TEST_F(QuicIetfFramerTest, RetireConnectionIdFrame) {
1442 char packet_buffer[kNormalPacketBufferSize];
1443
1444 QuicRetireConnectionIdFrame transmit_frame;
1445 transmit_frame.sequence_number = 0x01020304;
1446
1447 memset(packet_buffer, 0, sizeof(packet_buffer));
1448
fkastenholz3c4eabf2019-04-22 07:49:59 -07001449 // Set up the writer and transmit QuicRetireConnectionIdFrame
QUICHE teama6ef0a62019-03-07 20:34:33 -05001450 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1451 NETWORK_BYTE_ORDER);
1452
1453 // Add the frame.
1454 EXPECT_TRUE(QuicFramerPeer::AppendRetireConnectionIdFrame(
1455 &framer_, transmit_frame, &writer));
1456 // Check that buffer length is correct
1457 EXPECT_EQ(4u, writer.length());
1458 // clang-format off
1459 uint8_t packet[] = {
1460 // sequence number, 0x80 for varint62 encoding
1461 0x80 + 0x01, 0x02, 0x03, 0x04,
1462 };
1463
1464 // clang-format on
1465 EXPECT_EQ(0, memcmp(packet_buffer, packet, sizeof(packet)));
1466
1467 // Set up reader and empty receive QuicPaddingFrame.
1468 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1469 QuicRetireConnectionIdFrame receive_frame;
1470
1471 // Deframe it
1472 EXPECT_TRUE(QuicFramerPeer::ProcessRetireConnectionIdFrame(&framer_, &reader,
1473 &receive_frame));
1474
1475 // Now check that received == sent
1476 EXPECT_EQ(transmit_frame.sequence_number, receive_frame.sequence_number);
1477}
1478
1479} // namespace
1480} // namespace test
1481} // namespace quic