]> Cypherpunks repositories - gostls13.git/commitdiff
build: fix race in doc/articles/wiki test
authorRick Arnold <rickarnoldjr@gmail.com>
Tue, 18 Mar 2014 02:03:03 +0000 (13:03 +1100)
committerAndrew Gerrand <adg@golang.org>
Tue, 18 Mar 2014 02:03:03 +0000 (13:03 +1100)
The original test would open a local port and then immediately close it
and use the port number in subsequent tests. Between the port being closed
and reused by the later process, it could be opened by some other program
on the machine.

Changed the test to run the server process directly and have it save the
assigned port to a text file to be used by client processes.

Fixes #5564.

LGTM=adg
R=golang-codereviews, gobot, adg
CC=golang-codereviews
https://golang.org/cl/72290043

doc/articles/wiki/Makefile
doc/articles/wiki/final.go
doc/articles/wiki/test.bash

index 2f801b3c34e2fec5e924a8f4b52ade56c553a035..67563bc09220f4059c88f1086a11781655aaa289 100644 (file)
@@ -4,7 +4,7 @@
 
 all: index.html
 
-CLEANFILES=get.bin final-test.bin a.out
+CLEANFILES=get.bin final.bin a.out
 
 clean:
        rm -f $(CLEANFILES)
index f15794d660b70542c19725d13b64e4ba691201c6..d84c1ffb264663a279a76554c3e22d07009b22b9 100644 (file)
@@ -5,12 +5,19 @@
 package main
 
 import (
+       "flag"
        "html/template"
        "io/ioutil"
+       "log"
+       "net"
        "net/http"
        "regexp"
 )
 
+var (
+       addr = flag.Bool("addr", false, "find open address and print to final-port.txt")
+)
+
 type Page struct {
        Title string
        Body  []byte
@@ -81,8 +88,24 @@ func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.Handl
 }
 
 func main() {
+       flag.Parse()
        http.HandleFunc("/view/", makeHandler(viewHandler))
        http.HandleFunc("/edit/", makeHandler(editHandler))
        http.HandleFunc("/save/", makeHandler(saveHandler))
+
+       if *addr {
+               l, err := net.Listen("tcp", "127.0.0.1:0")
+               if err != nil {
+                       log.Fatal(err)
+               }
+               err = ioutil.WriteFile("final-port.txt", []byte(l.Addr().String()), 0644)
+               if err != nil {
+                       log.Fatal(err)
+               }
+               s := &http.Server{}
+               s.Serve(l)
+               return
+       }
+
        http.ListenAndServe(":8080", nil)
 }
index 54a632c308a64f665243c103295c431ea1484008..46c357ebde664edc7d81c3d9222b3b1c0afa5529 100755 (executable)
@@ -7,7 +7,7 @@ set -e
 wiki_pid=
 cleanup() {
        kill $wiki_pid
-       rm -f test_*.out Test.txt final-test.bin final-test.go a.out get.bin
+       rm -f test_*.out Test.txt final.bin final-port.txt a.out get.bin
 }
 trap cleanup 0 INT
 
@@ -19,13 +19,25 @@ if [ "$1" == "-all" ]; then
 fi
 
 go build -o get.bin get.go
-addr=$(./get.bin -addr)
-sed s/:8080/$addr/ < final.go > final-test.go
-go build -o final-test.bin final-test.go
-(./final-test.bin) &
+go build -o final.bin final.go
+(./final.bin --addr) &
 wiki_pid=$!
 
-./get.bin --wait_for_port=5s http://$addr/edit/Test > test_edit.out
+l=0
+while [ ! -f ./final-port.txt ]
+do
+       l=$(($l+1))
+       if [ "$l" -gt 5 ]
+       then
+               echo "port not available within 5 seconds"
+               exit 1
+               break
+       fi
+       sleep 1
+done
+
+addr=$(cat final-port.txt)
+./get.bin http://$addr/edit/Test > test_edit.out
 diff -u test_edit.out test_edit.good
 ./get.bin -post=body=some%20content http://$addr/save/Test > test_save.out
 diff -u test_save.out test_view.good # should be the same as viewing