1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
package versionnegotiation
import (
"context"
"net"
"testing"
"time"
"github.com/quic-go/quic-go"
quicproxy "github.com/quic-go/quic-go/integrationtests/tools/proxy"
"github.com/quic-go/quic-go/internal/protocol"
"github.com/stretchr/testify/require"
)
const rtt = 400 * time.Millisecond
func expectDurationInRTTs(t *testing.T, startTime time.Time, num int) {
t.Helper()
testDuration := time.Since(startTime)
rtts := float32(testDuration) / float32(rtt)
require.GreaterOrEqual(t, rtts, float32(num))
require.Less(t, rtts, float32(num+1))
}
func TestVersionNegotiationFailure(t *testing.T) {
if len(protocol.SupportedVersions) == 1 {
t.Fatal("Test requires at least 2 supported versions.")
}
serverConfig := &quic.Config{}
serverConfig.Versions = protocol.SupportedVersions[:1]
ln, err := quic.ListenAddr("localhost:0", getTLSConfig(), serverConfig)
require.NoError(t, err)
defer ln.Close()
proxyConn, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0})
require.NoError(t, err)
defer proxyConn.Close()
// start the proxy
proxy := quicproxy.Proxy{
Conn: proxyConn,
ServerAddr: ln.Addr().(*net.UDPAddr),
DelayPacket: func(quicproxy.Direction, net.Addr, net.Addr, []byte) time.Duration { return rtt / 2 },
}
require.NoError(t, proxy.Start())
defer proxy.Close()
startTime := time.Now()
_, err = quic.DialAddr(
context.Background(),
proxy.LocalAddr().String(),
getTLSClientConfig(),
maybeAddQLOGTracer(&quic.Config{Versions: protocol.SupportedVersions[1:2]}),
)
require.Error(t, err)
expectDurationInRTTs(t, startTime, 1)
}
|