diff options
| author | Adnan Maolood <[email protected]> | 2021-02-15 19:20:37 -0500 |
|---|---|---|
| committer | Adnan Maolood <[email protected]> | 2021-02-15 19:20:37 -0500 |
| commit | ec269c5c9d8bb338e472716f7c15b09235cade4b (patch) | |
| tree | c1b1dea3ea639e4e2a6d09fbfd92c2affcbb9f95 /request_test.go | |
| parent | Return ErrInvalidResponse on error reading status (diff) | |
| download | go-gemini-ec269c5c9d8bb338e472716f7c15b09235cade4b.tar.xz go-gemini-ec269c5c9d8bb338e472716f7c15b09235cade4b.zip | |
Add some tests
Diffstat (limited to 'request_test.go')
| -rw-r--r-- | request_test.go | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/request_test.go b/request_test.go new file mode 100644 index 0000000..ea42c70 --- /dev/null +++ b/request_test.go @@ -0,0 +1,148 @@ +package gemini + +import ( + "bufio" + "io" + "net/url" + "strings" + "testing" +) + +// 1024 bytes +const maxURL = "gemini://example.net/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + +func TestReadRequest(t *testing.T) { + tests := []struct { + Raw string + URL *url.URL + Err error + }{ + { + Raw: "gemini://example.com\r\n", + URL: &url.URL{ + Scheme: "gemini", + Host: "example.com", + }, + }, + { + Raw: "http://example.org/path/?query#fragment\r\n", + URL: &url.URL{ + Scheme: "http", + Host: "example.org", + Path: "/path/", + RawQuery: "query", + Fragment: "fragment", + }, + }, + { + Raw: "\r\n", + URL: &url.URL{}, + }, + { + Raw: "gemini://example.com\n", + Err: io.EOF, + }, + { + Raw: "gemini://example.com", + Err: io.EOF, + }, + { + Raw: "gemini://user:[email protected]\r\n", + Err: ErrInvalidURL, + }, + { + Raw: "https://user:[email protected]\r\n", + Err: ErrInvalidURL, + }, + { + // 1030 bytes + Raw: maxURL + "xxxxxx", + Err: io.EOF, + }, + { + // 1027 bytes + Raw: maxURL + "x" + "\r\n", + Err: io.EOF, + }, + { + // 1024 bytes + Raw: maxURL[:len(maxURL)-2] + "\r\n", + URL: &url.URL{ + Scheme: "gemini", + Host: "example.net", + Path: maxURL[len("gemini://example.net") : len(maxURL)-2], + }, + }, + } + + for _, test := range tests { + t.Logf("%#v", test.Raw) + req, err := ReadRequest(strings.NewReader(test.Raw)) + if err != test.Err { + t.Errorf("expected err = %v, got %v", test.Err, err) + } + if req == nil && test.URL != nil { + t.Errorf("expected url = %s, got nil", test.URL) + } else if req != nil && test.URL == nil { + t.Errorf("expected req = nil, got %v", req) + } else if req != nil && *req.URL != *test.URL { + t.Errorf("expected url = %v, got %v", *test.URL, *req.URL) + } + } +} + +func newRequest(rawurl string) *Request { + req, err := NewRequest(rawurl) + if err != nil { + panic(err) + } + return req +} + +func TestWriteRequest(t *testing.T) { + tests := []struct { + Req *Request + Raw string + Err error + }{ + { + Req: newRequest("gemini://example.com"), + Raw: "gemini://example.com\r\n", + }, + { + Req: newRequest("gemini://example.com/path/?query#fragment"), + Raw: "gemini://example.com/path/?query#fragment\r\n", + }, + { + Req: newRequest(maxURL), + Raw: maxURL + "\r\n", + }, + { + Req: newRequest(maxURL + "x"), + Err: ErrInvalidRequest, + }, + { + Req: newRequest("gemini://user:[email protected]"), + Err: ErrInvalidURL, + }, + { + Req: newRequest("https://user:[email protected]"), + Err: ErrInvalidURL, + }, + } + + for _, test := range tests { + t.Logf("%s", test.Req.URL) + var b strings.Builder + bw := bufio.NewWriter(&b) + err := test.Req.Write(bw) + if err != test.Err { + t.Errorf("expected err = %v, got %v", test.Err, err) + } + bw.Flush() + got := b.String() + if got != test.Raw { + t.Errorf("expected %#v, got %#v", test.Raw, got) + } + } +} |