/* * Copyright © 2019, 2020, 2021, 2022, 2023 Peter Doornbosch * * This file is part of Kwik, an implementation of the QUIC protocol in Java. * * Kwik is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your option) * any later version. * * Kwik is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for * more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ package net.luminis.quic.recovery; import net.luminis.quic.Version; import net.luminis.quic.frame.CryptoFrame; import net.luminis.quic.frame.MaxDataFrame; import net.luminis.quic.frame.QuicFrame; import net.luminis.quic.packet.*; import net.luminis.quic.test.FieldSetter; import java.time.Instant; import java.time.LocalTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; public abstract class RecoveryTests { byte[] srcCid = new byte[] { 0x01, 0x02, 0x03, 0x04 }; byte[] destCid = new byte[] { 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }; QuicPacket createPacket(int packetNumber, QuicFrame frame) { ShortHeaderPacket packet = new ShortHeaderPacket(Version.getDefault(), new byte[0], frame); setPacketNumber(packet, packetNumber); return packet; } QuicPacket createPacket(int packetNumber) { return createPacket(packetNumber, new MaxDataFrame(1024)); } List createPackets(int... packetNumbers) { List packets = new ArrayList<>(); for (int packetNumber: packetNumbers) { ShortHeaderPacket packet = new ShortHeaderPacket(Version.getDefault(), new byte[0], new MaxDataFrame(1024)); setPacketNumber(packet, packetNumber); packets.add(packet); } return packets; } QuicPacket createHandshakePacket(int packetNumber, QuicFrame... frames) { LongHeaderPacket packet = new HandshakePacket(Version.getDefault(), srcCid, destCid, frames[0]); for (int i = 1; i < frames.length; i++) { packet.addFrame(frames[i]); } setPacketNumber(packet, packetNumber); return packet; } QuicPacket createCryptoPacket(int packetNumber) { LongHeaderPacket packet = new InitialPacket(Version.getDefault(), srcCid, destCid, null, new CryptoFrame()); setPacketNumber(packet, packetNumber); return packet; } void setPacketNumber(QuicPacket packet, int packetNumber) { try { FieldSetter.setField(packet, QuicPacket.class.getDeclaredField("packetNumber"), packetNumber); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } } // For debugging recovery tests.... String timeNow() { LocalTime localTimeNow = LocalTime.from(Instant.now().atZone(ZoneId.systemDefault())); DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("mm:ss.SSS"); return timeFormatter.format(localTimeNow); } }