blob: 287a319bd4b114d872882eb2d5c2a97fcff6e08a [file] [log] [blame]
// Copyright (c) 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "quiche/quic/tools/quic_tcp_like_trace_converter.h"
#include "quiche/quic/platform/api/quic_test.h"
namespace quic {
namespace test {
namespace {
TEST(QuicTcpLikeTraceConverterTest, BasicTest) {
QuicTcpLikeTraceConverter converter;
EXPECT_EQ(QuicIntervalSet<uint64_t>(0, 100),
converter.OnStreamFrameSent(1, 0, 100, false));
EXPECT_EQ(QuicIntervalSet<uint64_t>(100, 200),
converter.OnStreamFrameSent(3, 0, 100, false));
EXPECT_EQ(QuicIntervalSet<uint64_t>(200, 300),
converter.OnStreamFrameSent(3, 100, 100, false));
EXPECT_EQ(QuicInterval<uint64_t>(300, 450),
converter.OnControlFrameSent(2, 150));
EXPECT_EQ(QuicIntervalSet<uint64_t>(450, 550),
converter.OnStreamFrameSent(1, 100, 100, false));
EXPECT_EQ(QuicInterval<uint64_t>(550, 650),
converter.OnControlFrameSent(3, 100));
EXPECT_EQ(QuicIntervalSet<uint64_t>(650, 850),
converter.OnStreamFrameSent(3, 200, 200, false));
EXPECT_EQ(QuicInterval<uint64_t>(850, 1050),
converter.OnControlFrameSent(4, 200));
EXPECT_EQ(QuicIntervalSet<uint64_t>(1050, 1100),
converter.OnStreamFrameSent(1, 200, 50, false));
EXPECT_EQ(QuicIntervalSet<uint64_t>(1100, 1150),
converter.OnStreamFrameSent(1, 250, 50, false));
EXPECT_EQ(QuicIntervalSet<uint64_t>(1150, 1350),
converter.OnStreamFrameSent(3, 400, 200, false));
// Stream 1 retransmits [50, 300) and sends new data [300, 350) in the same
// frame.
QuicIntervalSet<uint64_t> expected;
expected.Add(50, 100);
expected.Add(450, 550);
expected.Add(1050, 1150);
expected.Add(1350, 1401);
EXPECT_EQ(expected, converter.OnStreamFrameSent(1, 50, 300, true));
expected.Clear();
// Stream 3 retransmits [150, 500).
expected.Add(250, 300);
expected.Add(650, 850);
expected.Add(1150, 1250);
EXPECT_EQ(expected, converter.OnStreamFrameSent(3, 150, 350, false));
// Stream 3 retransmits [300, 600) and sends new data [600, 800) in the same
// frame.
expected.Clear();
expected.Add(750, 850);
expected.Add(1150, 1350);
expected.Add(1401, 1602);
EXPECT_EQ(expected, converter.OnStreamFrameSent(3, 300, 500, true));
// Stream 3 retransmits fin only frame.
expected.Clear();
expected.Add(1601, 1602);
EXPECT_EQ(expected, converter.OnStreamFrameSent(3, 800, 0, true));
QuicInterval<uint64_t> expected2;
// Ignore out of order control frames.
EXPECT_EQ(expected2, converter.OnControlFrameSent(1, 100));
// Ignore passed in length for retransmitted frame.
expected2 = {300, 450};
EXPECT_EQ(expected2, converter.OnControlFrameSent(2, 200));
expected2 = {1602, 1702};
EXPECT_EQ(expected2, converter.OnControlFrameSent(10, 100));
}
TEST(QuicTcpLikeTraceConverterTest, FuzzerTest) {
QuicTcpLikeTraceConverter converter;
// Stream does not start from offset 0.
EXPECT_EQ(QuicIntervalSet<uint64_t>(0, 100),
converter.OnStreamFrameSent(1, 100, 100, false));
EXPECT_EQ(QuicIntervalSet<uint64_t>(100, 300),
converter.OnStreamFrameSent(3, 200, 200, false));
// Stream does not send data contiguously.
EXPECT_EQ(QuicIntervalSet<uint64_t>(300, 400),
converter.OnStreamFrameSent(1, 300, 100, false));
// Stream fills existing holes.
QuicIntervalSet<uint64_t> expected;
expected.Add(0, 100);
expected.Add(300, 501);
EXPECT_EQ(expected, converter.OnStreamFrameSent(1, 0, 500, true));
// Stream sends frame after fin.
EXPECT_EQ(expected, converter.OnStreamFrameSent(1, 50, 600, false));
}
TEST(QuicTcpLikeTraceConverterTest, OnCryptoFrameSent) {
QuicTcpLikeTraceConverter converter;
EXPECT_EQ(QuicIntervalSet<uint64_t>(0, 100),
converter.OnCryptoFrameSent(ENCRYPTION_INITIAL, 0, 100));
EXPECT_EQ(QuicIntervalSet<uint64_t>(100, 200),
converter.OnStreamFrameSent(1, 0, 100, false));
EXPECT_EQ(QuicIntervalSet<uint64_t>(200, 300),
converter.OnStreamFrameSent(1, 100, 100, false));
EXPECT_EQ(QuicIntervalSet<uint64_t>(300, 400),
converter.OnCryptoFrameSent(ENCRYPTION_HANDSHAKE, 0, 100));
EXPECT_EQ(QuicIntervalSet<uint64_t>(400, 500),
converter.OnCryptoFrameSent(ENCRYPTION_HANDSHAKE, 100, 100));
// Verify crypto frame retransmission works as intended.
EXPECT_EQ(QuicIntervalSet<uint64_t>(0, 100),
converter.OnCryptoFrameSent(ENCRYPTION_INITIAL, 0, 100));
EXPECT_EQ(QuicIntervalSet<uint64_t>(400, 500),
converter.OnCryptoFrameSent(ENCRYPTION_HANDSHAKE, 100, 100));
}
} // namespace
} // namespace test
} // namespace quic