forked from quic-go/quic-go
Merge pull request #3105 from lucas-clemente/fix-flaky-timeout-test
fix flaky timeout test
This commit is contained in:
@@ -23,6 +23,7 @@ import (
|
||||
|
||||
"github.com/lucas-clemente/quic-go"
|
||||
"github.com/lucas-clemente/quic-go/internal/utils"
|
||||
"github.com/lucas-clemente/quic-go/internal/wire"
|
||||
"github.com/lucas-clemente/quic-go/logging"
|
||||
"github.com/lucas-clemente/quic-go/qlog"
|
||||
|
||||
@@ -368,6 +369,43 @@ func (t *connTracer) LossTimerCanceled()
|
||||
func (t *connTracer) Debug(string, string) {}
|
||||
func (t *connTracer) Close() {}
|
||||
|
||||
type packet struct {
|
||||
time time.Time
|
||||
hdr *logging.ExtendedHeader
|
||||
frames []logging.Frame
|
||||
}
|
||||
|
||||
type packetTracer struct {
|
||||
connTracer
|
||||
closed chan struct{}
|
||||
sent, rcvd []packet
|
||||
}
|
||||
|
||||
func newPacketTracer() *packetTracer {
|
||||
return &packetTracer{closed: make(chan struct{})}
|
||||
}
|
||||
|
||||
func (t *packetTracer) ReceivedPacket(hdr *logging.ExtendedHeader, _ logging.ByteCount, frames []logging.Frame) {
|
||||
t.rcvd = append(t.rcvd, packet{time: time.Now(), hdr: hdr, frames: frames})
|
||||
}
|
||||
|
||||
func (t *packetTracer) SentPacket(hdr *logging.ExtendedHeader, _ logging.ByteCount, ack *wire.AckFrame, frames []logging.Frame) {
|
||||
if ack != nil {
|
||||
frames = append(frames, ack)
|
||||
}
|
||||
t.sent = append(t.sent, packet{time: time.Now(), hdr: hdr, frames: frames})
|
||||
}
|
||||
func (t *packetTracer) Close() { close(t.closed) }
|
||||
func (t *packetTracer) getSentPackets() []packet {
|
||||
<-t.closed
|
||||
return t.sent
|
||||
}
|
||||
|
||||
func (t *packetTracer) getRcvdPackets() []packet {
|
||||
<-t.closed
|
||||
return t.rcvd
|
||||
}
|
||||
|
||||
func TestSelf(t *testing.T) {
|
||||
RegisterFailHandler(Fail)
|
||||
RunSpecs(t, "Self integration tests")
|
||||
|
||||
@@ -15,7 +15,6 @@ import (
|
||||
|
||||
quic "github.com/lucas-clemente/quic-go"
|
||||
quicproxy "github.com/lucas-clemente/quic-go/integrationtests/tools/proxy"
|
||||
"github.com/lucas-clemente/quic-go/internal/protocol"
|
||||
"github.com/lucas-clemente/quic-go/internal/utils"
|
||||
"github.com/lucas-clemente/quic-go/logging"
|
||||
. "github.com/onsi/ginkgo"
|
||||
@@ -46,17 +45,6 @@ func (c *faultyConn) WriteTo(p []byte, addr net.Addr) (int, error) {
|
||||
return 0, io.ErrClosedPipe
|
||||
}
|
||||
|
||||
type handshakeCompleteTracer struct {
|
||||
connTracer
|
||||
completionTime time.Time
|
||||
}
|
||||
|
||||
func (t *handshakeCompleteTracer) DroppedEncryptionLevel(l protocol.EncryptionLevel) {
|
||||
if l == protocol.EncryptionHandshake {
|
||||
t.completionTime = time.Now()
|
||||
}
|
||||
}
|
||||
|
||||
func areHandshakesRunning() bool {
|
||||
var b bytes.Buffer
|
||||
pprof.Lookup("goroutine").WriteTo(&b, 1)
|
||||
@@ -214,7 +202,7 @@ var _ = Describe("Timeout tests", func() {
|
||||
close(serverSessionClosed)
|
||||
}()
|
||||
|
||||
tr := &handshakeCompleteTracer{}
|
||||
tr := newPacketTracer()
|
||||
sess, err := quic.DialAddr(
|
||||
fmt.Sprintf("localhost:%d", server.Addr().(*net.UDPAddr).Port),
|
||||
getTLSClientConfig(),
|
||||
@@ -233,9 +221,26 @@ var _ = Describe("Timeout tests", func() {
|
||||
close(done)
|
||||
}()
|
||||
Eventually(done, 2*idleTimeout).Should(BeClosed())
|
||||
Expect(tr.completionTime).ToNot(BeZero())
|
||||
dur := time.Since(tr.completionTime)
|
||||
Expect(dur).To(And(
|
||||
var lastAckElicitingPacketSentAt time.Time
|
||||
for _, p := range tr.getSentPackets() {
|
||||
var hasAckElicitingFrame bool
|
||||
for _, f := range p.frames {
|
||||
if _, ok := f.(*logging.AckFrame); ok {
|
||||
continue
|
||||
}
|
||||
hasAckElicitingFrame = true
|
||||
break
|
||||
}
|
||||
if hasAckElicitingFrame {
|
||||
lastAckElicitingPacketSentAt = p.time
|
||||
}
|
||||
}
|
||||
rcvdPackets := tr.getRcvdPackets()
|
||||
lastPacketRcvdAt := rcvdPackets[len(rcvdPackets)-1].time
|
||||
// We're ignoring here that only the first ack-eliciting packet sent resets the idle timeout.
|
||||
// This is ok since we're dealing with a lossless connection here,
|
||||
// and we'd expect to receive an ACK for additional other ack-eliciting packet sent.
|
||||
Expect(time.Since(utils.MaxTime(lastAckElicitingPacketSentAt, lastPacketRcvdAt))).To(And(
|
||||
BeNumerically(">=", idleTimeout),
|
||||
BeNumerically("<", idleTimeout*6/5),
|
||||
))
|
||||
|
||||
@@ -23,30 +23,6 @@ import (
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
|
||||
type rcvdPacket struct {
|
||||
hdr *logging.ExtendedHeader
|
||||
frames []logging.Frame
|
||||
}
|
||||
|
||||
type rcvdPacketTracer struct {
|
||||
connTracer
|
||||
closed chan struct{}
|
||||
rcvdPackets []rcvdPacket
|
||||
}
|
||||
|
||||
func newRcvdPacketTracer() *rcvdPacketTracer {
|
||||
return &rcvdPacketTracer{closed: make(chan struct{})}
|
||||
}
|
||||
|
||||
func (t *rcvdPacketTracer) ReceivedPacket(hdr *logging.ExtendedHeader, _ logging.ByteCount, frames []logging.Frame) {
|
||||
t.rcvdPackets = append(t.rcvdPackets, rcvdPacket{hdr: hdr, frames: frames})
|
||||
}
|
||||
func (t *rcvdPacketTracer) Close() { close(t.closed) }
|
||||
func (t *rcvdPacketTracer) getRcvdPackets() []rcvdPacket {
|
||||
<-t.closed
|
||||
return t.rcvdPackets
|
||||
}
|
||||
|
||||
var _ = Describe("0-RTT", func() {
|
||||
rtt := scaleDuration(5 * time.Millisecond)
|
||||
|
||||
@@ -195,8 +171,8 @@ var _ = Describe("0-RTT", func() {
|
||||
Eventually(sess.Context().Done()).Should(BeClosed())
|
||||
}
|
||||
|
||||
// can be used to extract 0-RTT from a rcvdPacketTracer
|
||||
get0RTTPackets := func(packets []rcvdPacket) []protocol.PacketNumber {
|
||||
// can be used to extract 0-RTT from a packetTracer
|
||||
get0RTTPackets := func(packets []packet) []protocol.PacketNumber {
|
||||
var zeroRTTPackets []protocol.PacketNumber
|
||||
for _, p := range packets {
|
||||
if p.hdr.Type == protocol.PacketType0RTT {
|
||||
@@ -212,7 +188,7 @@ var _ = Describe("0-RTT", func() {
|
||||
It(fmt.Sprintf("transfers 0-RTT data, with %d byte connection IDs", connIDLen), func() {
|
||||
tlsConf, clientTLSConf := dialAndReceiveSessionTicket(nil)
|
||||
|
||||
tracer := newRcvdPacketTracer()
|
||||
tracer := newPacketTracer()
|
||||
ln, err := quic.ListenAddrEarly(
|
||||
"localhost:0",
|
||||
tlsConf,
|
||||
@@ -270,7 +246,7 @@ var _ = Describe("0-RTT", func() {
|
||||
zeroRTTData := GeneratePRData(2 * 1100) // 2 packets
|
||||
oneRTTData := PRData
|
||||
|
||||
tracer := newRcvdPacketTracer()
|
||||
tracer := newPacketTracer()
|
||||
ln, err := quic.ListenAddrEarly(
|
||||
"localhost:0",
|
||||
tlsConf,
|
||||
@@ -345,7 +321,7 @@ var _ = Describe("0-RTT", func() {
|
||||
|
||||
tlsConf, clientConf := dialAndReceiveSessionTicket(nil)
|
||||
|
||||
tracer := newRcvdPacketTracer()
|
||||
tracer := newPacketTracer()
|
||||
ln, err := quic.ListenAddrEarly(
|
||||
"localhost:0",
|
||||
tlsConf,
|
||||
@@ -415,7 +391,7 @@ var _ = Describe("0-RTT", func() {
|
||||
return
|
||||
}
|
||||
|
||||
tracer := newRcvdPacketTracer()
|
||||
tracer := newPacketTracer()
|
||||
ln, err := quic.ListenAddrEarly(
|
||||
"localhost:0",
|
||||
tlsConf,
|
||||
@@ -476,7 +452,7 @@ var _ = Describe("0-RTT", func() {
|
||||
AcceptToken: func(_ net.Addr, _ *quic.Token) bool { return true },
|
||||
}))
|
||||
|
||||
tracer := newRcvdPacketTracer()
|
||||
tracer := newPacketTracer()
|
||||
ln, err := quic.ListenAddrEarly(
|
||||
"localhost:0",
|
||||
tlsConf,
|
||||
@@ -527,7 +503,7 @@ var _ = Describe("0-RTT", func() {
|
||||
AcceptToken: func(_ net.Addr, _ *quic.Token) bool { return true },
|
||||
}))
|
||||
|
||||
tracer := newRcvdPacketTracer()
|
||||
tracer := newPacketTracer()
|
||||
ln, err := quic.ListenAddrEarly(
|
||||
"localhost:0",
|
||||
tlsConf,
|
||||
@@ -557,7 +533,7 @@ var _ = Describe("0-RTT", func() {
|
||||
// now close the listener and dial new connection with a different ALPN
|
||||
clientConf.NextProtos = []string{"new-alpn"}
|
||||
tlsConf.NextProtos = []string{"new-alpn"}
|
||||
tracer := newRcvdPacketTracer()
|
||||
tracer := newPacketTracer()
|
||||
ln, err := quic.ListenAddrEarly(
|
||||
"localhost:0",
|
||||
tlsConf,
|
||||
@@ -583,7 +559,7 @@ var _ = Describe("0-RTT", func() {
|
||||
|
||||
DescribeTable("flow control limits",
|
||||
func(addFlowControlLimit func(*quic.Config, uint64)) {
|
||||
tracer := newRcvdPacketTracer()
|
||||
tracer := newPacketTracer()
|
||||
firstConf := getQuicConfig(&quic.Config{
|
||||
AcceptToken: func(_ net.Addr, _ *quic.Token) bool { return true },
|
||||
Versions: []protocol.VersionNumber{version},
|
||||
@@ -666,7 +642,7 @@ var _ = Describe("0-RTT", func() {
|
||||
It(fmt.Sprintf("correctly deals with 0-RTT rejections, for %d byte connection IDs", connIDLen), func() {
|
||||
tlsConf, clientConf := dialAndReceiveSessionTicket(nil)
|
||||
// now dial new connection with different transport parameters
|
||||
tracer := newRcvdPacketTracer()
|
||||
tracer := newPacketTracer()
|
||||
ln, err := quic.ListenAddrEarly(
|
||||
"localhost:0",
|
||||
tlsConf,
|
||||
@@ -742,7 +718,7 @@ var _ = Describe("0-RTT", func() {
|
||||
It("queues 0-RTT packets, if the Initial is delayed", func() {
|
||||
tlsConf, clientConf := dialAndReceiveSessionTicket(nil)
|
||||
|
||||
tracer := newRcvdPacketTracer()
|
||||
tracer := newPacketTracer()
|
||||
ln, err := quic.ListenAddrEarly(
|
||||
"localhost:0",
|
||||
tlsConf,
|
||||
@@ -768,7 +744,7 @@ var _ = Describe("0-RTT", func() {
|
||||
|
||||
transfer0RTTData(ln, proxy.LocalPort(), clientConf, nil, PRData)
|
||||
|
||||
Expect(tracer.rcvdPackets[0].hdr.Type).To(Equal(protocol.PacketTypeInitial))
|
||||
Expect(tracer.getRcvdPackets()[0].hdr.Type).To(Equal(protocol.PacketTypeInitial))
|
||||
zeroRTTPackets := get0RTTPackets(tracer.getRcvdPackets())
|
||||
Expect(len(zeroRTTPackets)).To(BeNumerically(">", 10))
|
||||
Expect(zeroRTTPackets[0]).To(Equal(protocol.PacketNumber(0)))
|
||||
|
||||
Reference in New Issue
Block a user