Browse Source

More serverTester test cleanup

Brad Fitzpatrick 11 years ago
parent
commit
307114935b
2 changed files with 62 additions and 53 deletions
  1. 5 2
      http2.go
  2. 57 51
      http2_test.go

+ 5 - 2
http2.go

@@ -221,7 +221,7 @@ func (sc *serverConn) serve() {
 		sc.logf("bogus greeting from client: %q", buf)
 		return
 	}
-	log.Printf("client %v said hello", sc.conn.RemoteAddr())
+	sc.logf("client %v said hello", sc.conn.RemoteAddr())
 
 	f, err := sc.framer.ReadFrame()
 	if err != nil {
@@ -267,7 +267,10 @@ func (sc *serverConn) serve() {
 			if !ok {
 				err := <-sc.readFrameErrCh
 				if err != io.EOF {
-					sc.logf("client %s stopped sending frames: %v", sc.conn.RemoteAddr(), err)
+					errstr := err.Error()
+					if !strings.Contains(errstr, "use of closed network connection") {
+						sc.logf("client %s stopped sending frames: %v", sc.conn.RemoteAddr(), errstr)
+					}
 				}
 				return
 			}

+ 57 - 51
http2_test.go

@@ -11,10 +11,11 @@ import (
 	"crypto/tls"
 	"errors"
 	"fmt"
-	"io"
+	"log"
 	"net"
 	"net/http"
 	"net/http/httptest"
+	"os"
 	"os/exec"
 	"strconv"
 	"strings"
@@ -44,7 +45,7 @@ func newServerTester(t *testing.T, handler http.HandlerFunc) *serverTester {
 	if err != nil {
 		t.Fatal(err)
 	}
-
+	log.SetOutput(twriter{t})
 	return &serverTester{
 		t:  t,
 		ts: ts,
@@ -56,6 +57,7 @@ func newServerTester(t *testing.T, handler http.HandlerFunc) *serverTester {
 func (st *serverTester) Close() {
 	st.ts.Close()
 	st.cc.Close()
+	log.SetOutput(os.Stderr)
 }
 
 func (st *serverTester) writePreface() {
@@ -68,65 +70,60 @@ func (st *serverTester) writePreface() {
 	}
 }
 
-func TestServer(t *testing.T) {
-	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
-		w.Header().Set("Foo", "Bar")
-	})
-	defer st.Close()
-
-	st.writePreface()
-
-	fr := st.fr // temporary from here on
-	if err := fr.WriteSettings(); err != nil {
-		t.Fatal(err)
+func (st *serverTester) writeInitialSettings() {
+	if err := st.fr.WriteSettings(); err != nil {
+		st.t.Fatalf("Error writing initial SETTINGS frame from client to server: %v", err)
 	}
+}
 
-	// Expect first Settings frame.
-	{
-		f, err := fr.ReadFrame()
-		if err != nil {
-			t.Fatal(err)
-		}
-		sf, ok := f.(*SettingsFrame)
-		if !ok {
-			t.Fatalf("Received a %T, not a Settings frame from the server", f)
-		}
-		sf.ForeachSetting(func(s Setting) {
-			t.Logf("Server sent setting %v = %v", s.ID, s.Val)
-		})
+func (st *serverTester) writeSettingsAck() {
+	if err := st.fr.WriteSettingsAck(); err != nil {
+		st.t.Fatalf("Error writing ACK of server's SETTINGS: %v", err)
 	}
+}
 
-	// And expect an ACK of our settings.
-	{
-		f, err := fr.ReadFrame()
-		if err != nil {
-			t.Fatal(err)
-		}
-		sf, ok := f.(*SettingsFrame)
-		if !ok {
-			t.Fatalf("Received a %T, not a Settings ack frame from the server", f)
-		}
-		if !sf.Header().Flags.Has(FlagSettingsAck) {
-			t.Fatal("Settings Frame didn't have ACK set")
-		}
+func (st *serverTester) wantSettings() *SettingsFrame {
+	f, err := st.fr.ReadFrame()
+	if err != nil {
+		st.t.Fatal(err)
 	}
-
-	// TODO: table-itize steps, write request (HEADERS frame), read response.
+	sf, ok := f.(*SettingsFrame)
+	if !ok {
+		st.t.Fatalf("got a %T; want *SettingsFrame", f)
+	}
+	return sf
 }
 
-func mustWrite(t *testing.T, w io.Writer, p []byte) {
-	n, err := w.Write(p)
-	const maxLen = 80
-	l := len(p)
-	if len(p) > maxLen {
-		p = p[:maxLen]
-	}
+func (st *serverTester) wantSettingsAck() {
+	f, err := st.fr.ReadFrame()
 	if err != nil {
-		t.Fatalf("Error writing %d bytes (%q): %v", l, p, err)
+		st.t.Fatal(err)
+	}
+	sf, ok := f.(*SettingsFrame)
+	if !ok {
+		st.t.Fatalf("Wanting a settings ACK, received a %T", f)
 	}
-	if n != len(p) {
-		t.Fatalf("Only wrote %d of %d bytes (%q)", n, l, p)
+	if !sf.Header().Flags.Has(FlagSettingsAck) {
+		st.t.Fatal("Settings Frame didn't have ACK set")
 	}
+
+}
+
+func TestServer(t *testing.T) {
+	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
+		w.Header().Set("Foo", "Bar")
+	})
+	defer st.Close()
+
+	st.writePreface()
+	st.writeInitialSettings()
+	st.wantSettings().ForeachSetting(func(s Setting) {
+		t.Logf("Server sent setting %v = %v", s.ID, s.Val)
+	})
+	st.writeSettingsAck()
+	st.wantSettingsAck()
+
+	// TODO: send a request
 }
 
 func TestServerWithCurl(t *testing.T) {
@@ -225,3 +222,12 @@ func curl(t *testing.T, args ...string) (container string) {
 	}
 	return strings.TrimSpace(string(out))
 }
+
+type twriter struct {
+	t testing.TB
+}
+
+func (w twriter) Write(p []byte) (n int, err error) {
+	w.t.Logf("%s", p)
+	return len(p), nil
+}