mirror of https://github.com/golang/go.git
build: fix race in doc/articles/wiki test
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
This commit is contained in:
parent
e45f5cd5f1
commit
1f1f69e389
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue