blob: 9e4f3b061074e250cdd657ea0b739a493babfa13 [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>
23#include <vector>
24
25#include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h"
26#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
27#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
28#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
29#include "net/third_party/quiche/src/quic/core/quic_data_reader.h"
30#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
31#include "net/third_party/quiche/src/quic/core/quic_packets.h"
32#include "net/third_party/quiche/src/quic/core/quic_utils.h"
33#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
34#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
35#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
36#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
37#include "net/third_party/quiche/src/quic/platform/api/quic_string.h"
38#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
94 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override {}
95
96 void OnVersionNegotiationPacket(
97 const QuicVersionNegotiationPacket& packet) override {}
98
99 bool OnProtocolVersionMismatch(ParsedQuicVersion received_version,
100 PacketHeaderFormat form) override {
101 return true;
102 }
103
104 bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override {
105 return true;
106 }
107
108 bool OnUnauthenticatedHeader(const QuicPacketHeader& header) override {
109 return true;
110 }
111
112 void OnDecryptedPacket(EncryptionLevel level) override {}
113
114 bool OnPacketHeader(const QuicPacketHeader& header) override { return true; }
115
116 void OnCoalescedPacket(const QuicEncryptedPacket& packet) override {}
117
118 bool OnStreamFrame(const QuicStreamFrame& frame) override { return true; }
119
120 bool OnCryptoFrame(const QuicCryptoFrame& frame) override { return true; }
121
122 bool OnAckFrameStart(QuicPacketNumber largest_acked,
123 QuicTime::Delta ack_delay_time) override {
124 return true;
125 }
126
127 bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override {
128 return true;
129 }
130
131 bool OnAckTimestamp(QuicPacketNumber packet_number,
132 QuicTime timestamp) override {
133 return true;
134 }
135
136 bool OnAckFrameEnd(QuicPacketNumber start) override { return true; }
137
138 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override {
139 return true;
140 }
141
142 bool OnPaddingFrame(const QuicPaddingFrame& frame) override { return true; }
143
144 bool OnPingFrame(const QuicPingFrame& frame) override { return true; }
145
146 bool OnMessageFrame(const QuicMessageFrame& frame) override { return true; }
147
148 void OnPacketComplete() override {}
149
150 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override {
151 return true;
152 }
153
154 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override {
155 return true;
156 }
157
158 bool OnApplicationCloseFrame(
159 const QuicApplicationCloseFrame& frame) override {
160 return true;
161 }
162
163 bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override {
164 return true;
165 }
166
167 bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override {
168 return true;
169 }
170 bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override {
171 return true;
172 }
173
174 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override { return true; }
175
176 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override {
177 return true;
178 }
179
180 bool OnBlockedFrame(const QuicBlockedFrame& frame) override { return true; }
181
182 bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override {
183 return true;
184 }
185
186 bool OnRetireConnectionIdFrame(
187 const QuicRetireConnectionIdFrame& frame) override {
188 return true;
189 }
190
191 bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override { return true; }
192
193 bool IsValidStatelessResetToken(QuicUint128 token) const override {
194 return true;
195 }
196
197 void OnAuthenticatedIetfStatelessResetPacket(
198 const QuicIetfStatelessResetPacket& packet) override {}
199
200 bool OnMaxStreamIdFrame(const QuicMaxStreamIdFrame& frame) override {
201 return true;
202 }
203
204 bool OnStreamIdBlockedFrame(const QuicStreamIdBlockedFrame& frame) override {
205 return true;
206 }
207};
208
209class QuicIetfFramerTest : public QuicTestWithParam<ParsedQuicVersion> {
210 public:
211 QuicIetfFramerTest()
212 : start_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(0x10)),
213 framer_(AllSupportedVersions(),
214 start_,
215 Perspective::IS_SERVER,
216 kQuicDefaultConnectionIdLength) {
217 framer_.set_visitor(&visitor_);
218 }
219
220 // Utility functions to do actual framing/deframing.
221 void TryStreamFrame(char* packet_buffer,
222 size_t packet_buffer_size,
223 const char* xmit_packet_data,
224 size_t xmit_packet_data_size,
225 QuicIetfStreamId stream_id,
226 QuicIetfStreamOffset offset,
227 bool fin_bit,
228 bool last_frame_bit,
229 QuicIetfFrameType frame_type) {
230 // initialize a writer so that the serialized packet is placed in
231 // packet_buffer.
232 QuicDataWriter writer(packet_buffer_size, packet_buffer,
233 NETWORK_BYTE_ORDER); // do not really care
234 // about endianness.
235 // set up to define the source frame we wish to send.
236 QuicStreamFrame source_stream_frame(
237 stream_id, fin_bit, offset, xmit_packet_data, xmit_packet_data_size);
238
239 // Write the frame to the packet buffer.
240 EXPECT_TRUE(QuicFramerPeer::AppendIetfStreamFrame(
241 &framer_, source_stream_frame, last_frame_bit, &writer));
242 // Better have something in the packet buffer.
243 EXPECT_NE(0u, writer.length());
244 // Now set up a reader to read in the frame.
245 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
246
247 // A StreamFrame to hold the results... we know the frame type,
248 // put it into the QuicIetfStreamFrame
249 QuicStreamFrame sink_stream_frame;
250 if (xmit_packet_data_size) {
251 EXPECT_EQ(sink_stream_frame.data_buffer, nullptr);
252 EXPECT_EQ(sink_stream_frame.data_length, 0u);
253 }
254
255 EXPECT_TRUE(QuicFramerPeer::ProcessIetfStreamFrame(
256 &framer_, &reader, frame_type, &sink_stream_frame));
257
258 // Now check that the streamid, fin-bit, offset, and
259 // data len all match the input.
260 EXPECT_EQ(sink_stream_frame.stream_id, source_stream_frame.stream_id);
261 EXPECT_EQ(sink_stream_frame.fin, source_stream_frame.fin);
262 EXPECT_EQ(sink_stream_frame.data_length, source_stream_frame.data_length);
263 if (frame_type & IETF_STREAM_FRAME_OFF_BIT) {
264 // There was an offset in the frame, see if xmit and rcv vales equal.
265 EXPECT_EQ(sink_stream_frame.offset, source_stream_frame.offset);
266 } else {
267 // Offset not in frame, so it better come out 0.
268 EXPECT_EQ(sink_stream_frame.offset, 0u);
269 }
270 if (xmit_packet_data_size) {
271 ASSERT_NE(sink_stream_frame.data_buffer, nullptr);
272 ASSERT_NE(source_stream_frame.data_buffer, nullptr);
273 EXPECT_EQ(strcmp(sink_stream_frame.data_buffer,
274 source_stream_frame.data_buffer),
275 0);
276 } else {
277 // No data in the frame.
278 EXPECT_EQ(source_stream_frame.data_length, 0u);
279 EXPECT_EQ(sink_stream_frame.data_length, 0u);
280 }
281 }
282
283 // Overall ack frame encode/decode/compare function
284 // Encodes an ack frame as specified at |*frame|
285 // Then decodes the frame,
286 // Then compares the two
287 // Does some basic checking:
288 // - did the writer write something?
289 // - did the reader read the entire packet?
290 // - did the things the reader read match what the writer wrote?
291 // Returns true if it all worked false if not.
292 bool TryAckFrame(char* packet_buffer,
293 size_t packet_buffer_size,
294 struct ack_frame* frame) {
295 QuicAckFrame transmit_frame = InitAckFrame(frame->ranges);
296 if (frame->is_ack_ecn) {
297 transmit_frame.ecn_counters_populated = true;
298 transmit_frame.ect_0_count = frame->ect_0_count;
299 transmit_frame.ect_1_count = frame->ect_1_count;
300 transmit_frame.ecn_ce_count = frame->ecn_ce_count;
301 }
302 transmit_frame.ack_delay_time =
303 QuicTime::Delta::FromMicroseconds(frame->delay_time);
304 size_t expected_size =
305 QuicFramerPeer::GetIetfAckFrameSize(&framer_, transmit_frame);
306
307 // Make a writer so that the serialized packet is placed in
308 // packet_buffer.
309 QuicDataWriter writer(expected_size, packet_buffer, NETWORK_BYTE_ORDER);
310
311 // Write the frame to the packet buffer.
312 EXPECT_TRUE(QuicFramerPeer::AppendIetfAckFrameAndTypeByte(
313 &framer_, transmit_frame, &writer));
314
315 size_t expected_frame_length = QuicFramerPeer::ComputeFrameLength(
316 &framer_, QuicFrame(&transmit_frame), false,
317 static_cast<QuicPacketNumberLength>(123456u));
318
319 // Encoded length should match what ComputeFrameLength returns
320 EXPECT_EQ(expected_frame_length, writer.length());
321 // and what is in the buffer should be the expected size.
322 EXPECT_EQ(expected_size, writer.length()) << "Frame is " << transmit_frame;
323 // Now set up a reader to read in the frame.
324 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
325
326 // read in the frame type
327 uint8_t received_frame_type;
328 EXPECT_TRUE(reader.ReadUInt8(&received_frame_type));
329 EXPECT_EQ(frame->expected_frame_type, received_frame_type);
330
331 // an AckFrame to hold the results
332 QuicAckFrame receive_frame;
333
334 EXPECT_TRUE(QuicFramerPeer::ProcessIetfAckFrame(
335 &framer_, &reader, received_frame_type, &receive_frame));
336
337 if (frame->is_ack_ecn &&
338 (frame->ect_0_count || frame->ect_1_count || frame->ecn_ce_count)) {
339 EXPECT_TRUE(receive_frame.ecn_counters_populated);
340 EXPECT_EQ(receive_frame.ect_0_count, frame->ect_0_count);
341 EXPECT_EQ(receive_frame.ect_1_count, frame->ect_1_count);
342 EXPECT_EQ(receive_frame.ecn_ce_count, frame->ecn_ce_count);
343 } else {
344 EXPECT_FALSE(receive_frame.ecn_counters_populated);
345 EXPECT_EQ(receive_frame.ect_0_count, 0u);
346 EXPECT_EQ(receive_frame.ect_1_count, 0u);
347 EXPECT_EQ(receive_frame.ecn_ce_count, 0u);
348 }
349
350 // Now check that the received frame matches the sent frame.
351 EXPECT_EQ(transmit_frame.largest_acked, receive_frame.largest_acked);
352 // The ~0x7 needs some explaining. The ack frame format down shifts the
353 // delay time by 3 (divide by 8) to allow for greater ranges in delay time.
354 // Therefore, if we give the framer a delay time that is not an
355 // even multiple of 8, the value that the deframer produces will
356 // not be the same as what the framer got. The downshift on
357 // framing and upshift on deframing results in clearing the 3
358 // low-order bits ... The masking basically does the same thing,
359 // so the compare works properly.
360 return true;
361 }
362
363 // encode, decode, and check a Path Challenge frame.
364 bool TryPathChallengeFrame(char* packet_buffer,
365 size_t packet_buffer_size,
366 const QuicPathFrameBuffer& data) {
367 // Make a writer so that the serialized packet is placed in
368 // packet_buffer.
369 QuicDataWriter writer(packet_buffer_size, packet_buffer,
370 NETWORK_BYTE_ORDER);
371
372 QuicPathChallengeFrame transmit_frame(0, data);
373
374 // write the frame to the packet buffer.
375 EXPECT_TRUE(QuicFramerPeer::AppendPathChallengeFrame(
376 &framer_, transmit_frame, &writer));
377
378 // Check for correct length in the packet buffer.
379 EXPECT_EQ(kQuicPathChallengeFrameSize, writer.length());
380
381 // now set up a reader to read in the frame.
382 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
383
384 QuicPathChallengeFrame receive_frame;
385
386 EXPECT_TRUE(QuicFramerPeer::ProcessPathChallengeFrame(&framer_, &reader,
387 &receive_frame));
388
389 // Now check that the received frame matches the sent frame.
390 EXPECT_EQ(
391 0, memcmp(transmit_frame.data_buffer.data(),
392 receive_frame.data_buffer.data(), kQuicPathFrameBufferSize));
393 return true;
394 }
395
396 // encode, decode, and check a Path Response frame.
397 bool TryPathResponseFrame(char* packet_buffer,
398 size_t packet_buffer_size,
399 const QuicPathFrameBuffer& data) {
400 // Make a writer so that the serialized packet is placed in
401 // packet_buffer.
402 QuicDataWriter writer(packet_buffer_size, packet_buffer,
403 NETWORK_BYTE_ORDER);
404
405 QuicPathResponseFrame transmit_frame(0, data);
406
407 // Write the frame to the packet buffer.
408 EXPECT_TRUE(QuicFramerPeer::AppendPathResponseFrame(
409 &framer_, transmit_frame, &writer));
410
411 // Check for correct length in the packet buffer.
412 EXPECT_EQ(kQuicPathResponseFrameSize, writer.length());
413
414 // Set up a reader to read in the frame.
415 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
416
417 QuicPathResponseFrame receive_frame;
418
419 EXPECT_TRUE(QuicFramerPeer::ProcessPathResponseFrame(&framer_, &reader,
420 &receive_frame));
421
422 // Now check that the received frame matches the sent frame.
423 EXPECT_EQ(
424 0, memcmp(transmit_frame.data_buffer.data(),
425 receive_frame.data_buffer.data(), kQuicPathFrameBufferSize));
426 return true;
427 }
428
429 // Test the Serialization/deserialization of a Reset Stream Frame.
430 void TryResetFrame(char* packet_buffer,
431 size_t packet_buffer_size,
432 QuicStreamId stream_id,
433 uint16_t error_code,
434 QuicStreamOffset final_offset) {
435 // Initialize a writer so that the serialized packet is placed in
436 // packet_buffer.
437 QuicDataWriter writer(packet_buffer_size, packet_buffer,
438 NETWORK_BYTE_ORDER);
439
440 QuicRstStreamFrame transmit_frame(static_cast<QuicControlFrameId>(1),
441 stream_id, error_code, final_offset);
442
443 // Write the frame to the packet buffer.
444 EXPECT_TRUE(QuicFramerPeer::AppendIetfResetStreamFrame(
445 &framer_, transmit_frame, &writer));
446 // Check that the size of the serialzed frame is in the allowed range.
447 EXPECT_LT(3u, writer.length());
448 EXPECT_GT(19u, writer.length());
449 // Now set up a reader to read in the thing in.
450 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
451
452 // A QuicRstStreamFrame to hold the results
453 QuicRstStreamFrame receive_frame;
454 EXPECT_TRUE(QuicFramerPeer::ProcessIetfResetStreamFrame(&framer_, &reader,
455 &receive_frame));
456
457 // Now check that the received values match the input.
458 EXPECT_EQ(receive_frame.stream_id, transmit_frame.stream_id);
459 EXPECT_EQ(receive_frame.ietf_error_code, transmit_frame.ietf_error_code);
460 EXPECT_EQ(receive_frame.byte_offset, transmit_frame.byte_offset);
461 }
462
463 void TryMaxStreamsFrame(QuicStreamId stream_id,
464 bool unidirectional,
465 bool stream_id_server_initiated) {
466 if (!unidirectional && !stream_id_server_initiated && stream_id == 0) {
467 // For bidirectional, client initiated, streams, 0 is not allowed,
468 // it's used for the crypto stream and is not included in the counting.
469 return;
470 }
471
472 char packet_buffer[kNormalPacketBufferSize];
473 memset(packet_buffer, 0, sizeof(packet_buffer));
474
475 Perspective old_perspective = framer_.perspective();
476 // Set up the writer and transmit QuicMaxStreamIdFrame
477 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
478 NETWORK_BYTE_ORDER);
479 if (stream_id_server_initiated) {
480 stream_id |= 0x01;
481 }
482 if (unidirectional) {
483 stream_id |= 0x02;
484 }
485
486 // Set the perspective of the sender. If the stream id is supposed to
487 // be server-initiated, then the sender of the MAX_STREAMS should be
488 // a client, and vice versa. Do this prior to constructing the frame or
489 // generating the packet, so that any internal dependencies are satisfied.
490 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
491 ? Perspective::IS_CLIENT
492 : Perspective::IS_SERVER);
493 QuicMaxStreamIdFrame transmit_frame(0, stream_id);
494
495 // Add the frame.
496 EXPECT_TRUE(QuicFramerPeer::AppendMaxStreamsFrame(&framer_, transmit_frame,
497 &writer));
498
499 // Check that buffer length is in the expected range
500 EXPECT_LE(1u, writer.length());
501 EXPECT_GE(8u, writer.length());
502
503 // Set the perspective for the receiver.
504 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
505 ? Perspective::IS_SERVER
506 : Perspective::IS_CLIENT);
507
508 // Set up reader and empty receive QuicPaddingFrame.
509 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
510 QuicMaxStreamIdFrame receive_frame;
511
512 // Deframe it
513 EXPECT_TRUE(QuicFramerPeer::ProcessMaxStreamsFrame(
514 &framer_, &reader, &receive_frame,
515 (unidirectional) ? IETF_MAX_STREAMS_UNIDIRECTIONAL
516 : IETF_MAX_STREAMS_BIDIRECTIONAL))
517 << " Error: " << framer_.detailed_error();
518
519 // Now check that received and sent data are equivalent
520 EXPECT_EQ(stream_id, receive_frame.max_stream_id);
521 EXPECT_EQ(transmit_frame.max_stream_id, receive_frame.max_stream_id);
522 QuicFramerPeer::SetPerspective(&framer_, old_perspective);
523 }
524
525 void TryStreamsBlockedFrame(QuicStreamId stream_id,
526 bool unidirectional,
527 bool stream_id_server_initiated) {
528 if (!unidirectional && !stream_id_server_initiated && stream_id == 0) {
529 // For bidirectional, client initiated, streams, 0 is not allowed,
530 // it's used for the crypto stream and is not included in the counting.
531 return;
532 }
533
534 char packet_buffer[kNormalPacketBufferSize];
535 memset(packet_buffer, 0, sizeof(packet_buffer));
536
537 Perspective old_perspective = framer_.perspective();
538 // Set up the writer and transmit QuicMaxStreamIdFrame
539 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
540 NETWORK_BYTE_ORDER);
541 if (stream_id_server_initiated) {
542 stream_id |= 0x01;
543 }
544 if (unidirectional) {
545 stream_id |= 0x02;
546 }
547
548 // Set the perspective of the sender. If the stream id is supposed to
549 // be server-initiated, then the sender of the MAX_STREAMS should be
550 // a client, and vice versa. Do this prior to constructing the frame or
551 // generating the packet, so that any internal dependencies are satisfied.
552 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
553 ? Perspective::IS_SERVER
554 : Perspective::IS_CLIENT);
555 QuicStreamIdBlockedFrame transmit_frame(0, stream_id);
556
557 // Add the frame.
558 EXPECT_TRUE(QuicFramerPeer::AppendStreamsBlockedFrame(
559 &framer_, transmit_frame, &writer));
560
561 // Check that buffer length is in the expected range
562 EXPECT_LE(1u, writer.length());
563 EXPECT_GE(8u, writer.length());
564
565 // Set the perspective for the receiver.
566 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
567 ? Perspective::IS_CLIENT
568 : Perspective::IS_SERVER);
569
570 // Set up reader and empty receive QuicPaddingFrame.
571 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
572 QuicStreamIdBlockedFrame receive_frame;
573
574 // Deframe it
575 EXPECT_TRUE(QuicFramerPeer::ProcessStreamsBlockedFrame(
576 &framer_, &reader, &receive_frame,
577 (unidirectional) ? IETF_STREAMS_BLOCKED_UNIDIRECTIONAL
578 : IETF_STREAMS_BLOCKED_BIDIRECTIONAL));
579
580 // Now check that received and sent data are equivalent
581 EXPECT_EQ(stream_id, receive_frame.stream_id);
582 EXPECT_EQ(transmit_frame.stream_id, receive_frame.stream_id);
583 QuicFramerPeer::SetPerspective(&framer_, old_perspective);
584 }
585
586 QuicTime start_;
587 QuicFramer framer_;
588 test::TestQuicVisitor visitor_;
589};
590
591struct stream_frame_variant {
592 QuicIetfStreamId stream_id;
593 QuicIetfStreamOffset offset;
594 bool fin_bit;
595 bool last_frame_bit;
596 uint8_t frame_type;
597} stream_frame_to_test[] = {
598#define IETF_STREAM0 (((uint8_t)IETF_STREAM))
599
600#define IETF_STREAM1 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_FIN_BIT)
601
602#define IETF_STREAM2 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_LEN_BIT)
603
604#define IETF_STREAM3 \
605 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_LEN_BIT | \
606 IETF_STREAM_FRAME_FIN_BIT)
607
608#define IETF_STREAM4 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT)
609
610#define IETF_STREAM5 \
611 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
612 IETF_STREAM_FRAME_FIN_BIT)
613
614#define IETF_STREAM6 \
615 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
616 IETF_STREAM_FRAME_LEN_BIT)
617
618#define IETF_STREAM7 \
619 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
620 IETF_STREAM_FRAME_LEN_BIT | IETF_STREAM_FRAME_FIN_BIT)
621
622 {kStreamId8, kOffset8, true, false, IETF_STREAM7},
623 {kStreamId8, kOffset8, false, false, IETF_STREAM6},
624 {kStreamId8, kOffset4, true, false, IETF_STREAM7},
625 {kStreamId8, kOffset4, false, false, IETF_STREAM6},
626 {kStreamId8, kOffset2, true, false, IETF_STREAM7},
627 {kStreamId8, kOffset2, false, false, IETF_STREAM6},
628 {kStreamId8, kOffset1, true, false, IETF_STREAM7},
629 {kStreamId8, kOffset1, false, false, IETF_STREAM6},
630 {kStreamId8, kOffset0, true, false, IETF_STREAM3},
631 {kStreamId8, kOffset0, false, false, IETF_STREAM2},
632 {kStreamId4, kOffset8, true, false, IETF_STREAM7},
633 {kStreamId4, kOffset8, false, false, IETF_STREAM6},
634 {kStreamId4, kOffset4, true, false, IETF_STREAM7},
635 {kStreamId4, kOffset4, false, false, IETF_STREAM6},
636 {kStreamId4, kOffset2, true, false, IETF_STREAM7},
637 {kStreamId4, kOffset2, false, false, IETF_STREAM6},
638 {kStreamId4, kOffset1, true, false, IETF_STREAM7},
639 {kStreamId4, kOffset1, false, false, IETF_STREAM6},
640 {kStreamId4, kOffset0, true, false, IETF_STREAM3},
641 {kStreamId4, kOffset0, false, false, IETF_STREAM2},
642 {kStreamId2, kOffset8, true, false, IETF_STREAM7},
643 {kStreamId2, kOffset8, false, false, IETF_STREAM6},
644 {kStreamId2, kOffset4, true, false, IETF_STREAM7},
645 {kStreamId2, kOffset4, false, false, IETF_STREAM6},
646 {kStreamId2, kOffset2, true, false, IETF_STREAM7},
647 {kStreamId2, kOffset2, false, false, IETF_STREAM6},
648 {kStreamId2, kOffset1, true, false, IETF_STREAM7},
649 {kStreamId2, kOffset1, false, false, IETF_STREAM6},
650 {kStreamId2, kOffset0, true, false, IETF_STREAM3},
651 {kStreamId2, kOffset0, false, false, IETF_STREAM2},
652 {kStreamId1, kOffset8, true, false, IETF_STREAM7},
653 {kStreamId1, kOffset8, false, false, IETF_STREAM6},
654 {kStreamId1, kOffset4, true, false, IETF_STREAM7},
655 {kStreamId1, kOffset4, false, false, IETF_STREAM6},
656 {kStreamId1, kOffset2, true, false, IETF_STREAM7},
657 {kStreamId1, kOffset2, false, false, IETF_STREAM6},
658 {kStreamId1, kOffset1, true, false, IETF_STREAM7},
659 {kStreamId1, kOffset1, false, false, IETF_STREAM6},
660 {kStreamId1, kOffset0, true, false, IETF_STREAM3},
661 {kStreamId1, kOffset0, false, false, IETF_STREAM2},
662 {kStreamId0, kOffset8, true, false, IETF_STREAM7},
663 {kStreamId0, kOffset8, false, false, IETF_STREAM6},
664 {kStreamId0, kOffset4, true, false, IETF_STREAM7},
665 {kStreamId0, kOffset4, false, false, IETF_STREAM6},
666 {kStreamId0, kOffset2, true, false, IETF_STREAM7},
667 {kStreamId0, kOffset2, false, false, IETF_STREAM6},
668 {kStreamId0, kOffset1, true, false, IETF_STREAM7},
669 {kStreamId0, kOffset1, false, false, IETF_STREAM6},
670 {kStreamId0, kOffset0, true, false, IETF_STREAM3},
671 {kStreamId0, kOffset0, false, false, IETF_STREAM2},
672
673 {kStreamId8, kOffset8, true, true, IETF_STREAM5},
674 {kStreamId8, kOffset8, false, true, IETF_STREAM4},
675 {kStreamId8, kOffset4, true, true, IETF_STREAM5},
676 {kStreamId8, kOffset4, false, true, IETF_STREAM4},
677 {kStreamId8, kOffset2, true, true, IETF_STREAM5},
678 {kStreamId8, kOffset2, false, true, IETF_STREAM4},
679 {kStreamId8, kOffset1, true, true, IETF_STREAM5},
680 {kStreamId8, kOffset1, false, true, IETF_STREAM4},
681 {kStreamId8, kOffset0, true, true, IETF_STREAM1},
682 {kStreamId8, kOffset0, false, true, IETF_STREAM0},
683 {kStreamId4, kOffset8, true, true, IETF_STREAM5},
684 {kStreamId4, kOffset8, false, true, IETF_STREAM4},
685 {kStreamId4, kOffset4, true, true, IETF_STREAM5},
686 {kStreamId4, kOffset4, false, true, IETF_STREAM4},
687 {kStreamId4, kOffset2, true, true, IETF_STREAM5},
688 {kStreamId4, kOffset2, false, true, IETF_STREAM4},
689 {kStreamId4, kOffset1, true, true, IETF_STREAM5},
690 {kStreamId4, kOffset1, false, true, IETF_STREAM4},
691 {kStreamId4, kOffset0, true, true, IETF_STREAM1},
692 {kStreamId4, kOffset0, false, true, IETF_STREAM0},
693 {kStreamId2, kOffset8, true, true, IETF_STREAM5},
694 {kStreamId2, kOffset8, false, true, IETF_STREAM4},
695 {kStreamId2, kOffset4, true, true, IETF_STREAM5},
696 {kStreamId2, kOffset4, false, true, IETF_STREAM4},
697 {kStreamId2, kOffset2, true, true, IETF_STREAM5},
698 {kStreamId2, kOffset2, false, true, IETF_STREAM4},
699 {kStreamId2, kOffset1, true, true, IETF_STREAM5},
700 {kStreamId2, kOffset1, false, true, IETF_STREAM4},
701 {kStreamId2, kOffset0, true, true, IETF_STREAM1},
702 {kStreamId2, kOffset0, false, true, IETF_STREAM0},
703 {kStreamId1, kOffset8, true, true, IETF_STREAM5},
704 {kStreamId1, kOffset8, false, true, IETF_STREAM4},
705 {kStreamId1, kOffset4, true, true, IETF_STREAM5},
706 {kStreamId1, kOffset4, false, true, IETF_STREAM4},
707 {kStreamId1, kOffset2, true, true, IETF_STREAM5},
708 {kStreamId1, kOffset2, false, true, IETF_STREAM4},
709 {kStreamId1, kOffset1, true, true, IETF_STREAM5},
710 {kStreamId1, kOffset1, false, true, IETF_STREAM4},
711 {kStreamId1, kOffset0, true, true, IETF_STREAM1},
712 {kStreamId1, kOffset0, false, true, IETF_STREAM0},
713 {kStreamId0, kOffset8, true, true, IETF_STREAM5},
714 {kStreamId0, kOffset8, false, true, IETF_STREAM4},
715 {kStreamId0, kOffset4, true, true, IETF_STREAM5},
716 {kStreamId0, kOffset4, false, true, IETF_STREAM4},
717 {kStreamId0, kOffset2, true, true, IETF_STREAM5},
718 {kStreamId0, kOffset2, false, true, IETF_STREAM4},
719 {kStreamId0, kOffset1, true, true, IETF_STREAM5},
720 {kStreamId0, kOffset1, false, true, IETF_STREAM4},
721 {kStreamId0, kOffset0, true, true, IETF_STREAM1},
722 {kStreamId0, kOffset0, false, true, IETF_STREAM0},
723};
724
725TEST_F(QuicIetfFramerTest, StreamFrame) {
726 char packet_buffer[kNormalPacketBufferSize];
727 const char* transmit_packet_data =
728 "this is a test of some packet data, "
729 "can do a simple strcmp to see if the "
730 "input and output are the same!";
731
732 size_t transmit_packet_data_len = strlen(transmit_packet_data) + 1;
733 for (size_t i = 0; i < QUIC_ARRAYSIZE(stream_frame_to_test); ++i) {
734 SCOPED_TRACE(i);
735 struct stream_frame_variant* variant = &stream_frame_to_test[i];
736 TryStreamFrame(packet_buffer, sizeof(packet_buffer), transmit_packet_data,
737 transmit_packet_data_len, variant->stream_id,
738 variant->offset, variant->fin_bit, variant->last_frame_bit,
739 static_cast<QuicIetfFrameType>(variant->frame_type));
740 }
741}
742// As the previous test, but with no data.
743TEST_F(QuicIetfFramerTest, ZeroLengthStreamFrame) {
744 char packet_buffer[kNormalPacketBufferSize];
745
746 for (size_t i = 0; i < QUIC_ARRAYSIZE(stream_frame_to_test); ++i) {
747 SCOPED_TRACE(i);
748 struct stream_frame_variant* variant = &stream_frame_to_test[i];
749 TryStreamFrame(packet_buffer, sizeof(packet_buffer),
750 /* xmit_packet_data = */ NULL,
751 /* xmit_packet_data_size = */ 0, variant->stream_id,
752 variant->offset, variant->fin_bit, variant->last_frame_bit,
753 static_cast<QuicIetfFrameType>(variant->frame_type));
754 }
755}
756
757TEST_F(QuicIetfFramerTest, CryptoFrame) {
758 SimpleDataProducer data_producer;
759 framer_.set_data_producer(&data_producer);
760 char packet_buffer[kNormalPacketBufferSize];
761
762 QuicStringPiece frame_data("This is a CRYPTO frame.");
763
764 QuicStreamOffset offsets[] = {kOffset8, kOffset4, kOffset2, kOffset1,
765 kOffset0};
766 for (QuicStreamOffset offset : offsets) {
767 QuicCryptoFrame frame(ENCRYPTION_NONE, offset, frame_data.length());
768 data_producer.SaveCryptoData(ENCRYPTION_NONE, offset, frame_data);
769
770 QuicDataWriter writer(QUIC_ARRAYSIZE(packet_buffer), packet_buffer,
771 NETWORK_BYTE_ORDER);
772
773 // Write the frame.
774 EXPECT_TRUE(QuicFramerPeer::AppendCryptoFrame(&framer_, frame, &writer));
775 EXPECT_NE(0u, writer.length());
776 // Read it back.
777 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
778 QuicCryptoFrame read_frame;
779 EXPECT_TRUE(
780 QuicFramerPeer::ProcessCryptoFrame(&framer_, &reader, &read_frame));
781
782 // Check that the frames match:
783 QuicStringPiece read_data(read_frame.data_buffer, read_frame.data_length);
784 EXPECT_EQ(read_frame.data_length, frame.data_length);
785 EXPECT_EQ(read_frame.offset, frame.offset);
786 EXPECT_EQ(read_data, frame_data);
787 }
788}
789
790TEST_F(QuicIetfFramerTest, ConnectionCloseEmptyString) {
791 char packet_buffer[kNormalPacketBufferSize];
792
793 // initialize a writer so that the serialized packet is placed in
794 // packet_buffer.
795 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
796 NETWORK_BYTE_ORDER);
797
798 // empty string,
vasilvvc48c8712019-03-11 13:38:16 -0700799 std::string test_string = "Ich Bin Ein Jelly Donut?";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500800 QuicConnectionCloseFrame sent_frame;
801 sent_frame.error_code = static_cast<QuicErrorCode>(0);
802 sent_frame.error_details = test_string;
803 sent_frame.frame_type = 123;
804 // write the frame to the packet buffer.
805 EXPECT_TRUE(QuicFramerPeer::AppendIetfConnectionCloseFrame(
806 &framer_, sent_frame, &writer));
807
808 // better have something in the packet buffer.
809 EXPECT_NE(0u, writer.length());
810
811 // now set up a reader to read in the frame.
812 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
813
814 // a QuicConnectionCloseFrame to hold the results.
815 QuicConnectionCloseFrame sink_frame;
816
817 EXPECT_TRUE(QuicFramerPeer::ProcessIetfConnectionCloseFrame(&framer_, &reader,
818 &sink_frame));
819
820 // Now check that received == sent
821 EXPECT_EQ(sink_frame.error_code, static_cast<QuicErrorCode>(0));
822 EXPECT_EQ(sink_frame.error_details, test_string);
823}
824
825TEST_F(QuicIetfFramerTest, ApplicationCloseEmptyString) {
826 char packet_buffer[kNormalPacketBufferSize];
827
828 // initialize a writer so that the serialized packet is placed in
829 // packet_buffer.
830 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
831 NETWORK_BYTE_ORDER);
832
833 // empty string,
vasilvvc48c8712019-03-11 13:38:16 -0700834 std::string test_string = "Ich Bin Ein Jelly Donut?";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500835 QuicApplicationCloseFrame sent_frame;
836 sent_frame.error_code = static_cast<QuicErrorCode>(0);
837 sent_frame.error_details = test_string;
838 // write the frame to the packet buffer.
839 EXPECT_TRUE(QuicFramerPeer::AppendApplicationCloseFrame(&framer_, sent_frame,
840 &writer));
841
842 // better have something in the packet buffer.
843 EXPECT_NE(0u, writer.length());
844
845 // now set up a reader to read in the frame.
846 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
847
848 // a QuicConnectionCloseFrame to hold the results.
849 QuicApplicationCloseFrame sink_frame;
850
851 EXPECT_TRUE(QuicFramerPeer::ProcessApplicationCloseFrame(&framer_, &reader,
852 &sink_frame));
853
854 // Now check that received == sent
855 EXPECT_EQ(sink_frame.error_code, static_cast<QuicErrorCode>(0));
856 EXPECT_EQ(sink_frame.error_details, test_string);
857}
858
859// Testing for the IETF ACK framer.
860// clang-format off
861struct ack_frame ack_frame_variants[] = {
862 {90000,
863 false,
864 0,
865 0,
866 0,
867 {{QuicPacketNumber(1000), QuicPacketNumber(2001)}},
868 IETF_ACK},
869 {0,
870 false,
871 0,
872 0,
873 0,
874 {{QuicPacketNumber(1000), QuicPacketNumber(2001)}},
875 IETF_ACK},
876 {1,
877 false,
878 0,
879 0,
880 0,
881 {{QuicPacketNumber(1), QuicPacketNumber(2)},
882 {QuicPacketNumber(5), QuicPacketNumber(6)}},
883 IETF_ACK},
884 {63,
885 false,
886 0,
887 0,
888 0,
889 {{QuicPacketNumber(1), QuicPacketNumber(2)},
890 {QuicPacketNumber(5), QuicPacketNumber(6)}},
891 IETF_ACK},
892 {64,
893 false,
894 0,
895 0,
896 0,
897 {{QuicPacketNumber(1), QuicPacketNumber(2)},
898 {QuicPacketNumber(3), QuicPacketNumber(4)},
899 {QuicPacketNumber(5), QuicPacketNumber(6)},
900 {QuicPacketNumber(7), QuicPacketNumber(8)},
901 {QuicPacketNumber(9), QuicPacketNumber(10)},
902 {QuicPacketNumber(11), QuicPacketNumber(12)}},
903 IETF_ACK},
904 {10000,
905 false,
906 0,
907 0,
908 0,
909 {{QuicPacketNumber(1), QuicPacketNumber(2)},
910 {QuicPacketNumber(3), QuicPacketNumber(4)},
911 {QuicPacketNumber(5), QuicPacketNumber(6)},
912 {QuicPacketNumber(7), QuicPacketNumber(8)},
913 {QuicPacketNumber(9), QuicPacketNumber(10)},
914 {QuicPacketNumber(11), QuicPacketNumber(12)}},
915 IETF_ACK},
916 {100000000,
917 false,
918 0,
919 0,
920 0,
921 {{QuicPacketNumber(1), QuicPacketNumber(2)},
922 {QuicPacketNumber(3), QuicPacketNumber(4)},
923 {QuicPacketNumber(5), QuicPacketNumber(6)},
924 {QuicPacketNumber(7), QuicPacketNumber(8)},
925 {QuicPacketNumber(9), QuicPacketNumber(10)},
926 {QuicPacketNumber(11), QuicPacketNumber(12)}},
927 IETF_ACK},
928 {0,
929 false,
930 0,
931 0,
932 0,
933 {{QuicPacketNumber(1), QuicPacketNumber(65)}},
934 IETF_ACK},
935 {9223372036854775807,
936 false,
937 0,
938 0,
939 0,
940 {{QuicPacketNumber(1), QuicPacketNumber(11)},
941 {QuicPacketNumber(74), QuicPacketNumber(138)}},
942 IETF_ACK},
943 // This ack is for packets 60 & 125. There are 64 packets in the gap.
944 // The encoded value is gap_size - 1, or 63. Crosses a VarInt62 encoding
945 // boundary...
946 {1,
947 false,
948 0,
949 0,
950 0,
951 {{QuicPacketNumber(60), QuicPacketNumber(61)},
952 {QuicPacketNumber(125), QuicPacketNumber(126)}},
953 IETF_ACK},
954 {2,
955 false,
956 0,
957 0,
958 0,
959 {{QuicPacketNumber(1), QuicPacketNumber(65)},
960 {QuicPacketNumber(129), QuicPacketNumber(130)}},
961 IETF_ACK},
962 {3,
963 false,
964 0,
965 0,
966 0,
967 {{QuicPacketNumber(1), QuicPacketNumber(65)},
968 {QuicPacketNumber(129), QuicPacketNumber(195)}},
969 IETF_ACK},
970 {4,
971 false,
972 0,
973 0,
974 0,
975 {{QuicPacketNumber(1), QuicPacketNumber(65)},
976 {QuicPacketNumber(129), QuicPacketNumber(194)}},
977 IETF_ACK},
978 {5,
979 false,
980 0,
981 0,
982 0,
983 {{QuicPacketNumber(1), QuicPacketNumber(65)},
984 {QuicPacketNumber(129), QuicPacketNumber(193)}},
985 IETF_ACK},
986 {6,
987 false,
988 0,
989 0,
990 0,
991 {{QuicPacketNumber(1), QuicPacketNumber(65)},
992 {QuicPacketNumber(129), QuicPacketNumber(192)}},
993 IETF_ACK},
994 // declare some ack_ecn frames to try.
995 {6,
996 false,
997 100,
998 200,
999 300,
1000 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1001 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1002 IETF_ACK},
1003 {6,
1004 true,
1005 100,
1006 200,
1007 300,
1008 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1009 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1010 IETF_ACK_ECN},
1011 {6,
1012 true,
1013 100,
1014 0,
1015 0,
1016 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1017 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1018 IETF_ACK_ECN},
1019 {6,
1020 true,
1021 0,
1022 200,
1023 0,
1024 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1025 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1026 IETF_ACK_ECN},
1027 {6,
1028 true,
1029 0,
1030 0,
1031 300,
1032 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1033 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1034 IETF_ACK_ECN},
1035 {6,
1036 true,
1037 0,
1038 0,
1039 0,
1040 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1041 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1042 IETF_ACK},
1043};
1044// clang-format on
1045
1046TEST_F(QuicIetfFramerTest, AckFrame) {
1047 char packet_buffer[kNormalPacketBufferSize];
1048 for (auto ack_frame_variant : ack_frame_variants) {
1049 EXPECT_TRUE(
1050 TryAckFrame(packet_buffer, sizeof(packet_buffer), &ack_frame_variant));
1051 }
1052}
1053
1054// Test the case of having a QuicAckFrame with no ranges in it. By
1055// examination of the Google Quic Ack code and tests, this case should
1056// be handled as an ack with no "ranges after the first"; the
1057// AckBlockCount should be 0 and the FirstAckBlock should be
1058// |LargestAcked| - 1 (number of packets preceding the LargestAcked.
1059TEST_F(QuicIetfFramerTest, AckFrameNoRanges) {
1060 char packet_buffer[kNormalPacketBufferSize];
1061
1062 // Make a writer so that the serialized packet is placed in
1063 // packet_buffer.
1064 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1065 NETWORK_BYTE_ORDER);
1066
1067 QuicAckFrame transmit_frame;
1068 transmit_frame.largest_acked = QuicPacketNumber(1);
1069 transmit_frame.ack_delay_time = QuicTime::Delta::FromMicroseconds(0);
1070
1071 size_t expected_size =
1072 QuicFramerPeer::GetIetfAckFrameSize(&framer_, transmit_frame);
1073 // Write the frame to the packet buffer.
1074 EXPECT_TRUE(QuicFramerPeer::AppendIetfAckFrameAndTypeByte(
1075 &framer_, transmit_frame, &writer));
1076
1077 uint8_t packet[] = {
1078 0x02, // type, IETF_ACK
1079 0x01, // largest_acked,
1080 0x00, // delay
1081 0x00, // count of additional ack blocks
1082 0x00, // size of first ack block (packets preceding largest_acked)
1083 };
1084 EXPECT_EQ(expected_size, sizeof(packet));
1085 EXPECT_EQ(sizeof(packet), writer.length());
1086 EXPECT_EQ(0, memcmp(packet, packet_buffer, writer.length()));
1087
1088 // Now set up a reader to read in the frame.
1089 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1090
1091 // an AckFrame to hold the results
1092 QuicAckFrame receive_frame;
1093
1094 // read in the frame type
1095 uint8_t received_frame_type;
1096 EXPECT_TRUE(reader.ReadUInt8(&received_frame_type));
1097 EXPECT_EQ(received_frame_type, IETF_ACK);
1098
1099 EXPECT_TRUE(QuicFramerPeer::ProcessIetfAckFrame(&framer_, &reader, IETF_ACK,
1100 &receive_frame));
1101
1102 // Now check that the received frame matches the sent frame.
1103 EXPECT_EQ(transmit_frame.largest_acked, receive_frame.largest_acked);
1104}
1105
1106TEST_F(QuicIetfFramerTest, PathChallengeFrame) {
1107 // Double-braces needed on some platforms due to
1108 // https://bugs.llvm.org/show_bug.cgi?id=21629
1109 QuicPathFrameBuffer buffer0 = {{0, 0, 0, 0, 0, 0, 0, 0}};
1110 QuicPathFrameBuffer buffer1 = {
1111 {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
1112 char packet_buffer[kNormalPacketBufferSize];
1113 EXPECT_TRUE(
1114 TryPathChallengeFrame(packet_buffer, sizeof(packet_buffer), buffer0));
1115 EXPECT_TRUE(
1116 TryPathChallengeFrame(packet_buffer, sizeof(packet_buffer), buffer1));
1117}
1118
1119TEST_F(QuicIetfFramerTest, PathResponseFrame) {
1120 // Double-braces needed on some platforms due to
1121 // https://bugs.llvm.org/show_bug.cgi?id=21629
1122 QuicPathFrameBuffer buffer0 = {{0, 0, 0, 0, 0, 0, 0, 0}};
1123 QuicPathFrameBuffer buffer1 = {
1124 {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
1125 char packet_buffer[kNormalPacketBufferSize];
1126 EXPECT_TRUE(
1127 TryPathResponseFrame(packet_buffer, sizeof(packet_buffer), buffer0));
1128 EXPECT_TRUE(
1129 TryPathResponseFrame(packet_buffer, sizeof(packet_buffer), buffer1));
1130}
1131
1132TEST_F(QuicIetfFramerTest, ResetStreamFrame) {
1133 char packet_buffer[kNormalPacketBufferSize];
1134 struct resets {
1135 QuicStreamId stream_id;
1136 uint16_t error_code;
1137 QuicStreamOffset final_offset;
1138 } reset_frames[] = {
1139 {0, 55, 0},
1140 {0x10, 73, 0x300},
1141 };
1142 for (auto reset : reset_frames) {
1143 TryResetFrame(packet_buffer, sizeof(packet_buffer), reset.stream_id,
1144 reset.error_code, reset.final_offset);
1145 }
1146}
1147
1148TEST_F(QuicIetfFramerTest, StopSendingFrame) {
1149 char packet_buffer[kNormalPacketBufferSize];
1150
1151 // Make a writer so that the serialized packet is placed in
1152 // packet_buffer.
1153 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1154 NETWORK_BYTE_ORDER);
1155
1156 QuicStopSendingFrame transmit_frame;
1157 transmit_frame.stream_id = 12345;
1158 transmit_frame.application_error_code = 543;
1159
1160 // Write the frame to the packet buffer.
1161 EXPECT_TRUE(QuicFramerPeer::AppendStopSendingFrame(&framer_, transmit_frame,
1162 &writer));
1163 // Check that the number of bytes in the buffer is in the
1164 // allowed range.
1165 EXPECT_LE(3u, writer.length());
1166 EXPECT_GE(10u, writer.length());
1167
1168 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1169
1170 // A frame to hold the results
1171 QuicStopSendingFrame receive_frame;
1172
1173 EXPECT_TRUE(QuicFramerPeer::ProcessStopSendingFrame(&framer_, &reader,
1174 &receive_frame));
1175
1176 // Verify that the transmitted and received values are the same.
1177 EXPECT_EQ(receive_frame.stream_id, 12345u);
1178 EXPECT_EQ(receive_frame.application_error_code, 543u);
1179 EXPECT_EQ(receive_frame.stream_id, transmit_frame.stream_id);
1180 EXPECT_EQ(receive_frame.application_error_code,
1181 transmit_frame.application_error_code);
1182}
1183
1184TEST_F(QuicIetfFramerTest, MaxDataFrame) {
1185 char packet_buffer[kNormalPacketBufferSize];
1186 QuicStreamOffset window_sizes[] = {0, 1, 2, 5, 10,
1187 20, 50, 100, 200, 500,
1188 1000000, kOffset8, kOffset4, kOffset2};
1189 for (QuicStreamOffset window_size : window_sizes) {
1190 memset(packet_buffer, 0, sizeof(packet_buffer));
1191
1192 // Set up the writer and transmit QuicWindowUpdateFrame
1193 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1194 NETWORK_BYTE_ORDER);
1195 QuicWindowUpdateFrame transmit_frame(0, 99, window_size);
1196
1197 // Add the frame.
1198 EXPECT_TRUE(
1199 QuicFramerPeer::AppendMaxDataFrame(&framer_, transmit_frame, &writer));
1200
1201 // Check that the number of bytes in the buffer is in the expected range.
1202 EXPECT_LE(1u, writer.length());
1203 EXPECT_GE(8u, writer.length());
1204
1205 // Set up reader and an empty QuicWindowUpdateFrame
1206 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1207 QuicWindowUpdateFrame receive_frame;
1208
1209 // Deframe it
1210 EXPECT_TRUE(
1211 QuicFramerPeer::ProcessMaxDataFrame(&framer_, &reader, &receive_frame));
1212
1213 // Now check that the received data equals the sent data.
1214 EXPECT_EQ(transmit_frame.byte_offset, window_size);
1215 EXPECT_EQ(transmit_frame.byte_offset, receive_frame.byte_offset);
1216 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
1217 receive_frame.stream_id);
1218 }
1219}
1220
1221TEST_F(QuicIetfFramerTest, MaxStreamDataFrame) {
1222 char packet_buffer[kNormalPacketBufferSize];
1223 QuicStreamOffset window_sizes[] = {0, 1, 2, 5, 10,
1224 20, 50, 100, 200, 500,
1225 1000000, kOffset8, kOffset4, kOffset2};
1226 QuicIetfStreamId stream_ids[] = {kStreamId4, kStreamId2, kStreamId1,
1227 kStreamId0};
1228
1229 for (QuicIetfStreamId stream_id : stream_ids) {
1230 for (QuicStreamOffset window_size : window_sizes) {
1231 memset(packet_buffer, 0, sizeof(packet_buffer));
1232
1233 // Set up the writer and transmit QuicWindowUpdateFrame
1234 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1235 NETWORK_BYTE_ORDER);
1236 QuicWindowUpdateFrame transmit_frame(0, stream_id, window_size);
1237
1238 // Add the frame.
1239 EXPECT_TRUE(QuicFramerPeer::AppendMaxStreamDataFrame(
1240 &framer_, transmit_frame, &writer));
1241
1242 // Check that number of bytes in the buffer is in the expected range.
1243 EXPECT_LE(2u, writer.length());
1244 EXPECT_GE(16u, writer.length());
1245
1246 // Set up reader and empty receive QuicPaddingFrame.
1247 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1248 QuicWindowUpdateFrame receive_frame;
1249
1250 // Deframe it
1251 EXPECT_TRUE(QuicFramerPeer::ProcessMaxStreamDataFrame(&framer_, &reader,
1252 &receive_frame));
1253
1254 // Now check that received data and sent data are equal.
1255 EXPECT_EQ(transmit_frame.byte_offset, window_size);
1256 EXPECT_EQ(transmit_frame.byte_offset, receive_frame.byte_offset);
1257 EXPECT_EQ(stream_id, receive_frame.stream_id);
1258 EXPECT_EQ(transmit_frame.stream_id, receive_frame.stream_id);
1259 }
1260 }
1261}
1262
1263TEST_F(QuicIetfFramerTest, MaxStreamsFrame) {
1264 QuicIetfStreamId stream_ids[] = {kStreamId4, kStreamId2, kStreamId1,
1265 kStreamId0};
1266
1267 for (QuicIetfStreamId stream_id : stream_ids) {
1268 // Cover all four combinations of uni/bi-directional and
1269 // server-/client- initiation.
1270 TryMaxStreamsFrame(stream_id, /*unidirectional=*/true,
1271 /*stream_id_server_initiated=*/true);
1272 TryMaxStreamsFrame(stream_id, /*unidirectional=*/true,
1273 /*stream_id_server_initiated=*/false);
1274 TryMaxStreamsFrame(stream_id, /*unidirectional=*/false,
1275 /*stream_id_server_initiated=*/true);
1276 TryMaxStreamsFrame(stream_id, /*unidirectional=*/false,
1277 /*stream_id_server_initiated=*/false);
1278 }
1279}
1280
1281TEST_F(QuicIetfFramerTest, BlockedFrame) {
1282 char packet_buffer[kNormalPacketBufferSize];
1283 QuicStreamOffset offsets[] = {kOffset8, kOffset4, kOffset2, kOffset1,
1284 kOffset0};
1285
1286 for (QuicStreamOffset offset : offsets) {
1287 memset(packet_buffer, 0, sizeof(packet_buffer));
1288
1289 // Set up the writer and transmit QuicBlockedFrame
1290 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1291 NETWORK_BYTE_ORDER);
1292 QuicBlockedFrame transmit_frame(
1293 0, QuicUtils::GetInvalidStreamId(framer_.transport_version()), offset);
1294
1295 // Add the frame.
1296 EXPECT_TRUE(QuicFramerPeer::AppendIetfBlockedFrame(&framer_, transmit_frame,
1297 &writer));
1298
1299 // Check that buffer length is in the expected range
1300 EXPECT_LE(1u, writer.length());
1301 EXPECT_GE(8u, writer.length());
1302
1303 // Set up reader and empty receive QuicFrame.
1304 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1305 QuicBlockedFrame receive_frame;
1306
1307 // Deframe it
1308 EXPECT_TRUE(QuicFramerPeer::ProcessIetfBlockedFrame(&framer_, &reader,
1309 &receive_frame));
1310
1311 // Check that received and sent data are equivalent
1312 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
1313 receive_frame.stream_id);
1314 EXPECT_EQ(offset, receive_frame.offset);
1315 EXPECT_EQ(transmit_frame.offset, receive_frame.offset);
1316 }
1317}
1318
1319TEST_F(QuicIetfFramerTest, StreamBlockedFrame) {
1320 char packet_buffer[kNormalPacketBufferSize];
1321 QuicStreamOffset offsets[] = {0, 1, 2, 5, 10,
1322 20, 50, 100, 200, 500,
1323 1000000, kOffset8, kOffset4, kOffset2};
1324 QuicIetfStreamId stream_ids[] = {kStreamId4, kStreamId2, kStreamId1,
1325 kStreamId0};
1326
1327 for (QuicIetfStreamId stream_id : stream_ids) {
1328 for (QuicStreamOffset offset : offsets) {
1329 memset(packet_buffer, 0, sizeof(packet_buffer));
1330
1331 // Set up the writer and transmit QuicWindowUpdateFrame
1332 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1333 NETWORK_BYTE_ORDER);
1334 QuicBlockedFrame transmit_frame(0, stream_id, offset);
1335
1336 // Add the frame.
1337 EXPECT_TRUE(QuicFramerPeer::AppendStreamBlockedFrame(
1338 &framer_, transmit_frame, &writer));
1339
1340 // Check that number of bytes in the buffer is in the expected range.
1341 EXPECT_LE(2u, writer.length());
1342 EXPECT_GE(16u, writer.length());
1343
1344 // Set up reader and empty receive QuicPaddingFrame.
1345 QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
1346 QuicBlockedFrame receive_frame;
1347
1348 // Deframe it
1349 EXPECT_TRUE(QuicFramerPeer::ProcessStreamBlockedFrame(&framer_, &reader,
1350 &receive_frame));
1351
1352 // Now check that received == sent
1353 EXPECT_EQ(transmit_frame.offset, offset);
1354 EXPECT_EQ(transmit_frame.offset, receive_frame.offset);
1355 EXPECT_EQ(stream_id, receive_frame.stream_id);
1356 EXPECT_EQ(transmit_frame.stream_id, receive_frame.stream_id);
1357 }
1358 }
1359}
1360
1361TEST_F(QuicIetfFramerTest, StreamsBlockedFrame) {
1362 QuicIetfStreamId stream_ids[] = {kStreamId4, kStreamId2, kStreamId1,
1363 kStreamId0};
1364
1365 for (QuicIetfStreamId stream_id : stream_ids) {
1366 TryStreamsBlockedFrame(stream_id,
1367 /*unidirectional=*/false,
1368 /*stream_id_server_initiated=*/false);
1369 TryStreamsBlockedFrame(stream_id,
1370 /*unidirectional=*/false,
1371 /*stream_id_server_initiated=*/true);
1372 TryStreamsBlockedFrame(stream_id,
1373 /*unidirectional=*/true,
1374 /*stream_id_server_initiated=*/false);
1375 TryStreamsBlockedFrame(stream_id,
1376 /*unidirectional=*/true,
1377 /*stream_id_server_initiated=*/true);
1378 }
1379}
1380
1381TEST_F(QuicIetfFramerTest, NewConnectionIdFrame) {
1382 char packet_buffer[kNormalPacketBufferSize];
1383
1384 QuicNewConnectionIdFrame transmit_frame;
1385 transmit_frame.connection_id = TestConnectionId(UINT64_C(0x0edcba9876543201));
1386 transmit_frame.sequence_number = 0x01020304;
1387 // The token is defined as a uint128 -- a 16-byte integer.
1388 // The value is set in this manner because we want each
1389 // byte to have a specific value so that the binary
1390 // packet check (below) is good. If we used integer
1391 // operations (eg. "token = 0x12345...") then the bytes
1392 // would be set in host order.
1393 unsigned char token_bytes[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
1394 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
1395 0x0c, 0x0d, 0x0e, 0x0f};
1396 memcpy(&transmit_frame.stateless_reset_token, token_bytes,
1397 sizeof(transmit_frame.stateless_reset_token));
1398
1399 memset(packet_buffer, 0, sizeof(packet_buffer));
1400
1401 // Set up the writer and transmit QuicStreamIdBlockedFrame
1402 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
1403 NETWORK_BYTE_ORDER);
1404
1405 // Add the frame.
1406 EXPECT_TRUE(QuicFramerPeer::AppendNewConnectionIdFrame(
1407 &framer_, transmit_frame, &writer));
1408 // Check that buffer length is correct
1409 EXPECT_EQ(29u, writer.length());
1410 // clang-format off
1411 uint8_t packet[] = {
1412 // sequence number, 0x80 for varint62 encoding
1413 0x80 + 0x01, 0x02, 0x03, 0x04,
1414 // new connection id length, is not varint62 encoded.
1415 0x08,
1416 // new connection id, is not varint62 encoded.
1417 0x0E, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x01,
1418 // the reset token:
1419 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1420 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
1421 };
1422
1423 // clang-format on
1424 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);
1437 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
1449 // Set up the writer and transmit QuicStreamIdBlockedFrame
1450 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