1 // 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 #include "quiche/quic/tools/quic_tcp_like_trace_converter.h"
6 
7 #include "quiche/quic/platform/api/quic_test.h"
8 
9 namespace quic {
10 namespace test {
11 namespace {
12 
TEST(QuicTcpLikeTraceConverterTest,BasicTest)13 TEST(QuicTcpLikeTraceConverterTest, BasicTest) {
14   QuicTcpLikeTraceConverter converter;
15 
16   EXPECT_EQ(QuicIntervalSet<uint64_t>(0, 100),
17             converter.OnStreamFrameSent(1, 0, 100, false));
18   EXPECT_EQ(QuicIntervalSet<uint64_t>(100, 200),
19             converter.OnStreamFrameSent(3, 0, 100, false));
20   EXPECT_EQ(QuicIntervalSet<uint64_t>(200, 300),
21             converter.OnStreamFrameSent(3, 100, 100, false));
22   EXPECT_EQ(QuicInterval<uint64_t>(300, 450),
23             converter.OnControlFrameSent(2, 150));
24   EXPECT_EQ(QuicIntervalSet<uint64_t>(450, 550),
25             converter.OnStreamFrameSent(1, 100, 100, false));
26   EXPECT_EQ(QuicInterval<uint64_t>(550, 650),
27             converter.OnControlFrameSent(3, 100));
28   EXPECT_EQ(QuicIntervalSet<uint64_t>(650, 850),
29             converter.OnStreamFrameSent(3, 200, 200, false));
30   EXPECT_EQ(QuicInterval<uint64_t>(850, 1050),
31             converter.OnControlFrameSent(4, 200));
32   EXPECT_EQ(QuicIntervalSet<uint64_t>(1050, 1100),
33             converter.OnStreamFrameSent(1, 200, 50, false));
34   EXPECT_EQ(QuicIntervalSet<uint64_t>(1100, 1150),
35             converter.OnStreamFrameSent(1, 250, 50, false));
36   EXPECT_EQ(QuicIntervalSet<uint64_t>(1150, 1350),
37             converter.OnStreamFrameSent(3, 400, 200, false));
38 
39   // Stream 1 retransmits [50, 300) and sends new data [300, 350) in the same
40   // frame.
41   QuicIntervalSet<uint64_t> expected;
42   expected.Add(50, 100);
43   expected.Add(450, 550);
44   expected.Add(1050, 1150);
45   expected.Add(1350, 1401);
46   EXPECT_EQ(expected, converter.OnStreamFrameSent(1, 50, 300, true));
47 
48   expected.Clear();
49   // Stream 3 retransmits [150, 500).
50   expected.Add(250, 300);
51   expected.Add(650, 850);
52   expected.Add(1150, 1250);
53   EXPECT_EQ(expected, converter.OnStreamFrameSent(3, 150, 350, false));
54 
55   // Stream 3 retransmits [300, 600) and sends new data [600, 800) in the same
56   // frame.
57   expected.Clear();
58   expected.Add(750, 850);
59   expected.Add(1150, 1350);
60   expected.Add(1401, 1602);
61   EXPECT_EQ(expected, converter.OnStreamFrameSent(3, 300, 500, true));
62 
63   // Stream 3 retransmits fin only frame.
64   expected.Clear();
65   expected.Add(1601, 1602);
66   EXPECT_EQ(expected, converter.OnStreamFrameSent(3, 800, 0, true));
67 
68   QuicInterval<uint64_t> expected2;
69   // Ignore out of order control frames.
70   EXPECT_EQ(expected2, converter.OnControlFrameSent(1, 100));
71 
72   // Ignore passed in length for retransmitted frame.
73   expected2 = {300, 450};
74   EXPECT_EQ(expected2, converter.OnControlFrameSent(2, 200));
75 
76   expected2 = {1602, 1702};
77   EXPECT_EQ(expected2, converter.OnControlFrameSent(10, 100));
78 }
79 
TEST(QuicTcpLikeTraceConverterTest,FuzzerTest)80 TEST(QuicTcpLikeTraceConverterTest, FuzzerTest) {
81   QuicTcpLikeTraceConverter converter;
82   // Stream does not start from offset 0.
83   EXPECT_EQ(QuicIntervalSet<uint64_t>(0, 100),
84             converter.OnStreamFrameSent(1, 100, 100, false));
85   EXPECT_EQ(QuicIntervalSet<uint64_t>(100, 300),
86             converter.OnStreamFrameSent(3, 200, 200, false));
87   // Stream does not send data contiguously.
88   EXPECT_EQ(QuicIntervalSet<uint64_t>(300, 400),
89             converter.OnStreamFrameSent(1, 300, 100, false));
90 
91   // Stream fills existing holes.
92   QuicIntervalSet<uint64_t> expected;
93   expected.Add(0, 100);
94   expected.Add(300, 501);
95   EXPECT_EQ(expected, converter.OnStreamFrameSent(1, 0, 500, true));
96 
97   // Stream sends frame after fin.
98   EXPECT_EQ(expected, converter.OnStreamFrameSent(1, 50, 600, false));
99 }
100 
TEST(QuicTcpLikeTraceConverterTest,OnCryptoFrameSent)101 TEST(QuicTcpLikeTraceConverterTest, OnCryptoFrameSent) {
102   QuicTcpLikeTraceConverter converter;
103 
104   EXPECT_EQ(QuicIntervalSet<uint64_t>(0, 100),
105             converter.OnCryptoFrameSent(ENCRYPTION_INITIAL, 0, 100));
106   EXPECT_EQ(QuicIntervalSet<uint64_t>(100, 200),
107             converter.OnStreamFrameSent(1, 0, 100, false));
108   EXPECT_EQ(QuicIntervalSet<uint64_t>(200, 300),
109             converter.OnStreamFrameSent(1, 100, 100, false));
110   EXPECT_EQ(QuicIntervalSet<uint64_t>(300, 400),
111             converter.OnCryptoFrameSent(ENCRYPTION_HANDSHAKE, 0, 100));
112   EXPECT_EQ(QuicIntervalSet<uint64_t>(400, 500),
113             converter.OnCryptoFrameSent(ENCRYPTION_HANDSHAKE, 100, 100));
114 
115   // Verify crypto frame retransmission works as intended.
116   EXPECT_EQ(QuicIntervalSet<uint64_t>(0, 100),
117             converter.OnCryptoFrameSent(ENCRYPTION_INITIAL, 0, 100));
118   EXPECT_EQ(QuicIntervalSet<uint64_t>(400, 500),
119             converter.OnCryptoFrameSent(ENCRYPTION_HANDSHAKE, 100, 100));
120 }
121 
122 }  // namespace
123 }  // namespace test
124 }  // namespace quic
125