This is a fork of: https://github.com/roglew/puppy
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

199 lines
5.4 KiB

package puppy
import (
"net/url"
"runtime"
"testing"
// "bytes"
// "net/http"
// "bufio"
// "os"
)
type statusLiner interface {
StatusLine() string
}
func checkStr(t *testing.T, result, expected string) {
if result != expected {
_, f, ln, _ := runtime.Caller(1)
t.Errorf("Failed search test at %s:%d. Expected '%s', got '%s'", f, ln, expected, result)
}
}
func checkStatusline(t *testing.T, msg statusLiner, expected string) {
result := msg.StatusLine()
checkStr(t, expected, result)
}
func TestStatusline(t *testing.T) {
req := testReq()
checkStr(t, req.StatusLine(), "POST /?foo=bar HTTP/1.1")
req.Method = "GET"
checkStr(t, req.StatusLine(), "GET /?foo=bar HTTP/1.1")
req.URL.Fragment = "foofrag"
checkStr(t, req.StatusLine(), "GET /?foo=bar#foofrag HTTP/1.1")
req.URL.User = url.UserPassword("foo", "bar")
checkStr(t, req.StatusLine(), "GET /?foo=bar#foofrag HTTP/1.1")
req.URL.Scheme = "http"
checkStr(t, req.StatusLine(), "GET /?foo=bar#foofrag HTTP/1.1")
req.URL.Opaque = "foobaropaque"
checkStr(t, req.StatusLine(), "GET /?foo=bar#foofrag HTTP/1.1")
req.URL.Opaque = ""
req.URL.Host = "foobarhost"
checkStr(t, req.StatusLine(), "GET /?foo=bar#foofrag HTTP/1.1")
// rsp.Status is actually "200 OK" but the "200 " gets stripped from the front
rsp := req.ServerResponse
checkStr(t, rsp.StatusLine(), "HTTP/1.1 200 OK")
rsp.StatusCode = 404
checkStr(t, rsp.StatusLine(), "HTTP/1.1 404 200 OK")
rsp.Status = "is not there plz"
checkStr(t, rsp.StatusLine(), "HTTP/1.1 404 is not there plz")
// Same as with "200 OK"
rsp.Status = "404 is not there plz"
checkStr(t, rsp.StatusLine(), "HTTP/1.1 404 is not there plz")
}
func TestEq(t *testing.T) {
req1 := testReq()
req2 := testReq()
// Requests
if !req1.Eq(req2) {
t.Error("failed eq")
}
if !req2.Eq(req1) {
t.Error("failed eq")
}
req1.Header = map[string][]string{
"Foo": []string{"Bar", "Baz"},
"Foo2": []string{"Bar2", "Baz2"},
"Cookie": []string{"cookie=cocks"},
}
req2.Header = map[string][]string{
"Foo": []string{"Bar", "Baz"},
"Foo2": []string{"Bar2", "Baz2"},
"Cookie": []string{"cookie=cocks"},
}
if !req1.Eq(req2) {
t.Error("failed eq")
}
req2.Header = map[string][]string{
"Foo": []string{"Baz", "Bar"},
"Foo2": []string{"Bar2", "Baz2"},
"Cookie": []string{"cookie=cocks"},
}
if req1.Eq(req2) {
t.Error("failed eq")
}
req2.Header = map[string][]string{
"Foo": []string{"Bar", "Baz"},
"Foo2": []string{"Bar2", "Baz2"},
"Cookie": []string{"cookiee=cocks"},
}
if req1.Eq(req2) {
t.Error("failed eq")
}
req2 = testReq()
req2.URL.Host = "foobar"
if req1.Eq(req2) {
t.Error("failed eq")
}
req2 = testReq()
// Responses
if !req1.ServerResponse.Eq(req2.ServerResponse) {
t.Error("failed eq")
}
if !req2.ServerResponse.Eq(req1.ServerResponse) {
t.Error("failed eq")
}
req2.ServerResponse.StatusCode = 404
if req1.ServerResponse.Eq(req2.ServerResponse) {
t.Error("failed eq")
}
}
func TestDeepClone(t *testing.T) {
req1 := testReq()
req2 := req1.DeepClone()
if !req1.Eq(req2) {
t.Errorf("cloned request does not match original.\nExpected:\n%s\n-----\nGot:\n%s\n-----",
string(req1.FullMessage()), string(req2.FullMessage()))
}
if !req1.ServerResponse.Eq(req2.ServerResponse) {
t.Errorf("cloned response does not match original.\nExpected:\n%s\n-----\nGot:\n%s\n-----",
string(req1.ServerResponse.FullMessage()), string(req2.ServerResponse.FullMessage()))
}
rsp1 := req1.ServerResponse.Clone()
rsp1.Status = "foobarbaz"
rsp2 := rsp1.Clone()
if !rsp1.Eq(rsp2) {
t.Errorf("cloned response does not match original.\nExpected:\n%s\n-----\nGot:\n%s\n-----",
string(rsp1.FullMessage()), string(rsp2.FullMessage()))
}
rsp1 = req1.ServerResponse.Clone()
rsp1.ProtoMinor = 7
rsp2 = rsp1.Clone()
if !rsp1.Eq(rsp2) {
t.Errorf("cloned response does not match original.\nExpected:\n%s\n-----\nGot:\n%s\n-----",
string(rsp1.FullMessage()), string(rsp2.FullMessage()))
}
rsp1 = req1.ServerResponse.Clone()
rsp1.StatusCode = 234
rsp2 = rsp1.Clone()
if !rsp1.Eq(rsp2) {
t.Errorf("cloned response does not match original.\nExpected:\n%s\n-----\nGot:\n%s\n-----",
string(rsp1.FullMessage()), string(rsp2.FullMessage()))
}
}
// func TestFromBytes(t *testing.T) {
// rsp, err := ProxyResponseFromBytes([]byte("HTTP/1.1 200 OK\r\nFoo: Bar\r\n\r\nAAAA"))
// if err != nil {
// panic(err)
// }
// checkStr(t, string(rsp.BodyBytes()), "AAAA")
// checkStr(t, string(rsp.Header.Get("Content-Length")[0]), "4")
// //rspbytes := []byte("HTTP/1.0 200 OK\r\nServer: BaseHTTP/0.3 Python/2.7.11\r\nDate: Fri, 10 Mar 2017 18:21:27 GMT\r\n\r\nCLIENT VALUES:\nclient_address=('127.0.0.1', 62069) (1.0.0.127.in-addr.arpa)\ncommand=GET\npath=/?foo=foobar\nreal path=/\nquery=foo=foobar\nrequest_version=HTTP/1.1\n\nSERVER VALUES:\nserver_version=BaseHTTP/0.3\nsys_version=Python/2.7.11\nprotocol_version=HTTP/1.0")
// rspbytes := []byte("HTTP/1.0 200 OK\r\n\r\nAAAA")
// buf := bytes.NewBuffer(rspbytes)
// httpRsp, err := http.ReadResponse(bufio.NewReader(buf), nil)
// httpRsp.Close = false
// //rsp2 := NewProxyResponse(httpRsp)
// buf2 := bytes.NewBuffer(make([]byte, 0))
// httpRsp.Write(buf2)
// httpRsp2, err := http.ReadResponse(bufio.NewReader(buf2), nil)
// // fmt.Println(string(rsp2.FullMessage()))
// // fmt.Println(rsp2.Header)
// // if len(rsp2.Header["Connection"]) > 1 {
// // t.Errorf("too many connection headers")
// // }
// }