From 556bf2fe4bd884ae25bd7e8f3424e43b5e46b541 Mon Sep 17 00:00:00 2001 From: Lucas Clemente Date: Fri, 3 Jun 2016 10:12:34 +0200 Subject: [PATCH] add a test for h2quic.ListenAndServeQUIC fixes #160 --- h2quic/server_test.go | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/h2quic/server_test.go b/h2quic/server_test.go index aa6f1b21..ff826016 100644 --- a/h2quic/server_test.go +++ b/h2quic/server_test.go @@ -1,9 +1,11 @@ package h2quic import ( + "net" "net/http" "os" "sync" + "syscall" "time" "golang.org/x/net/http2" @@ -32,6 +34,9 @@ var _ = Describe("H2 server", func() { const port = "4826" const addr = "127.0.0.1:" + port + certPath := os.Getenv("GOPATH") + certPath += "/src/github.com/lucas-clemente/quic-go/example/" + var ( s *Server session *mockSession @@ -260,9 +265,6 @@ var _ = Describe("H2 server", func() { }) Context("ListenAndServeTLS", func() { - path := os.Getenv("GOPATH") - path += "/src/github.com/lucas-clemente/quic-go/example/" - BeforeEach(func() { s.Server.Addr = addr }) @@ -275,7 +277,7 @@ var _ = Describe("H2 server", func() { It("works", func(done Done) { go func() { defer GinkgoRecover() - err := s.ListenAndServeTLS(path+"fullchain.pem", path+"privkey.pem") + err := s.ListenAndServeTLS(certPath+"fullchain.pem", certPath+"privkey.pem") Expect(err).NotTo(HaveOccurred()) close(done) }() @@ -287,12 +289,12 @@ var _ = Describe("H2 server", func() { It("may only be called once", func(done Done) { go func() { defer GinkgoRecover() - err := s.ListenAndServeTLS(path+"fullchain.pem", path+"privkey.pem") + err := s.ListenAndServeTLS(certPath+"fullchain.pem", certPath+"privkey.pem") Expect(err).NotTo(HaveOccurred()) close(done) }() time.Sleep(10 * time.Millisecond) - err := s.ListenAndServeTLS(path+"fullchain.pem", path+"privkey.pem") + err := s.ListenAndServeTLS(certPath+"fullchain.pem", certPath+"privkey.pem") Expect(err).To(MatchError("ListenAndServe may only be called once")) err = s.Close() Expect(err).NotTo(HaveOccurred()) @@ -303,4 +305,24 @@ var _ = Describe("H2 server", func() { err := s.CloseGracefully(0) Expect(err).NotTo(HaveOccurred()) }) + + It("at least errors in global ListenAndServeQUIC", func() { + // It's quite hard to test this, since we cannot properly shutdown the server + // once it's started. So, we open a socket on the same port before the test, + // so that ListenAndServeQUIC definitely fails. This way we know it at least + // created a socket on the proper address :) + udpAddr, err := net.ResolveUDPAddr("udp", addr) + Expect(err).NotTo(HaveOccurred()) + c, err := net.ListenUDP("udp", udpAddr) + Expect(err).NotTo(HaveOccurred()) + defer c.Close() + err = ListenAndServeQUIC(addr, certPath+"fullchain.pem", certPath+"privkey.pem", nil) + // Check that it's an EADDRINUSE + Expect(err).ToNot(BeNil()) + opErr, ok := err.(*net.OpError) + Expect(ok).To(BeTrue()) + syscallErr, ok := opErr.Err.(*os.SyscallError) + Expect(ok).To(BeTrue()) + Expect(syscallErr.Err).To(MatchError(syscall.EADDRINUSE)) + }) })