1
Fork 0
galene/webserver/precondition_test.go

115 lines
2.2 KiB
Go

package webserver
import (
"net/http"
"testing"
)
type testWriter struct {
statusCode int
}
func (w *testWriter) Header() http.Header {
return nil
}
func (w *testWriter) Write(buf []byte) (int, error) {
return len(buf), nil
}
func (w *testWriter) WriteHeader(statusCode int) {
if w.statusCode != 0 {
panic("WriteHeader called twice")
}
w.statusCode = statusCode
}
func TestEtagMatch(t *testing.T) {
type tst struct {
etag, header string
}
var match = []tst{
{`"foo"`, `"foo"`},
{`"foo"`, ` "foo"`},
{`"foo"`, `"foo" `},
{`"foo"`, ` "foo" `},
{`"foo"`, `"foo", "bar"`},
{`"foo"`, `"bar", "foo"`},
{`W/"foo"`, `W/"foo"`},
}
var mismatch = []tst{
{``, ``},
{``, `*`},
{``, `"foo"`},
{`"foo"`, ``},
{`"foo"`, `"bar"`},
{`"foo"`, `"bar", "baz"`},
{`"foo"`, `"baz", "bar"`},
{`"foo"`, `W/"foo"`},
{`W/"foo"`, `"foo"`},
}
for _, tst := range match {
m := etagMatch(tst.etag, tst.header)
if !m {
t.Errorf("%#v %#v: got %v, expected true",
tst.etag, tst.header, m,
)
}
}
for _, tst := range mismatch {
m := etagMatch(tst.etag, tst.header)
if m {
t.Errorf("%#v %#v: got %v, expected false",
tst.etag, tst.header, m,
)
}
}
}
func TestCheckPreconditions(t *testing.T) {
var tests = []struct {
method, etag, im, inm string
result int
}{
{"GET", ``, ``, ``, 0},
{"GET", ``, `*`, ``, 412},
{"GET", ``, ``, `*`, 0},
{"POST", ``, `*`, ``, 412},
{"POST", ``, ``, `*`, 0},
{"GET", `"123"`, ``, ``, 0},
{"GET", `"123"`, `"123"`, ``, 0},
{"GET", `"123"`, `"124"`, ``, 412},
{"POST", `"123"`, `"124"`, ``, 412},
{"GET", `"123"`, `*`, ``, 0},
{"GET", `"123"`, ``, `"123"`, 304},
{"POST", `"123"`, ``, `"123"`, 412},
{"GET", `"123"`, ``, `"124"`, 0},
{"GET", `"123"`, ``, `*`, 304},
}
for _, tst := range tests {
var w testWriter
h := make(http.Header)
if tst.im != "" {
h.Set("If-Match", tst.im)
}
if tst.inm != "" {
h.Set("If-None-Match", tst.inm)
}
r := http.Request{
Method: tst.method,
Header: h,
}
done := checkPreconditions(&w, &r, tst.etag)
if done != (tst.result != 0) || w.statusCode != tst.result {
t.Errorf("%#v %#v %#v: got %v, expected %v",
tst.etag, tst.im, tst.inm,
w.statusCode, tst.result)
}
}
}