}
type handlerTest struct {
+ logbuf bytes.Buffer
handler Handler
}
func newHandlerTest(h Handler) handlerTest {
- return handlerTest{h}
+ return handlerTest{handler: h}
}
-func (ht handlerTest) rawResponse(req string) string {
+func (ht *handlerTest) rawResponse(req string) string {
reqb := reqBytes(req)
var output bytes.Buffer
conn := &rwTestConn{
closec: make(chan bool, 1),
}
ln := &oneConnListener{conn: conn}
- go Serve(ln, ht.handler)
+ srv := &Server{
+ ErrorLog: log.New(&ht.logbuf, "", 0),
+ Handler: ht.handler,
+ }
+ go srv.Serve(ln)
<-conn.closec
return output.String()
}
tests := []struct {
name string
handler func(ResponseWriter, *Request)
- check func(output string) error
+ check func(got, logs string) error
}{
{
name: "write without Header",
handler: func(rw ResponseWriter, r *Request) {
rw.Write([]byte("hello world"))
},
- check: func(got string) error {
+ check: func(got, logs string) error {
if !strings.Contains(got, "Content-Length:") {
return errors.New("no content-length")
}
rw.Write([]byte("hello world"))
h.Set("Too-Late", "bogus")
},
- check: func(got string) error {
+ check: func(got, logs string) error {
if !strings.Contains(got, "Content-Length:") {
return errors.New("no content-length")
}
rw.Write([]byte("hello world"))
rw.Header().Set("Too-Late", "Write already wrote headers")
},
- check: func(got string) error {
+ check: func(got, logs string) error {
if strings.Contains(got, "Too-Late") {
return errors.New("header appeared from after WriteHeader")
}
rw.Write([]byte("post-flush"))
rw.Header().Set("Too-Late", "Write already wrote headers")
},
- check: func(got string) error {
+ check: func(got, logs string) error {
if !strings.Contains(got, "Transfer-Encoding: chunked") {
return errors.New("not chunked")
}
rw.Write([]byte("post-flush"))
rw.Header().Set("Too-Late", "Write already wrote headers")
},
- check: func(got string) error {
+ check: func(got, logs string) error {
if !strings.Contains(got, "Transfer-Encoding: chunked") {
return errors.New("not chunked")
}
rw.Write([]byte("<html><head></head><body>some html</body></html>"))
rw.Header().Set("Content-Type", "x/wrong")
},
- check: func(got string) error {
+ check: func(got, logs string) error {
if !strings.Contains(got, "Content-Type: text/html") {
return errors.New("wrong content-type; want html")
}
rw.Header().Set("Content-Type", "some/type")
rw.Write([]byte("<html><head></head><body>some html</body></html>"))
},
- check: func(got string) error {
+ check: func(got, logs string) error {
if !strings.Contains(got, "Content-Type: some/type") {
return errors.New("wrong content-type; want html")
}
name: "empty handler",
handler: func(rw ResponseWriter, r *Request) {
},
- check: func(got string) error {
+ check: func(got, logs string) error {
if !strings.Contains(got, "Content-Length: 0") {
return errors.New("want 0 content-length")
}
handler: func(rw ResponseWriter, r *Request) {
rw.Header().Set("Some-Header", "some-value")
},
- check: func(got string) error {
+ check: func(got, logs string) error {
if !strings.Contains(got, "Some-Header") {
return errors.New("didn't get header")
}
rw.WriteHeader(404)
rw.Header().Set("Too-Late", "some-value")
},
- check: func(got string) error {
+ check: func(got, logs string) error {
if !strings.Contains(got, "404") {
return errors.New("wrong status")
}
rw.WriteHeader(200)
rw.Write([]byte("<!doctype html>\n<html><head></head><body>some html</body></html>"))
},
- check: func(got string) error {
+ check: func(got, logs string) error {
if !strings.Contains(got, "Content-Type: application/octet-stream\r\n") {
return errors.New("Output should have an innocuous content-type")
}
if strings.Contains(got, "text/html") {
return errors.New("Output should not have a guess")
}
+ if !strings.Contains(logs, "X-Content-Type-Options:nosniff but no Content-Type") {
+ return errors.New("Expected log message")
+ }
return nil
},
},
for _, tc := range tests {
ht := newHandlerTest(HandlerFunc(tc.handler))
got := ht.rawResponse("GET / HTTP/1.1\nHost: golang.org")
- if err := tc.check(got); err != nil {
- t.Errorf("%s: %v\nGot response:\n%s", tc.name, err, got)
+ logs := ht.logbuf.String()
+ if err := tc.check(got, logs); err != nil {
+ t.Errorf("%s: %v\nGot response:\n%s\n\n%s", tc.name, err, got, logs)
}
}
}