From 10f9b2eb86839fd63bc9d1f93d4c7796c9ebb868 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sun, 8 Mar 2020 15:31:53 +0700 Subject: [PATCH] add an integration test that introduces packet reordering --- integrationtests/self/rtt_test.go | 89 ++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 25 deletions(-) diff --git a/integrationtests/self/rtt_test.go b/integrationtests/self/rtt_test.go index 6e0a2f5d..367713f7 100644 --- a/integrationtests/self/rtt_test.go +++ b/integrationtests/self/rtt_test.go @@ -19,38 +19,55 @@ var _ = Describe("non-zero RTT", func() { for _, v := range protocol.SupportedVersions { version := v + runServer := func() quic.Listener { + ln, err := quic.ListenAddr( + "localhost:0", + getTLSConfig(), + &quic.Config{ + Versions: []protocol.VersionNumber{version}, + }, + ) + Expect(err).ToNot(HaveOccurred()) + go func() { + defer GinkgoRecover() + sess, err := ln.Accept(context.Background()) + Expect(err).ToNot(HaveOccurred()) + str, err := sess.OpenStream() + Expect(err).ToNot(HaveOccurred()) + _, err = str.Write(PRData) + Expect(err).ToNot(HaveOccurred()) + str.Close() + }() + return ln + } + + downloadFile := func(port int) { + sess, err := quic.DialAddr( + fmt.Sprintf("localhost:%d", port), + getTLSClientConfig(), + &quic.Config{Versions: []protocol.VersionNumber{version}}, + ) + Expect(err).ToNot(HaveOccurred()) + str, err := sess.AcceptStream(context.Background()) + Expect(err).ToNot(HaveOccurred()) + data, err := ioutil.ReadAll(str) + Expect(err).ToNot(HaveOccurred()) + Expect(data).To(Equal(PRData)) + sess.CloseWithError(0, "") + } + Context(fmt.Sprintf("with QUIC version %s", version), func() { - roundTrips := [...]time.Duration{ + for _, r := range [...]time.Duration{ 10 * time.Millisecond, 50 * time.Millisecond, 100 * time.Millisecond, 200 * time.Millisecond, - } - - for _, r := range roundTrips { + } { rtt := r It(fmt.Sprintf("downloads a message with %s RTT", rtt), func() { - ln, err := quic.ListenAddr( - "localhost:0", - getTLSConfig(), - &quic.Config{ - Versions: []protocol.VersionNumber{version}, - }, - ) - Expect(err).ToNot(HaveOccurred()) - done := make(chan struct{}) - go func() { - defer GinkgoRecover() - sess, err := ln.Accept(context.Background()) - Expect(err).ToNot(HaveOccurred()) - str, err := sess.OpenStream() - Expect(err).ToNot(HaveOccurred()) - _, err = str.Write(PRData) - Expect(err).ToNot(HaveOccurred()) - str.Close() - close(done) - }() + ln := runServer() + defer ln.Close() serverPort := ln.Addr().(*net.UDPAddr).Port proxy, err := quicproxy.NewQuicProxy("localhost:0", &quicproxy.Opts{ RemoteAddr: fmt.Sprintf("localhost:%d", serverPort), @@ -73,7 +90,29 @@ var _ = Describe("non-zero RTT", func() { Expect(err).ToNot(HaveOccurred()) Expect(data).To(Equal(PRData)) sess.CloseWithError(0, "") - Eventually(done).Should(BeClosed()) + }) + } + + for _, r := range [...]time.Duration{ + 10 * time.Millisecond, + 40 * time.Millisecond, + } { + rtt := r + + It(fmt.Sprintf("downloads a message with %s RTT, with reordering", rtt), func() { + ln := runServer() + defer ln.Close() + serverPort := ln.Addr().(*net.UDPAddr).Port + proxy, err := quicproxy.NewQuicProxy("localhost:0", &quicproxy.Opts{ + RemoteAddr: fmt.Sprintf("localhost:%d", serverPort), + DelayPacket: func(quicproxy.Direction, []byte) time.Duration { + return randomDuration(rtt/2, rtt*3/2) / 2 + }, + }) + Expect(err).ToNot(HaveOccurred()) + defer proxy.Close() + + downloadFile(proxy.LocalPort()) }) } })