deflake tests.

This commit is contained in:
Brendan Burns 2014-08-13 14:07:14 -07:00
parent 9355fae71e
commit 7ea2a37219

View File

@ -18,8 +18,11 @@ package proxy
import ( import (
"fmt" "fmt"
"io" "io/ioutil"
"net" "net"
"net/http"
"net/http/httptest"
"net/url"
"strconv" "strconv"
"testing" "testing"
"time" "time"
@ -38,49 +41,40 @@ func waitForClosedPort(p *Proxier, proxyPort string) error {
return fmt.Errorf("port %s still open", proxyPort) return fmt.Errorf("port %s still open", proxyPort)
} }
// a simple echoServer that only accepts one connection. Returns port actually var port string
// being listened on, or an error.
func echoServer(t *testing.T, addr string) (string, error) { func init() {
l, err := net.Listen("tcp", addr) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte(r.URL.Path[1:]))
}))
u, err := url.Parse(ts.URL)
if err != nil { if err != nil {
return "", fmt.Errorf("failed to start echo service: %v", err) panic(fmt.Sprintf("failed to parse: %v", err))
} }
go func() { _, port, err = net.SplitHostPort(u.Host)
defer l.Close()
conn, err := l.Accept()
if err != nil { if err != nil {
t.Errorf("failed to accept new conn to echo service: %v", err) panic(fmt.Sprintf("failed to parse: %v", err))
} }
io.Copy(conn, conn)
conn.Close()
}()
_, port, err := net.SplitHostPort(l.Addr().String())
return port, err
} }
func testEchoConnection(t *testing.T, address, port string) { func testEchoConnection(t *testing.T, address, port string) {
conn, err := net.Dial("tcp", net.JoinHostPort(address, port)) path := "aaaaa"
res, err := http.Get("http://" + address + ":" + port + "/" + path)
if err != nil { if err != nil {
t.Fatalf("error connecting to proxy: %v", err) t.Fatalf("error connecting to server: %v", err)
} }
magic := "aaaaa" defer res.Body.Close()
if _, err := conn.Write([]byte(magic)); err != nil { data, err := ioutil.ReadAll(res.Body)
t.Fatalf("error writing to proxy: %v", err) if err != nil {
t.Errorf("error reading data: %v %v", err, string(data))
} }
buf := make([]byte, 5) if string(data) != path {
if _, err := conn.Read(buf); err != nil { t.Errorf("expected: %s, got %s", path, string(data))
t.Fatalf("error reading from proxy: %v", err)
}
if string(buf) != magic {
t.Fatalf("bad echo from proxy: got: %q, expected %q", string(buf), magic)
} }
} }
func TestProxy(t *testing.T) { func TestProxy(t *testing.T) {
port, err := echoServer(t, "127.0.0.1:0")
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
lb := NewLoadBalancerRR() lb := NewLoadBalancerRR()
lb.OnUpdate([]api.Endpoints{ lb.OnUpdate([]api.Endpoints{
{JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}}) {JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}})
@ -95,11 +89,6 @@ func TestProxy(t *testing.T) {
} }
func TestProxyStop(t *testing.T) { func TestProxyStop(t *testing.T) {
port, err := echoServer(t, "127.0.0.1:0")
if err != nil {
t.Fatal(err)
}
lb := NewLoadBalancerRR() lb := NewLoadBalancerRR()
lb.OnUpdate([]api.Endpoints{{JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}}) lb.OnUpdate([]api.Endpoints{{JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}})
@ -123,11 +112,6 @@ func TestProxyStop(t *testing.T) {
} }
func TestProxyUpdateDelete(t *testing.T) { func TestProxyUpdateDelete(t *testing.T) {
port, err := echoServer(t, "127.0.0.1:0")
if err != nil {
t.Fatal(err)
}
lb := NewLoadBalancerRR() lb := NewLoadBalancerRR()
lb.OnUpdate([]api.Endpoints{{JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}}) lb.OnUpdate([]api.Endpoints{{JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}})
@ -150,11 +134,6 @@ func TestProxyUpdateDelete(t *testing.T) {
} }
func TestProxyUpdatePort(t *testing.T) { func TestProxyUpdatePort(t *testing.T) {
port, err := echoServer(t, "127.0.0.1:0")
if err != nil {
t.Fatal(err)
}
lb := NewLoadBalancerRR() lb := NewLoadBalancerRR()
lb.OnUpdate([]api.Endpoints{{JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}}) lb.OnUpdate([]api.Endpoints{{JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}})
@ -167,19 +146,22 @@ func TestProxyUpdatePort(t *testing.T) {
// add a new dummy listener in order to get a port that is free // add a new dummy listener in order to get a port that is free
l, _ := net.Listen("tcp", ":0") l, _ := net.Listen("tcp", ":0")
_, port, _ = net.SplitHostPort(l.Addr().String()) _, newPort, _ := net.SplitHostPort(l.Addr().String())
portNum, _ := strconv.Atoi(port) portNum, _ := strconv.Atoi(newPort)
l.Close() l.Close()
// Wait for the socket to actually get free. // Wait for the socket to actually get free.
if err := waitForClosedPort(p, port); err != nil { if err := waitForClosedPort(p, newPort); err != nil {
t.Fatalf(err.Error()) t.Fatalf(err.Error())
} }
if proxyPort == newPort {
t.Errorf("expected difference, got %s %s", newPort, proxyPort)
}
p.OnUpdate([]api.Service{ p.OnUpdate([]api.Service{
{JSONBase: api.JSONBase{ID: "echo"}, Port: portNum}, {JSONBase: api.JSONBase{ID: "echo"}, Port: portNum},
}) })
if err := waitForClosedPort(p, proxyPort); err != nil { if err := waitForClosedPort(p, proxyPort); err != nil {
t.Fatalf(err.Error()) t.Fatalf(err.Error())
} }
testEchoConnection(t, "127.0.0.1", port) testEchoConnection(t, "127.0.0.1", newPort)
} }