github.com/quic-go/quic-go@v0.44.0/internal/congestion/hybrid_slow_start_test.go (about) 1 package congestion 2 3 import ( 4 "time" 5 6 "github.com/quic-go/quic-go/internal/protocol" 7 8 . "github.com/onsi/ginkgo/v2" 9 . "github.com/onsi/gomega" 10 ) 11 12 var _ = Describe("Hybrid slow start", func() { 13 var slowStart HybridSlowStart 14 15 BeforeEach(func() { 16 slowStart = HybridSlowStart{} 17 }) 18 19 It("works in a simple case", func() { 20 packetNumber := protocol.PacketNumber(1) 21 endPacketNumber := protocol.PacketNumber(3) 22 slowStart.StartReceiveRound(endPacketNumber) 23 24 packetNumber++ 25 Expect(slowStart.IsEndOfRound(packetNumber)).To(BeFalse()) 26 27 // Test duplicates. 28 Expect(slowStart.IsEndOfRound(packetNumber)).To(BeFalse()) 29 30 packetNumber++ 31 Expect(slowStart.IsEndOfRound(packetNumber)).To(BeFalse()) 32 packetNumber++ 33 Expect(slowStart.IsEndOfRound(packetNumber)).To(BeTrue()) 34 35 // Test without a new registered end_packet_number; 36 packetNumber++ 37 Expect(slowStart.IsEndOfRound(packetNumber)).To(BeTrue()) 38 39 endPacketNumber = 20 40 slowStart.StartReceiveRound(endPacketNumber) 41 for packetNumber < endPacketNumber { 42 packetNumber++ 43 Expect(slowStart.IsEndOfRound(packetNumber)).To(BeFalse()) 44 } 45 packetNumber++ 46 Expect(slowStart.IsEndOfRound(packetNumber)).To(BeTrue()) 47 }) 48 49 It("works with delay", func() { 50 rtt := 60 * time.Millisecond 51 // We expect to detect the increase at +1/8 of the RTT; hence at a typical 52 // RTT of 60ms the detection will happen at 67.5 ms. 53 const hybridStartMinSamples = 8 // Number of acks required to trigger. 54 55 endPacketNumber := protocol.PacketNumber(1) 56 endPacketNumber++ 57 slowStart.StartReceiveRound(endPacketNumber) 58 59 // Will not trigger since our lowest RTT in our burst is the same as the long 60 // term RTT provided. 61 for n := 0; n < hybridStartMinSamples; n++ { 62 Expect(slowStart.ShouldExitSlowStart(rtt+time.Duration(n)*time.Millisecond, rtt, 100)).To(BeFalse()) 63 } 64 endPacketNumber++ 65 slowStart.StartReceiveRound(endPacketNumber) 66 for n := 1; n < hybridStartMinSamples; n++ { 67 Expect(slowStart.ShouldExitSlowStart(rtt+(time.Duration(n)+10)*time.Millisecond, rtt, 100)).To(BeFalse()) 68 } 69 // Expect to trigger since all packets in this burst was above the long term 70 // RTT provided. 71 Expect(slowStart.ShouldExitSlowStart(rtt+10*time.Millisecond, rtt, 100)).To(BeTrue()) 72 }) 73 })