aboutsummaryrefslogtreecommitdiff
path: root/request_test.go
blob: 34719308befdeb425faf2400959c6f1020856461 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package gemini

import (
	"bufio"
	"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",
			Err: ErrInvalidRequest,
		},
		{
			Raw: "gemini://example.com\n",
			Err: ErrInvalidRequest,
		},
		{
			Raw: "gemini://example.com",
			Err: ErrInvalidRequest,
		},
		{
			// 1030 bytes
			Raw: maxURL + "xxxxxx",
			Err: ErrInvalidRequest,
		},
		{
			// 1027 bytes
			Raw: maxURL + "x" + "\r\n",
			Err: ErrInvalidRequest,
		},
		{
			// 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,
		},
	}

	for _, test := range tests {
		t.Logf("%s", test.Req.URL)
		var b strings.Builder
		bw := bufio.NewWriter(&b)
		_, err := test.Req.WriteTo(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)
		}
	}
}