bine/tests/tor_listen_test.go

67 lines
2.3 KiB
Go

package tests
import (
"context"
"net/http"
"testing"
"time"
"git.openprivacy.ca/openprivacy/bine/tor"
"git.openprivacy.ca/openprivacy/bine/torutil"
)
func TestListenSimpleHTTPV2(t *testing.T) {
ctx := GlobalEnabledNetworkContext(t)
// Create an onion service to listen on random port but show as 80
conf := &tor.ListenConf{RemotePorts: []int{80}}
client, server, onion := startHTTPServer(ctx, conf, "/test", func(w http.ResponseWriter, r *http.Request) {
_, err := w.Write([]byte("Test Content"))
ctx.Require.NoError(err)
})
// Check the service ID
ctx.Require.Equal(torutil.OnionServiceIDFromPrivateKey(onion.Key), onion.ID)
defer server.Shutdown(ctx)
// Call /test
byts := httpGet(ctx, client, "http://"+onion.ID+".onion/test")
ctx.Require.Equal("Test Content", string(byts))
}
func TestListenSimpleHTTPV3(t *testing.T) {
ctx := GlobalEnabledNetworkContext(t)
// Create an onion service to listen on random port but show as 80
conf := &tor.ListenConf{RemotePorts: []int{80}, Version3: true}
// _, conf.Key, _ = ed25519.GenerateKey(nil)
client, server, onion := startHTTPServer(ctx, conf, "/test", func(w http.ResponseWriter, r *http.Request) {
_, err := w.Write([]byte("Test Content"))
ctx.Require.NoError(err)
})
defer server.Shutdown(ctx)
// Check the service ID
ctx.Require.Equal(torutil.OnionServiceIDFromPrivateKey(onion.Key), onion.ID)
// Call /test
byts := httpGet(ctx, client, "http://"+onion.ID+".onion/test")
ctx.Require.Equal("Test Content", string(byts))
}
// Only have to shutdown the HTTP server
func startHTTPServer(
ctx *TestContext,
listenConf *tor.ListenConf,
handlePattern string,
handler func(http.ResponseWriter, *http.Request),
) (*http.Client, *http.Server, *tor.OnionService) {
httpClient := httpClient(ctx, nil)
// Wait at most a few minutes for the entire test
listenCtx, listenCancel := context.WithTimeout(context.Background(), 4*time.Minute)
defer listenCancel()
// Create an onion service to listen on random port but show as 80
onion, err := ctx.Listen(listenCtx, listenConf)
ctx.Require.NoError(err)
// Make HTTP server
mux := http.NewServeMux()
mux.HandleFunc(handlePattern, handler)
httpServer := &http.Server{Handler: mux}
go func() { ctx.Require.Equal(http.ErrServerClosed, httpServer.Serve(onion)) }()
return httpClient, httpServer, onion
}