blob: e4feb471131692a5b03e7501bf0134a179d90708 [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"
QUICHE teama6ef0a62019-03-07 20:34:33 -050037#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
38#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
39#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
40#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
41
42namespace quic {
43namespace test {
44namespace {
45
46const size_t kNormalPacketBufferSize = 1400;
47// Several different stream ids, should be encoded
48// in 8, 4, 2, and 1 byte, respectively. Last one
49// checks that value==0 works.
50// All stream IDs end in 0x0, so the client/server- initiated
51// and Uni/Bi-directional bits are available to alter, as any
52// given test may wish.
53const QuicIetfStreamId kStreamId8 = UINT64_C(0x3EDCBA9876543210);
54const QuicIetfStreamId kStreamId4 = UINT64_C(0x36543210);
55const QuicIetfStreamId kStreamId2 = UINT64_C(0x3210);
56const QuicIetfStreamId kStreamId1 = UINT64_C(0x10);
57const QuicIetfStreamId kStreamId0 = UINT64_C(0x00);
58
59// Ditto for the offsets.
60const QuicIetfStreamOffset kOffset8 = UINT64_C(0x3210BA9876543210);
61const QuicIetfStreamOffset kOffset4 = UINT64_C(0x32109876);
62const QuicIetfStreamOffset kOffset2 = UINT64_C(0x3456);
63const QuicIetfStreamOffset kOffset1 = UINT64_C(0x3f);
64const QuicIetfStreamOffset kOffset0 = UINT64_C(0x00);
65
66// Structures used to create various ack frames.
67
68// Defines an ack frame to feed through the framer/deframer.
69struct ack_frame {
70 uint64_t delay_time;
71 bool is_ack_ecn;
72 QuicPacketCount ect_0_count;
73 QuicPacketCount ect_1_count;
74 QuicPacketCount ecn_ce_count;
75 const std::vector<QuicAckBlock>& ranges;
76 uint64_t expected_frame_type;
77};
78
79class TestQuicVisitor : public QuicFramerVisitorInterface {
80 public:
81 TestQuicVisitor() {}
82
83 ~TestQuicVisitor() override {}
84
85 void OnError(QuicFramer* f) override {
86 QUIC_DLOG(INFO) << "QuicIetfFramer Error: "
87 << QuicErrorCodeToString(f->error()) << " (" << f->error()
88 << ")";
89 }
90
91 void OnPacket() override {}
92
dschinazi17d42422019-06-18 16:35:07 -070093 void OnPublicResetPacket(const QuicPublicResetPacket& /*packet*/) override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -050094
95 void OnVersionNegotiationPacket(
dschinazi17d42422019-06-18 16:35:07 -070096 const QuicVersionNegotiationPacket& /*packet*/) override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -050097
dschinazi17d42422019-06-18 16:35:07 -070098 void OnRetryPacket(QuicConnectionId /*original_connection_id*/,
99 QuicConnectionId /*new_connection_id*/,
100 QuicStringPiece /*retry_token*/) override {}
dschinazi244f6dc2019-05-06 15:45:16 -0700101
fayang8aba1ff2019-06-21 12:00:54 -0700102 bool OnProtocolVersionMismatch(
103 ParsedQuicVersion /*received_version*/) override {
dschinazi48ac9192019-07-31 00:07:26 -0700104 return false;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500105 }
106
dschinazi17d42422019-06-18 16:35:07 -0700107 bool OnUnauthenticatedPublicHeader(
108 const QuicPacketHeader& /*header*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500109 return true;
110 }
111
dschinazi17d42422019-06-18 16:35:07 -0700112 bool OnUnauthenticatedHeader(const QuicPacketHeader& /*header*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500113 return true;
114 }
115
dschinazi17d42422019-06-18 16:35:07 -0700116 void OnDecryptedPacket(EncryptionLevel /*level*/) override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -0500117
dschinazi17d42422019-06-18 16:35:07 -0700118 bool OnPacketHeader(const QuicPacketHeader& /*header*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500119 return true;
120 }
121
dschinazi17d42422019-06-18 16:35:07 -0700122 void OnCoalescedPacket(const QuicEncryptedPacket& /*packet*/) override {}
123
dschinazi4b5a68a2019-08-15 15:45:36 -0700124 void OnUndecryptablePacket(const QuicEncryptedPacket& /*packet*/,
125 EncryptionLevel /*decryption_level*/,
126 bool /*has_decryption_key*/) override {}
127
dschinazi17d42422019-06-18 16:35:07 -0700128 bool OnStreamFrame(const QuicStreamFrame& /*frame*/) override { return true; }
129
130 bool OnCryptoFrame(const QuicCryptoFrame& /*frame*/) override { return true; }
131
132 bool OnAckFrameStart(QuicPacketNumber /*largest_acked*/,
133 QuicTime::Delta /*ack_delay_time*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500134 return true;
135 }
136
dschinazi17d42422019-06-18 16:35:07 -0700137 bool OnAckRange(QuicPacketNumber /*start*/,
138 QuicPacketNumber /*end*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500139 return true;
140 }
141
dschinazi17d42422019-06-18 16:35:07 -0700142 bool OnAckTimestamp(QuicPacketNumber /*packet_number*/,
143 QuicTime /*timestamp*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500144 return true;
145 }
146
dschinazi17d42422019-06-18 16:35:07 -0700147 bool OnAckFrameEnd(QuicPacketNumber /*start*/) override { return true; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500148
dschinazi17d42422019-06-18 16:35:07 -0700149 bool OnStopWaitingFrame(const QuicStopWaitingFrame& /*frame*/) override {
150 return true;
151 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500152
dschinazi17d42422019-06-18 16:35:07 -0700153 bool OnPaddingFrame(const QuicPaddingFrame& /*frame*/) override {
154 return true;
155 }
156
157 bool OnPingFrame(const QuicPingFrame& /*frame*/) override { return true; }
158
159 bool OnMessageFrame(const QuicMessageFrame& /*frame*/) override {
160 return true;
161 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500162
163 void OnPacketComplete() override {}
164
dschinazi17d42422019-06-18 16:35:07 -0700165 bool OnRstStreamFrame(const QuicRstStreamFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500166 return true;
167 }
168
dschinazi17d42422019-06-18 16:35:07 -0700169 bool OnConnectionCloseFrame(
170 const QuicConnectionCloseFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500171 return true;
172 }
173
dschinazi17d42422019-06-18 16:35:07 -0700174 bool OnStopSendingFrame(const QuicStopSendingFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500175 return true;
176 }
177
dschinazi17d42422019-06-18 16:35:07 -0700178 bool OnPathChallengeFrame(const QuicPathChallengeFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500179 return true;
180 }
dschinazi17d42422019-06-18 16:35:07 -0700181 bool OnPathResponseFrame(const QuicPathResponseFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500182 return true;
183 }
184
dschinazi17d42422019-06-18 16:35:07 -0700185 bool OnGoAwayFrame(const QuicGoAwayFrame& /*frame*/) override { return true; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500186
dschinazi17d42422019-06-18 16:35:07 -0700187 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500188 return true;
189 }
190
dschinazi17d42422019-06-18 16:35:07 -0700191 bool OnBlockedFrame(const QuicBlockedFrame& /*frame*/) override {
192 return true;
193 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500194
dschinazi17d42422019-06-18 16:35:07 -0700195 bool OnNewConnectionIdFrame(
196 const QuicNewConnectionIdFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500197 return true;
198 }
199
200 bool OnRetireConnectionIdFrame(
dschinazi17d42422019-06-18 16:35:07 -0700201 const QuicRetireConnectionIdFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500202 return true;
203 }
204
dschinazi17d42422019-06-18 16:35:07 -0700205 bool OnNewTokenFrame(const QuicNewTokenFrame& /*frame*/) override {
206 return true;
207 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500208
dschinazi17d42422019-06-18 16:35:07 -0700209 bool IsValidStatelessResetToken(QuicUint128 /*token*/) const override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500210 return true;
211 }
212
213 void OnAuthenticatedIetfStatelessResetPacket(
dschinazi17d42422019-06-18 16:35:07 -0700214 const QuicIetfStatelessResetPacket& /*packet*/) override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -0500215
dschinazi17d42422019-06-18 16:35:07 -0700216 bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500217 return true;
218 }
219
dschinazi17d42422019-06-18 16:35:07 -0700220 bool OnStreamsBlockedFrame(
221 const QuicStreamsBlockedFrame& /*frame*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500222 return true;
223 }
224};
225
226class QuicIetfFramerTest : public QuicTestWithParam<ParsedQuicVersion> {
227 public:
228 QuicIetfFramerTest()
229 : start_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(0x10)),
230 framer_(AllSupportedVersions(),
231 start_,
232 Perspective::IS_SERVER,
233 kQuicDefaultConnectionIdLength) {
234 framer_.set_visitor(&visitor_);
235 }
236
237 // Utility functions to do actual framing/deframing.
238 void TryStreamFrame(char* packet_buffer,
239 size_t packet_buffer_size,
240 const char* xmit_packet_data,
241 size_t xmit_packet_data_size,
242 QuicIetfStreamId stream_id,
243 QuicIetfStreamOffset offset,
244 bool fin_bit,
245 bool last_frame_bit,
246 QuicIetfFrameType frame_type) {
247 // initialize a writer so that the serialized packet is placed in
248 // packet_buffer.
249 QuicDataWriter writer(packet_buffer_size, packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -0800250 quiche::NETWORK_BYTE_ORDER); // do not really care
251 // about endianness.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500252 // set up to define the source frame we wish to send.
253 QuicStreamFrame source_stream_frame(
254 stream_id, fin_bit, offset, xmit_packet_data, xmit_packet_data_size);
255
256 // Write the frame to the packet buffer.
257 EXPECT_TRUE(QuicFramerPeer::AppendIetfStreamFrame(
258 &framer_, source_stream_frame, last_frame_bit, &writer));
259 // Better have something in the packet buffer.
260 EXPECT_NE(0u, writer.length());
261 // Now set up a reader to read in the frame.
QUICHE team173c48f2019-11-19 16:34:44 -0800262 QuicDataReader reader(packet_buffer, writer.length(),
263 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500264
265 // A StreamFrame to hold the results... we know the frame type,
266 // put it into the QuicIetfStreamFrame
267 QuicStreamFrame sink_stream_frame;
268 if (xmit_packet_data_size) {
269 EXPECT_EQ(sink_stream_frame.data_buffer, nullptr);
270 EXPECT_EQ(sink_stream_frame.data_length, 0u);
271 }
272
273 EXPECT_TRUE(QuicFramerPeer::ProcessIetfStreamFrame(
274 &framer_, &reader, frame_type, &sink_stream_frame));
275
276 // Now check that the streamid, fin-bit, offset, and
277 // data len all match the input.
278 EXPECT_EQ(sink_stream_frame.stream_id, source_stream_frame.stream_id);
279 EXPECT_EQ(sink_stream_frame.fin, source_stream_frame.fin);
280 EXPECT_EQ(sink_stream_frame.data_length, source_stream_frame.data_length);
281 if (frame_type & IETF_STREAM_FRAME_OFF_BIT) {
282 // There was an offset in the frame, see if xmit and rcv vales equal.
283 EXPECT_EQ(sink_stream_frame.offset, source_stream_frame.offset);
284 } else {
285 // Offset not in frame, so it better come out 0.
286 EXPECT_EQ(sink_stream_frame.offset, 0u);
287 }
288 if (xmit_packet_data_size) {
289 ASSERT_NE(sink_stream_frame.data_buffer, nullptr);
290 ASSERT_NE(source_stream_frame.data_buffer, nullptr);
291 EXPECT_EQ(strcmp(sink_stream_frame.data_buffer,
292 source_stream_frame.data_buffer),
293 0);
294 } else {
295 // No data in the frame.
296 EXPECT_EQ(source_stream_frame.data_length, 0u);
297 EXPECT_EQ(sink_stream_frame.data_length, 0u);
298 }
299 }
300
301 // Overall ack frame encode/decode/compare function
302 // Encodes an ack frame as specified at |*frame|
303 // Then decodes the frame,
304 // Then compares the two
305 // Does some basic checking:
306 // - did the writer write something?
307 // - did the reader read the entire packet?
308 // - did the things the reader read match what the writer wrote?
309 // Returns true if it all worked false if not.
310 bool TryAckFrame(char* packet_buffer,
dschinazi17d42422019-06-18 16:35:07 -0700311 size_t /*packet_buffer_size*/,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500312 struct ack_frame* frame) {
313 QuicAckFrame transmit_frame = InitAckFrame(frame->ranges);
314 if (frame->is_ack_ecn) {
315 transmit_frame.ecn_counters_populated = true;
316 transmit_frame.ect_0_count = frame->ect_0_count;
317 transmit_frame.ect_1_count = frame->ect_1_count;
318 transmit_frame.ecn_ce_count = frame->ecn_ce_count;
319 }
320 transmit_frame.ack_delay_time =
321 QuicTime::Delta::FromMicroseconds(frame->delay_time);
322 size_t expected_size =
323 QuicFramerPeer::GetIetfAckFrameSize(&framer_, transmit_frame);
324
325 // Make a writer so that the serialized packet is placed in
326 // packet_buffer.
QUICHE team173c48f2019-11-19 16:34:44 -0800327 QuicDataWriter writer(expected_size, packet_buffer,
328 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500329
330 // Write the frame to the packet buffer.
331 EXPECT_TRUE(QuicFramerPeer::AppendIetfAckFrameAndTypeByte(
332 &framer_, transmit_frame, &writer));
333
334 size_t expected_frame_length = QuicFramerPeer::ComputeFrameLength(
335 &framer_, QuicFrame(&transmit_frame), false,
336 static_cast<QuicPacketNumberLength>(123456u));
337
338 // Encoded length should match what ComputeFrameLength returns
339 EXPECT_EQ(expected_frame_length, writer.length());
340 // and what is in the buffer should be the expected size.
341 EXPECT_EQ(expected_size, writer.length()) << "Frame is " << transmit_frame;
342 // Now set up a reader to read in the frame.
QUICHE team173c48f2019-11-19 16:34:44 -0800343 QuicDataReader reader(packet_buffer, writer.length(),
344 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500345
346 // read in the frame type
347 uint8_t received_frame_type;
348 EXPECT_TRUE(reader.ReadUInt8(&received_frame_type));
349 EXPECT_EQ(frame->expected_frame_type, received_frame_type);
350
351 // an AckFrame to hold the results
352 QuicAckFrame receive_frame;
353
354 EXPECT_TRUE(QuicFramerPeer::ProcessIetfAckFrame(
355 &framer_, &reader, received_frame_type, &receive_frame));
356
357 if (frame->is_ack_ecn &&
358 (frame->ect_0_count || frame->ect_1_count || frame->ecn_ce_count)) {
359 EXPECT_TRUE(receive_frame.ecn_counters_populated);
360 EXPECT_EQ(receive_frame.ect_0_count, frame->ect_0_count);
361 EXPECT_EQ(receive_frame.ect_1_count, frame->ect_1_count);
362 EXPECT_EQ(receive_frame.ecn_ce_count, frame->ecn_ce_count);
363 } else {
364 EXPECT_FALSE(receive_frame.ecn_counters_populated);
365 EXPECT_EQ(receive_frame.ect_0_count, 0u);
366 EXPECT_EQ(receive_frame.ect_1_count, 0u);
367 EXPECT_EQ(receive_frame.ecn_ce_count, 0u);
368 }
369
370 // Now check that the received frame matches the sent frame.
371 EXPECT_EQ(transmit_frame.largest_acked, receive_frame.largest_acked);
372 // The ~0x7 needs some explaining. The ack frame format down shifts the
373 // delay time by 3 (divide by 8) to allow for greater ranges in delay time.
374 // Therefore, if we give the framer a delay time that is not an
375 // even multiple of 8, the value that the deframer produces will
376 // not be the same as what the framer got. The downshift on
377 // framing and upshift on deframing results in clearing the 3
378 // low-order bits ... The masking basically does the same thing,
379 // so the compare works properly.
380 return true;
381 }
382
383 // encode, decode, and check a Path Challenge frame.
384 bool TryPathChallengeFrame(char* packet_buffer,
385 size_t packet_buffer_size,
386 const QuicPathFrameBuffer& data) {
387 // Make a writer so that the serialized packet is placed in
388 // packet_buffer.
389 QuicDataWriter writer(packet_buffer_size, packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -0800390 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500391
392 QuicPathChallengeFrame transmit_frame(0, data);
393
394 // write the frame to the packet buffer.
395 EXPECT_TRUE(QuicFramerPeer::AppendPathChallengeFrame(
396 &framer_, transmit_frame, &writer));
397
398 // Check for correct length in the packet buffer.
399 EXPECT_EQ(kQuicPathChallengeFrameSize, writer.length());
400
401 // now set up a reader to read in the frame.
QUICHE team173c48f2019-11-19 16:34:44 -0800402 QuicDataReader reader(packet_buffer, writer.length(),
403 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500404
405 QuicPathChallengeFrame receive_frame;
406
407 EXPECT_TRUE(QuicFramerPeer::ProcessPathChallengeFrame(&framer_, &reader,
408 &receive_frame));
409
410 // Now check that the received frame matches the sent frame.
411 EXPECT_EQ(
412 0, memcmp(transmit_frame.data_buffer.data(),
413 receive_frame.data_buffer.data(), kQuicPathFrameBufferSize));
414 return true;
415 }
416
417 // encode, decode, and check a Path Response frame.
418 bool TryPathResponseFrame(char* packet_buffer,
419 size_t packet_buffer_size,
420 const QuicPathFrameBuffer& data) {
421 // Make a writer so that the serialized packet is placed in
422 // packet_buffer.
423 QuicDataWriter writer(packet_buffer_size, packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -0800424 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500425
426 QuicPathResponseFrame transmit_frame(0, data);
427
428 // Write the frame to the packet buffer.
429 EXPECT_TRUE(QuicFramerPeer::AppendPathResponseFrame(
430 &framer_, transmit_frame, &writer));
431
432 // Check for correct length in the packet buffer.
433 EXPECT_EQ(kQuicPathResponseFrameSize, writer.length());
434
435 // Set up a reader to read in the frame.
QUICHE team173c48f2019-11-19 16:34:44 -0800436 QuicDataReader reader(packet_buffer, writer.length(),
437 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500438
439 QuicPathResponseFrame receive_frame;
440
441 EXPECT_TRUE(QuicFramerPeer::ProcessPathResponseFrame(&framer_, &reader,
442 &receive_frame));
443
444 // Now check that the received frame matches the sent frame.
445 EXPECT_EQ(
446 0, memcmp(transmit_frame.data_buffer.data(),
447 receive_frame.data_buffer.data(), kQuicPathFrameBufferSize));
448 return true;
449 }
450
451 // Test the Serialization/deserialization of a Reset Stream Frame.
452 void TryResetFrame(char* packet_buffer,
453 size_t packet_buffer_size,
454 QuicStreamId stream_id,
455 uint16_t error_code,
456 QuicStreamOffset final_offset) {
457 // Initialize a writer so that the serialized packet is placed in
458 // packet_buffer.
459 QuicDataWriter writer(packet_buffer_size, packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -0800460 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500461
462 QuicRstStreamFrame transmit_frame(static_cast<QuicControlFrameId>(1),
463 stream_id, error_code, final_offset);
464
465 // Write the frame to the packet buffer.
466 EXPECT_TRUE(QuicFramerPeer::AppendIetfResetStreamFrame(
467 &framer_, transmit_frame, &writer));
fkastenholz07300e52019-07-16 11:51:37 -0700468 // Check that the size of the serialzed frame is in the allowed range (3 to
469 // 24 bytes, inclusive).
470 EXPECT_LT(2u, writer.length());
471 EXPECT_GT(25u, writer.length());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500472 // Now set up a reader to read in the thing in.
QUICHE team173c48f2019-11-19 16:34:44 -0800473 QuicDataReader reader(packet_buffer, writer.length(),
474 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500475
476 // A QuicRstStreamFrame to hold the results
477 QuicRstStreamFrame receive_frame;
478 EXPECT_TRUE(QuicFramerPeer::ProcessIetfResetStreamFrame(&framer_, &reader,
479 &receive_frame));
480
481 // Now check that the received values match the input.
482 EXPECT_EQ(receive_frame.stream_id, transmit_frame.stream_id);
483 EXPECT_EQ(receive_frame.ietf_error_code, transmit_frame.ietf_error_code);
484 EXPECT_EQ(receive_frame.byte_offset, transmit_frame.byte_offset);
485 }
486
fkastenholz3c4eabf2019-04-22 07:49:59 -0700487 void TryMaxStreamsFrame(QuicStreamCount stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500488 bool unidirectional,
489 bool stream_id_server_initiated) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500490 char packet_buffer[kNormalPacketBufferSize];
491 memset(packet_buffer, 0, sizeof(packet_buffer));
492
493 Perspective old_perspective = framer_.perspective();
fkastenholz3c4eabf2019-04-22 07:49:59 -0700494 // Set up the writer and transmit QuicMaxStreamsFrame
QUICHE teama6ef0a62019-03-07 20:34:33 -0500495 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -0800496 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500497
498 // Set the perspective of the sender. If the stream id is supposed to
499 // be server-initiated, then the sender of the MAX_STREAMS should be
500 // a client, and vice versa. Do this prior to constructing the frame or
501 // generating the packet, so that any internal dependencies are satisfied.
502 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
503 ? Perspective::IS_CLIENT
504 : Perspective::IS_SERVER);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700505 QuicMaxStreamsFrame transmit_frame(0, stream_count, unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500506
507 // Add the frame.
508 EXPECT_TRUE(QuicFramerPeer::AppendMaxStreamsFrame(&framer_, transmit_frame,
509 &writer));
510
511 // Check that buffer length is in the expected range
512 EXPECT_LE(1u, writer.length());
513 EXPECT_GE(8u, writer.length());
514
515 // Set the perspective for the receiver.
516 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
517 ? Perspective::IS_SERVER
518 : Perspective::IS_CLIENT);
519
520 // Set up reader and empty receive QuicPaddingFrame.
QUICHE team173c48f2019-11-19 16:34:44 -0800521 QuicDataReader reader(packet_buffer, writer.length(),
522 quiche::NETWORK_BYTE_ORDER);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700523 QuicMaxStreamsFrame receive_frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500524
525 // Deframe it
526 EXPECT_TRUE(QuicFramerPeer::ProcessMaxStreamsFrame(
527 &framer_, &reader, &receive_frame,
528 (unidirectional) ? IETF_MAX_STREAMS_UNIDIRECTIONAL
529 : IETF_MAX_STREAMS_BIDIRECTIONAL))
530 << " Error: " << framer_.detailed_error();
531
532 // Now check that received and sent data are equivalent
fkastenholz3c4eabf2019-04-22 07:49:59 -0700533 EXPECT_EQ(stream_count, receive_frame.stream_count);
534 EXPECT_EQ(transmit_frame.stream_count, receive_frame.stream_count);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500535 QuicFramerPeer::SetPerspective(&framer_, old_perspective);
536 }
537
fkastenholz3c4eabf2019-04-22 07:49:59 -0700538 void TryStreamsBlockedFrame(QuicStreamCount stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500539 bool unidirectional,
540 bool stream_id_server_initiated) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500541 char packet_buffer[kNormalPacketBufferSize];
542 memset(packet_buffer, 0, sizeof(packet_buffer));
543
544 Perspective old_perspective = framer_.perspective();
fkastenholz3c4eabf2019-04-22 07:49:59 -0700545 // Set up the writer and transmit QuicStreamsBlockedFrame
QUICHE teama6ef0a62019-03-07 20:34:33 -0500546 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -0800547 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500548
549 // Set the perspective of the sender. If the stream id is supposed to
fkastenholz3c4eabf2019-04-22 07:49:59 -0700550 // be server-initiated, then the sender of the STREAMS_BLOCKED should be
QUICHE teama6ef0a62019-03-07 20:34:33 -0500551 // a client, and vice versa. Do this prior to constructing the frame or
552 // generating the packet, so that any internal dependencies are satisfied.
553 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
554 ? Perspective::IS_SERVER
555 : Perspective::IS_CLIENT);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700556 QuicStreamsBlockedFrame transmit_frame(0, stream_count, unidirectional);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500557
558 // Add the frame.
559 EXPECT_TRUE(QuicFramerPeer::AppendStreamsBlockedFrame(
560 &framer_, transmit_frame, &writer));
561
562 // Check that buffer length is in the expected range
563 EXPECT_LE(1u, writer.length());
564 EXPECT_GE(8u, writer.length());
565
566 // Set the perspective for the receiver.
567 QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
568 ? Perspective::IS_CLIENT
569 : Perspective::IS_SERVER);
570
571 // Set up reader and empty receive QuicPaddingFrame.
QUICHE team173c48f2019-11-19 16:34:44 -0800572 QuicDataReader reader(packet_buffer, writer.length(),
573 quiche::NETWORK_BYTE_ORDER);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700574 QuicStreamsBlockedFrame receive_frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500575
576 // Deframe it
577 EXPECT_TRUE(QuicFramerPeer::ProcessStreamsBlockedFrame(
578 &framer_, &reader, &receive_frame,
579 (unidirectional) ? IETF_STREAMS_BLOCKED_UNIDIRECTIONAL
580 : IETF_STREAMS_BLOCKED_BIDIRECTIONAL));
581
582 // Now check that received and sent data are equivalent
fkastenholz3c4eabf2019-04-22 07:49:59 -0700583 EXPECT_EQ(stream_count, receive_frame.stream_count);
584 EXPECT_EQ(transmit_frame.stream_count, receive_frame.stream_count);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500585 QuicFramerPeer::SetPerspective(&framer_, old_perspective);
586 }
587
588 QuicTime start_;
589 QuicFramer framer_;
590 test::TestQuicVisitor visitor_;
591};
592
593struct stream_frame_variant {
594 QuicIetfStreamId stream_id;
595 QuicIetfStreamOffset offset;
596 bool fin_bit;
597 bool last_frame_bit;
598 uint8_t frame_type;
599} stream_frame_to_test[] = {
600#define IETF_STREAM0 (((uint8_t)IETF_STREAM))
601
602#define IETF_STREAM1 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_FIN_BIT)
603
604#define IETF_STREAM2 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_LEN_BIT)
605
606#define IETF_STREAM3 \
607 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_LEN_BIT | \
608 IETF_STREAM_FRAME_FIN_BIT)
609
610#define IETF_STREAM4 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT)
611
612#define IETF_STREAM5 \
613 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
614 IETF_STREAM_FRAME_FIN_BIT)
615
616#define IETF_STREAM6 \
617 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
618 IETF_STREAM_FRAME_LEN_BIT)
619
620#define IETF_STREAM7 \
621 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
622 IETF_STREAM_FRAME_LEN_BIT | IETF_STREAM_FRAME_FIN_BIT)
623
624 {kStreamId8, kOffset8, true, false, IETF_STREAM7},
625 {kStreamId8, kOffset8, false, false, IETF_STREAM6},
626 {kStreamId8, kOffset4, true, false, IETF_STREAM7},
627 {kStreamId8, kOffset4, false, false, IETF_STREAM6},
628 {kStreamId8, kOffset2, true, false, IETF_STREAM7},
629 {kStreamId8, kOffset2, false, false, IETF_STREAM6},
630 {kStreamId8, kOffset1, true, false, IETF_STREAM7},
631 {kStreamId8, kOffset1, false, false, IETF_STREAM6},
632 {kStreamId8, kOffset0, true, false, IETF_STREAM3},
633 {kStreamId8, kOffset0, false, false, IETF_STREAM2},
634 {kStreamId4, kOffset8, true, false, IETF_STREAM7},
635 {kStreamId4, kOffset8, false, false, IETF_STREAM6},
636 {kStreamId4, kOffset4, true, false, IETF_STREAM7},
637 {kStreamId4, kOffset4, false, false, IETF_STREAM6},
638 {kStreamId4, kOffset2, true, false, IETF_STREAM7},
639 {kStreamId4, kOffset2, false, false, IETF_STREAM6},
640 {kStreamId4, kOffset1, true, false, IETF_STREAM7},
641 {kStreamId4, kOffset1, false, false, IETF_STREAM6},
642 {kStreamId4, kOffset0, true, false, IETF_STREAM3},
643 {kStreamId4, kOffset0, false, false, IETF_STREAM2},
644 {kStreamId2, kOffset8, true, false, IETF_STREAM7},
645 {kStreamId2, kOffset8, false, false, IETF_STREAM6},
646 {kStreamId2, kOffset4, true, false, IETF_STREAM7},
647 {kStreamId2, kOffset4, false, false, IETF_STREAM6},
648 {kStreamId2, kOffset2, true, false, IETF_STREAM7},
649 {kStreamId2, kOffset2, false, false, IETF_STREAM6},
650 {kStreamId2, kOffset1, true, false, IETF_STREAM7},
651 {kStreamId2, kOffset1, false, false, IETF_STREAM6},
652 {kStreamId2, kOffset0, true, false, IETF_STREAM3},
653 {kStreamId2, kOffset0, false, false, IETF_STREAM2},
654 {kStreamId1, kOffset8, true, false, IETF_STREAM7},
655 {kStreamId1, kOffset8, false, false, IETF_STREAM6},
656 {kStreamId1, kOffset4, true, false, IETF_STREAM7},
657 {kStreamId1, kOffset4, false, false, IETF_STREAM6},
658 {kStreamId1, kOffset2, true, false, IETF_STREAM7},
659 {kStreamId1, kOffset2, false, false, IETF_STREAM6},
660 {kStreamId1, kOffset1, true, false, IETF_STREAM7},
661 {kStreamId1, kOffset1, false, false, IETF_STREAM6},
662 {kStreamId1, kOffset0, true, false, IETF_STREAM3},
663 {kStreamId1, kOffset0, false, false, IETF_STREAM2},
664 {kStreamId0, kOffset8, true, false, IETF_STREAM7},
665 {kStreamId0, kOffset8, false, false, IETF_STREAM6},
666 {kStreamId0, kOffset4, true, false, IETF_STREAM7},
667 {kStreamId0, kOffset4, false, false, IETF_STREAM6},
668 {kStreamId0, kOffset2, true, false, IETF_STREAM7},
669 {kStreamId0, kOffset2, false, false, IETF_STREAM6},
670 {kStreamId0, kOffset1, true, false, IETF_STREAM7},
671 {kStreamId0, kOffset1, false, false, IETF_STREAM6},
672 {kStreamId0, kOffset0, true, false, IETF_STREAM3},
673 {kStreamId0, kOffset0, false, false, IETF_STREAM2},
674
675 {kStreamId8, kOffset8, true, true, IETF_STREAM5},
676 {kStreamId8, kOffset8, false, true, IETF_STREAM4},
677 {kStreamId8, kOffset4, true, true, IETF_STREAM5},
678 {kStreamId8, kOffset4, false, true, IETF_STREAM4},
679 {kStreamId8, kOffset2, true, true, IETF_STREAM5},
680 {kStreamId8, kOffset2, false, true, IETF_STREAM4},
681 {kStreamId8, kOffset1, true, true, IETF_STREAM5},
682 {kStreamId8, kOffset1, false, true, IETF_STREAM4},
683 {kStreamId8, kOffset0, true, true, IETF_STREAM1},
684 {kStreamId8, kOffset0, false, true, IETF_STREAM0},
685 {kStreamId4, kOffset8, true, true, IETF_STREAM5},
686 {kStreamId4, kOffset8, false, true, IETF_STREAM4},
687 {kStreamId4, kOffset4, true, true, IETF_STREAM5},
688 {kStreamId4, kOffset4, false, true, IETF_STREAM4},
689 {kStreamId4, kOffset2, true, true, IETF_STREAM5},
690 {kStreamId4, kOffset2, false, true, IETF_STREAM4},
691 {kStreamId4, kOffset1, true, true, IETF_STREAM5},
692 {kStreamId4, kOffset1, false, true, IETF_STREAM4},
693 {kStreamId4, kOffset0, true, true, IETF_STREAM1},
694 {kStreamId4, kOffset0, false, true, IETF_STREAM0},
695 {kStreamId2, kOffset8, true, true, IETF_STREAM5},
696 {kStreamId2, kOffset8, false, true, IETF_STREAM4},
697 {kStreamId2, kOffset4, true, true, IETF_STREAM5},
698 {kStreamId2, kOffset4, false, true, IETF_STREAM4},
699 {kStreamId2, kOffset2, true, true, IETF_STREAM5},
700 {kStreamId2, kOffset2, false, true, IETF_STREAM4},
701 {kStreamId2, kOffset1, true, true, IETF_STREAM5},
702 {kStreamId2, kOffset1, false, true, IETF_STREAM4},
703 {kStreamId2, kOffset0, true, true, IETF_STREAM1},
704 {kStreamId2, kOffset0, false, true, IETF_STREAM0},
705 {kStreamId1, kOffset8, true, true, IETF_STREAM5},
706 {kStreamId1, kOffset8, false, true, IETF_STREAM4},
707 {kStreamId1, kOffset4, true, true, IETF_STREAM5},
708 {kStreamId1, kOffset4, false, true, IETF_STREAM4},
709 {kStreamId1, kOffset2, true, true, IETF_STREAM5},
710 {kStreamId1, kOffset2, false, true, IETF_STREAM4},
711 {kStreamId1, kOffset1, true, true, IETF_STREAM5},
712 {kStreamId1, kOffset1, false, true, IETF_STREAM4},
713 {kStreamId1, kOffset0, true, true, IETF_STREAM1},
714 {kStreamId1, kOffset0, false, true, IETF_STREAM0},
715 {kStreamId0, kOffset8, true, true, IETF_STREAM5},
716 {kStreamId0, kOffset8, false, true, IETF_STREAM4},
717 {kStreamId0, kOffset4, true, true, IETF_STREAM5},
718 {kStreamId0, kOffset4, false, true, IETF_STREAM4},
719 {kStreamId0, kOffset2, true, true, IETF_STREAM5},
720 {kStreamId0, kOffset2, false, true, IETF_STREAM4},
721 {kStreamId0, kOffset1, true, true, IETF_STREAM5},
722 {kStreamId0, kOffset1, false, true, IETF_STREAM4},
723 {kStreamId0, kOffset0, true, true, IETF_STREAM1},
724 {kStreamId0, kOffset0, false, true, IETF_STREAM0},
725};
726
727TEST_F(QuicIetfFramerTest, StreamFrame) {
728 char packet_buffer[kNormalPacketBufferSize];
729 const char* transmit_packet_data =
730 "this is a test of some packet data, "
731 "can do a simple strcmp to see if the "
732 "input and output are the same!";
733
734 size_t transmit_packet_data_len = strlen(transmit_packet_data) + 1;
735 for (size_t i = 0; i < QUIC_ARRAYSIZE(stream_frame_to_test); ++i) {
736 SCOPED_TRACE(i);
737 struct stream_frame_variant* variant = &stream_frame_to_test[i];
738 TryStreamFrame(packet_buffer, sizeof(packet_buffer), transmit_packet_data,
739 transmit_packet_data_len, variant->stream_id,
740 variant->offset, variant->fin_bit, variant->last_frame_bit,
741 static_cast<QuicIetfFrameType>(variant->frame_type));
742 }
743}
744// As the previous test, but with no data.
745TEST_F(QuicIetfFramerTest, ZeroLengthStreamFrame) {
746 char packet_buffer[kNormalPacketBufferSize];
747
748 for (size_t i = 0; i < QUIC_ARRAYSIZE(stream_frame_to_test); ++i) {
749 SCOPED_TRACE(i);
750 struct stream_frame_variant* variant = &stream_frame_to_test[i];
751 TryStreamFrame(packet_buffer, sizeof(packet_buffer),
752 /* xmit_packet_data = */ NULL,
753 /* xmit_packet_data_size = */ 0, variant->stream_id,
754 variant->offset, variant->fin_bit, variant->last_frame_bit,
755 static_cast<QuicIetfFrameType>(variant->frame_type));
756 }
757}
758
759TEST_F(QuicIetfFramerTest, CryptoFrame) {
760 SimpleDataProducer data_producer;
761 framer_.set_data_producer(&data_producer);
762 char packet_buffer[kNormalPacketBufferSize];
763
764 QuicStringPiece frame_data("This is a CRYPTO frame.");
765
766 QuicStreamOffset offsets[] = {kOffset8, kOffset4, kOffset2, kOffset1,
767 kOffset0};
768 for (QuicStreamOffset offset : offsets) {
QUICHE team6987b4a2019-03-15 16:23:04 -0700769 QuicCryptoFrame frame(ENCRYPTION_INITIAL, offset, frame_data.length());
770 data_producer.SaveCryptoData(ENCRYPTION_INITIAL, offset, frame_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500771
772 QuicDataWriter writer(QUIC_ARRAYSIZE(packet_buffer), packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -0800773 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500774
775 // Write the frame.
776 EXPECT_TRUE(QuicFramerPeer::AppendCryptoFrame(&framer_, frame, &writer));
777 EXPECT_NE(0u, writer.length());
778 // Read it back.
QUICHE team173c48f2019-11-19 16:34:44 -0800779 QuicDataReader reader(packet_buffer, writer.length(),
780 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500781 QuicCryptoFrame read_frame;
782 EXPECT_TRUE(
783 QuicFramerPeer::ProcessCryptoFrame(&framer_, &reader, &read_frame));
784
785 // Check that the frames match:
786 QuicStringPiece read_data(read_frame.data_buffer, read_frame.data_length);
787 EXPECT_EQ(read_frame.data_length, frame.data_length);
788 EXPECT_EQ(read_frame.offset, frame.offset);
789 EXPECT_EQ(read_data, frame_data);
790 }
791}
792
wubb2486b82019-09-06 21:18:24 -0700793TEST_F(QuicIetfFramerTest, ConnectionClose) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500794 char packet_buffer[kNormalPacketBufferSize];
795
796 // initialize a writer so that the serialized packet is placed in
797 // packet_buffer.
798 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -0800799 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500800
vasilvvc48c8712019-03-11 13:38:16 -0700801 std::string test_string = "Ich Bin Ein Jelly Donut?";
wubb2486b82019-09-06 21:18:24 -0700802 QuicConnectionCloseFrame sent_frame(QUIC_VERSION_99, QUIC_NO_ERROR,
803 test_string,
804 /*transport_close_frame_type=*/123);
805
QUICHE teama6ef0a62019-03-07 20:34:33 -0500806 // write the frame to the packet buffer.
807 EXPECT_TRUE(QuicFramerPeer::AppendIetfConnectionCloseFrame(
808 &framer_, sent_frame, &writer));
809
810 // better have something in the packet buffer.
811 EXPECT_NE(0u, writer.length());
812
813 // now set up a reader to read in the frame.
QUICHE team173c48f2019-11-19 16:34:44 -0800814 QuicDataReader reader(packet_buffer, writer.length(),
815 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500816
817 // a QuicConnectionCloseFrame to hold the results.
818 QuicConnectionCloseFrame sink_frame;
819
fkastenholze9d71a82019-04-09 05:12:13 -0700820 EXPECT_TRUE(QuicFramerPeer::ProcessIetfConnectionCloseFrame(
821 &framer_, &reader, IETF_QUIC_TRANSPORT_CONNECTION_CLOSE, &sink_frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500822
823 // Now check that received == sent
fkastenholz72f509b2019-04-10 09:17:49 -0700824 EXPECT_EQ(sent_frame.quic_error_code, sink_frame.quic_error_code);
bncf54082a2019-11-27 10:19:47 -0800825 EXPECT_THAT(sink_frame.quic_error_code, IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500826 EXPECT_EQ(sink_frame.error_details, test_string);
fkastenholz72f509b2019-04-10 09:17:49 -0700827 EXPECT_EQ(sink_frame.close_type, sent_frame.close_type);
828 EXPECT_EQ(sent_frame.close_type, IETF_QUIC_TRANSPORT_CONNECTION_CLOSE);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500829}
830
wubb2486b82019-09-06 21:18:24 -0700831TEST_F(QuicIetfFramerTest, ApplicationClose) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500832 char packet_buffer[kNormalPacketBufferSize];
833
834 // initialize a writer so that the serialized packet is placed in
835 // packet_buffer.
836 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -0800837 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500838
vasilvvc48c8712019-03-11 13:38:16 -0700839 std::string test_string = "Ich Bin Ein Jelly Donut?";
wubb2486b82019-09-06 21:18:24 -0700840 QuicConnectionCloseFrame sent_frame(QUIC_VERSION_99, QUIC_LAST_ERROR,
841 test_string,
842 /*transport_close_frame_type=*/0);
843
QUICHE teama6ef0a62019-03-07 20:34:33 -0500844 // write the frame to the packet buffer.
fkastenholz72f509b2019-04-10 09:17:49 -0700845 EXPECT_TRUE(QuicFramerPeer::AppendIetfConnectionCloseFrame(
846 &framer_, sent_frame, &writer));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500847
848 // better have something in the packet buffer.
849 EXPECT_NE(0u, writer.length());
850
851 // now set up a reader to read in the frame.
QUICHE team173c48f2019-11-19 16:34:44 -0800852 QuicDataReader reader(packet_buffer, writer.length(),
853 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500854
855 // a QuicConnectionCloseFrame to hold the results.
fkastenholz72f509b2019-04-10 09:17:49 -0700856 QuicConnectionCloseFrame sink_frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500857
fkastenholz72f509b2019-04-10 09:17:49 -0700858 EXPECT_TRUE(QuicFramerPeer::ProcessIetfConnectionCloseFrame(
859 &framer_, &reader, IETF_QUIC_APPLICATION_CONNECTION_CLOSE, &sink_frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500860
861 // Now check that received == sent
wubb2486b82019-09-06 21:18:24 -0700862 EXPECT_EQ(sink_frame.quic_error_code, QUIC_LAST_ERROR);
fkastenholz72f509b2019-04-10 09:17:49 -0700863 EXPECT_EQ(sent_frame.quic_error_code, sink_frame.quic_error_code);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500864 EXPECT_EQ(sink_frame.error_details, test_string);
fkastenholz72f509b2019-04-10 09:17:49 -0700865 EXPECT_EQ(sent_frame.close_type, IETF_QUIC_APPLICATION_CONNECTION_CLOSE);
866 EXPECT_EQ(sent_frame.close_type, sink_frame.close_type);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500867}
868
869// Testing for the IETF ACK framer.
870// clang-format off
871struct ack_frame ack_frame_variants[] = {
872 {90000,
873 false,
874 0,
875 0,
876 0,
877 {{QuicPacketNumber(1000), QuicPacketNumber(2001)}},
878 IETF_ACK},
879 {0,
880 false,
881 0,
882 0,
883 0,
884 {{QuicPacketNumber(1000), QuicPacketNumber(2001)}},
885 IETF_ACK},
886 {1,
887 false,
888 0,
889 0,
890 0,
891 {{QuicPacketNumber(1), QuicPacketNumber(2)},
892 {QuicPacketNumber(5), QuicPacketNumber(6)}},
893 IETF_ACK},
894 {63,
895 false,
896 0,
897 0,
898 0,
899 {{QuicPacketNumber(1), QuicPacketNumber(2)},
900 {QuicPacketNumber(5), QuicPacketNumber(6)}},
901 IETF_ACK},
902 {64,
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 {10000,
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 {100000000,
927 false,
928 0,
929 0,
930 0,
931 {{QuicPacketNumber(1), QuicPacketNumber(2)},
932 {QuicPacketNumber(3), QuicPacketNumber(4)},
933 {QuicPacketNumber(5), QuicPacketNumber(6)},
934 {QuicPacketNumber(7), QuicPacketNumber(8)},
935 {QuicPacketNumber(9), QuicPacketNumber(10)},
936 {QuicPacketNumber(11), QuicPacketNumber(12)}},
937 IETF_ACK},
938 {0,
939 false,
940 0,
941 0,
942 0,
943 {{QuicPacketNumber(1), QuicPacketNumber(65)}},
944 IETF_ACK},
945 {9223372036854775807,
946 false,
947 0,
948 0,
949 0,
950 {{QuicPacketNumber(1), QuicPacketNumber(11)},
951 {QuicPacketNumber(74), QuicPacketNumber(138)}},
952 IETF_ACK},
953 // This ack is for packets 60 & 125. There are 64 packets in the gap.
954 // The encoded value is gap_size - 1, or 63. Crosses a VarInt62 encoding
955 // boundary...
956 {1,
957 false,
958 0,
959 0,
960 0,
961 {{QuicPacketNumber(60), QuicPacketNumber(61)},
962 {QuicPacketNumber(125), QuicPacketNumber(126)}},
963 IETF_ACK},
964 {2,
965 false,
966 0,
967 0,
968 0,
969 {{QuicPacketNumber(1), QuicPacketNumber(65)},
970 {QuicPacketNumber(129), QuicPacketNumber(130)}},
971 IETF_ACK},
972 {3,
973 false,
974 0,
975 0,
976 0,
977 {{QuicPacketNumber(1), QuicPacketNumber(65)},
978 {QuicPacketNumber(129), QuicPacketNumber(195)}},
979 IETF_ACK},
980 {4,
981 false,
982 0,
983 0,
984 0,
985 {{QuicPacketNumber(1), QuicPacketNumber(65)},
986 {QuicPacketNumber(129), QuicPacketNumber(194)}},
987 IETF_ACK},
988 {5,
989 false,
990 0,
991 0,
992 0,
993 {{QuicPacketNumber(1), QuicPacketNumber(65)},
994 {QuicPacketNumber(129), QuicPacketNumber(193)}},
995 IETF_ACK},
996 {6,
997 false,
998 0,
999 0,
1000 0,
1001 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1002 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1003 IETF_ACK},
1004 // declare some ack_ecn frames to try.
1005 {6,
1006 false,
1007 100,
1008 200,
1009 300,
1010 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1011 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1012 IETF_ACK},
1013 {6,
1014 true,
1015 100,
1016 200,
1017 300,
1018 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1019 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1020 IETF_ACK_ECN},
1021 {6,
1022 true,
1023 100,
1024 0,
1025 0,
1026 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1027 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1028 IETF_ACK_ECN},
1029 {6,
1030 true,
1031 0,
1032 200,
1033 0,
1034 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1035 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1036 IETF_ACK_ECN},
1037 {6,
1038 true,
1039 0,
1040 0,
1041 300,
1042 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1043 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1044 IETF_ACK_ECN},
1045 {6,
1046 true,
1047 0,
1048 0,
1049 0,
1050 {{QuicPacketNumber(1), QuicPacketNumber(65)},
1051 {QuicPacketNumber(129), QuicPacketNumber(192)}},
1052 IETF_ACK},
1053};
1054// clang-format on
1055
1056TEST_F(QuicIetfFramerTest, AckFrame) {
1057 char packet_buffer[kNormalPacketBufferSize];
1058 for (auto ack_frame_variant : ack_frame_variants) {
1059 EXPECT_TRUE(
1060 TryAckFrame(packet_buffer, sizeof(packet_buffer), &ack_frame_variant));
1061 }
1062}
1063
1064// Test the case of having a QuicAckFrame with no ranges in it. By
1065// examination of the Google Quic Ack code and tests, this case should
1066// be handled as an ack with no "ranges after the first"; the
1067// AckBlockCount should be 0 and the FirstAckBlock should be
1068// |LargestAcked| - 1 (number of packets preceding the LargestAcked.
1069TEST_F(QuicIetfFramerTest, AckFrameNoRanges) {
1070 char packet_buffer[kNormalPacketBufferSize];
1071
1072 // Make a writer so that the serialized packet is placed in
1073 // packet_buffer.
1074 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -08001075 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001076
1077 QuicAckFrame transmit_frame;
1078 transmit_frame.largest_acked = QuicPacketNumber(1);
1079 transmit_frame.ack_delay_time = QuicTime::Delta::FromMicroseconds(0);
1080
1081 size_t expected_size =
1082 QuicFramerPeer::GetIetfAckFrameSize(&framer_, transmit_frame);
1083 // Write the frame to the packet buffer.
1084 EXPECT_TRUE(QuicFramerPeer::AppendIetfAckFrameAndTypeByte(
1085 &framer_, transmit_frame, &writer));
1086
1087 uint8_t packet[] = {
1088 0x02, // type, IETF_ACK
1089 0x01, // largest_acked,
1090 0x00, // delay
1091 0x00, // count of additional ack blocks
1092 0x00, // size of first ack block (packets preceding largest_acked)
1093 };
1094 EXPECT_EQ(expected_size, sizeof(packet));
1095 EXPECT_EQ(sizeof(packet), writer.length());
1096 EXPECT_EQ(0, memcmp(packet, packet_buffer, writer.length()));
1097
1098 // Now set up a reader to read in the frame.
QUICHE team173c48f2019-11-19 16:34:44 -08001099 QuicDataReader reader(packet_buffer, writer.length(),
1100 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001101
1102 // an AckFrame to hold the results
1103 QuicAckFrame receive_frame;
1104
1105 // read in the frame type
1106 uint8_t received_frame_type;
1107 EXPECT_TRUE(reader.ReadUInt8(&received_frame_type));
1108 EXPECT_EQ(received_frame_type, IETF_ACK);
1109
1110 EXPECT_TRUE(QuicFramerPeer::ProcessIetfAckFrame(&framer_, &reader, IETF_ACK,
1111 &receive_frame));
1112
1113 // Now check that the received frame matches the sent frame.
1114 EXPECT_EQ(transmit_frame.largest_acked, receive_frame.largest_acked);
1115}
1116
1117TEST_F(QuicIetfFramerTest, PathChallengeFrame) {
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 TryPathChallengeFrame(packet_buffer, sizeof(packet_buffer), buffer0));
1126 EXPECT_TRUE(
1127 TryPathChallengeFrame(packet_buffer, sizeof(packet_buffer), buffer1));
1128}
1129
1130TEST_F(QuicIetfFramerTest, PathResponseFrame) {
1131 // Double-braces needed on some platforms due to
1132 // https://bugs.llvm.org/show_bug.cgi?id=21629
1133 QuicPathFrameBuffer buffer0 = {{0, 0, 0, 0, 0, 0, 0, 0}};
1134 QuicPathFrameBuffer buffer1 = {
1135 {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
1136 char packet_buffer[kNormalPacketBufferSize];
1137 EXPECT_TRUE(
1138 TryPathResponseFrame(packet_buffer, sizeof(packet_buffer), buffer0));
1139 EXPECT_TRUE(
1140 TryPathResponseFrame(packet_buffer, sizeof(packet_buffer), buffer1));
1141}
1142
1143TEST_F(QuicIetfFramerTest, ResetStreamFrame) {
1144 char packet_buffer[kNormalPacketBufferSize];
1145 struct resets {
1146 QuicStreamId stream_id;
1147 uint16_t error_code;
1148 QuicStreamOffset final_offset;
1149 } reset_frames[] = {
1150 {0, 55, 0},
1151 {0x10, 73, 0x300},
1152 };
1153 for (auto reset : reset_frames) {
1154 TryResetFrame(packet_buffer, sizeof(packet_buffer), reset.stream_id,
1155 reset.error_code, reset.final_offset);
1156 }
1157}
1158
1159TEST_F(QuicIetfFramerTest, StopSendingFrame) {
1160 char packet_buffer[kNormalPacketBufferSize];
1161
1162 // Make a writer so that the serialized packet is placed in
1163 // packet_buffer.
1164 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -08001165 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001166
1167 QuicStopSendingFrame transmit_frame;
1168 transmit_frame.stream_id = 12345;
1169 transmit_frame.application_error_code = 543;
1170
1171 // Write the frame to the packet buffer.
1172 EXPECT_TRUE(QuicFramerPeer::AppendStopSendingFrame(&framer_, transmit_frame,
1173 &writer));
1174 // Check that the number of bytes in the buffer is in the
1175 // allowed range.
1176 EXPECT_LE(3u, writer.length());
1177 EXPECT_GE(10u, writer.length());
1178
QUICHE team173c48f2019-11-19 16:34:44 -08001179 QuicDataReader reader(packet_buffer, writer.length(),
1180 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001181
1182 // A frame to hold the results
1183 QuicStopSendingFrame receive_frame;
1184
1185 EXPECT_TRUE(QuicFramerPeer::ProcessStopSendingFrame(&framer_, &reader,
1186 &receive_frame));
1187
1188 // Verify that the transmitted and received values are the same.
1189 EXPECT_EQ(receive_frame.stream_id, 12345u);
1190 EXPECT_EQ(receive_frame.application_error_code, 543u);
1191 EXPECT_EQ(receive_frame.stream_id, transmit_frame.stream_id);
1192 EXPECT_EQ(receive_frame.application_error_code,
1193 transmit_frame.application_error_code);
1194}
1195
1196TEST_F(QuicIetfFramerTest, MaxDataFrame) {
1197 char packet_buffer[kNormalPacketBufferSize];
1198 QuicStreamOffset window_sizes[] = {0, 1, 2, 5, 10,
1199 20, 50, 100, 200, 500,
1200 1000000, kOffset8, kOffset4, kOffset2};
1201 for (QuicStreamOffset window_size : window_sizes) {
1202 memset(packet_buffer, 0, sizeof(packet_buffer));
1203
1204 // Set up the writer and transmit QuicWindowUpdateFrame
1205 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -08001206 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001207 QuicWindowUpdateFrame transmit_frame(0, 99, window_size);
1208
1209 // Add the frame.
1210 EXPECT_TRUE(
1211 QuicFramerPeer::AppendMaxDataFrame(&framer_, transmit_frame, &writer));
1212
1213 // Check that the number of bytes in the buffer is in the expected range.
1214 EXPECT_LE(1u, writer.length());
1215 EXPECT_GE(8u, writer.length());
1216
1217 // Set up reader and an empty QuicWindowUpdateFrame
QUICHE team173c48f2019-11-19 16:34:44 -08001218 QuicDataReader reader(packet_buffer, writer.length(),
1219 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001220 QuicWindowUpdateFrame receive_frame;
1221
1222 // Deframe it
1223 EXPECT_TRUE(
1224 QuicFramerPeer::ProcessMaxDataFrame(&framer_, &reader, &receive_frame));
1225
1226 // Now check that the received data equals the sent data.
renjietangd088eab2019-11-21 14:54:41 -08001227 EXPECT_EQ(transmit_frame.max_data, window_size);
1228 EXPECT_EQ(transmit_frame.max_data, receive_frame.max_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001229 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
1230 receive_frame.stream_id);
1231 }
1232}
1233
1234TEST_F(QuicIetfFramerTest, MaxStreamDataFrame) {
1235 char packet_buffer[kNormalPacketBufferSize];
1236 QuicStreamOffset window_sizes[] = {0, 1, 2, 5, 10,
1237 20, 50, 100, 200, 500,
1238 1000000, kOffset8, kOffset4, kOffset2};
1239 QuicIetfStreamId stream_ids[] = {kStreamId4, kStreamId2, kStreamId1,
1240 kStreamId0};
1241
1242 for (QuicIetfStreamId stream_id : stream_ids) {
1243 for (QuicStreamOffset window_size : window_sizes) {
1244 memset(packet_buffer, 0, sizeof(packet_buffer));
1245
1246 // Set up the writer and transmit QuicWindowUpdateFrame
1247 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -08001248 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001249 QuicWindowUpdateFrame transmit_frame(0, stream_id, window_size);
1250
1251 // Add the frame.
1252 EXPECT_TRUE(QuicFramerPeer::AppendMaxStreamDataFrame(
1253 &framer_, transmit_frame, &writer));
1254
1255 // Check that number of bytes in the buffer is in the expected range.
1256 EXPECT_LE(2u, writer.length());
1257 EXPECT_GE(16u, writer.length());
1258
1259 // Set up reader and empty receive QuicPaddingFrame.
QUICHE team173c48f2019-11-19 16:34:44 -08001260 QuicDataReader reader(packet_buffer, writer.length(),
1261 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001262 QuicWindowUpdateFrame receive_frame;
1263
1264 // Deframe it
1265 EXPECT_TRUE(QuicFramerPeer::ProcessMaxStreamDataFrame(&framer_, &reader,
1266 &receive_frame));
1267
1268 // Now check that received data and sent data are equal.
renjietangd088eab2019-11-21 14:54:41 -08001269 EXPECT_EQ(transmit_frame.max_data, window_size);
1270 EXPECT_EQ(transmit_frame.max_data, receive_frame.max_data);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001271 EXPECT_EQ(stream_id, receive_frame.stream_id);
1272 EXPECT_EQ(transmit_frame.stream_id, receive_frame.stream_id);
1273 }
1274 }
1275}
1276
1277TEST_F(QuicIetfFramerTest, MaxStreamsFrame) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07001278 QuicStreamCount stream_counts[] = {0x3fffffff, 0x3fff, 0x3f, 0x1};
QUICHE teama6ef0a62019-03-07 20:34:33 -05001279
fkastenholz3c4eabf2019-04-22 07:49:59 -07001280 for (QuicStreamCount stream_count : stream_counts) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001281 // Cover all four combinations of uni/bi-directional and
1282 // server-/client- initiation.
fkastenholz3c4eabf2019-04-22 07:49:59 -07001283 TryMaxStreamsFrame(stream_count, /*unidirectional=*/true,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001284 /*stream_id_server_initiated=*/true);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001285 TryMaxStreamsFrame(stream_count, /*unidirectional=*/true,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001286 /*stream_id_server_initiated=*/false);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001287 TryMaxStreamsFrame(stream_count, /*unidirectional=*/false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001288 /*stream_id_server_initiated=*/true);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001289 TryMaxStreamsFrame(stream_count, /*unidirectional=*/false,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001290 /*stream_id_server_initiated=*/false);
1291 }
1292}
1293
1294TEST_F(QuicIetfFramerTest, BlockedFrame) {
1295 char packet_buffer[kNormalPacketBufferSize];
1296 QuicStreamOffset offsets[] = {kOffset8, kOffset4, kOffset2, kOffset1,
1297 kOffset0};
1298
1299 for (QuicStreamOffset offset : offsets) {
1300 memset(packet_buffer, 0, sizeof(packet_buffer));
1301
1302 // Set up the writer and transmit QuicBlockedFrame
1303 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -08001304 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001305 QuicBlockedFrame transmit_frame(
1306 0, QuicUtils::GetInvalidStreamId(framer_.transport_version()), offset);
1307
1308 // Add the frame.
1309 EXPECT_TRUE(QuicFramerPeer::AppendIetfBlockedFrame(&framer_, transmit_frame,
1310 &writer));
1311
1312 // Check that buffer length is in the expected range
1313 EXPECT_LE(1u, writer.length());
1314 EXPECT_GE(8u, writer.length());
1315
1316 // Set up reader and empty receive QuicFrame.
QUICHE team173c48f2019-11-19 16:34:44 -08001317 QuicDataReader reader(packet_buffer, writer.length(),
1318 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001319 QuicBlockedFrame receive_frame;
1320
1321 // Deframe it
1322 EXPECT_TRUE(QuicFramerPeer::ProcessIetfBlockedFrame(&framer_, &reader,
1323 &receive_frame));
1324
1325 // Check that received and sent data are equivalent
1326 EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
1327 receive_frame.stream_id);
1328 EXPECT_EQ(offset, receive_frame.offset);
1329 EXPECT_EQ(transmit_frame.offset, receive_frame.offset);
1330 }
1331}
1332
1333TEST_F(QuicIetfFramerTest, StreamBlockedFrame) {
1334 char packet_buffer[kNormalPacketBufferSize];
1335 QuicStreamOffset offsets[] = {0, 1, 2, 5, 10,
1336 20, 50, 100, 200, 500,
1337 1000000, kOffset8, kOffset4, kOffset2};
1338 QuicIetfStreamId stream_ids[] = {kStreamId4, kStreamId2, kStreamId1,
1339 kStreamId0};
1340
1341 for (QuicIetfStreamId stream_id : stream_ids) {
1342 for (QuicStreamOffset offset : offsets) {
1343 memset(packet_buffer, 0, sizeof(packet_buffer));
1344
1345 // Set up the writer and transmit QuicWindowUpdateFrame
1346 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -08001347 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001348 QuicBlockedFrame transmit_frame(0, stream_id, offset);
1349
1350 // Add the frame.
1351 EXPECT_TRUE(QuicFramerPeer::AppendStreamBlockedFrame(
1352 &framer_, transmit_frame, &writer));
1353
1354 // Check that number of bytes in the buffer is in the expected range.
1355 EXPECT_LE(2u, writer.length());
1356 EXPECT_GE(16u, writer.length());
1357
1358 // Set up reader and empty receive QuicPaddingFrame.
QUICHE team173c48f2019-11-19 16:34:44 -08001359 QuicDataReader reader(packet_buffer, writer.length(),
1360 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001361 QuicBlockedFrame receive_frame;
1362
1363 // Deframe it
1364 EXPECT_TRUE(QuicFramerPeer::ProcessStreamBlockedFrame(&framer_, &reader,
1365 &receive_frame));
1366
1367 // Now check that received == sent
1368 EXPECT_EQ(transmit_frame.offset, offset);
1369 EXPECT_EQ(transmit_frame.offset, receive_frame.offset);
1370 EXPECT_EQ(stream_id, receive_frame.stream_id);
1371 EXPECT_EQ(transmit_frame.stream_id, receive_frame.stream_id);
1372 }
1373 }
1374}
1375
1376TEST_F(QuicIetfFramerTest, StreamsBlockedFrame) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07001377 QuicStreamCount stream_counts[] = {0x3fffffff, 0x3fff, 0x3f, 0x1};
QUICHE teama6ef0a62019-03-07 20:34:33 -05001378
fkastenholz3c4eabf2019-04-22 07:49:59 -07001379 for (QuicStreamCount stream_count : stream_counts) {
1380 TryStreamsBlockedFrame(stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001381 /*unidirectional=*/false,
1382 /*stream_id_server_initiated=*/false);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001383 TryStreamsBlockedFrame(stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001384 /*unidirectional=*/false,
1385 /*stream_id_server_initiated=*/true);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001386 TryStreamsBlockedFrame(stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001387 /*unidirectional=*/true,
1388 /*stream_id_server_initiated=*/false);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001389 TryStreamsBlockedFrame(stream_count,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001390 /*unidirectional=*/true,
1391 /*stream_id_server_initiated=*/true);
1392 }
1393}
1394
1395TEST_F(QuicIetfFramerTest, NewConnectionIdFrame) {
1396 char packet_buffer[kNormalPacketBufferSize];
1397
1398 QuicNewConnectionIdFrame transmit_frame;
1399 transmit_frame.connection_id = TestConnectionId(UINT64_C(0x0edcba9876543201));
1400 transmit_frame.sequence_number = 0x01020304;
fkastenholz1c19fc22019-07-12 11:06:19 -07001401 transmit_frame.retire_prior_to = 0x00020304;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001402 // The token is defined as a uint128 -- a 16-byte integer.
1403 // The value is set in this manner because we want each
1404 // byte to have a specific value so that the binary
1405 // packet check (below) is good. If we used integer
1406 // operations (eg. "token = 0x12345...") then the bytes
1407 // would be set in host order.
1408 unsigned char token_bytes[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
1409 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
1410 0x0c, 0x0d, 0x0e, 0x0f};
1411 memcpy(&transmit_frame.stateless_reset_token, token_bytes,
1412 sizeof(transmit_frame.stateless_reset_token));
1413
1414 memset(packet_buffer, 0, sizeof(packet_buffer));
1415
fkastenholz3c4eabf2019-04-22 07:49:59 -07001416 // Set up the writer and transmit a QuicNewConnectionIdFrame
QUICHE teama6ef0a62019-03-07 20:34:33 -05001417 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -08001418 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001419
1420 // Add the frame.
1421 EXPECT_TRUE(QuicFramerPeer::AppendNewConnectionIdFrame(
1422 &framer_, transmit_frame, &writer));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001423 // clang-format off
1424 uint8_t packet[] = {
1425 // sequence number, 0x80 for varint62 encoding
1426 0x80 + 0x01, 0x02, 0x03, 0x04,
fkastenholz1c19fc22019-07-12 11:06:19 -07001427 // retire_prior_to, 0x80 for varint62 encoding
1428 0x80 + 0x00, 0x02, 0x03, 0x04,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001429 // new connection id length, is not varint62 encoded.
1430 0x08,
1431 // new connection id, is not varint62 encoded.
1432 0x0E, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x01,
1433 // the reset token:
1434 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1435 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
1436 };
QUICHE teama6ef0a62019-03-07 20:34:33 -05001437 // clang-format on
fkastenholz1c19fc22019-07-12 11:06:19 -07001438
1439 // Check that buffer length is correct
1440 EXPECT_EQ(sizeof(packet), writer.length());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001441 EXPECT_EQ(0, memcmp(packet_buffer, packet, sizeof(packet)));
1442
1443 // Set up reader and empty receive QuicPaddingFrame.
QUICHE team173c48f2019-11-19 16:34:44 -08001444 QuicDataReader reader(packet_buffer, writer.length(),
1445 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001446 QuicNewConnectionIdFrame receive_frame;
1447
1448 // Deframe it
1449 EXPECT_TRUE(QuicFramerPeer::ProcessNewConnectionIdFrame(&framer_, &reader,
1450 &receive_frame));
1451
1452 // Now check that received == sent
1453 EXPECT_EQ(transmit_frame.connection_id, receive_frame.connection_id);
1454 EXPECT_EQ(transmit_frame.sequence_number, receive_frame.sequence_number);
fkastenholz1c19fc22019-07-12 11:06:19 -07001455 EXPECT_EQ(transmit_frame.retire_prior_to, receive_frame.retire_prior_to);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001456 EXPECT_EQ(transmit_frame.stateless_reset_token,
1457 receive_frame.stateless_reset_token);
1458}
1459
1460TEST_F(QuicIetfFramerTest, RetireConnectionIdFrame) {
1461 char packet_buffer[kNormalPacketBufferSize];
1462
1463 QuicRetireConnectionIdFrame transmit_frame;
1464 transmit_frame.sequence_number = 0x01020304;
1465
1466 memset(packet_buffer, 0, sizeof(packet_buffer));
1467
fkastenholz3c4eabf2019-04-22 07:49:59 -07001468 // Set up the writer and transmit QuicRetireConnectionIdFrame
QUICHE teama6ef0a62019-03-07 20:34:33 -05001469 QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
QUICHE team173c48f2019-11-19 16:34:44 -08001470 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001471
1472 // Add the frame.
1473 EXPECT_TRUE(QuicFramerPeer::AppendRetireConnectionIdFrame(
1474 &framer_, transmit_frame, &writer));
1475 // Check that buffer length is correct
1476 EXPECT_EQ(4u, writer.length());
1477 // clang-format off
1478 uint8_t packet[] = {
1479 // sequence number, 0x80 for varint62 encoding
1480 0x80 + 0x01, 0x02, 0x03, 0x04,
1481 };
1482
1483 // clang-format on
1484 EXPECT_EQ(0, memcmp(packet_buffer, packet, sizeof(packet)));
1485
1486 // Set up reader and empty receive QuicPaddingFrame.
QUICHE team173c48f2019-11-19 16:34:44 -08001487 QuicDataReader reader(packet_buffer, writer.length(),
1488 quiche::NETWORK_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001489 QuicRetireConnectionIdFrame receive_frame;
1490
1491 // Deframe it
1492 EXPECT_TRUE(QuicFramerPeer::ProcessRetireConnectionIdFrame(&framer_, &reader,
1493 &receive_frame));
1494
1495 // Now check that received == sent
1496 EXPECT_EQ(transmit_frame.sequence_number, receive_frame.sequence_number);
1497}
1498
1499} // namespace
1500} // namespace test
1501} // namespace quic