1package quic 2 3import ( 4 "net" 5 6 "github.com/golang/mock/gomock" 7 mocklogging "github.com/lucas-clemente/quic-go/internal/mocks/logging" 8 9 . "github.com/onsi/ginkgo" 10 . "github.com/onsi/gomega" 11) 12 13type testConn struct { 14 counter int 15 net.PacketConn 16} 17 18var _ = Describe("Multiplexer", func() { 19 It("adds a new packet conn ", func() { 20 conn := NewMockPacketConn(mockCtrl) 21 conn.EXPECT().ReadFrom(gomock.Any()).Do(func([]byte) { <-(make(chan struct{})) }).MaxTimes(1) 22 conn.EXPECT().LocalAddr().Return(&net.UDPAddr{IP: net.IPv4(1, 2, 3, 4), Port: 1234}) 23 _, err := getMultiplexer().AddConn(conn, 8, nil, nil) 24 Expect(err).ToNot(HaveOccurred()) 25 }) 26 27 It("recognizes when the same connection is added twice", func() { 28 pconn := NewMockPacketConn(mockCtrl) 29 pconn.EXPECT().LocalAddr().Return(&net.UDPAddr{IP: net.IPv4(1, 2, 3, 4), Port: 4321}).Times(2) 30 pconn.EXPECT().ReadFrom(gomock.Any()).Do(func([]byte) { <-(make(chan struct{})) }).MaxTimes(1) 31 conn := testConn{PacketConn: pconn} 32 tracer := mocklogging.NewMockTracer(mockCtrl) 33 _, err := getMultiplexer().AddConn(conn, 8, []byte("foobar"), tracer) 34 Expect(err).ToNot(HaveOccurred()) 35 conn.counter++ 36 _, err = getMultiplexer().AddConn(conn, 8, []byte("foobar"), tracer) 37 Expect(err).ToNot(HaveOccurred()) 38 Expect(getMultiplexer().(*connMultiplexer).conns).To(HaveLen(1)) 39 }) 40 41 It("errors when adding an existing conn with a different connection ID length", func() { 42 conn := NewMockPacketConn(mockCtrl) 43 conn.EXPECT().ReadFrom(gomock.Any()).Do(func([]byte) { <-(make(chan struct{})) }).MaxTimes(1) 44 conn.EXPECT().LocalAddr().Return(&net.UDPAddr{IP: net.IPv4(1, 2, 3, 4), Port: 1234}).Times(2) 45 _, err := getMultiplexer().AddConn(conn, 5, nil, nil) 46 Expect(err).ToNot(HaveOccurred()) 47 _, err = getMultiplexer().AddConn(conn, 6, nil, nil) 48 Expect(err).To(MatchError("cannot use 6 byte connection IDs on a connection that is already using 5 byte connction IDs")) 49 }) 50 51 It("errors when adding an existing conn with a different stateless rest key", func() { 52 conn := NewMockPacketConn(mockCtrl) 53 conn.EXPECT().ReadFrom(gomock.Any()).Do(func([]byte) { <-(make(chan struct{})) }).MaxTimes(1) 54 conn.EXPECT().LocalAddr().Return(&net.UDPAddr{IP: net.IPv4(1, 2, 3, 4), Port: 1234}).Times(2) 55 _, err := getMultiplexer().AddConn(conn, 7, []byte("foobar"), nil) 56 Expect(err).ToNot(HaveOccurred()) 57 _, err = getMultiplexer().AddConn(conn, 7, []byte("raboof"), nil) 58 Expect(err).To(MatchError("cannot use different stateless reset keys on the same packet conn")) 59 }) 60 61 It("errors when adding an existing conn with different tracers", func() { 62 conn := NewMockPacketConn(mockCtrl) 63 conn.EXPECT().ReadFrom(gomock.Any()).Do(func([]byte) { <-(make(chan struct{})) }).MaxTimes(1) 64 conn.EXPECT().LocalAddr().Return(&net.UDPAddr{IP: net.IPv4(1, 2, 3, 4), Port: 1234}).Times(2) 65 _, err := getMultiplexer().AddConn(conn, 7, nil, mocklogging.NewMockTracer(mockCtrl)) 66 Expect(err).ToNot(HaveOccurred()) 67 _, err = getMultiplexer().AddConn(conn, 7, nil, mocklogging.NewMockTracer(mockCtrl)) 68 Expect(err).To(MatchError("cannot use different tracers on the same packet conn")) 69 }) 70}) 71