diff --git a/integrationtests/chrome_test.go b/integrationtests/chrome_test.go index 81180e740..d991b37d0 100644 --- a/integrationtests/chrome_test.go +++ b/integrationtests/chrome_test.go @@ -7,6 +7,7 @@ import ( "net/http" "os" "path/filepath" + "strconv" "github.com/tebeka/selenium" @@ -148,9 +149,9 @@ var _ = Describe("Chrome tests", func() { Expect(err).ToNot(HaveOccurred()) copyFileToDocker(tmpfn) - err = wd.Get("https://quic.clemente.io/uploadform") + err = wd.Get("https://quic.clemente.io/uploadform?num=1") Expect(err).NotTo(HaveOccurred()) - elem, err := wd.FindElement(selenium.ByCSSSelector, "#upload") + elem, err := wd.FindElement(selenium.ByCSSSelector, "#upload_0") Expect(err).ToNot(HaveOccurred()) err = elem.SendKeys("/home/seluser/data.dat") Expect(err).ToNot(HaveOccurred()) @@ -172,9 +173,9 @@ var _ = Describe("Chrome tests", func() { Expect(err).ToNot(HaveOccurred()) copyFileToDocker(tmpfn) - err = wd.Get("https://quic.clemente.io/uploadform") + err = wd.Get("https://quic.clemente.io/uploadform?num=1") Expect(err).NotTo(HaveOccurred()) - elem, err := wd.FindElement(selenium.ByCSSSelector, "#upload") + elem, err := wd.FindElement(selenium.ByCSSSelector, "#upload_0") Expect(err).ToNot(HaveOccurred()) err = elem.SendKeys("/home/seluser/data.dat") Expect(err).ToNot(HaveOccurred()) @@ -184,6 +185,50 @@ var _ = Describe("Chrome tests", func() { Expect(getFileSize(file)).To(Equal(dataLongLen)) Expect(getFileMD5(file)).To(Equal(dataMan.GetMD5())) }) + + // this test takes a long time because it copies every file into the docker container one by one + // unfortunately, docker doesn't support copying multiple files at once + // see https://github.com/docker/docker/issues/7710 + It("uploads many small files", func() { + num := protocol.MaxStreamsPerConnection + 20 + + dir, err := ioutil.TempDir("", "quic-upload-src") + Expect(err).ToNot(HaveOccurred()) + defer os.RemoveAll(dir) + + var md5s [][]byte + + for i := 0; i < num; i++ { + dataMan.GenerateData(dataLen) + data := dataMan.GetData() + md5s = append(md5s, dataMan.GetMD5()) + tmpfn := filepath.Join(dir, "data_"+strconv.Itoa(i)+".dat") + err = ioutil.WriteFile(tmpfn, data, 0777) + Expect(err).ToNot(HaveOccurred()) + copyFileToDocker(tmpfn) + } + + err = wd.Get("https://quic.clemente.io/uploadform?num=" + strconv.Itoa(num)) + Expect(err).NotTo(HaveOccurred()) + + for i := 0; i < num; i++ { + var elem selenium.WebElement + elem, err = wd.FindElement(selenium.ByCSSSelector, "#upload_"+strconv.Itoa(i)) + Expect(err).ToNot(HaveOccurred()) + err = elem.SendKeys("/home/seluser/data_" + strconv.Itoa(i) + ".dat") + Expect(err).ToNot(HaveOccurred()) + } + + elem, err := wd.FindElement(selenium.ByCSSSelector, "#form") + Expect(err).ToNot(HaveOccurred()) + Eventually(func() error { return elem.Submit() }, 30, 0.1).ShouldNot(HaveOccurred()) + + for i := 0; i < num; i++ { + file := filepath.Join(uploadDir, "data_"+strconv.Itoa(i)+".dat") + Expect(getFileSize(file)).To(Equal(dataLen)) + Expect(getFileMD5(file)).To(Equal(md5s[i])) + } + }) }) } }) diff --git a/integrationtests/integrationtests_suite_test.go b/integrationtests/integrationtests_suite_test.go index 1dd2006f1..9ca49f532 100644 --- a/integrationtests/integrationtests_suite_test.go +++ b/integrationtests/integrationtests_suite_test.go @@ -7,6 +7,7 @@ import ( "fmt" "io" "io/ioutil" + "mime/multipart" "net" "net/http" "os" @@ -103,13 +104,18 @@ func setupHTTPHandlers() { Expect(err).NotTo(HaveOccurred()) }) + // requires the num GET parameter, e.g. /uploadform?num=2 + // will create num input fields for uploading files http.HandleFunc("/uploadform", func(w http.ResponseWriter, r *http.Request) { defer GinkgoRecover() - _, err := io.WriteString(w, ` -
- -
- `) + num, err := strconv.Atoi(r.URL.Query().Get("num")) + Expect(err).ToNot(HaveOccurred()) + response := "\n
" + for i := 0; i < num; i++ { + response += "" + } + response += "
" + _, err = io.WriteString(w, response) Expect(err).NotTo(HaveOccurred()) }) @@ -118,13 +124,23 @@ func setupHTTPHandlers() { err := r.ParseMultipartForm(100 * (1 << 20)) // max. 100 MB Expect(err).ToNot(HaveOccurred()) - file, handler, err := r.FormFile("uploadfile") - Expect(err).ToNot(HaveOccurred()) - defer file.Close() - f, err := os.OpenFile(path.Join(uploadDir, handler.Filename), os.O_WRONLY|os.O_CREATE, 0666) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - io.Copy(f, file) + + count := 0 + for { + var file multipart.File + var handler *multipart.FileHeader + file, handler, err = r.FormFile("uploadfile_" + strconv.Itoa(count)) + if err != nil { + break + } + count++ + f, err2 := os.OpenFile(path.Join(uploadDir, handler.Filename), os.O_WRONLY|os.O_CREATE, 0666) + Expect(err2).ToNot(HaveOccurred()) + io.Copy(f, file) + f.Close() + file.Close() + } + Expect(count).ToNot(BeZero()) // there have been at least one uploaded file in this request _, err = io.WriteString(w, "") Expect(err).NotTo(HaveOccurred())