github.com/mikelsr/quic-go@v0.36.1-0.20230701132136-1d9415b66898/internal/ackhandler/sent_packet_handler_test.go (about)

     1  package ackhandler
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/golang/mock/gomock"
     8  
     9  	"github.com/mikelsr/quic-go/internal/mocks"
    10  	"github.com/mikelsr/quic-go/internal/protocol"
    11  	"github.com/mikelsr/quic-go/internal/qerr"
    12  	"github.com/mikelsr/quic-go/internal/utils"
    13  	"github.com/mikelsr/quic-go/internal/wire"
    14  
    15  	. "github.com/onsi/ginkgo/v2"
    16  	. "github.com/onsi/gomega"
    17  )
    18  
    19  type customFrameHandler struct {
    20  	onLost, onAcked func(wire.Frame)
    21  }
    22  
    23  func (h *customFrameHandler) OnLost(f wire.Frame) {
    24  	if h.onLost != nil {
    25  		h.onLost(f)
    26  	}
    27  }
    28  
    29  func (h *customFrameHandler) OnAcked(f wire.Frame) {
    30  	if h.onAcked != nil {
    31  		h.onAcked(f)
    32  	}
    33  }
    34  
    35  var _ = Describe("SentPacketHandler", func() {
    36  	var (
    37  		handler     *sentPacketHandler
    38  		streamFrame wire.StreamFrame
    39  		lostPackets []protocol.PacketNumber
    40  		perspective protocol.Perspective
    41  	)
    42  
    43  	BeforeEach(func() { perspective = protocol.PerspectiveServer })
    44  
    45  	JustBeforeEach(func() {
    46  		lostPackets = nil
    47  		rttStats := utils.NewRTTStats()
    48  		handler = newSentPacketHandler(42, protocol.InitialPacketSizeIPv4, rttStats, false, perspective, nil, utils.DefaultLogger)
    49  		streamFrame = wire.StreamFrame{
    50  			StreamID: 5,
    51  			Data:     []byte{0x13, 0x37},
    52  		}
    53  	})
    54  
    55  	getPacket := func(pn protocol.PacketNumber, encLevel protocol.EncryptionLevel) *packet {
    56  		for _, p := range handler.getPacketNumberSpace(encLevel).history.packets {
    57  			if p != nil && p.PacketNumber == pn {
    58  				return p
    59  			}
    60  		}
    61  		return nil
    62  	}
    63  
    64  	ackElicitingPacket := func(p *packet) *packet {
    65  		if p.EncryptionLevel == 0 {
    66  			p.EncryptionLevel = protocol.Encryption1RTT
    67  		}
    68  		if p.Length == 0 {
    69  			p.Length = 1
    70  		}
    71  		if p.SendTime.IsZero() {
    72  			p.SendTime = time.Now()
    73  		}
    74  		if len(p.Frames) == 0 {
    75  			p.Frames = []Frame{
    76  				{Frame: &wire.PingFrame{}, Handler: &customFrameHandler{
    77  					onLost: func(wire.Frame) { lostPackets = append(lostPackets, p.PacketNumber) },
    78  				}},
    79  			}
    80  		}
    81  		return p
    82  	}
    83  
    84  	nonAckElicitingPacket := func(p *packet) *packet {
    85  		p = ackElicitingPacket(p)
    86  		p.Frames = nil
    87  		p.LargestAcked = 1
    88  		return p
    89  	}
    90  
    91  	initialPacket := func(p *packet) *packet {
    92  		p = ackElicitingPacket(p)
    93  		p.EncryptionLevel = protocol.EncryptionInitial
    94  		return p
    95  	}
    96  
    97  	handshakePacket := func(p *packet) *packet {
    98  		p = ackElicitingPacket(p)
    99  		p.EncryptionLevel = protocol.EncryptionHandshake
   100  		return p
   101  	}
   102  
   103  	handshakePacketNonAckEliciting := func(p *packet) *packet {
   104  		p = nonAckElicitingPacket(p)
   105  		p.EncryptionLevel = protocol.EncryptionHandshake
   106  		return p
   107  	}
   108  
   109  	sentPacket := func(p *packet) {
   110  		handler.SentPacket(p.SendTime, p.PacketNumber, p.LargestAcked, p.StreamFrames, p.Frames, p.EncryptionLevel, p.Length, p.IsPathMTUProbePacket)
   111  	}
   112  
   113  	expectInPacketHistory := func(expected []protocol.PacketNumber, encLevel protocol.EncryptionLevel) {
   114  		pnSpace := handler.getPacketNumberSpace(encLevel)
   115  		var length int
   116  		pnSpace.history.Iterate(func(p *packet) (bool, error) {
   117  			if !p.declaredLost && !p.skippedPacket {
   118  				length++
   119  			}
   120  			return true, nil
   121  		})
   122  		ExpectWithOffset(1, length).To(Equal(len(expected)))
   123  		for _, p := range expected {
   124  			ExpectWithOffset(2, getPacket(p, encLevel)).ToNot(BeNil())
   125  		}
   126  	}
   127  
   128  	updateRTT := func(rtt time.Duration) {
   129  		handler.rttStats.UpdateRTT(rtt, 0, time.Now())
   130  		ExpectWithOffset(1, handler.rttStats.SmoothedRTT()).To(Equal(rtt))
   131  	}
   132  
   133  	Context("registering sent packets", func() {
   134  		It("accepts two consecutive packets", func() {
   135  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, EncryptionLevel: protocol.EncryptionHandshake}))
   136  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, EncryptionLevel: protocol.EncryptionHandshake}))
   137  			Expect(handler.handshakePackets.largestSent).To(Equal(protocol.PacketNumber(2)))
   138  			expectInPacketHistory([]protocol.PacketNumber{1, 2}, protocol.EncryptionHandshake)
   139  			Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(2)))
   140  		})
   141  
   142  		It("uses the same packet number space for 0-RTT and 1-RTT packets", func() {
   143  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, EncryptionLevel: protocol.Encryption0RTT}))
   144  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, EncryptionLevel: protocol.Encryption1RTT}))
   145  			Expect(handler.appDataPackets.largestSent).To(Equal(protocol.PacketNumber(2)))
   146  			Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(2)))
   147  		})
   148  
   149  		It("accepts packet number 0", func() {
   150  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 0, EncryptionLevel: protocol.Encryption1RTT}))
   151  			Expect(handler.appDataPackets.largestSent).To(BeZero())
   152  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, EncryptionLevel: protocol.Encryption1RTT}))
   153  			Expect(handler.appDataPackets.largestSent).To(Equal(protocol.PacketNumber(1)))
   154  			expectInPacketHistory([]protocol.PacketNumber{0, 1}, protocol.Encryption1RTT)
   155  			Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(2)))
   156  		})
   157  
   158  		It("stores the sent time", func() {
   159  			sendTime := time.Now().Add(-time.Minute)
   160  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: sendTime}))
   161  			Expect(handler.appDataPackets.lastAckElicitingPacketTime).To(Equal(sendTime))
   162  		})
   163  
   164  		It("stores the sent time of Initial packets", func() {
   165  			sendTime := time.Now().Add(-time.Minute)
   166  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: sendTime, EncryptionLevel: protocol.EncryptionInitial}))
   167  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: sendTime.Add(time.Hour), EncryptionLevel: protocol.Encryption1RTT}))
   168  			Expect(handler.initialPackets.lastAckElicitingPacketTime).To(Equal(sendTime))
   169  		})
   170  	})
   171  
   172  	Context("ACK processing", func() {
   173  		JustBeforeEach(func() {
   174  			for i := protocol.PacketNumber(0); i < 10; i++ {
   175  				sentPacket(ackElicitingPacket(&packet{PacketNumber: i}))
   176  			}
   177  			// Increase RTT, because the tests would be flaky otherwise
   178  			updateRTT(time.Hour)
   179  			Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(10)))
   180  		})
   181  
   182  		Context("ACK processing", func() {
   183  			It("accepts ACKs sent in packet 0", func() {
   184  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 5}}}
   185  				_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   186  				Expect(err).ToNot(HaveOccurred())
   187  				Expect(handler.appDataPackets.largestAcked).To(Equal(protocol.PacketNumber(5)))
   188  			})
   189  
   190  			It("says if a 1-RTT packet was acknowledged", func() {
   191  				sentPacket(ackElicitingPacket(&packet{PacketNumber: 10, EncryptionLevel: protocol.Encryption0RTT}))
   192  				sentPacket(ackElicitingPacket(&packet{PacketNumber: 11, EncryptionLevel: protocol.Encryption0RTT}))
   193  				sentPacket(ackElicitingPacket(&packet{PacketNumber: 12, EncryptionLevel: protocol.Encryption1RTT}))
   194  				acked1RTT, err := handler.ReceivedAck(
   195  					&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 11}}},
   196  					protocol.Encryption1RTT,
   197  					time.Now(),
   198  				)
   199  				Expect(err).ToNot(HaveOccurred())
   200  				Expect(acked1RTT).To(BeFalse())
   201  				acked1RTT, err = handler.ReceivedAck(
   202  					&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 11, Largest: 12}}},
   203  					protocol.Encryption1RTT,
   204  					time.Now(),
   205  				)
   206  				Expect(err).ToNot(HaveOccurred())
   207  				Expect(acked1RTT).To(BeTrue())
   208  			})
   209  
   210  			It("accepts multiple ACKs sent in the same packet", func() {
   211  				ack1 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 3}}}
   212  				ack2 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 4}}}
   213  				_, err := handler.ReceivedAck(ack1, protocol.Encryption1RTT, time.Now())
   214  				Expect(err).ToNot(HaveOccurred())
   215  				Expect(handler.appDataPackets.largestAcked).To(Equal(protocol.PacketNumber(3)))
   216  				// this wouldn't happen in practice
   217  				// for testing purposes, we pretend to send a different ACK frame in a duplicated packet, to be able to verify that it actually doesn't get processed
   218  				_, err = handler.ReceivedAck(ack2, protocol.Encryption1RTT, time.Now())
   219  				Expect(err).ToNot(HaveOccurred())
   220  				Expect(handler.appDataPackets.largestAcked).To(Equal(protocol.PacketNumber(4)))
   221  			})
   222  
   223  			It("rejects ACKs that acknowledge a skipped packet number", func() {
   224  				sentPacket(ackElicitingPacket(&packet{PacketNumber: 10}))
   225  				handler.appDataPackets.history.SkippedPacket(11)
   226  				sentPacket(ackElicitingPacket(&packet{PacketNumber: 12}))
   227  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 12}}}
   228  				_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   229  				Expect(err).To(MatchError(&qerr.TransportError{
   230  					ErrorCode:    qerr.ProtocolViolation,
   231  					ErrorMessage: "received an ACK for skipped packet number: 11 (1-RTT)",
   232  				}))
   233  			})
   234  
   235  			It("rejects ACKs with a too high LargestAcked packet number", func() {
   236  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 9999}}}
   237  				_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   238  				Expect(err).To(MatchError(&qerr.TransportError{
   239  					ErrorCode:    qerr.ProtocolViolation,
   240  					ErrorMessage: "received ACK for an unsent packet",
   241  				}))
   242  				Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(10)))
   243  			})
   244  
   245  			It("ignores repeated ACKs", func() {
   246  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 3}}}
   247  				_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   248  				Expect(err).ToNot(HaveOccurred())
   249  				Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(6)))
   250  				_, err = handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   251  				Expect(err).ToNot(HaveOccurred())
   252  				Expect(handler.appDataPackets.largestAcked).To(Equal(protocol.PacketNumber(3)))
   253  				Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(6)))
   254  			})
   255  		})
   256  
   257  		Context("acks the right packets", func() {
   258  			expectInPacketHistoryOrLost := func(expected []protocol.PacketNumber, encLevel protocol.EncryptionLevel) {
   259  				pnSpace := handler.getPacketNumberSpace(encLevel)
   260  				var length int
   261  				pnSpace.history.Iterate(func(p *packet) (bool, error) {
   262  					if !p.declaredLost {
   263  						length++
   264  					}
   265  					return true, nil
   266  				})
   267  				ExpectWithOffset(1, length+len(lostPackets)).To(Equal(len(expected)))
   268  			expectedLoop:
   269  				for _, p := range expected {
   270  					if getPacket(p, encLevel) != nil {
   271  						continue
   272  					}
   273  					for _, lostP := range lostPackets {
   274  						if lostP == p {
   275  							continue expectedLoop
   276  						}
   277  					}
   278  					Fail(fmt.Sprintf("Packet %d not in packet history.", p))
   279  				}
   280  			}
   281  
   282  			It("adjusts the LargestAcked, and adjusts the bytes in flight", func() {
   283  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 5}}}
   284  				_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   285  				Expect(err).ToNot(HaveOccurred())
   286  				Expect(handler.appDataPackets.largestAcked).To(Equal(protocol.PacketNumber(5)))
   287  				expectInPacketHistoryOrLost([]protocol.PacketNumber{6, 7, 8, 9}, protocol.Encryption1RTT)
   288  				Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(4)))
   289  			})
   290  
   291  			It("acks packet 0", func() {
   292  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 0}}}
   293  				_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   294  				Expect(err).ToNot(HaveOccurred())
   295  				Expect(getPacket(0, protocol.Encryption1RTT)).To(BeNil())
   296  				expectInPacketHistoryOrLost([]protocol.PacketNumber{1, 2, 3, 4, 5, 6, 7, 8, 9}, protocol.Encryption1RTT)
   297  			})
   298  
   299  			It("calls the OnAcked callback", func() {
   300  				var acked bool
   301  				ping := &wire.PingFrame{}
   302  				sentPacket(ackElicitingPacket(&packet{
   303  					PacketNumber: 10,
   304  					Frames: []Frame{{
   305  						Frame: ping,
   306  						Handler: &customFrameHandler{
   307  							onAcked: func(f wire.Frame) {
   308  								Expect(f).To(Equal(ping))
   309  								acked = true
   310  							},
   311  						},
   312  					}},
   313  				}))
   314  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 10}}}
   315  				_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   316  				Expect(err).ToNot(HaveOccurred())
   317  				Expect(acked).To(BeTrue())
   318  			})
   319  
   320  			It("handles an ACK frame with one missing packet range", func() {
   321  				ack := &wire.AckFrame{ // lose 4 and 5
   322  					AckRanges: []wire.AckRange{
   323  						{Smallest: 6, Largest: 9},
   324  						{Smallest: 1, Largest: 3},
   325  					},
   326  				}
   327  				_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   328  				Expect(err).ToNot(HaveOccurred())
   329  				expectInPacketHistoryOrLost([]protocol.PacketNumber{0, 4, 5}, protocol.Encryption1RTT)
   330  			})
   331  
   332  			It("does not ack packets below the LowestAcked", func() {
   333  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 3, Largest: 8}}}
   334  				_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   335  				Expect(err).ToNot(HaveOccurred())
   336  				expectInPacketHistoryOrLost([]protocol.PacketNumber{0, 1, 2, 9}, protocol.Encryption1RTT)
   337  			})
   338  
   339  			It("handles an ACK with multiple missing packet ranges", func() {
   340  				ack := &wire.AckFrame{ // packets 2, 4 and 5, and 8 were lost
   341  					AckRanges: []wire.AckRange{
   342  						{Smallest: 9, Largest: 9},
   343  						{Smallest: 6, Largest: 7},
   344  						{Smallest: 3, Largest: 3},
   345  						{Smallest: 1, Largest: 1},
   346  					},
   347  				}
   348  				_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   349  				Expect(err).ToNot(HaveOccurred())
   350  				expectInPacketHistoryOrLost([]protocol.PacketNumber{0, 2, 4, 5, 8}, protocol.Encryption1RTT)
   351  			})
   352  
   353  			It("processes an ACK frame that would be sent after a late arrival of a packet", func() {
   354  				ack1 := &wire.AckFrame{ // 5 lost
   355  					AckRanges: []wire.AckRange{
   356  						{Smallest: 6, Largest: 6},
   357  						{Smallest: 1, Largest: 4},
   358  					},
   359  				}
   360  				_, err := handler.ReceivedAck(ack1, protocol.Encryption1RTT, time.Now())
   361  				Expect(err).ToNot(HaveOccurred())
   362  				expectInPacketHistoryOrLost([]protocol.PacketNumber{0, 5, 7, 8, 9}, protocol.Encryption1RTT)
   363  				ack2 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 6}}} // now ack 5
   364  				_, err = handler.ReceivedAck(ack2, protocol.Encryption1RTT, time.Now())
   365  				Expect(err).ToNot(HaveOccurred())
   366  				expectInPacketHistoryOrLost([]protocol.PacketNumber{0, 7, 8, 9}, protocol.Encryption1RTT)
   367  			})
   368  
   369  			It("processes an ACK that contains old ACK ranges", func() {
   370  				ack1 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 6}}}
   371  				_, err := handler.ReceivedAck(ack1, protocol.Encryption1RTT, time.Now())
   372  				Expect(err).ToNot(HaveOccurred())
   373  				expectInPacketHistoryOrLost([]protocol.PacketNumber{0, 7, 8, 9}, protocol.Encryption1RTT)
   374  				ack2 := &wire.AckFrame{
   375  					AckRanges: []wire.AckRange{
   376  						{Smallest: 8, Largest: 8},
   377  						{Smallest: 3, Largest: 3},
   378  						{Smallest: 1, Largest: 1},
   379  					},
   380  				}
   381  				_, err = handler.ReceivedAck(ack2, protocol.Encryption1RTT, time.Now())
   382  				Expect(err).ToNot(HaveOccurred())
   383  				expectInPacketHistoryOrLost([]protocol.PacketNumber{0, 7, 9}, protocol.Encryption1RTT)
   384  			})
   385  		})
   386  
   387  		Context("calculating RTT", func() {
   388  			It("computes the RTT", func() {
   389  				now := time.Now()
   390  				// First, fake the sent times of the first, second and last packet
   391  				getPacket(1, protocol.Encryption1RTT).SendTime = now.Add(-10 * time.Minute)
   392  				getPacket(2, protocol.Encryption1RTT).SendTime = now.Add(-5 * time.Minute)
   393  				getPacket(6, protocol.Encryption1RTT).SendTime = now.Add(-1 * time.Minute)
   394  				// Now, check that the proper times are used when calculating the deltas
   395  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}
   396  				_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   397  				Expect(err).ToNot(HaveOccurred())
   398  				Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 10*time.Minute, 1*time.Second))
   399  				ack = &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 2}}}
   400  				_, err = handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   401  				Expect(err).ToNot(HaveOccurred())
   402  				Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 5*time.Minute, 1*time.Second))
   403  				ack = &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 6}}}
   404  				_, err = handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   405  				Expect(err).ToNot(HaveOccurred())
   406  				Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 1*time.Minute, 1*time.Second))
   407  			})
   408  
   409  			It("ignores the DelayTime for Initial and Handshake packets", func() {
   410  				sentPacket(initialPacket(&packet{PacketNumber: 1}))
   411  				handler.rttStats.SetMaxAckDelay(time.Hour)
   412  				// make sure the rttStats have a min RTT, so that the delay is used
   413  				handler.rttStats.UpdateRTT(5*time.Minute, 0, time.Now())
   414  				getPacket(1, protocol.EncryptionInitial).SendTime = time.Now().Add(-10 * time.Minute)
   415  				ack := &wire.AckFrame{
   416  					AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}},
   417  					DelayTime: 5 * time.Minute,
   418  				}
   419  				_, err := handler.ReceivedAck(ack, protocol.EncryptionInitial, time.Now())
   420  				Expect(err).ToNot(HaveOccurred())
   421  				Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 10*time.Minute, 1*time.Second))
   422  			})
   423  
   424  			It("uses the DelayTime in the ACK frame", func() {
   425  				handler.rttStats.SetMaxAckDelay(time.Hour)
   426  				// make sure the rttStats have a min RTT, so that the delay is used
   427  				handler.rttStats.UpdateRTT(5*time.Minute, 0, time.Now())
   428  				getPacket(1, protocol.Encryption1RTT).SendTime = time.Now().Add(-10 * time.Minute)
   429  				ack := &wire.AckFrame{
   430  					AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}},
   431  					DelayTime: 5 * time.Minute,
   432  				}
   433  				_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   434  				Expect(err).ToNot(HaveOccurred())
   435  				Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 5*time.Minute, 1*time.Second))
   436  			})
   437  
   438  			It("limits the DelayTime in the ACK frame to max_ack_delay", func() {
   439  				handler.rttStats.SetMaxAckDelay(time.Minute)
   440  				// make sure the rttStats have a min RTT, so that the delay is used
   441  				handler.rttStats.UpdateRTT(5*time.Minute, 0, time.Now())
   442  				getPacket(1, protocol.Encryption1RTT).SendTime = time.Now().Add(-10 * time.Minute)
   443  				ack := &wire.AckFrame{
   444  					AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}},
   445  					DelayTime: 5 * time.Minute,
   446  				}
   447  				_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   448  				Expect(err).ToNot(HaveOccurred())
   449  				Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 9*time.Minute, 1*time.Second))
   450  			})
   451  		})
   452  
   453  		Context("determining which ACKs we have received an ACK for", func() {
   454  			JustBeforeEach(func() {
   455  				morePackets := []*packet{
   456  					{
   457  						PacketNumber:    10,
   458  						LargestAcked:    100,
   459  						Frames:          []Frame{{Frame: &streamFrame}},
   460  						Length:          1,
   461  						EncryptionLevel: protocol.Encryption1RTT,
   462  					},
   463  					{
   464  						PacketNumber:    11,
   465  						LargestAcked:    200,
   466  						Frames:          []Frame{{Frame: &streamFrame}},
   467  						Length:          1,
   468  						EncryptionLevel: protocol.Encryption1RTT,
   469  					},
   470  					{
   471  						PacketNumber:    12,
   472  						Frames:          []Frame{{Frame: &streamFrame}},
   473  						Length:          1,
   474  						EncryptionLevel: protocol.Encryption1RTT,
   475  					},
   476  				}
   477  				for _, packet := range morePackets {
   478  					sentPacket(packet)
   479  				}
   480  			})
   481  
   482  			It("determines which ACK we have received an ACK for", func() {
   483  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 12}}}
   484  				_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   485  				Expect(err).ToNot(HaveOccurred())
   486  				Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(201)))
   487  			})
   488  
   489  			It("doesn't do anything when the acked packet didn't contain an ACK", func() {
   490  				ack1 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 10}}}
   491  				ack2 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 12, Largest: 12}}}
   492  				_, err := handler.ReceivedAck(ack1, protocol.Encryption1RTT, time.Now())
   493  				Expect(err).ToNot(HaveOccurred())
   494  				Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(101)))
   495  				_, err = handler.ReceivedAck(ack2, protocol.Encryption1RTT, time.Now())
   496  				Expect(err).ToNot(HaveOccurred())
   497  				Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(101)))
   498  			})
   499  
   500  			It("doesn't decrease the value", func() {
   501  				ack1 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 11, Largest: 11}}}
   502  				ack2 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 10}}}
   503  				_, err := handler.ReceivedAck(ack1, protocol.Encryption1RTT, time.Now())
   504  				Expect(err).ToNot(HaveOccurred())
   505  				Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(201)))
   506  				_, err = handler.ReceivedAck(ack2, protocol.Encryption1RTT, time.Now())
   507  				Expect(err).ToNot(HaveOccurred())
   508  				Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(201)))
   509  			})
   510  		})
   511  	})
   512  
   513  	Context("congestion", func() {
   514  		var cong *mocks.MockSendAlgorithmWithDebugInfos
   515  
   516  		JustBeforeEach(func() {
   517  			cong = mocks.NewMockSendAlgorithmWithDebugInfos(mockCtrl)
   518  			handler.congestion = cong
   519  		})
   520  
   521  		It("should call OnSent", func() {
   522  			cong.EXPECT().OnPacketSent(
   523  				gomock.Any(),
   524  				protocol.ByteCount(42),
   525  				protocol.PacketNumber(1),
   526  				protocol.ByteCount(42),
   527  				true,
   528  			)
   529  			sentPacket(&packet{
   530  				PacketNumber:    1,
   531  				Length:          42,
   532  				Frames:          []Frame{{Frame: &wire.PingFrame{}}},
   533  				EncryptionLevel: protocol.Encryption1RTT,
   534  			})
   535  		})
   536  
   537  		It("should call MaybeExitSlowStart and OnPacketAcked", func() {
   538  			rcvTime := time.Now().Add(-5 * time.Second)
   539  			cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(3)
   540  			gomock.InOrder(
   541  				cong.EXPECT().MaybeExitSlowStart(), // must be called before packets are acked
   542  				cong.EXPECT().OnPacketAcked(protocol.PacketNumber(1), protocol.ByteCount(1), protocol.ByteCount(3), rcvTime),
   543  				cong.EXPECT().OnPacketAcked(protocol.PacketNumber(2), protocol.ByteCount(1), protocol.ByteCount(3), rcvTime),
   544  			)
   545  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 1}))
   546  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 2}))
   547  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 3}))
   548  			ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 2}}}
   549  			_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, rcvTime)
   550  			Expect(err).ToNot(HaveOccurred())
   551  		})
   552  
   553  		It("doesn't call OnPacketAcked when a retransmitted packet is acked", func() {
   554  			cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(2)
   555  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: time.Now().Add(-time.Hour)}))
   556  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 2}))
   557  			// lose packet 1
   558  			gomock.InOrder(
   559  				cong.EXPECT().MaybeExitSlowStart(),
   560  				cong.EXPECT().OnPacketLost(protocol.PacketNumber(1), protocol.ByteCount(1), protocol.ByteCount(2)),
   561  				cong.EXPECT().OnPacketAcked(protocol.PacketNumber(2), protocol.ByteCount(1), protocol.ByteCount(2), gomock.Any()),
   562  			)
   563  			ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
   564  			_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   565  			Expect(err).ToNot(HaveOccurred())
   566  			// don't EXPECT any further calls to the congestion controller
   567  			ack = &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 2}}}
   568  			_, err = handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   569  			Expect(err).ToNot(HaveOccurred())
   570  		})
   571  
   572  		It("doesn't call OnPacketLost when a Path MTU probe packet is lost", func() {
   573  			cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(2)
   574  			var mtuPacketDeclaredLost bool
   575  			sentPacket(ackElicitingPacket(&packet{
   576  				PacketNumber:         1,
   577  				SendTime:             time.Now().Add(-time.Hour),
   578  				IsPathMTUProbePacket: true,
   579  				Frames: []Frame{
   580  					{
   581  						Frame:   &wire.PingFrame{},
   582  						Handler: &customFrameHandler{onLost: func(wire.Frame) { mtuPacketDeclaredLost = true }},
   583  					},
   584  				},
   585  			}))
   586  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 2}))
   587  			// lose packet 1, but don't EXPECT any calls to OnPacketLost()
   588  			gomock.InOrder(
   589  				cong.EXPECT().MaybeExitSlowStart(),
   590  				cong.EXPECT().OnPacketAcked(protocol.PacketNumber(2), protocol.ByteCount(1), protocol.ByteCount(2), gomock.Any()),
   591  			)
   592  			ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
   593  			_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   594  			Expect(err).ToNot(HaveOccurred())
   595  			Expect(mtuPacketDeclaredLost).To(BeTrue())
   596  			Expect(handler.bytesInFlight).To(BeZero())
   597  		})
   598  
   599  		It("calls OnPacketAcked and OnPacketLost with the right bytes_in_flight value", func() {
   600  			cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(4)
   601  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: time.Now().Add(-time.Hour)}))
   602  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: time.Now().Add(-30 * time.Minute)}))
   603  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 3, SendTime: time.Now().Add(-30 * time.Minute)}))
   604  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 4, SendTime: time.Now()}))
   605  			// receive the first ACK
   606  			gomock.InOrder(
   607  				cong.EXPECT().MaybeExitSlowStart(),
   608  				cong.EXPECT().OnPacketLost(protocol.PacketNumber(1), protocol.ByteCount(1), protocol.ByteCount(4)),
   609  				cong.EXPECT().OnPacketAcked(protocol.PacketNumber(2), protocol.ByteCount(1), protocol.ByteCount(4), gomock.Any()),
   610  			)
   611  			ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
   612  			_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now().Add(-30*time.Minute))
   613  			Expect(err).ToNot(HaveOccurred())
   614  			// receive the second ACK
   615  			gomock.InOrder(
   616  				cong.EXPECT().MaybeExitSlowStart(),
   617  				cong.EXPECT().OnPacketLost(protocol.PacketNumber(3), protocol.ByteCount(1), protocol.ByteCount(2)),
   618  				cong.EXPECT().OnPacketAcked(protocol.PacketNumber(4), protocol.ByteCount(1), protocol.ByteCount(2), gomock.Any()),
   619  			)
   620  			ack = &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 4, Largest: 4}}}
   621  			_, err = handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   622  			Expect(err).ToNot(HaveOccurred())
   623  		})
   624  
   625  		It("passes the bytes in flight to the congestion controller", func() {
   626  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   627  			cong.EXPECT().OnPacketSent(gomock.Any(), protocol.ByteCount(42), gomock.Any(), protocol.ByteCount(42), true)
   628  			sentPacket(&packet{
   629  				Length:          42,
   630  				EncryptionLevel: protocol.EncryptionInitial,
   631  				Frames:          []Frame{{Frame: &wire.PingFrame{}}},
   632  				SendTime:        time.Now(),
   633  			})
   634  			cong.EXPECT().CanSend(protocol.ByteCount(42)).Return(true)
   635  			cong.EXPECT().HasPacingBudget(gomock.Any()).Return(true)
   636  			handler.SendMode(time.Now())
   637  		})
   638  
   639  		It("allows sending of ACKs when congestion limited", func() {
   640  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   641  			cong.EXPECT().CanSend(gomock.Any()).Return(true)
   642  			cong.EXPECT().HasPacingBudget(gomock.Any()).Return(true)
   643  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
   644  			cong.EXPECT().CanSend(gomock.Any()).Return(false)
   645  			Expect(handler.SendMode(time.Now())).To(Equal(SendAck))
   646  		})
   647  
   648  		It("allows sending of ACKs when we're keeping track of MaxOutstandingSentPackets packets", func() {
   649  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   650  			cong.EXPECT().CanSend(gomock.Any()).Return(true).AnyTimes()
   651  			cong.EXPECT().HasPacingBudget(gomock.Any()).Return(true).AnyTimes()
   652  			cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes()
   653  			for i := protocol.PacketNumber(0); i < protocol.MaxOutstandingSentPackets; i++ {
   654  				Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
   655  				sentPacket(ackElicitingPacket(&packet{PacketNumber: i}))
   656  			}
   657  			Expect(handler.SendMode(time.Now())).To(Equal(SendAck))
   658  		})
   659  
   660  		It("allows PTOs, even when congestion limited", func() {
   661  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   662  			// note that we don't EXPECT a call to GetCongestionWindow
   663  			// that means retransmissions are sent without considering the congestion window
   664  			handler.numProbesToSend = 1
   665  			handler.ptoMode = SendPTOHandshake
   666  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake))
   667  		})
   668  
   669  		It("returns the pacing delay", func() {
   670  			t := time.Now()
   671  			cong.EXPECT().TimeUntilSend(gomock.Any()).Return(t)
   672  			Expect(handler.TimeUntilSend()).To(Equal(t))
   673  		})
   674  	})
   675  
   676  	It("doesn't set an alarm if there are no outstanding packets", func() {
   677  		handler.ReceivedPacket(protocol.EncryptionHandshake)
   678  		sentPacket(ackElicitingPacket(&packet{PacketNumber: 10}))
   679  		sentPacket(ackElicitingPacket(&packet{PacketNumber: 11}))
   680  		ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 11}}}
   681  		_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   682  		Expect(err).ToNot(HaveOccurred())
   683  		Expect(handler.GetLossDetectionTimeout()).To(BeZero())
   684  	})
   685  
   686  	It("does nothing on OnAlarm if there are no outstanding packets", func() {
   687  		handler.ReceivedPacket(protocol.EncryptionHandshake)
   688  		Expect(handler.OnLossDetectionTimeout()).To(Succeed())
   689  		Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
   690  	})
   691  
   692  	Context("probe packets", func() {
   693  		It("queues a probe packet", func() {
   694  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 10}))
   695  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 11}))
   696  			queued := handler.QueueProbePacket(protocol.Encryption1RTT)
   697  			Expect(queued).To(BeTrue())
   698  			Expect(lostPackets).To(Equal([]protocol.PacketNumber{10}))
   699  		})
   700  
   701  		It("says when it can't queue a probe packet", func() {
   702  			queued := handler.QueueProbePacket(protocol.Encryption1RTT)
   703  			Expect(queued).To(BeFalse())
   704  		})
   705  
   706  		It("implements exponential backoff", func() {
   707  			handler.peerAddressValidated = true
   708  			handler.SetHandshakeConfirmed()
   709  			sendTime := time.Now().Add(-time.Hour)
   710  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: sendTime}))
   711  			timeout := handler.GetLossDetectionTimeout().Sub(sendTime)
   712  			Expect(handler.GetLossDetectionTimeout().Sub(sendTime)).To(Equal(timeout))
   713  			handler.ptoCount = 1
   714  			handler.setLossDetectionTimer()
   715  			Expect(handler.GetLossDetectionTimeout().Sub(sendTime)).To(Equal(2 * timeout))
   716  			handler.ptoCount = 2
   717  			handler.setLossDetectionTimer()
   718  			Expect(handler.GetLossDetectionTimeout().Sub(sendTime)).To(Equal(4 * timeout))
   719  			// truncated when the exponential gets too large
   720  			handler.ptoCount = 20
   721  			handler.setLossDetectionTimer()
   722  			Expect(handler.GetLossDetectionTimeout().Sub(sendTime)).To(Equal(maxPTODuration))
   723  			// protected from rollover
   724  			handler.ptoCount = 100
   725  			handler.setLossDetectionTimer()
   726  			Expect(handler.GetLossDetectionTimeout().Sub(sendTime)).To(Equal(maxPTODuration))
   727  		})
   728  
   729  		It("reset the PTO count when receiving an ACK", func() {
   730  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   731  			now := time.Now()
   732  			handler.SetHandshakeConfirmed()
   733  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: now.Add(-time.Minute)}))
   734  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: now.Add(-time.Minute)}))
   735  			handler.appDataPackets.pns.(*skippingPacketNumberGenerator).next = 3
   736  			Expect(handler.GetLossDetectionTimeout()).To(BeTemporally("~", now.Add(-time.Minute), time.Second))
   737  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
   738  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
   739  			Expect(handler.ptoCount).To(BeEquivalentTo(1))
   740  			_, err := handler.ReceivedAck(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}, protocol.Encryption1RTT, time.Now())
   741  			Expect(err).ToNot(HaveOccurred())
   742  			Expect(handler.ptoCount).To(BeZero())
   743  		})
   744  
   745  		It("resets the PTO mode and PTO count when a packet number space is dropped", func() {
   746  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   747  
   748  			now := time.Now()
   749  			handler.rttStats.UpdateRTT(time.Second/2, 0, now)
   750  			Expect(handler.rttStats.SmoothedRTT()).To(Equal(time.Second / 2))
   751  			Expect(handler.rttStats.PTO(true)).To(And(
   752  				BeNumerically(">", time.Second),
   753  				BeNumerically("<", 2*time.Second),
   754  			))
   755  			sendTimeHandshake := now.Add(-2 * time.Minute)
   756  			sendTimeAppData := now.Add(-time.Minute)
   757  
   758  			sentPacket(ackElicitingPacket(&packet{
   759  				PacketNumber:    1,
   760  				EncryptionLevel: protocol.EncryptionHandshake,
   761  				SendTime:        sendTimeHandshake,
   762  			}))
   763  			sentPacket(ackElicitingPacket(&packet{
   764  				PacketNumber: 2,
   765  				SendTime:     sendTimeAppData,
   766  			}))
   767  
   768  			// PTO timer based on the Handshake packet
   769  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
   770  			Expect(handler.ptoCount).To(BeEquivalentTo(1))
   771  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake))
   772  			Expect(handler.GetLossDetectionTimeout()).To(Equal(sendTimeHandshake.Add(handler.rttStats.PTO(false) << 1)))
   773  			handler.SetHandshakeConfirmed()
   774  			handler.DropPackets(protocol.EncryptionHandshake)
   775  			// PTO timer based on the 1-RTT packet
   776  			Expect(handler.GetLossDetectionTimeout()).To(Equal(sendTimeAppData.Add(handler.rttStats.PTO(true)))) // no backoff. PTO count = 0
   777  			Expect(handler.SendMode(time.Now())).ToNot(Equal(SendPTOHandshake))
   778  			Expect(handler.ptoCount).To(BeZero())
   779  		})
   780  
   781  		It("allows two 1-RTT PTOs", func() {
   782  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   783  			handler.SetHandshakeConfirmed()
   784  			var lostPackets []protocol.PacketNumber
   785  			sentPacket(ackElicitingPacket(&packet{
   786  				PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT),
   787  				SendTime:     time.Now().Add(-time.Hour),
   788  				Frames: []Frame{
   789  					{
   790  						Frame:   &wire.PingFrame{},
   791  						Handler: &customFrameHandler{onLost: func(wire.Frame) { lostPackets = append(lostPackets, 1) }},
   792  					},
   793  				},
   794  			}))
   795  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
   796  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
   797  			sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
   798  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
   799  			sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
   800  			Expect(handler.SendMode(time.Now())).ToNot(Equal(SendPTOAppData))
   801  		})
   802  
   803  		It("only counts ack-eliciting packets as probe packets", func() {
   804  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   805  			handler.SetHandshakeConfirmed()
   806  			sentPacket(ackElicitingPacket(&packet{
   807  				PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT),
   808  				SendTime:     time.Now().Add(-time.Hour),
   809  			}))
   810  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
   811  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
   812  			sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
   813  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
   814  			for i := 0; i < 30; i++ {
   815  				sentPacket(nonAckElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
   816  				Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
   817  			}
   818  			sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
   819  			Expect(handler.SendMode(time.Now())).ToNot(Equal(SendPTOAppData))
   820  		})
   821  
   822  		It("gets two probe packets if PTO expires", func() {
   823  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   824  			handler.SetHandshakeConfirmed()
   825  			sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
   826  			sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
   827  
   828  			updateRTT(time.Hour)
   829  			Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue())
   830  
   831  			Expect(handler.OnLossDetectionTimeout()).To(Succeed()) // TLP
   832  			Expect(handler.ptoCount).To(BeEquivalentTo(1))
   833  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
   834  			sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
   835  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
   836  			sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
   837  
   838  			Expect(handler.OnLossDetectionTimeout()).To(Succeed()) // PTO
   839  			Expect(handler.ptoCount).To(BeEquivalentTo(2))
   840  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
   841  			sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
   842  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
   843  			sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
   844  
   845  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
   846  		})
   847  
   848  		It("gets two probe packets if PTO expires, for Handshake packets", func() {
   849  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   850  			sentPacket(initialPacket(&packet{PacketNumber: 1}))
   851  			sentPacket(initialPacket(&packet{PacketNumber: 2}))
   852  
   853  			updateRTT(time.Hour)
   854  			Expect(handler.initialPackets.lossTime.IsZero()).To(BeTrue())
   855  
   856  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
   857  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
   858  			sentPacket(initialPacket(&packet{PacketNumber: 3}))
   859  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
   860  			sentPacket(initialPacket(&packet{PacketNumber: 4}))
   861  
   862  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
   863  		})
   864  
   865  		It("doesn't send 1-RTT probe packets before the handshake completes", func() {
   866  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   867  			sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
   868  			updateRTT(time.Hour)
   869  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
   870  			Expect(handler.GetLossDetectionTimeout()).To(BeZero())
   871  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
   872  			handler.SetHandshakeConfirmed()
   873  			Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
   874  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
   875  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
   876  		})
   877  
   878  		It("resets the send mode when it receives an acknowledgement after queueing probe packets", func() {
   879  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   880  			handler.SetHandshakeConfirmed()
   881  			pn := handler.PopPacketNumber(protocol.Encryption1RTT)
   882  			sentPacket(ackElicitingPacket(&packet{PacketNumber: pn, SendTime: time.Now().Add(-time.Hour)}))
   883  			updateRTT(time.Second)
   884  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
   885  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
   886  			ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: pn, Largest: pn}}}
   887  			_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
   888  			Expect(err).ToNot(HaveOccurred())
   889  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
   890  		})
   891  
   892  		It("handles ACKs for the original packet", func() {
   893  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   894  			sentPacket(ackElicitingPacket(&packet{
   895  				PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT),
   896  				SendTime:     time.Now().Add(-time.Hour),
   897  			}))
   898  			updateRTT(time.Second)
   899  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
   900  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
   901  		})
   902  
   903  		It("doesn't set the PTO timer for Path MTU probe packets", func() {
   904  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   905  			handler.SetHandshakeConfirmed()
   906  			updateRTT(time.Second)
   907  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 5, SendTime: time.Now(), IsPathMTUProbePacket: true}))
   908  			Expect(handler.GetLossDetectionTimeout()).To(BeZero())
   909  		})
   910  	})
   911  
   912  	Context("amplification limit, for the server", func() {
   913  		It("limits the window to 3x the bytes received, to avoid amplification attacks", func() {
   914  			now := time.Now()
   915  			handler.ReceivedPacket(protocol.EncryptionInitial) // receiving an Initial packet doesn't validate the client's address
   916  			handler.ReceivedBytes(200)
   917  			sentPacket(&packet{
   918  				PacketNumber:    1,
   919  				Length:          599,
   920  				EncryptionLevel: protocol.EncryptionInitial,
   921  				Frames:          []Frame{{Frame: &wire.PingFrame{}}},
   922  				SendTime:        now,
   923  			})
   924  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
   925  			sentPacket(&packet{
   926  				PacketNumber:    2,
   927  				Length:          1,
   928  				EncryptionLevel: protocol.EncryptionInitial,
   929  				Frames:          []Frame{{Frame: &wire.PingFrame{}}},
   930  				SendTime:        now,
   931  			})
   932  			Expect(handler.SendMode(time.Now())).To(Equal(SendNone))
   933  		})
   934  
   935  		It("cancels the loss detection timer when it is amplification limited, and resets it when becoming unblocked", func() {
   936  			handler.ReceivedBytes(300)
   937  			sentPacket(&packet{
   938  				PacketNumber:    1,
   939  				Length:          900,
   940  				EncryptionLevel: protocol.EncryptionInitial,
   941  				Frames:          []Frame{{Frame: &wire.PingFrame{}}},
   942  				SendTime:        time.Now(),
   943  			})
   944  			// Amplification limited. We don't need to set a timer now.
   945  			Expect(handler.GetLossDetectionTimeout()).To(BeZero())
   946  			// Unblock the server. Now we should fire up the timer.
   947  			handler.ReceivedBytes(1)
   948  			Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
   949  		})
   950  
   951  		It("resets the loss detection timer when the client's address is validated", func() {
   952  			handler.ReceivedBytes(300)
   953  			sentPacket(&packet{
   954  				PacketNumber:    1,
   955  				Length:          900,
   956  				EncryptionLevel: protocol.EncryptionHandshake,
   957  				Frames:          []Frame{{Frame: &wire.PingFrame{}}},
   958  				SendTime:        time.Now(),
   959  			})
   960  			// Amplification limited. We don't need to set a timer now.
   961  			Expect(handler.GetLossDetectionTimeout()).To(BeZero())
   962  			handler.ReceivedPacket(protocol.EncryptionHandshake)
   963  			Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
   964  		})
   965  
   966  		It("cancels the loss detection alarm when all Handshake packets are acknowledged", func() {
   967  			t := time.Now().Add(-time.Second)
   968  			handler.ReceivedBytes(99999)
   969  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: t}))
   970  			sentPacket(handshakePacket(&packet{PacketNumber: 3, SendTime: t}))
   971  			sentPacket(handshakePacket(&packet{PacketNumber: 4, SendTime: t}))
   972  			Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
   973  			handler.ReceivedAck(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 3, Largest: 4}}}, protocol.EncryptionHandshake, time.Now())
   974  			Expect(handler.GetLossDetectionTimeout()).To(BeZero())
   975  		})
   976  	})
   977  
   978  	Context("amplification limit, for the server, with validated address", func() {
   979  		JustBeforeEach(func() {
   980  			rttStats := utils.NewRTTStats()
   981  			handler = newSentPacketHandler(42, protocol.InitialPacketSizeIPv4, rttStats, true, perspective, nil, utils.DefaultLogger)
   982  		})
   983  
   984  		It("do not limits the window", func() {
   985  			handler.ReceivedBytes(0)
   986  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
   987  			sentPacket(&packet{
   988  				PacketNumber:    1,
   989  				Length:          900,
   990  				EncryptionLevel: protocol.EncryptionInitial,
   991  				Frames:          []Frame{{Frame: &wire.PingFrame{}}},
   992  				SendTime:        time.Now(),
   993  			})
   994  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
   995  		})
   996  	})
   997  
   998  	Context("amplification limit, for the client", func() {
   999  		BeforeEach(func() {
  1000  			perspective = protocol.PerspectiveClient
  1001  		})
  1002  
  1003  		It("sends an Initial packet to unblock the server", func() {
  1004  			sentPacket(initialPacket(&packet{PacketNumber: 1}))
  1005  			_, err := handler.ReceivedAck(
  1006  				&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}},
  1007  				protocol.EncryptionInitial,
  1008  				time.Now(),
  1009  			)
  1010  			Expect(err).ToNot(HaveOccurred())
  1011  			// No packets are outstanding at this point.
  1012  			// Make sure that a probe packet is sent.
  1013  			Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
  1014  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
  1015  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
  1016  
  1017  			// send a single packet to unblock the server
  1018  			sentPacket(initialPacket(&packet{PacketNumber: 2}))
  1019  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
  1020  
  1021  			// Now receive an ACK for a Handshake packet.
  1022  			// This tells the client that the server completed address validation.
  1023  			sentPacket(handshakePacket(&packet{PacketNumber: 1}))
  1024  			_, err = handler.ReceivedAck(
  1025  				&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}},
  1026  				protocol.EncryptionHandshake,
  1027  				time.Now(),
  1028  			)
  1029  			Expect(err).ToNot(HaveOccurred())
  1030  			// Make sure that no timer is set at this point.
  1031  			Expect(handler.GetLossDetectionTimeout()).To(BeZero())
  1032  		})
  1033  
  1034  		It("sends a Handshake packet to unblock the server, if Initial keys were already dropped", func() {
  1035  			sentPacket(initialPacket(&packet{PacketNumber: 1}))
  1036  			_, err := handler.ReceivedAck(
  1037  				&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}},
  1038  				protocol.EncryptionInitial,
  1039  				time.Now(),
  1040  			)
  1041  			Expect(err).ToNot(HaveOccurred())
  1042  
  1043  			sentPacket(handshakePacketNonAckEliciting(&packet{PacketNumber: 1})) // also drops Initial packets
  1044  			Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
  1045  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
  1046  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake))
  1047  
  1048  			// Now receive an ACK for this packet, and send another one.
  1049  			_, err = handler.ReceivedAck(
  1050  				&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}},
  1051  				protocol.EncryptionHandshake,
  1052  				time.Now(),
  1053  			)
  1054  			Expect(err).ToNot(HaveOccurred())
  1055  			sentPacket(handshakePacketNonAckEliciting(&packet{PacketNumber: 2}))
  1056  			Expect(handler.GetLossDetectionTimeout()).To(BeZero())
  1057  		})
  1058  
  1059  		It("doesn't send a packet to unblock the server after handshake confirmation, even if no Handshake ACK was received", func() {
  1060  			sentPacket(handshakePacket(&packet{PacketNumber: 1}))
  1061  			Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
  1062  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
  1063  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake))
  1064  			// confirm the handshake
  1065  			handler.DropPackets(protocol.EncryptionHandshake)
  1066  			Expect(handler.GetLossDetectionTimeout()).To(BeZero())
  1067  		})
  1068  
  1069  		It("correctly sets the timer after the Initial packet number space has been dropped", func() {
  1070  			sentPacket(initialPacket(&packet{PacketNumber: 1, SendTime: time.Now().Add(-19 * time.Second)}))
  1071  			_, err := handler.ReceivedAck(
  1072  				&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}},
  1073  				protocol.EncryptionInitial,
  1074  				time.Now(),
  1075  			)
  1076  			Expect(err).ToNot(HaveOccurred())
  1077  			sentPacket(handshakePacketNonAckEliciting(&packet{PacketNumber: 1, SendTime: time.Now()}))
  1078  			Expect(handler.initialPackets).To(BeNil())
  1079  
  1080  			pto := handler.rttStats.PTO(false)
  1081  			Expect(pto).ToNot(BeZero())
  1082  			// pto is approximately 19 * 3. Using a number > 19 above will
  1083  			// run into the maxPTODuration limit
  1084  			Expect(handler.GetLossDetectionTimeout()).To(BeTemporally("~", time.Now().Add(pto), 10*time.Millisecond))
  1085  		})
  1086  
  1087  		It("doesn't reset the PTO count when receiving an ACK", func() {
  1088  			now := time.Now()
  1089  			sentPacket(initialPacket(&packet{PacketNumber: 1, SendTime: now.Add(-time.Minute)}))
  1090  			sentPacket(initialPacket(&packet{PacketNumber: 2, SendTime: now.Add(-time.Minute)}))
  1091  			Expect(handler.GetLossDetectionTimeout()).To(BeTemporally("~", now.Add(-time.Minute), time.Second))
  1092  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
  1093  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
  1094  			Expect(handler.ptoCount).To(BeEquivalentTo(1))
  1095  			_, err := handler.ReceivedAck(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}, protocol.EncryptionInitial, time.Now())
  1096  			Expect(err).ToNot(HaveOccurred())
  1097  			Expect(handler.ptoCount).To(BeEquivalentTo(1))
  1098  		})
  1099  	})
  1100  
  1101  	Context("Packet-based loss detection", func() {
  1102  		It("declares packet below the packet loss threshold as lost", func() {
  1103  			now := time.Now()
  1104  			for i := protocol.PacketNumber(1); i <= 6; i++ {
  1105  				sentPacket(ackElicitingPacket(&packet{PacketNumber: i}))
  1106  			}
  1107  			ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 6, Largest: 6}}}
  1108  			_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, now)
  1109  			Expect(err).ToNot(HaveOccurred())
  1110  			expectInPacketHistory([]protocol.PacketNumber{4, 5}, protocol.Encryption1RTT)
  1111  			Expect(lostPackets).To(Equal([]protocol.PacketNumber{1, 2, 3}))
  1112  		})
  1113  	})
  1114  
  1115  	Context("Delay-based loss detection", func() {
  1116  		It("immediately detects old packets as lost when receiving an ACK", func() {
  1117  			now := time.Now()
  1118  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: now.Add(-time.Hour)}))
  1119  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: now.Add(-time.Second)}))
  1120  			Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue())
  1121  
  1122  			ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
  1123  			_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, now)
  1124  			Expect(err).ToNot(HaveOccurred())
  1125  			// no need to set an alarm, since packet 1 was already declared lost
  1126  			Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue())
  1127  			Expect(handler.bytesInFlight).To(BeZero())
  1128  		})
  1129  
  1130  		It("sets the early retransmit alarm", func() {
  1131  			handler.ReceivedPacket(protocol.EncryptionHandshake)
  1132  			handler.handshakeConfirmed = true
  1133  			now := time.Now()
  1134  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: now.Add(-2 * time.Second)}))
  1135  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: now.Add(-2 * time.Second)}))
  1136  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 3, SendTime: now}))
  1137  			Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue())
  1138  
  1139  			ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
  1140  			_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, now.Add(-time.Second))
  1141  			Expect(err).ToNot(HaveOccurred())
  1142  			Expect(handler.rttStats.SmoothedRTT()).To(Equal(time.Second))
  1143  
  1144  			// Packet 1 should be considered lost (1+1/8) RTTs after it was sent.
  1145  			Expect(handler.GetLossDetectionTimeout().Sub(getPacket(1, protocol.Encryption1RTT).SendTime)).To(Equal(time.Second * 9 / 8))
  1146  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
  1147  
  1148  			expectInPacketHistory([]protocol.PacketNumber{1, 3}, protocol.Encryption1RTT)
  1149  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
  1150  			expectInPacketHistory([]protocol.PacketNumber{3}, protocol.Encryption1RTT)
  1151  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
  1152  		})
  1153  
  1154  		It("sets the early retransmit alarm for crypto packets", func() {
  1155  			handler.ReceivedBytes(1000)
  1156  			now := time.Now()
  1157  			sentPacket(initialPacket(&packet{PacketNumber: 1, SendTime: now.Add(-2 * time.Second)}))
  1158  			sentPacket(initialPacket(&packet{PacketNumber: 2, SendTime: now.Add(-2 * time.Second)}))
  1159  			sentPacket(initialPacket(&packet{PacketNumber: 3, SendTime: now}))
  1160  			Expect(handler.initialPackets.lossTime.IsZero()).To(BeTrue())
  1161  
  1162  			ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
  1163  			_, err := handler.ReceivedAck(ack, protocol.EncryptionInitial, now.Add(-time.Second))
  1164  			Expect(err).ToNot(HaveOccurred())
  1165  			Expect(handler.rttStats.SmoothedRTT()).To(Equal(time.Second))
  1166  
  1167  			// Packet 1 should be considered lost (1+1/8) RTTs after it was sent.
  1168  			Expect(handler.GetLossDetectionTimeout().Sub(getPacket(1, protocol.EncryptionInitial).SendTime)).To(Equal(time.Second * 9 / 8))
  1169  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
  1170  
  1171  			expectInPacketHistory([]protocol.PacketNumber{1, 3}, protocol.EncryptionInitial)
  1172  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
  1173  			expectInPacketHistory([]protocol.PacketNumber{3}, protocol.EncryptionInitial)
  1174  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
  1175  		})
  1176  
  1177  		It("sets the early retransmit alarm for Path MTU probe packets", func() {
  1178  			var mtuPacketDeclaredLost bool
  1179  			now := time.Now()
  1180  			sentPacket(ackElicitingPacket(&packet{
  1181  				PacketNumber:         1,
  1182  				SendTime:             now.Add(-3 * time.Second),
  1183  				IsPathMTUProbePacket: true,
  1184  				Frames: []Frame{
  1185  					{
  1186  						Frame:   &wire.PingFrame{},
  1187  						Handler: &customFrameHandler{onLost: func(wire.Frame) { mtuPacketDeclaredLost = true }},
  1188  					},
  1189  				},
  1190  			}))
  1191  			sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: now.Add(-3 * time.Second)}))
  1192  			ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
  1193  			_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, now.Add(-time.Second))
  1194  			Expect(err).ToNot(HaveOccurred())
  1195  			Expect(mtuPacketDeclaredLost).To(BeFalse())
  1196  			Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
  1197  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
  1198  			Expect(mtuPacketDeclaredLost).To(BeTrue())
  1199  			Expect(handler.GetLossDetectionTimeout()).To(BeZero())
  1200  		})
  1201  	})
  1202  
  1203  	Context("crypto packets", func() {
  1204  		It("rejects an ACK that acks packets with a higher encryption level", func() {
  1205  			sentPacket(ackElicitingPacket(&packet{
  1206  				PacketNumber:    13,
  1207  				EncryptionLevel: protocol.Encryption1RTT,
  1208  			}))
  1209  			ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 13, Largest: 13}}}
  1210  			_, err := handler.ReceivedAck(ack, protocol.EncryptionHandshake, time.Now())
  1211  			Expect(err).To(MatchError(&qerr.TransportError{
  1212  				ErrorCode:    qerr.ProtocolViolation,
  1213  				ErrorMessage: "received ACK for an unsent packet",
  1214  			}))
  1215  		})
  1216  
  1217  		It("deletes Initial packets, as a server", func() {
  1218  			for i := protocol.PacketNumber(0); i < 6; i++ {
  1219  				sentPacket(ackElicitingPacket(&packet{
  1220  					PacketNumber:    i,
  1221  					EncryptionLevel: protocol.EncryptionInitial,
  1222  				}))
  1223  			}
  1224  			for i := protocol.PacketNumber(0); i < 10; i++ {
  1225  				sentPacket(ackElicitingPacket(&packet{
  1226  					PacketNumber:    i,
  1227  					EncryptionLevel: protocol.EncryptionHandshake,
  1228  				}))
  1229  			}
  1230  			Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(16)))
  1231  			handler.DropPackets(protocol.EncryptionInitial)
  1232  			Expect(lostPackets).To(BeEmpty()) // frames must not be queued for retransmission
  1233  			Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(10)))
  1234  			Expect(handler.initialPackets).To(BeNil())
  1235  			Expect(handler.handshakePackets.history.Len()).ToNot(BeZero())
  1236  		})
  1237  
  1238  		Context("deleting Initials", func() {
  1239  			BeforeEach(func() { perspective = protocol.PerspectiveClient })
  1240  
  1241  			It("deletes Initials, as a client", func() {
  1242  				for i := 0; i < 6; i++ {
  1243  					sentPacket(ackElicitingPacket(&packet{
  1244  						PacketNumber:    handler.PopPacketNumber(protocol.EncryptionInitial),
  1245  						EncryptionLevel: protocol.EncryptionInitial,
  1246  						Length:          1,
  1247  					}))
  1248  				}
  1249  				Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(6)))
  1250  				handler.DropPackets(protocol.EncryptionInitial)
  1251  				// DropPackets should be ignored for clients and the Initial packet number space.
  1252  				// It has to be possible to send another Initial packets after this function was called.
  1253  				sentPacket(ackElicitingPacket(&packet{
  1254  					PacketNumber:    handler.PopPacketNumber(protocol.EncryptionInitial),
  1255  					EncryptionLevel: protocol.EncryptionInitial,
  1256  					Length:          1,
  1257  				}))
  1258  				Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(7)))
  1259  				// Sending a Handshake packet triggers dropping of Initials.
  1260  				sentPacket(ackElicitingPacket(&packet{
  1261  					PacketNumber:    handler.PopPacketNumber(protocol.EncryptionHandshake),
  1262  					EncryptionLevel: protocol.EncryptionHandshake,
  1263  				}))
  1264  				Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(1)))
  1265  				Expect(lostPackets).To(BeEmpty()) // frames must not be queued for retransmission
  1266  				Expect(handler.initialPackets).To(BeNil())
  1267  				Expect(handler.handshakePackets.history.Len()).ToNot(BeZero())
  1268  			})
  1269  		})
  1270  
  1271  		It("deletes Handshake packets", func() {
  1272  			for i := protocol.PacketNumber(0); i < 6; i++ {
  1273  				sentPacket(ackElicitingPacket(&packet{
  1274  					PacketNumber:    i,
  1275  					EncryptionLevel: protocol.EncryptionHandshake,
  1276  				}))
  1277  			}
  1278  			for i := protocol.PacketNumber(0); i < 10; i++ {
  1279  				sentPacket(ackElicitingPacket(&packet{
  1280  					PacketNumber:    i,
  1281  					EncryptionLevel: protocol.Encryption1RTT,
  1282  				}))
  1283  			}
  1284  			Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(16)))
  1285  			handler.DropPackets(protocol.EncryptionHandshake)
  1286  			Expect(lostPackets).To(BeEmpty()) // frames must not be queued for retransmission
  1287  			Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(10)))
  1288  			Expect(handler.handshakePackets).To(BeNil())
  1289  		})
  1290  
  1291  		It("doesn't retransmit 0-RTT packets when 0-RTT keys are dropped", func() {
  1292  			for i := protocol.PacketNumber(0); i < 6; i++ {
  1293  				if i == 3 {
  1294  					handler.appDataPackets.history.SkippedPacket(3)
  1295  					continue
  1296  				}
  1297  				sentPacket(ackElicitingPacket(&packet{
  1298  					PacketNumber:    i,
  1299  					EncryptionLevel: protocol.Encryption0RTT,
  1300  				}))
  1301  			}
  1302  			for i := protocol.PacketNumber(6); i < 12; i++ {
  1303  				sentPacket(ackElicitingPacket(&packet{PacketNumber: i}))
  1304  			}
  1305  			Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(11)))
  1306  			handler.DropPackets(protocol.Encryption0RTT)
  1307  			Expect(lostPackets).To(BeEmpty())
  1308  			Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(6)))
  1309  		})
  1310  
  1311  		It("cancels the PTO when dropping a packet number space", func() {
  1312  			handler.ReceivedPacket(protocol.EncryptionHandshake)
  1313  			now := time.Now()
  1314  			sentPacket(handshakePacket(&packet{PacketNumber: 1, SendTime: now.Add(-time.Minute)}))
  1315  			sentPacket(handshakePacket(&packet{PacketNumber: 2, SendTime: now.Add(-time.Minute)}))
  1316  			Expect(handler.GetLossDetectionTimeout()).To(BeTemporally("~", now.Add(-time.Minute), time.Second))
  1317  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
  1318  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake))
  1319  			Expect(handler.ptoCount).To(BeEquivalentTo(1))
  1320  			handler.DropPackets(protocol.EncryptionHandshake)
  1321  			Expect(handler.ptoCount).To(BeZero())
  1322  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
  1323  		})
  1324  	})
  1325  
  1326  	Context("peeking and popping packet number", func() {
  1327  		It("peeks and pops the initial packet number", func() {
  1328  			pn, _ := handler.PeekPacketNumber(protocol.EncryptionInitial)
  1329  			Expect(pn).To(Equal(protocol.PacketNumber(42)))
  1330  			Expect(handler.PopPacketNumber(protocol.EncryptionInitial)).To(Equal(protocol.PacketNumber(42)))
  1331  		})
  1332  
  1333  		It("peeks and pops beyond the initial packet number", func() {
  1334  			Expect(handler.PopPacketNumber(protocol.EncryptionInitial)).To(Equal(protocol.PacketNumber(42)))
  1335  			Expect(handler.PopPacketNumber(protocol.EncryptionInitial)).To(BeNumerically(">", 42))
  1336  		})
  1337  
  1338  		It("starts at 0 for handshake and application-data packet number space", func() {
  1339  			pn, _ := handler.PeekPacketNumber(protocol.EncryptionHandshake)
  1340  			Expect(pn).To(BeZero())
  1341  			Expect(handler.PopPacketNumber(protocol.EncryptionHandshake)).To(BeZero())
  1342  			pn, _ = handler.PeekPacketNumber(protocol.Encryption1RTT)
  1343  			Expect(pn).To(BeZero())
  1344  			Expect(handler.PopPacketNumber(protocol.Encryption1RTT)).To(BeZero())
  1345  		})
  1346  	})
  1347  
  1348  	Context("for the client", func() {
  1349  		BeforeEach(func() {
  1350  			perspective = protocol.PerspectiveClient
  1351  		})
  1352  
  1353  		It("considers the server's address validated right away", func() {
  1354  		})
  1355  
  1356  		It("queues outstanding packets for retransmission, cancels alarms and resets PTO count when receiving a Retry", func() {
  1357  			sentPacket(initialPacket(&packet{PacketNumber: 42}))
  1358  			Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
  1359  			Expect(handler.bytesInFlight).ToNot(BeZero())
  1360  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
  1361  			// now receive a Retry
  1362  			Expect(handler.ResetForRetry()).To(Succeed())
  1363  			Expect(lostPackets).To(Equal([]protocol.PacketNumber{42}))
  1364  			Expect(handler.bytesInFlight).To(BeZero())
  1365  			Expect(handler.GetLossDetectionTimeout()).To(BeZero())
  1366  			Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
  1367  			Expect(handler.ptoCount).To(BeZero())
  1368  		})
  1369  
  1370  		It("queues outstanding frames for retransmission and cancels alarms when receiving a Retry", func() {
  1371  			var lostInitial, lost0RTT bool
  1372  			sentPacket(&packet{
  1373  				PacketNumber:    13,
  1374  				EncryptionLevel: protocol.EncryptionInitial,
  1375  				Frames: []Frame{
  1376  					{
  1377  						Frame:   &wire.CryptoFrame{Data: []byte("foobar")},
  1378  						Handler: &customFrameHandler{onLost: func(wire.Frame) { lostInitial = true }},
  1379  					},
  1380  				},
  1381  				Length: 100,
  1382  			})
  1383  			pn := handler.PopPacketNumber(protocol.Encryption0RTT)
  1384  			sentPacket(&packet{
  1385  				PacketNumber:    pn,
  1386  				EncryptionLevel: protocol.Encryption0RTT,
  1387  				Frames: []Frame{
  1388  					{
  1389  						Frame:   &wire.StreamFrame{Data: []byte("foobar")},
  1390  						Handler: &customFrameHandler{onLost: func(wire.Frame) { lost0RTT = true }},
  1391  					},
  1392  				},
  1393  				Length: 999,
  1394  			})
  1395  			Expect(handler.bytesInFlight).ToNot(BeZero())
  1396  			// now receive a Retry
  1397  			Expect(handler.ResetForRetry()).To(Succeed())
  1398  			Expect(handler.bytesInFlight).To(BeZero())
  1399  			Expect(lostInitial).To(BeTrue())
  1400  			Expect(lost0RTT).To(BeTrue())
  1401  
  1402  			// make sure we keep increasing the packet number for 0-RTT packets
  1403  			Expect(handler.PopPacketNumber(protocol.Encryption0RTT)).To(BeNumerically(">", pn))
  1404  		})
  1405  
  1406  		It("uses a Retry for an RTT estimate, if it was not retransmitted", func() {
  1407  			sentPacket(ackElicitingPacket(&packet{
  1408  				PacketNumber:    42,
  1409  				EncryptionLevel: protocol.EncryptionInitial,
  1410  				SendTime:        time.Now().Add(-500 * time.Millisecond),
  1411  			}))
  1412  			sentPacket(ackElicitingPacket(&packet{
  1413  				PacketNumber:    43,
  1414  				EncryptionLevel: protocol.EncryptionInitial,
  1415  				SendTime:        time.Now().Add(-10 * time.Millisecond),
  1416  			}))
  1417  			Expect(handler.ResetForRetry()).To(Succeed())
  1418  			Expect(handler.rttStats.SmoothedRTT()).To(BeNumerically("~", 500*time.Millisecond, 100*time.Millisecond))
  1419  		})
  1420  
  1421  		It("uses a Retry for an RTT estimate, but doesn't set the RTT to a value lower than 5ms", func() {
  1422  			sentPacket(ackElicitingPacket(&packet{
  1423  				PacketNumber:    42,
  1424  				EncryptionLevel: protocol.EncryptionInitial,
  1425  				SendTime:        time.Now().Add(-500 * time.Microsecond),
  1426  			}))
  1427  			sentPacket(ackElicitingPacket(&packet{
  1428  				PacketNumber:    43,
  1429  				EncryptionLevel: protocol.EncryptionInitial,
  1430  				SendTime:        time.Now().Add(-10 * time.Microsecond),
  1431  			}))
  1432  			Expect(handler.ResetForRetry()).To(Succeed())
  1433  			Expect(handler.rttStats.SmoothedRTT()).To(Equal(minRTTAfterRetry))
  1434  		})
  1435  
  1436  		It("doesn't use a Retry for an RTT estimate, if it was not retransmitted", func() {
  1437  			sentPacket(ackElicitingPacket(&packet{
  1438  				PacketNumber:    42,
  1439  				EncryptionLevel: protocol.EncryptionInitial,
  1440  				SendTime:        time.Now().Add(-800 * time.Millisecond),
  1441  			}))
  1442  			Expect(handler.OnLossDetectionTimeout()).To(Succeed())
  1443  			Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
  1444  			sentPacket(ackElicitingPacket(&packet{
  1445  				PacketNumber:    43,
  1446  				EncryptionLevel: protocol.EncryptionInitial,
  1447  				SendTime:        time.Now().Add(-100 * time.Millisecond),
  1448  			}))
  1449  			Expect(handler.ResetForRetry()).To(Succeed())
  1450  			Expect(handler.rttStats.SmoothedRTT()).To(BeZero())
  1451  		})
  1452  	})
  1453  })