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

     1  package quic
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"math/rand"
     7  	"net"
     8  	"time"
     9  
    10  	"github.com/mikelsr/quic-go/internal/ackhandler"
    11  	"github.com/mikelsr/quic-go/internal/handshake"
    12  	"github.com/mikelsr/quic-go/internal/mocks"
    13  	mockackhandler "github.com/mikelsr/quic-go/internal/mocks/ackhandler"
    14  	"github.com/mikelsr/quic-go/internal/protocol"
    15  	"github.com/mikelsr/quic-go/internal/qerr"
    16  	"github.com/mikelsr/quic-go/internal/utils"
    17  	"github.com/mikelsr/quic-go/internal/wire"
    18  
    19  	"github.com/golang/mock/gomock"
    20  
    21  	. "github.com/onsi/ginkgo/v2"
    22  	. "github.com/onsi/gomega"
    23  )
    24  
    25  var _ = Describe("Packet packer", func() {
    26  	const maxPacketSize protocol.ByteCount = 1357
    27  	const version = protocol.Version1
    28  
    29  	var (
    30  		packer              *packetPacker
    31  		retransmissionQueue *retransmissionQueue
    32  		datagramQueue       *datagramQueue
    33  		framer              *MockFrameSource
    34  		ackFramer           *MockAckFrameSource
    35  		initialStream       *MockCryptoStream
    36  		handshakeStream     *MockCryptoStream
    37  		sealingManager      *MockSealingManager
    38  		pnManager           *mockackhandler.MockSentPacketHandler
    39  	)
    40  	connID := protocol.ParseConnectionID([]byte{1, 2, 3, 4, 5, 6, 7, 8})
    41  
    42  	parsePacket := func(data []byte) (hdrs []*wire.ExtendedHeader, more []byte) {
    43  		for len(data) > 0 {
    44  			if !wire.IsLongHeaderPacket(data[0]) {
    45  				break
    46  			}
    47  			hdr, _, more, err := wire.ParsePacket(data)
    48  			Expect(err).ToNot(HaveOccurred())
    49  			r := bytes.NewReader(data)
    50  			extHdr, err := hdr.ParseExtended(r, version)
    51  			Expect(err).ToNot(HaveOccurred())
    52  			ExpectWithOffset(1, extHdr.Length).To(BeEquivalentTo(r.Len() - len(more) + int(extHdr.PacketNumberLen)))
    53  			ExpectWithOffset(1, extHdr.Length+protocol.ByteCount(extHdr.PacketNumberLen)).To(BeNumerically(">=", 4))
    54  			data = more
    55  			hdrs = append(hdrs, extHdr)
    56  		}
    57  		return hdrs, data
    58  	}
    59  
    60  	parseShortHeaderPacket := func(data []byte) {
    61  		l, _, pnLen, _, err := wire.ParseShortHeader(data, connID.Len())
    62  		ExpectWithOffset(1, err).ToNot(HaveOccurred())
    63  		ExpectWithOffset(1, len(data)-l+int(pnLen)).To(BeNumerically(">=", 4))
    64  	}
    65  
    66  	expectAppendStreamFrames := func(frames ...ackhandler.StreamFrame) {
    67  		framer.EXPECT().AppendStreamFrames(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(fs []ackhandler.StreamFrame, _ protocol.ByteCount, v protocol.VersionNumber) ([]ackhandler.StreamFrame, protocol.ByteCount) {
    68  			var length protocol.ByteCount
    69  			for _, f := range frames {
    70  				length += f.Frame.Length(v)
    71  			}
    72  			return append(fs, frames...), length
    73  		})
    74  	}
    75  
    76  	expectAppendControlFrames := func(frames ...ackhandler.Frame) {
    77  		framer.EXPECT().AppendControlFrames(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(fs []ackhandler.Frame, _ protocol.ByteCount, v protocol.VersionNumber) ([]ackhandler.Frame, protocol.ByteCount) {
    78  			var length protocol.ByteCount
    79  			for _, f := range frames {
    80  				length += f.Frame.Length(v)
    81  			}
    82  			return append(fs, frames...), length
    83  		})
    84  	}
    85  
    86  	BeforeEach(func() {
    87  		rand.Seed(GinkgoRandomSeed())
    88  		retransmissionQueue = newRetransmissionQueue()
    89  		mockSender := NewMockStreamSender(mockCtrl)
    90  		mockSender.EXPECT().onHasStreamData(gomock.Any()).AnyTimes()
    91  		initialStream = NewMockCryptoStream(mockCtrl)
    92  		handshakeStream = NewMockCryptoStream(mockCtrl)
    93  		framer = NewMockFrameSource(mockCtrl)
    94  		ackFramer = NewMockAckFrameSource(mockCtrl)
    95  		sealingManager = NewMockSealingManager(mockCtrl)
    96  		pnManager = mockackhandler.NewMockSentPacketHandler(mockCtrl)
    97  		datagramQueue = newDatagramQueue(func() {}, utils.DefaultLogger)
    98  
    99  		packer = newPacketPacker(protocol.ParseConnectionID([]byte{1, 2, 3, 4, 5, 6, 7, 8}), func() protocol.ConnectionID { return connID }, initialStream, handshakeStream, pnManager, retransmissionQueue, sealingManager, framer, ackFramer, datagramQueue, protocol.PerspectiveServer)
   100  	})
   101  
   102  	Context("determining the maximum packet size", func() {
   103  		It("uses the minimum initial size, if it can't determine if the remote address is IPv4 or IPv6", func() {
   104  			Expect(getMaxPacketSize(&net.TCPAddr{})).To(BeEquivalentTo(protocol.MinInitialPacketSize))
   105  		})
   106  
   107  		It("uses the maximum IPv4 packet size, if the remote address is IPv4", func() {
   108  			addr := &net.UDPAddr{IP: net.IPv4(11, 12, 13, 14), Port: 1337}
   109  			Expect(getMaxPacketSize(addr)).To(BeEquivalentTo(protocol.InitialPacketSizeIPv4))
   110  		})
   111  
   112  		It("uses the maximum IPv6 packet size, if the remote address is IPv6", func() {
   113  			ip := net.ParseIP("2001:0db8:85a3:0000:0000:8a2e:0370:7334")
   114  			addr := &net.UDPAddr{IP: ip, Port: 1337}
   115  			Expect(getMaxPacketSize(addr)).To(BeEquivalentTo(protocol.InitialPacketSizeIPv6))
   116  		})
   117  	})
   118  
   119  	Context("generating a packet header", func() {
   120  		It("uses the Long Header format", func() {
   121  			pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen3)
   122  			h := packer.getLongHeader(protocol.EncryptionHandshake, protocol.Version1)
   123  			Expect(h.PacketNumber).To(Equal(protocol.PacketNumber(0x42)))
   124  			Expect(h.PacketNumberLen).To(Equal(protocol.PacketNumberLen3))
   125  			Expect(h.Version).To(Equal(protocol.Version1))
   126  		})
   127  
   128  		It("sets source and destination connection ID", func() {
   129  			pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   130  			srcConnID := protocol.ParseConnectionID([]byte{1, 2, 3, 4, 5, 6, 7, 8})
   131  			destConnID := protocol.ParseConnectionID([]byte{8, 7, 6, 5, 4, 3, 2, 1})
   132  			packer.srcConnID = srcConnID
   133  			packer.getDestConnID = func() protocol.ConnectionID { return destConnID }
   134  			h := packer.getLongHeader(protocol.EncryptionHandshake, protocol.Version1)
   135  			Expect(h.SrcConnectionID).To(Equal(srcConnID))
   136  			Expect(h.DestConnectionID).To(Equal(destConnID))
   137  		})
   138  	})
   139  
   140  	Context("encrypting packets", func() {
   141  		It("encrypts a packet", func() {
   142  			pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x1337), protocol.PacketNumberLen2)
   143  			pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x1337))
   144  			sealer := mocks.NewMockShortHeaderSealer(mockCtrl)
   145  			sealer.EXPECT().Overhead().Return(4).AnyTimes()
   146  			var hdrRaw []byte
   147  			gomock.InOrder(
   148  				sealer.EXPECT().KeyPhase().Return(protocol.KeyPhaseOne),
   149  				sealer.EXPECT().Seal(gomock.Any(), gomock.Any(), protocol.PacketNumber(0x1337), gomock.Any()).DoAndReturn(func(_, src []byte, _ protocol.PacketNumber, aad []byte) []byte {
   150  					hdrRaw = append([]byte{}, aad...)
   151  					return append(src, []byte{0xde, 0xca, 0xfb, 0xad}...)
   152  				}),
   153  				sealer.EXPECT().EncryptHeader(gomock.Any(), gomock.Any(), gomock.Any()).Do(func(sample []byte, firstByte *byte, pnBytes []byte) {
   154  					Expect(firstByte).To(Equal(&hdrRaw[0]))
   155  					Expect(pnBytes).To(Equal(hdrRaw[len(hdrRaw)-2:]))
   156  					*firstByte ^= 0xff // invert the first byte
   157  					// invert the packet number bytes
   158  					for i := range pnBytes {
   159  						pnBytes[i] ^= 0xff
   160  					}
   161  				}),
   162  			)
   163  			framer.EXPECT().HasData().Return(true)
   164  			sealingManager.EXPECT().GetInitialSealer().Return(nil, nil)
   165  			sealingManager.EXPECT().GetHandshakeSealer().Return(nil, nil)
   166  			sealingManager.EXPECT().Get1RTTSealer().Return(sealer, nil)
   167  			ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
   168  			expectAppendControlFrames()
   169  			f := &wire.StreamFrame{Data: []byte{0xde, 0xca, 0xfb, 0xad}}
   170  			expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f})
   171  			p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
   172  			Expect(err).ToNot(HaveOccurred())
   173  			Expect(p).ToNot(BeNil())
   174  			Expect(p.longHdrPackets).To(BeEmpty())
   175  			Expect(p.shortHdrPacket).ToNot(BeNil())
   176  			Expect(p.shortHdrPacket.Frames).To(BeEmpty())
   177  			Expect(p.shortHdrPacket.StreamFrames).To(HaveLen(1))
   178  			Expect(p.shortHdrPacket.StreamFrames[0].Frame).To(Equal(f))
   179  			hdrRawEncrypted := append([]byte{}, hdrRaw...)
   180  			hdrRawEncrypted[0] ^= 0xff
   181  			hdrRawEncrypted[len(hdrRaw)-2] ^= 0xff
   182  			hdrRawEncrypted[len(hdrRaw)-1] ^= 0xff
   183  			Expect(p.buffer.Data[0:len(hdrRaw)]).To(Equal(hdrRawEncrypted))
   184  			Expect(p.buffer.Data[p.buffer.Len()-4:]).To(Equal([]byte{0xde, 0xca, 0xfb, 0xad}))
   185  		})
   186  	})
   187  
   188  	Context("packing packets", func() {
   189  		// getSealer gets a sealer that's expected to seal exactly one packet
   190  		getSealer := func() *mocks.MockShortHeaderSealer {
   191  			sealer := mocks.NewMockShortHeaderSealer(mockCtrl)
   192  			sealer.EXPECT().KeyPhase().Return(protocol.KeyPhaseOne).AnyTimes()
   193  			sealer.EXPECT().Overhead().Return(7).AnyTimes()
   194  			sealer.EXPECT().EncryptHeader(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes()
   195  			sealer.EXPECT().Seal(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(dst, src []byte, pn protocol.PacketNumber, associatedData []byte) []byte {
   196  				return append(src, bytes.Repeat([]byte{'s'}, sealer.Overhead())...)
   197  			}).AnyTimes()
   198  			return sealer
   199  		}
   200  
   201  		Context("packing ACK packets", func() {
   202  			It("doesn't pack a packet if there's no ACK to send", func() {
   203  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
   204  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
   205  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   206  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   207  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true)
   208  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true)
   209  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true)
   210  				p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1)
   211  				Expect(err).ToNot(HaveOccurred())
   212  				Expect(p).To(BeNil())
   213  			})
   214  
   215  			It("packs Initial ACK-only packets, and pads them (for the client)", func() {
   216  				packer.perspective = protocol.PerspectiveClient
   217  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   218  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42))
   219  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
   220  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}}
   221  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).Return(ack)
   222  				p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1)
   223  				Expect(err).NotTo(HaveOccurred())
   224  				Expect(p).ToNot(BeNil())
   225  				Expect(p.longHdrPackets).To(HaveLen(1))
   226  				Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial))
   227  				Expect(p.longHdrPackets[0].ack).To(Equal(ack))
   228  				Expect(p.longHdrPackets[0].frames).To(BeEmpty())
   229  				Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
   230  				parsePacket(p.buffer.Data)
   231  			})
   232  
   233  			It("packs Initial ACK-only packets, and doesn't pads them (for the server)", func() {
   234  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   235  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42))
   236  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
   237  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}}
   238  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).Return(ack)
   239  				p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1)
   240  				Expect(err).NotTo(HaveOccurred())
   241  				Expect(p).ToNot(BeNil())
   242  				Expect(p.longHdrPackets).To(HaveLen(1))
   243  				Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial))
   244  				Expect(p.longHdrPackets[0].ack).To(Equal(ack))
   245  				Expect(p.longHdrPackets[0].frames).To(BeEmpty())
   246  				Expect(p.buffer.Len()).To(BeNumerically("<", 100))
   247  				parsePacket(p.buffer.Data)
   248  			})
   249  
   250  			It("packs 1-RTT ACK-only packets, before handshake confirmation", func() {
   251  				sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped)
   252  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
   253  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   254  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   255  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   256  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}}
   257  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true)
   258  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack)
   259  				p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1)
   260  				Expect(err).NotTo(HaveOccurred())
   261  				Expect(p).ToNot(BeNil())
   262  				Expect(p.longHdrPackets).To(BeEmpty())
   263  				Expect(p.shortHdrPacket).ToNot(BeNil())
   264  				Expect(p.shortHdrPacket.Ack).To(Equal(ack))
   265  				Expect(p.shortHdrPacket.Frames).To(BeEmpty())
   266  				parsePacket(p.buffer.Data)
   267  			})
   268  
   269  			It("packs 1-RTT ACK-only packets, after handshake confirmation", func() {
   270  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   271  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   272  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   273  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}}
   274  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack)
   275  				p, buffer, err := packer.PackAckOnlyPacket(maxPacketSize, protocol.Version1)
   276  				Expect(err).NotTo(HaveOccurred())
   277  				Expect(p).ToNot(BeNil())
   278  				Expect(p.Ack).To(Equal(ack))
   279  				Expect(p.Frames).To(BeEmpty())
   280  				parsePacket(buffer.Data)
   281  			})
   282  		})
   283  
   284  		Context("packing 0-RTT packets", func() {
   285  			BeforeEach(func() {
   286  				packer.perspective = protocol.PerspectiveClient
   287  				sealingManager.EXPECT().GetInitialSealer().Return(nil, nil).AnyTimes()
   288  				sealingManager.EXPECT().GetHandshakeSealer().Return(nil, nil).AnyTimes()
   289  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable).AnyTimes()
   290  				initialStream.EXPECT().HasData().AnyTimes()
   291  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).AnyTimes()
   292  				handshakeStream.EXPECT().HasData().AnyTimes()
   293  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true).AnyTimes()
   294  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).AnyTimes()
   295  			})
   296  
   297  			It("packs a 0-RTT packet", func() {
   298  				sealingManager.EXPECT().Get0RTTSealer().Return(getSealer(), nil).AnyTimes()
   299  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   300  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(0x42))
   301  				cf := ackhandler.Frame{Frame: &wire.MaxDataFrame{MaximumData: 0x1337}}
   302  				framer.EXPECT().HasData().Return(true)
   303  				framer.EXPECT().AppendControlFrames(gomock.Any(), gomock.Any(), protocol.Version1).DoAndReturn(func(frames []ackhandler.Frame, _ protocol.ByteCount, v protocol.VersionNumber) ([]ackhandler.Frame, protocol.ByteCount) {
   304  					Expect(frames).To(BeEmpty())
   305  					return append(frames, cf), cf.Frame.Length(v)
   306  				})
   307  				// TODO: check sizes
   308  				framer.EXPECT().AppendStreamFrames(gomock.Any(), gomock.Any(), protocol.Version1).DoAndReturn(func(frames []ackhandler.StreamFrame, _ protocol.ByteCount, _ protocol.VersionNumber) ([]ackhandler.StreamFrame, protocol.ByteCount) {
   309  					return frames, 0
   310  				})
   311  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
   312  				Expect(p).ToNot(BeNil())
   313  				Expect(err).ToNot(HaveOccurred())
   314  				Expect(p.longHdrPackets).To(HaveLen(1))
   315  				Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketType0RTT))
   316  				Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.Encryption0RTT))
   317  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
   318  				Expect(p.longHdrPackets[0].frames[0].Frame).To(Equal(cf.Frame))
   319  				Expect(p.longHdrPackets[0].frames[0].Handler).ToNot(BeNil())
   320  			})
   321  
   322  			It("doesn't add an ACK-only 0-RTT packet", func() { // ACK frames cannot be sent in 0-RTT packets
   323  				p, err := packer.PackCoalescedPacket(true, protocol.MaxByteCount, protocol.Version1)
   324  				Expect(err).ToNot(HaveOccurred())
   325  				Expect(p).To(BeNil())
   326  			})
   327  		})
   328  
   329  		Context("packing CONNECTION_CLOSE", func() {
   330  			It("clears the reason phrase for crypto errors", func() {
   331  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   332  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
   333  				sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped)
   334  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
   335  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
   336  				quicErr := qerr.NewLocalCryptoError(0x42, "crypto error")
   337  				quicErr.FrameType = 0x1234
   338  				p, err := packer.PackConnectionClose(quicErr, maxPacketSize, protocol.Version1)
   339  				Expect(err).ToNot(HaveOccurred())
   340  				Expect(p.longHdrPackets).To(HaveLen(1))
   341  				Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeHandshake))
   342  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
   343  				Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{}))
   344  				ccf := p.longHdrPackets[0].frames[0].Frame.(*wire.ConnectionCloseFrame)
   345  				Expect(ccf.IsApplicationError).To(BeFalse())
   346  				Expect(ccf.ErrorCode).To(BeEquivalentTo(0x100 + 0x42))
   347  				Expect(ccf.FrameType).To(BeEquivalentTo(0x1234))
   348  				Expect(ccf.ReasonPhrase).To(BeEmpty())
   349  			})
   350  
   351  			It("packs a CONNECTION_CLOSE in 1-RTT", func() {
   352  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   353  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   354  				sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped)
   355  				sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysDropped)
   356  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   357  				// expect no framer.PopStreamFrames
   358  				p, err := packer.PackConnectionClose(&qerr.TransportError{
   359  					ErrorCode:    qerr.CryptoBufferExceeded,
   360  					ErrorMessage: "test error",
   361  				}, maxPacketSize, protocol.Version1)
   362  				Expect(err).ToNot(HaveOccurred())
   363  				Expect(p.longHdrPackets).To(BeEmpty())
   364  				Expect(p.shortHdrPacket.Frames).To(HaveLen(1))
   365  				Expect(p.shortHdrPacket.Frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{}))
   366  				ccf := p.shortHdrPacket.Frames[0].Frame.(*wire.ConnectionCloseFrame)
   367  				Expect(ccf.IsApplicationError).To(BeFalse())
   368  				Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.CryptoBufferExceeded))
   369  				Expect(ccf.ReasonPhrase).To(Equal("test error"))
   370  			})
   371  
   372  			It("packs a CONNECTION_CLOSE in all available encryption levels, and replaces application errors in Initial and Handshake", func() {
   373  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(1), protocol.PacketNumberLen2)
   374  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(1))
   375  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(2), protocol.PacketNumberLen2)
   376  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(2))
   377  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(3), protocol.PacketNumberLen2)
   378  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(3))
   379  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
   380  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
   381  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   382  				p, err := packer.PackApplicationClose(&qerr.ApplicationError{
   383  					ErrorCode:    0x1337,
   384  					ErrorMessage: "test error",
   385  				}, maxPacketSize, protocol.Version1)
   386  				Expect(err).ToNot(HaveOccurred())
   387  				Expect(p.longHdrPackets).To(HaveLen(2))
   388  				Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeInitial))
   389  				Expect(p.longHdrPackets[0].header.PacketNumber).To(Equal(protocol.PacketNumber(1)))
   390  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
   391  				Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{}))
   392  				ccf := p.longHdrPackets[0].frames[0].Frame.(*wire.ConnectionCloseFrame)
   393  				Expect(ccf.IsApplicationError).To(BeFalse())
   394  				Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.ApplicationErrorErrorCode))
   395  				Expect(ccf.ReasonPhrase).To(BeEmpty())
   396  				Expect(p.longHdrPackets[1].header.Type).To(Equal(protocol.PacketTypeHandshake))
   397  				Expect(p.longHdrPackets[1].header.PacketNumber).To(Equal(protocol.PacketNumber(2)))
   398  				Expect(p.longHdrPackets[1].frames).To(HaveLen(1))
   399  				Expect(p.longHdrPackets[1].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{}))
   400  				ccf = p.longHdrPackets[1].frames[0].Frame.(*wire.ConnectionCloseFrame)
   401  				Expect(ccf.IsApplicationError).To(BeFalse())
   402  				Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.ApplicationErrorErrorCode))
   403  				Expect(ccf.ReasonPhrase).To(BeEmpty())
   404  				Expect(p.shortHdrPacket).ToNot(BeNil())
   405  				Expect(p.shortHdrPacket.PacketNumber).To(Equal(protocol.PacketNumber(3)))
   406  				Expect(p.shortHdrPacket.Frames).To(HaveLen(1))
   407  				Expect(p.shortHdrPacket.Frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{}))
   408  				ccf = p.shortHdrPacket.Frames[0].Frame.(*wire.ConnectionCloseFrame)
   409  				Expect(ccf.IsApplicationError).To(BeTrue())
   410  				Expect(ccf.ErrorCode).To(BeEquivalentTo(0x1337))
   411  				Expect(ccf.ReasonPhrase).To(Equal("test error"))
   412  			})
   413  
   414  			It("packs a CONNECTION_CLOSE in all available encryption levels, as a client", func() {
   415  				packer.perspective = protocol.PerspectiveClient
   416  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(1), protocol.PacketNumberLen2)
   417  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(1))
   418  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(2), protocol.PacketNumberLen2)
   419  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(2))
   420  				sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped)
   421  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
   422  				sealingManager.EXPECT().Get0RTTSealer().Return(nil, handshake.ErrKeysDropped)
   423  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   424  				p, err := packer.PackApplicationClose(&qerr.ApplicationError{
   425  					ErrorCode:    0x1337,
   426  					ErrorMessage: "test error",
   427  				}, maxPacketSize, protocol.Version1)
   428  				Expect(err).ToNot(HaveOccurred())
   429  				Expect(p.longHdrPackets).To(HaveLen(1))
   430  				Expect(p.buffer.Len()).To(BeNumerically("<", protocol.MinInitialPacketSize))
   431  				Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeHandshake))
   432  				Expect(p.longHdrPackets[0].header.PacketNumber).To(Equal(protocol.PacketNumber(1)))
   433  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
   434  				Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{}))
   435  				ccf := p.longHdrPackets[0].frames[0].Frame.(*wire.ConnectionCloseFrame)
   436  				Expect(ccf.IsApplicationError).To(BeFalse())
   437  				Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.ApplicationErrorErrorCode))
   438  				Expect(ccf.ReasonPhrase).To(BeEmpty())
   439  				Expect(p.shortHdrPacket).ToNot(BeNil())
   440  				Expect(p.shortHdrPacket.PacketNumber).To(Equal(protocol.PacketNumber(2)))
   441  				Expect(p.shortHdrPacket.Frames).To(HaveLen(1))
   442  				Expect(p.shortHdrPacket.Frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{}))
   443  				ccf = p.shortHdrPacket.Frames[0].Frame.(*wire.ConnectionCloseFrame)
   444  				Expect(ccf.IsApplicationError).To(BeTrue())
   445  				Expect(ccf.ErrorCode).To(BeEquivalentTo(0x1337))
   446  				Expect(ccf.ReasonPhrase).To(Equal("test error"))
   447  			})
   448  
   449  			It("packs a CONNECTION_CLOSE in all available encryption levels and pads, as a client", func() {
   450  				packer.perspective = protocol.PerspectiveClient
   451  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(1), protocol.PacketNumberLen2)
   452  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(1))
   453  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(2), protocol.PacketNumberLen2)
   454  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(2))
   455  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
   456  				sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
   457  				sealingManager.EXPECT().Get0RTTSealer().Return(getSealer(), nil)
   458  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
   459  				p, err := packer.PackApplicationClose(&qerr.ApplicationError{
   460  					ErrorCode:    0x1337,
   461  					ErrorMessage: "test error",
   462  				}, maxPacketSize, protocol.Version1)
   463  				Expect(err).ToNot(HaveOccurred())
   464  				Expect(p.longHdrPackets).To(HaveLen(2))
   465  				Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize))
   466  				Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
   467  				Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeInitial))
   468  				Expect(p.longHdrPackets[0].header.PacketNumber).To(Equal(protocol.PacketNumber(1)))
   469  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
   470  				Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{}))
   471  				ccf := p.longHdrPackets[0].frames[0].Frame.(*wire.ConnectionCloseFrame)
   472  				Expect(ccf.IsApplicationError).To(BeFalse())
   473  				Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.ApplicationErrorErrorCode))
   474  				Expect(ccf.ReasonPhrase).To(BeEmpty())
   475  				Expect(p.longHdrPackets[1].header.Type).To(Equal(protocol.PacketType0RTT))
   476  				Expect(p.longHdrPackets[1].header.PacketNumber).To(Equal(protocol.PacketNumber(2)))
   477  				Expect(p.longHdrPackets[1].frames).To(HaveLen(1))
   478  				Expect(p.longHdrPackets[1].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{}))
   479  				ccf = p.longHdrPackets[1].frames[0].Frame.(*wire.ConnectionCloseFrame)
   480  				Expect(ccf.IsApplicationError).To(BeTrue())
   481  				Expect(ccf.ErrorCode).To(BeEquivalentTo(0x1337))
   482  				Expect(ccf.ReasonPhrase).To(Equal("test error"))
   483  				hdrs, more := parsePacket(p.buffer.Data)
   484  				Expect(hdrs).To(HaveLen(2))
   485  				Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial))
   486  				Expect(hdrs[1].Type).To(Equal(protocol.PacketType0RTT))
   487  				Expect(more).To(BeEmpty())
   488  			})
   489  		})
   490  
   491  		Context("packing normal packets", func() {
   492  			It("returns nil when no packet is queued", func() {
   493  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   494  				// don't expect any calls to PopPacketNumber
   495  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   496  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true)
   497  				framer.EXPECT().HasData()
   498  				_, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
   499  				Expect(err).To(MatchError(errNothingToPack))
   500  			})
   501  
   502  			It("appends single packets", func() {
   503  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   504  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   505  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   506  				framer.EXPECT().HasData().Return(true)
   507  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
   508  				expectAppendControlFrames()
   509  				f := &wire.StreamFrame{
   510  					StreamID: 5,
   511  					Data:     []byte{0xde, 0xca, 0xfb, 0xad},
   512  				}
   513  				expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f})
   514  				buffer := getPacketBuffer()
   515  				buffer.Data = append(buffer.Data, []byte("foobar")...)
   516  				p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1)
   517  				Expect(err).ToNot(HaveOccurred())
   518  				Expect(p).ToNot(BeNil())
   519  				b, err := f.Append(nil, protocol.Version1)
   520  				Expect(err).ToNot(HaveOccurred())
   521  				Expect(p.Frames).To(BeEmpty())
   522  				Expect(p.StreamFrames).To(HaveLen(1))
   523  				Expect(p.StreamFrames[0].Frame.StreamID).To(Equal(f.StreamID))
   524  				Expect(buffer.Data[:6]).To(Equal([]byte("foobar"))) // make sure the packet was actually appended
   525  				Expect(buffer.Data).To(ContainSubstring(string(b)))
   526  			})
   527  
   528  			It("packs a single ACK", func() {
   529  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   530  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   531  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Largest: 42, Smallest: 1}}}
   532  				framer.EXPECT().HasData()
   533  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack)
   534  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   535  				p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
   536  				Expect(err).NotTo(HaveOccurred())
   537  				Expect(p).ToNot(BeNil())
   538  				Expect(p.Ack).To(Equal(ack))
   539  			})
   540  
   541  			It("packs control frames", func() {
   542  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   543  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   544  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   545  				framer.EXPECT().HasData().Return(true)
   546  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
   547  				frames := []ackhandler.Frame{
   548  					{Frame: &wire.ResetStreamFrame{}},
   549  					{Frame: &wire.MaxDataFrame{}},
   550  				}
   551  				expectAppendControlFrames(frames...)
   552  				expectAppendStreamFrames()
   553  				buffer := getPacketBuffer()
   554  				p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1)
   555  				Expect(p).ToNot(BeNil())
   556  				Expect(err).ToNot(HaveOccurred())
   557  				Expect(p.Frames).To(HaveLen(2))
   558  				for i, f := range p.Frames {
   559  					Expect(f).To(BeAssignableToTypeOf(frames[i]))
   560  				}
   561  				Expect(buffer.Len()).ToNot(BeZero())
   562  			})
   563  
   564  			It("packs DATAGRAM frames", func() {
   565  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true)
   566  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   567  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   568  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   569  				f := &wire.DatagramFrame{
   570  					DataLenPresent: true,
   571  					Data:           []byte("foobar"),
   572  				}
   573  				done := make(chan struct{})
   574  				go func() {
   575  					defer GinkgoRecover()
   576  					defer close(done)
   577  					datagramQueue.AddAndWait(f)
   578  				}()
   579  				// make sure the DATAGRAM has actually been queued
   580  				time.Sleep(scaleDuration(20 * time.Millisecond))
   581  
   582  				framer.EXPECT().HasData()
   583  				buffer := getPacketBuffer()
   584  				p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1)
   585  				Expect(p).ToNot(BeNil())
   586  				Expect(err).ToNot(HaveOccurred())
   587  				Expect(p.Frames).To(HaveLen(1))
   588  				Expect(p.Frames[0].Frame).To(Equal(f))
   589  				Expect(buffer.Data).ToNot(BeEmpty())
   590  				Eventually(done).Should(BeClosed())
   591  			})
   592  
   593  			It("doesn't pack a DATAGRAM frame if the ACK frame is too large", func() {
   594  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Largest: 100}}})
   595  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   596  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   597  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   598  				f := &wire.DatagramFrame{
   599  					DataLenPresent: true,
   600  					Data:           make([]byte, maxPacketSize-10),
   601  				}
   602  				done := make(chan struct{})
   603  				go func() {
   604  					defer GinkgoRecover()
   605  					defer close(done)
   606  					datagramQueue.AddAndWait(f)
   607  				}()
   608  				// make sure the DATAGRAM has actually been queued
   609  				time.Sleep(scaleDuration(20 * time.Millisecond))
   610  
   611  				framer.EXPECT().HasData()
   612  				buffer := getPacketBuffer()
   613  				p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1)
   614  				Expect(p).ToNot(BeNil())
   615  				Expect(err).ToNot(HaveOccurred())
   616  				Expect(p.Ack).ToNot(BeNil())
   617  				Expect(p.Frames).To(BeEmpty())
   618  				Expect(buffer.Data).ToNot(BeEmpty())
   619  				datagramQueue.CloseWithError(nil)
   620  				Eventually(done).Should(BeClosed())
   621  			})
   622  
   623  			It("accounts for the space consumed by control frames", func() {
   624  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   625  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   626  				framer.EXPECT().HasData().Return(true)
   627  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
   628  				var maxSize protocol.ByteCount
   629  				gomock.InOrder(
   630  					framer.EXPECT().AppendControlFrames(gomock.Any(), gomock.Any(), protocol.Version1).DoAndReturn(func(fs []ackhandler.Frame, maxLen protocol.ByteCount, _ protocol.VersionNumber) ([]ackhandler.Frame, protocol.ByteCount) {
   631  						maxSize = maxLen
   632  						return fs, 444
   633  					}),
   634  					framer.EXPECT().AppendStreamFrames(gomock.Any(), gomock.Any(), protocol.Version1).Do(func(fs []ackhandler.StreamFrame, maxLen protocol.ByteCount, _ protocol.VersionNumber) ([]ackhandler.StreamFrame, protocol.ByteCount) {
   635  						Expect(maxLen).To(Equal(maxSize - 444))
   636  						return fs, 0
   637  					}),
   638  				)
   639  				_, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
   640  				Expect(err).To(MatchError(errNothingToPack))
   641  			})
   642  
   643  			It("pads if payload length + packet number length is smaller than 4, for Long Header packets", func() {
   644  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1)
   645  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
   646  				sealer := getSealer()
   647  				sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped)
   648  				sealingManager.EXPECT().GetHandshakeSealer().Return(sealer, nil)
   649  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
   650  				packer.retransmissionQueue.addHandshake(&wire.PingFrame{})
   651  				handshakeStream.EXPECT().HasData()
   652  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false)
   653  				packet, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
   654  				Expect(err).ToNot(HaveOccurred())
   655  				Expect(packet).ToNot(BeNil())
   656  				Expect(packet.longHdrPackets).To(HaveLen(1))
   657  				// cut off the tag that the mock sealer added
   658  				// packet.buffer.Data = packet.buffer.Data[:packet.buffer.Len()-protocol.ByteCount(sealer.Overhead())]
   659  				hdr, _, _, err := wire.ParsePacket(packet.buffer.Data)
   660  				Expect(err).ToNot(HaveOccurred())
   661  				data := packet.buffer.Data
   662  				r := bytes.NewReader(data)
   663  				extHdr, err := hdr.ParseExtended(r, protocol.Version1)
   664  				Expect(err).ToNot(HaveOccurred())
   665  				Expect(extHdr.PacketNumberLen).To(Equal(protocol.PacketNumberLen1))
   666  				Expect(r.Len()).To(Equal(4 - 1 /* packet number length */ + sealer.Overhead()))
   667  				// the first bytes of the payload should be a 2 PADDING frames...
   668  				firstPayloadByte, err := r.ReadByte()
   669  				Expect(err).ToNot(HaveOccurred())
   670  				Expect(firstPayloadByte).To(Equal(byte(0)))
   671  				secondPayloadByte, err := r.ReadByte()
   672  				Expect(err).ToNot(HaveOccurred())
   673  				Expect(secondPayloadByte).To(Equal(byte(0)))
   674  				// ... followed by the PING
   675  				frameParser := wire.NewFrameParser(false)
   676  				l, frame, err := frameParser.ParseNext(data[len(data)-r.Len():], protocol.Encryption1RTT, protocol.Version1)
   677  				Expect(err).ToNot(HaveOccurred())
   678  				Expect(frame).To(BeAssignableToTypeOf(&wire.PingFrame{}))
   679  				Expect(r.Len() - l).To(Equal(sealer.Overhead()))
   680  			})
   681  
   682  			It("pads if payload length + packet number length is smaller than 4", func() {
   683  				f := &wire.StreamFrame{
   684  					StreamID: 0x10, // small stream ID, such that only a single byte is consumed
   685  					Fin:      true,
   686  				}
   687  				Expect(f.Length(protocol.Version1)).To(BeEquivalentTo(2))
   688  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1)
   689  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   690  				sealer := getSealer()
   691  				sealingManager.EXPECT().Get1RTTSealer().Return(sealer, nil)
   692  				framer.EXPECT().HasData().Return(true)
   693  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
   694  				expectAppendControlFrames()
   695  				expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f})
   696  				buffer := getPacketBuffer()
   697  				_, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1)
   698  				Expect(err).ToNot(HaveOccurred())
   699  				// cut off the tag that the mock sealer added
   700  				buffer.Data = buffer.Data[:buffer.Len()-protocol.ByteCount(sealer.Overhead())]
   701  				data := buffer.Data
   702  				l, _, pnLen, _, err := wire.ParseShortHeader(data, connID.Len())
   703  				Expect(err).ToNot(HaveOccurred())
   704  				r := bytes.NewReader(data[l:])
   705  				Expect(pnLen).To(Equal(protocol.PacketNumberLen1))
   706  				Expect(r.Len()).To(Equal(4 - 1 /* packet number length */))
   707  				// the first byte of the payload should be a PADDING frame...
   708  				firstPayloadByte, err := r.ReadByte()
   709  				Expect(err).ToNot(HaveOccurred())
   710  				Expect(firstPayloadByte).To(Equal(byte(0)))
   711  				// ... followed by the STREAM frame
   712  				frameParser := wire.NewFrameParser(true)
   713  				l, frame, err := frameParser.ParseNext(buffer.Data[len(data)-r.Len():], protocol.Encryption1RTT, protocol.Version1)
   714  				Expect(err).ToNot(HaveOccurred())
   715  				Expect(frame).To(BeAssignableToTypeOf(&wire.StreamFrame{}))
   716  				sf := frame.(*wire.StreamFrame)
   717  				Expect(sf.StreamID).To(Equal(f.StreamID))
   718  				Expect(sf.Fin).To(Equal(f.Fin))
   719  				Expect(sf.Data).To(BeEmpty())
   720  				Expect(r.Len() - l).To(BeZero())
   721  			})
   722  
   723  			It("packs multiple small STREAM frames into single packet", func() {
   724  				f1 := &wire.StreamFrame{
   725  					StreamID:       5,
   726  					Data:           []byte("frame 1"),
   727  					DataLenPresent: true,
   728  				}
   729  				f2 := &wire.StreamFrame{
   730  					StreamID:       5,
   731  					Data:           []byte("frame 2"),
   732  					DataLenPresent: true,
   733  				}
   734  				f3 := &wire.StreamFrame{
   735  					StreamID:       3,
   736  					Data:           []byte("frame 3"),
   737  					DataLenPresent: true,
   738  				}
   739  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   740  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   741  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   742  				framer.EXPECT().HasData().Return(true)
   743  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
   744  				expectAppendControlFrames()
   745  				expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f1}, ackhandler.StreamFrame{Frame: f2}, ackhandler.StreamFrame{Frame: f3})
   746  				p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
   747  				Expect(p).ToNot(BeNil())
   748  				Expect(err).ToNot(HaveOccurred())
   749  				Expect(p.Frames).To(BeEmpty())
   750  				Expect(p.StreamFrames).To(HaveLen(3))
   751  				Expect(p.StreamFrames[0].Frame.Data).To(Equal([]byte("frame 1")))
   752  				Expect(p.StreamFrames[1].Frame.Data).To(Equal([]byte("frame 2")))
   753  				Expect(p.StreamFrames[2].Frame.Data).To(Equal([]byte("frame 3")))
   754  			})
   755  
   756  			Context("making ACK packets ack-eliciting", func() {
   757  				sendMaxNumNonAckElicitingAcks := func() {
   758  					for i := 0; i < protocol.MaxNonAckElicitingAcks; i++ {
   759  						pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   760  						pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   761  						sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   762  						framer.EXPECT().HasData().Return(true)
   763  						ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}})
   764  						expectAppendControlFrames()
   765  						expectAppendStreamFrames()
   766  						p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
   767  						Expect(p).ToNot(BeNil())
   768  						Expect(err).ToNot(HaveOccurred())
   769  						Expect(p.Ack).ToNot(BeNil())
   770  						Expect(p.Frames).To(BeEmpty())
   771  					}
   772  				}
   773  
   774  				It("adds a PING frame when it's supposed to send a ack-eliciting packet", func() {
   775  					sendMaxNumNonAckElicitingAcks()
   776  					pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   777  					pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   778  					sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   779  					framer.EXPECT().HasData().Return(true)
   780  					ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}})
   781  					expectAppendControlFrames()
   782  					expectAppendStreamFrames()
   783  					p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
   784  					Expect(p).ToNot(BeNil())
   785  					Expect(err).ToNot(HaveOccurred())
   786  					var hasPing bool
   787  					for _, f := range p.Frames {
   788  						if _, ok := f.Frame.(*wire.PingFrame); ok {
   789  							hasPing = true
   790  							Expect(f.Handler).To(BeNil()) // make sure the PING is not retransmitted if lost
   791  						}
   792  					}
   793  					Expect(hasPing).To(BeTrue())
   794  					// make sure the next packet doesn't contain another PING
   795  					pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   796  					pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   797  					sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   798  					framer.EXPECT().HasData().Return(true)
   799  					ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}})
   800  					expectAppendControlFrames()
   801  					expectAppendStreamFrames()
   802  					p, err = packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
   803  					Expect(p).ToNot(BeNil())
   804  					Expect(err).ToNot(HaveOccurred())
   805  					Expect(p.Ack).ToNot(BeNil())
   806  					Expect(p.Frames).To(BeEmpty())
   807  				})
   808  
   809  				It("waits until there's something to send before adding a PING frame", func() {
   810  					sendMaxNumNonAckElicitingAcks()
   811  					// nothing to send
   812  					pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   813  					sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   814  					framer.EXPECT().HasData().Return(true)
   815  					expectAppendControlFrames()
   816  					expectAppendStreamFrames()
   817  					ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
   818  					_, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
   819  					Expect(err).To(MatchError(errNothingToPack))
   820  					// now add some frame to send
   821  					expectAppendControlFrames()
   822  					expectAppendStreamFrames()
   823  					pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   824  					pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   825  					sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   826  					framer.EXPECT().HasData().Return(true)
   827  					ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}
   828  					ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(ack)
   829  					p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
   830  					Expect(err).ToNot(HaveOccurred())
   831  					Expect(p.Ack).To(Equal(ack))
   832  					var hasPing bool
   833  					for _, f := range p.Frames {
   834  						if _, ok := f.Frame.(*wire.PingFrame); ok {
   835  							hasPing = true
   836  							Expect(f.Handler).To(BeNil()) // make sure the PING is not retransmitted if lost
   837  						}
   838  					}
   839  					Expect(hasPing).To(BeTrue())
   840  				})
   841  
   842  				It("doesn't send a PING if it already sent another ack-eliciting frame", func() {
   843  					sendMaxNumNonAckElicitingAcks()
   844  					pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   845  					pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
   846  					sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
   847  					framer.EXPECT().HasData().Return(true)
   848  					ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
   849  					expectAppendStreamFrames()
   850  					expectAppendControlFrames(ackhandler.Frame{Frame: &wire.MaxDataFrame{}})
   851  					p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
   852  					Expect(err).ToNot(HaveOccurred())
   853  					Expect(p).ToNot(BeNil())
   854  					Expect(p.Frames).ToNot(ContainElement(&wire.PingFrame{}))
   855  				})
   856  			})
   857  		})
   858  
   859  		Context("packing crypto packets", func() {
   860  			It("sets the length", func() {
   861  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   862  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
   863  				f := &wire.CryptoFrame{
   864  					Offset: 0x1337,
   865  					Data:   []byte("foobar"),
   866  				}
   867  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false)
   868  				handshakeStream.EXPECT().HasData().Return(true).AnyTimes()
   869  				handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f)
   870  				sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped)
   871  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
   872  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
   873  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
   874  				Expect(err).ToNot(HaveOccurred())
   875  				Expect(p).ToNot(BeNil())
   876  				parsePacket(p.buffer.Data)
   877  			})
   878  
   879  			It("packs an Initial packet and pads it", func() {
   880  				packer.perspective = protocol.PerspectiveClient
   881  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen1)
   882  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24))
   883  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
   884  				sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
   885  				sealingManager.EXPECT().Get0RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
   886  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
   887  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false)
   888  				initialStream.EXPECT().HasData().Return(true).Times(2)
   889  				initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
   890  					return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")}
   891  				})
   892  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
   893  				Expect(err).ToNot(HaveOccurred())
   894  				Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize))
   895  				Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
   896  				Expect(p.longHdrPackets).To(HaveLen(1))
   897  				Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial))
   898  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
   899  				Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial")))
   900  				hdrs, more := parsePacket(p.buffer.Data)
   901  				Expect(hdrs).To(HaveLen(1))
   902  				Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial))
   903  				Expect(more).To(BeEmpty())
   904  			})
   905  
   906  			It("packs a maximum size Handshake packet", func() {
   907  				var f *wire.CryptoFrame
   908  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   909  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
   910  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
   911  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
   912  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true)
   913  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false)
   914  				initialStream.EXPECT().HasData()
   915  				handshakeStream.EXPECT().HasData().Return(true).Times(2)
   916  				handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
   917  					f = &wire.CryptoFrame{Offset: 0x1337}
   918  					f.Data = bytes.Repeat([]byte{'f'}, int(size-f.Length(protocol.Version1)-1))
   919  					Expect(f.Length(protocol.Version1)).To(Equal(size))
   920  					return f
   921  				})
   922  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
   923  				Expect(err).ToNot(HaveOccurred())
   924  				Expect(p.longHdrPackets).To(HaveLen(1))
   925  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
   926  				Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
   927  				parsePacket(p.buffer.Data)
   928  			})
   929  
   930  			It("packs a coalesced packet with Initial / Handshake, and pads it", func() {
   931  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2)
   932  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24))
   933  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
   934  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
   935  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
   936  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
   937  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
   938  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false)
   939  				// don't EXPECT any calls for a Handshake ACK frame
   940  				initialStream.EXPECT().HasData().Return(true).Times(2)
   941  				initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
   942  					return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")}
   943  				})
   944  				handshakeStream.EXPECT().HasData().Return(true).Times(2)
   945  				handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
   946  					return &wire.CryptoFrame{Offset: 0x1337, Data: []byte("handshake")}
   947  				})
   948  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
   949  				Expect(err).ToNot(HaveOccurred())
   950  				Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
   951  				Expect(p.longHdrPackets).To(HaveLen(2))
   952  				Expect(p.shortHdrPacket).To(BeNil())
   953  				Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial))
   954  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
   955  				Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial")))
   956  				Expect(p.longHdrPackets[1].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake))
   957  				Expect(p.longHdrPackets[1].frames).To(HaveLen(1))
   958  				Expect(p.longHdrPackets[1].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("handshake")))
   959  				hdrs, more := parsePacket(p.buffer.Data)
   960  				Expect(hdrs).To(HaveLen(2))
   961  				Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial))
   962  				Expect(hdrs[1].Type).To(Equal(protocol.PacketTypeHandshake))
   963  				Expect(more).To(BeEmpty())
   964  			})
   965  
   966  			It("packs a coalesced packet with Initial / super short Handshake, and pads it", func() {
   967  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2)
   968  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24))
   969  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1)
   970  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
   971  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
   972  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
   973  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
   974  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false)
   975  				// don't EXPECT any calls for a Handshake ACK frame
   976  				initialStream.EXPECT().HasData().Return(true).Times(2)
   977  				initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
   978  					return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")}
   979  				})
   980  				handshakeStream.EXPECT().HasData()
   981  				packer.retransmissionQueue.addHandshake(&wire.PingFrame{})
   982  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
   983  				Expect(err).ToNot(HaveOccurred())
   984  				Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
   985  				Expect(p.longHdrPackets).To(HaveLen(2))
   986  				Expect(p.shortHdrPacket).To(BeNil())
   987  				Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial))
   988  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
   989  				Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial")))
   990  				Expect(p.longHdrPackets[1].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake))
   991  				Expect(p.longHdrPackets[1].frames).To(HaveLen(1))
   992  				Expect(p.longHdrPackets[1].frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{}))
   993  				hdrs, more := parsePacket(p.buffer.Data)
   994  				Expect(hdrs).To(HaveLen(2))
   995  				Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial))
   996  				Expect(hdrs[1].Type).To(Equal(protocol.PacketTypeHandshake))
   997  				Expect(more).To(BeEmpty())
   998  			})
   999  
  1000  			It("packs a coalesced packet with super short Initial / super short Handshake, and pads it", func() {
  1001  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen1)
  1002  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24))
  1003  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1)
  1004  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
  1005  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
  1006  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
  1007  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1008  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, gomock.Any())
  1009  				initialStream.EXPECT().HasData()
  1010  				handshakeStream.EXPECT().HasData()
  1011  				packer.retransmissionQueue.addInitial(&wire.PingFrame{})
  1012  				packer.retransmissionQueue.addHandshake(&wire.PingFrame{})
  1013  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
  1014  				Expect(err).ToNot(HaveOccurred())
  1015  				Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
  1016  				Expect(p.longHdrPackets).To(HaveLen(2))
  1017  				Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial))
  1018  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
  1019  				Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{}))
  1020  				Expect(p.longHdrPackets[1].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake))
  1021  				Expect(p.longHdrPackets[1].frames).To(HaveLen(1))
  1022  				Expect(p.longHdrPackets[1].frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{}))
  1023  				hdrs, more := parsePacket(p.buffer.Data)
  1024  				Expect(hdrs).To(HaveLen(2))
  1025  				Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial))
  1026  				Expect(hdrs[1].Type).To(Equal(protocol.PacketTypeHandshake))
  1027  				Expect(more).To(BeEmpty())
  1028  			})
  1029  
  1030  			It("packs a coalesced packet with Initial / super short 1-RTT, and pads it", func() {
  1031  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2)
  1032  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24))
  1033  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1)
  1034  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
  1035  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
  1036  				sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1037  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
  1038  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false)
  1039  				initialStream.EXPECT().HasData().Return(true).Times(2)
  1040  				initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
  1041  					return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")}
  1042  				})
  1043  				expectAppendControlFrames()
  1044  				expectAppendStreamFrames()
  1045  				framer.EXPECT().HasData().Return(true)
  1046  				packer.retransmissionQueue.addAppData(&wire.PingFrame{})
  1047  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
  1048  				Expect(err).ToNot(HaveOccurred())
  1049  				Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
  1050  				Expect(p.longHdrPackets).To(HaveLen(1))
  1051  				Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial))
  1052  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
  1053  				Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial")))
  1054  				Expect(p.shortHdrPacket).ToNot(BeNil())
  1055  				Expect(p.shortHdrPacket.Frames).To(HaveLen(1))
  1056  				Expect(p.shortHdrPacket.Frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{}))
  1057  				hdrs, more := parsePacket(p.buffer.Data)
  1058  				Expect(hdrs).To(HaveLen(1))
  1059  				Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial))
  1060  				Expect(more).ToNot(BeEmpty())
  1061  				parseShortHeaderPacket(more)
  1062  			})
  1063  
  1064  			It("packs a coalesced packet with Initial / 0-RTT, and pads it", func() {
  1065  				packer.perspective = protocol.PerspectiveClient
  1066  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2)
  1067  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24))
  1068  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
  1069  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(0x42))
  1070  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
  1071  				sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1072  				sealingManager.EXPECT().Get0RTTSealer().Return(getSealer(), nil)
  1073  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1074  				framer.EXPECT().HasData().Return(true)
  1075  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false)
  1076  				// don't EXPECT any calls for a Handshake ACK frame
  1077  				initialStream.EXPECT().HasData().Return(true).Times(2)
  1078  				initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
  1079  					return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")}
  1080  				})
  1081  				expectAppendControlFrames()
  1082  				expectAppendStreamFrames(ackhandler.StreamFrame{Frame: &wire.StreamFrame{Data: []byte("foobar")}})
  1083  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
  1084  				Expect(err).ToNot(HaveOccurred())
  1085  				Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize))
  1086  				Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
  1087  				Expect(p.longHdrPackets).To(HaveLen(2))
  1088  				Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial))
  1089  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
  1090  				Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial")))
  1091  				Expect(p.longHdrPackets[0].streamFrames).To(BeEmpty())
  1092  				Expect(p.longHdrPackets[1].EncryptionLevel()).To(Equal(protocol.Encryption0RTT))
  1093  				Expect(p.longHdrPackets[1].frames).To(BeEmpty())
  1094  				Expect(p.longHdrPackets[1].streamFrames).To(HaveLen(1))
  1095  				Expect(p.longHdrPackets[1].streamFrames[0].Frame.Data).To(Equal([]byte("foobar")))
  1096  				hdrs, more := parsePacket(p.buffer.Data)
  1097  				Expect(hdrs).To(HaveLen(2))
  1098  				Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial))
  1099  				Expect(hdrs[1].Type).To(Equal(protocol.PacketType0RTT))
  1100  				Expect(more).To(BeEmpty())
  1101  			})
  1102  
  1103  			It("packs a coalesced packet with Handshake / 1-RTT", func() {
  1104  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2)
  1105  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x24))
  1106  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
  1107  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
  1108  				sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped)
  1109  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
  1110  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
  1111  				framer.EXPECT().HasData().Return(true)
  1112  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false)
  1113  				// don't EXPECT any calls for a 1-RTT ACK frame
  1114  				handshakeStream.EXPECT().HasData().Return(true).Times(2)
  1115  				handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
  1116  					return &wire.CryptoFrame{Offset: 0x1337, Data: []byte("handshake")}
  1117  				})
  1118  				expectAppendControlFrames()
  1119  				expectAppendStreamFrames(ackhandler.StreamFrame{Frame: &wire.StreamFrame{Data: []byte("foobar")}})
  1120  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
  1121  				Expect(err).ToNot(HaveOccurred())
  1122  				Expect(p.buffer.Len()).To(BeNumerically("<", 100))
  1123  				Expect(p.longHdrPackets).To(HaveLen(1))
  1124  				Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake))
  1125  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
  1126  				Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("handshake")))
  1127  				Expect(p.shortHdrPacket).ToNot(BeNil())
  1128  				Expect(p.shortHdrPacket.Frames).To(BeEmpty())
  1129  				Expect(p.shortHdrPacket.StreamFrames).To(HaveLen(1))
  1130  				Expect(p.shortHdrPacket.StreamFrames[0].Frame.Data).To(Equal([]byte("foobar")))
  1131  				hdrs, more := parsePacket(p.buffer.Data)
  1132  				Expect(hdrs).To(HaveLen(1))
  1133  				Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeHandshake))
  1134  				Expect(more).ToNot(BeEmpty())
  1135  				parseShortHeaderPacket(more)
  1136  			})
  1137  
  1138  			It("doesn't add a coalesced packet if the remaining size is smaller than MaxCoalescedPacketSize", func() {
  1139  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2)
  1140  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x24))
  1141  				sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped)
  1142  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
  1143  				// don't EXPECT any calls to GetHandshakeSealer and Get1RTTSealer
  1144  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false)
  1145  				handshakeStream.EXPECT().HasData().Return(true).Times(2)
  1146  				handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
  1147  					s := size - protocol.MinCoalescedPacketSize
  1148  					f := &wire.CryptoFrame{Offset: 0x1337}
  1149  					f.Data = bytes.Repeat([]byte{'f'}, int(s-f.Length(protocol.Version1)-1))
  1150  					Expect(f.Length(protocol.Version1)).To(Equal(s))
  1151  					return f
  1152  				})
  1153  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
  1154  				Expect(err).ToNot(HaveOccurred())
  1155  				Expect(p.longHdrPackets).To(HaveLen(1))
  1156  				Expect(p.shortHdrPacket).To(BeNil())
  1157  				Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake))
  1158  				Expect(len(p.buffer.Data)).To(BeEquivalentTo(maxPacketSize - protocol.MinCoalescedPacketSize))
  1159  				parsePacket(p.buffer.Data)
  1160  			})
  1161  
  1162  			It("pads if payload length + packet number length is smaller than 4, for Long Header packets", func() {
  1163  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1)
  1164  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
  1165  				sealer := getSealer()
  1166  				sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped)
  1167  				sealingManager.EXPECT().GetHandshakeSealer().Return(sealer, nil)
  1168  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1169  				packer.retransmissionQueue.addHandshake(&wire.PingFrame{})
  1170  				handshakeStream.EXPECT().HasData()
  1171  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false)
  1172  				packet, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
  1173  				Expect(err).ToNot(HaveOccurred())
  1174  				Expect(packet).ToNot(BeNil())
  1175  				Expect(packet.longHdrPackets).To(HaveLen(1))
  1176  				Expect(packet.shortHdrPacket).To(BeNil())
  1177  				// cut off the tag that the mock sealer added
  1178  				// packet.buffer.Data = packet.buffer.Data[:packet.buffer.Len()-protocol.ByteCount(sealer.Overhead())]
  1179  				hdr, _, _, err := wire.ParsePacket(packet.buffer.Data)
  1180  				Expect(err).ToNot(HaveOccurred())
  1181  				data := packet.buffer.Data
  1182  				r := bytes.NewReader(data)
  1183  				extHdr, err := hdr.ParseExtended(r, protocol.Version1)
  1184  				Expect(err).ToNot(HaveOccurred())
  1185  				Expect(extHdr.PacketNumberLen).To(Equal(protocol.PacketNumberLen1))
  1186  				Expect(r.Len()).To(Equal(4 - 1 /* packet number length */ + sealer.Overhead()))
  1187  				// the first bytes of the payload should be a 2 PADDING frames...
  1188  				firstPayloadByte, err := r.ReadByte()
  1189  				Expect(err).ToNot(HaveOccurred())
  1190  				Expect(firstPayloadByte).To(Equal(byte(0)))
  1191  				secondPayloadByte, err := r.ReadByte()
  1192  				Expect(err).ToNot(HaveOccurred())
  1193  				Expect(secondPayloadByte).To(Equal(byte(0)))
  1194  				// ... followed by the PING
  1195  				frameParser := wire.NewFrameParser(false)
  1196  				l, frame, err := frameParser.ParseNext(data[len(data)-r.Len():], protocol.Encryption1RTT, protocol.Version1)
  1197  				Expect(err).ToNot(HaveOccurred())
  1198  				Expect(frame).To(BeAssignableToTypeOf(&wire.PingFrame{}))
  1199  				Expect(r.Len() - l).To(Equal(sealer.Overhead()))
  1200  			})
  1201  
  1202  			It("adds retransmissions", func() {
  1203  				f := &wire.CryptoFrame{Data: []byte("Initial")}
  1204  				retransmissionQueue.addInitial(f)
  1205  				retransmissionQueue.addHandshake(&wire.CryptoFrame{Data: []byte("Handshake")})
  1206  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
  1207  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42))
  1208  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
  1209  				sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1210  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1211  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false)
  1212  				initialStream.EXPECT().HasData()
  1213  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
  1214  				Expect(err).ToNot(HaveOccurred())
  1215  				Expect(p.longHdrPackets).To(HaveLen(1))
  1216  				Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial))
  1217  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
  1218  				Expect(p.longHdrPackets[0].frames[0].Frame).To(Equal(f))
  1219  				Expect(p.longHdrPackets[0].frames[0].Handler).ToNot(BeNil())
  1220  			})
  1221  
  1222  			It("sends an Initial packet containing only an ACK", func() {
  1223  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 20}}}
  1224  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).Return(ack)
  1225  				initialStream.EXPECT().HasData().Times(2)
  1226  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
  1227  				sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1228  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1229  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
  1230  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42))
  1231  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
  1232  				Expect(err).ToNot(HaveOccurred())
  1233  				Expect(p.longHdrPackets).To(HaveLen(1))
  1234  				Expect(p.longHdrPackets[0].ack).To(Equal(ack))
  1235  			})
  1236  
  1237  			It("doesn't pack anything if there's nothing to send at Initial and Handshake keys are not yet available", func() {
  1238  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
  1239  				sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1240  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1241  				initialStream.EXPECT().HasData()
  1242  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true)
  1243  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
  1244  				Expect(err).ToNot(HaveOccurred())
  1245  				Expect(p).To(BeNil())
  1246  			})
  1247  
  1248  			It("sends a Handshake packet containing only an ACK", func() {
  1249  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 20}}}
  1250  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true)
  1251  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true).Return(ack)
  1252  				initialStream.EXPECT().HasData()
  1253  				handshakeStream.EXPECT().HasData().Times(2)
  1254  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
  1255  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
  1256  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1257  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
  1258  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
  1259  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
  1260  				Expect(err).ToNot(HaveOccurred())
  1261  				Expect(p.longHdrPackets).To(HaveLen(1))
  1262  				Expect(p.longHdrPackets[0].ack).To(Equal(ack))
  1263  			})
  1264  
  1265  			for _, pers := range []protocol.Perspective{protocol.PerspectiveServer, protocol.PerspectiveClient} {
  1266  				perspective := pers
  1267  
  1268  				It(fmt.Sprintf("pads Initial packets to the required minimum packet size, for the %s", perspective), func() {
  1269  					token := []byte("initial token")
  1270  					packer.SetToken(token)
  1271  					f := &wire.CryptoFrame{Data: []byte("foobar")}
  1272  					pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
  1273  					pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42))
  1274  					sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
  1275  					sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1276  					sealingManager.EXPECT().Get0RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1277  					sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1278  					ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false)
  1279  					initialStream.EXPECT().HasData().Return(true).Times(2)
  1280  					initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f)
  1281  					packer.perspective = protocol.PerspectiveClient
  1282  					p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
  1283  					Expect(err).ToNot(HaveOccurred())
  1284  					Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize))
  1285  					Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
  1286  					Expect(p.longHdrPackets).To(HaveLen(1))
  1287  					Expect(p.longHdrPackets[0].header.Token).To(Equal(token))
  1288  					Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
  1289  					cf := p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame)
  1290  					Expect(cf.Data).To(Equal([]byte("foobar")))
  1291  				})
  1292  			}
  1293  
  1294  			It("adds an ACK frame", func() {
  1295  				f := &wire.CryptoFrame{Data: []byte("foobar")}
  1296  				ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 42, Largest: 1337}}}
  1297  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
  1298  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42))
  1299  				sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
  1300  				sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1301  				sealingManager.EXPECT().Get0RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1302  				sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
  1303  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false).Return(ack)
  1304  				initialStream.EXPECT().HasData().Return(true).Times(2)
  1305  				initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f)
  1306  				packer.perspective = protocol.PerspectiveClient
  1307  				p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
  1308  				Expect(err).ToNot(HaveOccurred())
  1309  				Expect(p.longHdrPackets).To(HaveLen(1))
  1310  				Expect(p.longHdrPackets[0].ack).To(Equal(ack))
  1311  				Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
  1312  				Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
  1313  			})
  1314  		})
  1315  
  1316  		Context("packing probe packets", func() {
  1317  			for _, pers := range []protocol.Perspective{protocol.PerspectiveServer, protocol.PerspectiveClient} {
  1318  				perspective := pers
  1319  
  1320  				It(fmt.Sprintf("packs an Initial probe packet and pads it, for the %s", perspective), func() {
  1321  					packer.perspective = perspective
  1322  					f := &wire.CryptoFrame{Data: []byte("Initial")}
  1323  					retransmissionQueue.addInitial(f)
  1324  					sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
  1325  					ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false)
  1326  					initialStream.EXPECT().HasData()
  1327  					pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
  1328  					pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42))
  1329  
  1330  					p, err := packer.MaybePackProbePacket(protocol.EncryptionInitial, maxPacketSize, protocol.Version1)
  1331  					Expect(err).ToNot(HaveOccurred())
  1332  					Expect(p).ToNot(BeNil())
  1333  					Expect(p.longHdrPackets).To(HaveLen(1))
  1334  					packet := p.longHdrPackets[0]
  1335  					Expect(packet.EncryptionLevel()).To(Equal(protocol.EncryptionInitial))
  1336  					Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize))
  1337  					Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
  1338  					Expect(packet.frames).To(HaveLen(1))
  1339  					Expect(packet.frames[0].Frame).To(Equal(f))
  1340  					parsePacket(p.buffer.Data)
  1341  				})
  1342  
  1343  				It(fmt.Sprintf("packs an Initial probe packet with 1 byte payload, for the %s", perspective), func() {
  1344  					packer.perspective = perspective
  1345  					retransmissionQueue.addInitial(&wire.PingFrame{})
  1346  					sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
  1347  					ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false)
  1348  					initialStream.EXPECT().HasData()
  1349  					pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1)
  1350  					pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42))
  1351  
  1352  					p, err := packer.MaybePackProbePacket(protocol.EncryptionInitial, maxPacketSize, protocol.Version1)
  1353  					Expect(err).ToNot(HaveOccurred())
  1354  					Expect(err).ToNot(HaveOccurred())
  1355  					Expect(p).ToNot(BeNil())
  1356  					Expect(p.longHdrPackets).To(HaveLen(1))
  1357  					packet := p.longHdrPackets[0]
  1358  					Expect(packet.EncryptionLevel()).To(Equal(protocol.EncryptionInitial))
  1359  					Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize))
  1360  					Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
  1361  					Expect(packet.frames).To(HaveLen(1))
  1362  					Expect(packet.frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{}))
  1363  					parsePacket(p.buffer.Data)
  1364  				})
  1365  			}
  1366  
  1367  			It("packs a Handshake probe packet", func() {
  1368  				f := &wire.CryptoFrame{Data: []byte("Handshake")}
  1369  				retransmissionQueue.addHandshake(f)
  1370  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
  1371  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false)
  1372  				handshakeStream.EXPECT().HasData()
  1373  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
  1374  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
  1375  
  1376  				p, err := packer.MaybePackProbePacket(protocol.EncryptionHandshake, maxPacketSize, protocol.Version1)
  1377  				Expect(err).ToNot(HaveOccurred())
  1378  				Expect(err).ToNot(HaveOccurred())
  1379  				Expect(p).ToNot(BeNil())
  1380  				Expect(p.longHdrPackets).To(HaveLen(1))
  1381  				packet := p.longHdrPackets[0]
  1382  				Expect(packet.EncryptionLevel()).To(Equal(protocol.EncryptionHandshake))
  1383  				Expect(packet.frames).To(HaveLen(1))
  1384  				Expect(packet.frames[0].Frame).To(Equal(f))
  1385  				parsePacket(p.buffer.Data)
  1386  			})
  1387  
  1388  			It("packs a full size  Handshake probe packet", func() {
  1389  				f := &wire.CryptoFrame{Data: make([]byte, 2000)}
  1390  				retransmissionQueue.addHandshake(f)
  1391  				sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
  1392  				ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false)
  1393  				handshakeStream.EXPECT().HasData()
  1394  				pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
  1395  				pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
  1396  
  1397  				p, err := packer.MaybePackProbePacket(protocol.EncryptionHandshake, maxPacketSize, protocol.Version1)
  1398  				Expect(err).ToNot(HaveOccurred())
  1399  				Expect(err).ToNot(HaveOccurred())
  1400  				Expect(p).ToNot(BeNil())
  1401  				Expect(p.longHdrPackets).To(HaveLen(1))
  1402  				packet := p.longHdrPackets[0]
  1403  				Expect(packet.EncryptionLevel()).To(Equal(protocol.EncryptionHandshake))
  1404  				Expect(packet.frames).To(HaveLen(1))
  1405  				Expect(packet.frames[0].Frame).To(BeAssignableToTypeOf(&wire.CryptoFrame{}))
  1406  				Expect(packet.length).To(Equal(maxPacketSize))
  1407  				parsePacket(p.buffer.Data)
  1408  			})
  1409  
  1410  			It("packs a 1-RTT probe packet", func() {
  1411  				f := &wire.StreamFrame{Data: []byte("1-RTT")}
  1412  				retransmissionQueue.addInitial(f)
  1413  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
  1414  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
  1415  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
  1416  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
  1417  				framer.EXPECT().HasData().Return(true)
  1418  				expectAppendControlFrames()
  1419  				expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f})
  1420  
  1421  				p, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, protocol.Version1)
  1422  				Expect(err).ToNot(HaveOccurred())
  1423  				Expect(p).ToNot(BeNil())
  1424  				Expect(p.longHdrPackets).To(BeEmpty())
  1425  				Expect(p.shortHdrPacket).ToNot(BeNil())
  1426  				packet := p.shortHdrPacket
  1427  				Expect(packet.Frames).To(BeEmpty())
  1428  				Expect(packet.StreamFrames).To(HaveLen(1))
  1429  				Expect(packet.StreamFrames[0].Frame).To(Equal(f))
  1430  			})
  1431  
  1432  			It("packs a full size 1-RTT probe packet", func() {
  1433  				f := &wire.StreamFrame{Data: make([]byte, 2000)}
  1434  				retransmissionQueue.addInitial(f)
  1435  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
  1436  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
  1437  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
  1438  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
  1439  				framer.EXPECT().HasData().Return(true)
  1440  				expectAppendControlFrames()
  1441  				framer.EXPECT().AppendStreamFrames(gomock.Any(), gomock.Any(), protocol.Version1).DoAndReturn(func(fs []ackhandler.StreamFrame, maxSize protocol.ByteCount, v protocol.VersionNumber) ([]ackhandler.StreamFrame, protocol.ByteCount) {
  1442  					sf, split := f.MaybeSplitOffFrame(maxSize, v)
  1443  					Expect(split).To(BeTrue())
  1444  					return append(fs, ackhandler.StreamFrame{Frame: sf}), sf.Length(v)
  1445  				})
  1446  
  1447  				p, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, protocol.Version1)
  1448  				Expect(err).ToNot(HaveOccurred())
  1449  				Expect(p).ToNot(BeNil())
  1450  				Expect(p.longHdrPackets).To(BeEmpty())
  1451  				Expect(p.shortHdrPacket).ToNot(BeNil())
  1452  				packet := p.shortHdrPacket
  1453  				Expect(packet.Frames).To(BeEmpty())
  1454  				Expect(packet.StreamFrames).To(HaveLen(1))
  1455  				Expect(packet.Length).To(Equal(maxPacketSize))
  1456  			})
  1457  
  1458  			It("returns nil if there's no probe data to send", func() {
  1459  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
  1460  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
  1461  				ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true)
  1462  				framer.EXPECT().HasData()
  1463  
  1464  				packet, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, protocol.Version1)
  1465  				Expect(err).ToNot(HaveOccurred())
  1466  				Expect(packet).To(BeNil())
  1467  			})
  1468  
  1469  			It("packs an MTU probe packet", func() {
  1470  				sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
  1471  				pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x43), protocol.PacketNumberLen2)
  1472  				pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x43))
  1473  				ping := ackhandler.Frame{Frame: &wire.PingFrame{}}
  1474  				const probePacketSize = maxPacketSize + 42
  1475  				p, buffer, err := packer.PackMTUProbePacket(ping, probePacketSize, protocol.Version1)
  1476  				Expect(err).ToNot(HaveOccurred())
  1477  				Expect(p.Length).To(BeEquivalentTo(probePacketSize))
  1478  				Expect(p.PacketNumber).To(Equal(protocol.PacketNumber(0x43)))
  1479  				Expect(buffer.Data).To(HaveLen(int(probePacketSize)))
  1480  				Expect(p.IsPathMTUProbePacket).To(BeTrue())
  1481  			})
  1482  		})
  1483  	})
  1484  })