github.com/MerlinKodo/quic-go@v0.39.2/internal/handshake/session_ticket_test.go (about)

     1  package handshake
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/MerlinKodo/quic-go/internal/wire"
     7  	"github.com/MerlinKodo/quic-go/quicvarint"
     8  
     9  	. "github.com/onsi/ginkgo/v2"
    10  	. "github.com/onsi/gomega"
    11  )
    12  
    13  var _ = Describe("Session Ticket", func() {
    14  	It("marshals and unmarshals a 0-RTT session ticket", func() {
    15  		ticket := &sessionTicket{
    16  			Parameters: &wire.TransportParameters{
    17  				InitialMaxStreamDataBidiLocal:  1,
    18  				InitialMaxStreamDataBidiRemote: 2,
    19  				ActiveConnectionIDLimit:        10,
    20  				MaxDatagramFrameSize:           20,
    21  			},
    22  			RTT: 1337 * time.Microsecond,
    23  		}
    24  		var t sessionTicket
    25  		Expect(t.Unmarshal(ticket.Marshal(), true)).To(Succeed())
    26  		Expect(t.Parameters.InitialMaxStreamDataBidiLocal).To(BeEquivalentTo(1))
    27  		Expect(t.Parameters.InitialMaxStreamDataBidiRemote).To(BeEquivalentTo(2))
    28  		Expect(t.Parameters.ActiveConnectionIDLimit).To(BeEquivalentTo(10))
    29  		Expect(t.Parameters.MaxDatagramFrameSize).To(BeEquivalentTo(20))
    30  		Expect(t.RTT).To(Equal(1337 * time.Microsecond))
    31  		// fails to unmarshal the ticket as a non-0-RTT ticket
    32  		Expect(t.Unmarshal(ticket.Marshal(), false)).To(MatchError("the session ticket has more bytes than expected"))
    33  	})
    34  
    35  	It("marshals and unmarshals a non-0-RTT session ticket", func() {
    36  		ticket := &sessionTicket{
    37  			RTT: 1337 * time.Microsecond,
    38  		}
    39  		var t sessionTicket
    40  		Expect(t.Unmarshal(ticket.Marshal(), false)).To(Succeed())
    41  		Expect(t.Parameters).To(BeNil())
    42  		Expect(t.RTT).To(Equal(1337 * time.Microsecond))
    43  		// fails to unmarshal the ticket as a 0-RTT ticket
    44  		Expect(t.Unmarshal(ticket.Marshal(), true)).To(MatchError(ContainSubstring("unmarshaling transport parameters from session ticket failed")))
    45  	})
    46  
    47  	It("refuses to unmarshal if the ticket is too short for the revision", func() {
    48  		Expect((&sessionTicket{}).Unmarshal([]byte{}, true)).To(MatchError("failed to read session ticket revision"))
    49  		Expect((&sessionTicket{}).Unmarshal([]byte{}, false)).To(MatchError("failed to read session ticket revision"))
    50  	})
    51  
    52  	It("refuses to unmarshal if the revision doesn't match", func() {
    53  		b := quicvarint.Append(nil, 1337)
    54  		Expect((&sessionTicket{}).Unmarshal(b, true)).To(MatchError("unknown session ticket revision: 1337"))
    55  		Expect((&sessionTicket{}).Unmarshal(b, false)).To(MatchError("unknown session ticket revision: 1337"))
    56  	})
    57  
    58  	It("refuses to unmarshal if the RTT cannot be read", func() {
    59  		b := quicvarint.Append(nil, sessionTicketRevision)
    60  		Expect((&sessionTicket{}).Unmarshal(b, true)).To(MatchError("failed to read RTT"))
    61  		Expect((&sessionTicket{}).Unmarshal(b, false)).To(MatchError("failed to read RTT"))
    62  	})
    63  
    64  	It("refuses to unmarshal a 0-RTT session ticket if unmarshaling the transport parameters fails", func() {
    65  		b := quicvarint.Append(nil, sessionTicketRevision)
    66  		b = append(b, []byte("foobar")...)
    67  		err := (&sessionTicket{}).Unmarshal(b, true)
    68  		Expect(err).To(HaveOccurred())
    69  		Expect(err.Error()).To(ContainSubstring("unmarshaling transport parameters from session ticket failed"))
    70  	})
    71  
    72  	It("refuses to unmarshal if the non-0-RTT session ticket has more bytes than expected", func() {
    73  		ticket := &sessionTicket{
    74  			Parameters: &wire.TransportParameters{
    75  				InitialMaxStreamDataBidiLocal:  1,
    76  				InitialMaxStreamDataBidiRemote: 2,
    77  				ActiveConnectionIDLimit:        10,
    78  				MaxDatagramFrameSize:           20,
    79  			},
    80  			RTT: 1234 * time.Microsecond,
    81  		}
    82  		err := (&sessionTicket{}).Unmarshal(ticket.Marshal(), false)
    83  		Expect(err).To(HaveOccurred())
    84  		Expect(err.Error()).To(ContainSubstring("the session ticket has more bytes than expected"))
    85  	})
    86  })