mirror of
https://github.com/jech/galene.git
synced 2024-11-25 10:05:58 +01:00
115 lines
2.2 KiB
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)
|
||
|
}
|
||
|
}
|
||
|
}
|