mirror of
https://github.com/golang/go
synced 2024-10-07 07:41:21 -06:00
136 lines
2.5 KiB
Go
136 lines
2.5 KiB
Go
|
// 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)
|
||
|
}
|
||
|
}
|