2023-01-11 20:19:42 +00:00
|
|
|
package gemini_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"context"
|
|
|
|
"crypto/tls"
|
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"net/url"
|
|
|
|
"testing"
|
|
|
|
|
2023-01-24 14:36:28 +00:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
2023-01-17 22:59:29 +00:00
|
|
|
"tildegit.org/tjp/gus"
|
2023-01-11 20:19:42 +00:00
|
|
|
"tildegit.org/tjp/gus/gemini"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestRoundTrip(t *testing.T) {
|
|
|
|
tlsConf, err := gemini.FileTLS("./testdata/server.crt", "./testdata/server.key")
|
2023-01-24 14:36:28 +00:00
|
|
|
require.Nil(t, err)
|
2023-01-11 20:19:42 +00:00
|
|
|
|
2023-01-17 22:59:29 +00:00
|
|
|
handler := func(ctx context.Context, req *gus.Request) *gus.Response {
|
2023-01-11 20:19:42 +00:00
|
|
|
return gemini.Success("text/gemini", bytes.NewBufferString("you've found my page"))
|
|
|
|
}
|
|
|
|
|
2023-01-24 05:15:16 +00:00
|
|
|
server, err := gemini.NewServer(context.Background(), nil, tlsConf, "tcp", "127.0.0.1:0", handler)
|
2023-01-24 14:36:28 +00:00
|
|
|
require.Nil(t, err)
|
2023-01-11 20:19:42 +00:00
|
|
|
|
2023-01-25 02:59:47 +00:00
|
|
|
go func() {
|
|
|
|
_ = server.Serve()
|
|
|
|
}()
|
2023-01-11 20:19:42 +00:00
|
|
|
defer server.Close()
|
|
|
|
|
|
|
|
u, err := url.Parse(fmt.Sprintf("gemini://%s/test", server.Address()))
|
2023-01-24 14:36:28 +00:00
|
|
|
require.Nil(t, err)
|
2023-01-11 20:19:42 +00:00
|
|
|
|
|
|
|
cli := gemini.NewClient(testClientTLS())
|
2023-01-17 22:59:29 +00:00
|
|
|
response, err := cli.RoundTrip(&gus.Request{URL: u})
|
2023-01-24 14:36:28 +00:00
|
|
|
require.Nil(t, err)
|
2023-01-11 20:19:42 +00:00
|
|
|
|
2023-01-24 14:36:28 +00:00
|
|
|
assert.Equal(t, gemini.StatusSuccess, response.Status)
|
|
|
|
assert.Equal(t, "text/gemini", response.Meta)
|
2023-01-11 20:19:42 +00:00
|
|
|
|
2023-01-24 14:36:28 +00:00
|
|
|
require.NotNil(t, response.Body)
|
2023-01-11 20:19:42 +00:00
|
|
|
body, err := io.ReadAll(response.Body)
|
2023-01-24 14:36:28 +00:00
|
|
|
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)
|
2023-01-11 20:19:42 +00:00
|
|
|
}
|
2023-01-24 14:36:28 +00:00
|
|
|
|
|
|
|
server, err := gemini.NewServer(context.Background(), nil, tlsConf, "tcp", "127.0.0.1:0", handler)
|
|
|
|
require.Nil(t, err)
|
|
|
|
|
2023-01-25 02:59:47 +00:00
|
|
|
go func() {
|
|
|
|
_ = server.Serve()
|
|
|
|
}()
|
2023-01-24 14:36:28 +00:00
|
|
|
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)
|
2023-01-11 20:19:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func testClientTLS() *tls.Config {
|
|
|
|
return &tls.Config{InsecureSkipVerify: true}
|
|
|
|
}
|