// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // End-to-end serving tests package http import ( "bytes" "os" "net" "testing" ) type dummyAddr string type oneConnListener struct { conn net.Conn } func (l *oneConnListener) Accept() (c net.Conn, err os.Error) { c = l.conn if c == nil { err = os.EOF return } err = nil l.conn = nil return } func (l *oneConnListener) Close() os.Error { return nil } func (l *oneConnListener) Addr() net.Addr { return dummyAddr("test-address") } func (a dummyAddr) Network() string { return string(a) } func (a dummyAddr) String() string { return string(a) } type testConn struct { readBuf bytes.Buffer writeBuf bytes.Buffer } func (c *testConn) Read(b []byte) (int, os.Error) { return c.readBuf.Read(b) } func (c *testConn) Write(b []byte) (int, os.Error) { return c.writeBuf.Write(b) } func (c *testConn) Close() os.Error { return nil } func (c *testConn) LocalAddr() net.Addr { return dummyAddr("local-addr") } func (c *testConn) RemoteAddr() net.Addr { return dummyAddr("remote-addr") } func (c *testConn) SetTimeout(nsec int64) os.Error { return nil } func (c *testConn) SetReadTimeout(nsec int64) os.Error { return nil } func (c *testConn) SetWriteTimeout(nsec int64) os.Error { return nil } func TestConsumingBodyOnNextConn(t *testing.T) { conn := new(testConn) for i := 0; i < 2; i++ { conn.readBuf.Write([]byte( "POST / HTTP/1.1\r\n" + "Host: test\r\n" + "Content-Length: 11\r\n" + "\r\n" + "foo=1&bar=1")) } reqNum := 0 ch := make(chan *Request) servech := make(chan os.Error) listener := &oneConnListener{conn} handler := func(res ResponseWriter, req *Request) { reqNum++ t.Logf("Got request #%d: %v", reqNum, req) ch <- req } go func() { servech <- Serve(listener, HandlerFunc(handler)) }() var req *Request t.Log("Waiting for first request.") req = <-ch if req == nil { t.Fatal("Got nil first request.") } if req.Method != "POST" { t.Errorf("For request #1's method, got %q; expected %q", req.Method, "POST") } t.Log("Waiting for second request.") req = <-ch if req == nil { t.Fatal("Got nil first request.") } if req.Method != "POST" { t.Errorf("For request #2's method, got %q; expected %q", req.Method, "POST") } t.Log("Waiting for EOF.") if serveerr := <-servech; serveerr != os.EOF { t.Errorf("Serve returned %q; expected EOF", serveerr) } }