summaryrefslogtreecommitdiff
path: root/gemini/roundtrip_test.go
blob: a9d9b59cfbb613c099f80bff0233087e98102fe6 (plain)
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
package gemini_test

import (
	"bytes"
	"context"
	"crypto/tls"
	"fmt"
	"io"
	"net/url"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"

	"tildegit.org/tjp/gus"
	"tildegit.org/tjp/gus/gemini"
)

func TestRoundTrip(t *testing.T) {
	tlsConf, err := gemini.FileTLS("./testdata/server.crt", "./testdata/server.key")
	require.Nil(t, err)

	handler := func(ctx context.Context, req *gus.Request) *gus.Response {
		return gemini.Success("text/gemini", bytes.NewBufferString("you've found my page"))
	}

	server, err := gemini.NewServer(context.Background(), "localhost", "tcp", "127.0.0.1:0", handler, nil, tlsConf)
	require.Nil(t, err)

	go func() {
		_ = server.Serve()
	}()
	defer server.Close()

	u, err := url.Parse(fmt.Sprintf("gemini://%s/test", server.Address()))
	require.Nil(t, err)

	cli := gemini.NewClient(testClientTLS())
	response, err := cli.RoundTrip(&gus.Request{URL: u})
	require.Nil(t, err)

	assert.Equal(t, gemini.StatusSuccess, response.Status)
	assert.Equal(t, "text/gemini", response.Meta)

	require.NotNil(t, response.Body)
	body, err := io.ReadAll(response.Body)
	require.Nil(t, err)

	assert.Equal(t, "you've found my page", string(body))
}

func TestTitanRequest(t *testing.T) {
	tlsConf, err := gemini.FileTLS("./testdata/server.crt", "./testdata/server.key")
	require.Nil(t, err)

	invoked := false
	handler := func(ctx context.Context, request *gus.Request) *gus.Response {
		invoked = true

		body := ctx.Value(gemini.TitanRequestBody)
		if !assert.NotNil(t, body) {
			return gemini.Success("", nil)
		}

		bodyBytes, err := io.ReadAll(body.(io.Reader))
		require.Nil(t, err)

		assert.Equal(t, "the request body\n", string(bodyBytes))
		return gemini.Success("", nil)
	}

	server, err := gemini.NewServer(context.Background(), "localhost", "tcp", "127.0.0.1:0", handler, nil, tlsConf)
	require.Nil(t, err)

	go func() {
		_ = server.Serve()
	}()
	defer server.Close()

	conn, err := tls.Dial(server.Network(), server.Address(), testClientTLS())
	require.Nil(t, err)

	_, err = fmt.Fprintf(
		conn,
		"titan://%s/foobar;size=17;mime=text/plain\r\nthe request body\n",
		server.Address(),
	)
	require.Nil(t, err)

	_, err = io.ReadAll(conn)
	require.Nil(t, err)

	assert.True(t, invoked)
}

func testClientTLS() *tls.Config {
	return &tls.Config{InsecureSkipVerify: true}
}