package integrationtests import ( "flag" "fmt" "io" "io/ioutil" "log" "net" "net/http" "os" "path/filepath" "runtime" "strconv" "github.com/lucas-clemente/quic-go/h2quic" "github.com/lucas-clemente/quic-go/internal/testdata" "github.com/lucas-clemente/quic-go/internal/utils" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "testing" ) const ( dataLen = 500 * 1024 // 500 KB dataLongLen = 50 * 1024 * 1024 // 50 MB ) var ( server *h2quic.Server dataMan dataManager port string clientPath string serverPath string logFileName string // the log file set in the ginkgo flags logFile *os.File ) func TestIntegration(t *testing.T) { RegisterFailHandler(Fail) RunSpecs(t, "Integration Tests Suite") } var _ = BeforeSuite(setupHTTPHandlers) // read the logfile command line flag // to set call ginkgo -- -logfile=log.txt func init() { flag.StringVar(&logFileName, "logfile", "", "log file") } var _ = BeforeEach(func() { // set custom time format for logs utils.SetLogTimeFormat("15:04:05.000") _, thisfile, _, ok := runtime.Caller(0) if !ok { Fail("Failed to get current path") } clientPath = filepath.Join(thisfile, fmt.Sprintf("../../../quic-clients/client-%s-debug", runtime.GOOS)) serverPath = filepath.Join(thisfile, fmt.Sprintf("../../../quic-clients/server-%s-debug", runtime.GOOS)) if len(logFileName) > 0 { var err error logFile, err = os.Create("./log.txt") Expect(err).ToNot(HaveOccurred()) log.SetOutput(logFile) utils.SetLogLevel(utils.LogLevelDebug) } }) var _ = JustBeforeEach(startQuicServer) var _ = AfterEach(func() { stopQuicServer() if len(logFileName) > 0 { _ = logFile.Close() } }) func setupHTTPHandlers() { defer GinkgoRecover() http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) { defer GinkgoRecover() _, err := io.WriteString(w, "Hello, World!\n") Expect(err).NotTo(HaveOccurred()) }) http.HandleFunc("/data", func(w http.ResponseWriter, r *http.Request) { defer GinkgoRecover() data := dataMan.GetData() Expect(data).ToNot(HaveLen(0)) _, err := w.Write(data) Expect(err).NotTo(HaveOccurred()) }) http.HandleFunc("/echo", func(w http.ResponseWriter, r *http.Request) { defer GinkgoRecover() body, err := ioutil.ReadAll(r.Body) Expect(err).NotTo(HaveOccurred()) _, err = w.Write(body) Expect(err).NotTo(HaveOccurred()) }) } func startQuicServer() { server = &h2quic.Server{ Server: &http.Server{ TLSConfig: testdata.GetTLSConfig(), }, } addr, err := net.ResolveUDPAddr("udp", "0.0.0.0:0") Expect(err).NotTo(HaveOccurred()) conn, err := net.ListenUDP("udp", addr) Expect(err).NotTo(HaveOccurred()) port = strconv.Itoa(conn.LocalAddr().(*net.UDPAddr).Port) go func() { defer GinkgoRecover() server.Serve(conn) }() } func stopQuicServer() { Expect(server.Close()).NotTo(HaveOccurred()) }