go-ssb-room/internal/network/isserver_test.go

91 lines
1.8 KiB
Go

// SPDX-FileCopyrightText: 2021 The NGI Pointer Secure-Scuttlebutt Team of 2020/2021
//
// SPDX-License-Identifier: MIT
package network_test
import (
"context"
"crypto/rand"
"net"
"os"
"testing"
"github.com/ssbc/go-ssb-room/v2/internal/maybemod/keys"
"github.com/ssbc/go-ssb-room/v2/internal/network"
"go.mindeco.de/log"
"github.com/ssbc/go-muxrpc/v2"
"github.com/stretchr/testify/require"
)
func TestIsServer(t *testing.T) {
r := require.New(t)
ctx := context.Background()
var appkey = make([]byte, 32)
rand.Read(appkey)
logger := log.NewLogfmtLogger(os.Stderr)
kpClient, err := keys.NewKeyPair(nil)
r.NoError(err)
kpServ, err := keys.NewKeyPair(nil)
r.NoError(err)
client, err := network.New(network.Options{
Logger: logger,
AppKey: appkey,
KeyPair: kpClient,
MakeHandler: makeServerHandler(t, true),
})
r.NoError(err)
server, err := network.New(network.Options{
Logger: logger,
AppKey: appkey,
KeyPair: kpServ,
ListenAddr: &net.TCPAddr{Port: 0}, // any random port
MakeHandler: makeServerHandler(t, false),
})
r.NoError(err)
go func() {
err = server.Serve(ctx)
if err != nil {
panic(err)
}
}()
err = client.Connect(ctx, server.GetListenAddr())
r.NoError(err)
client.Close()
server.Close()
}
type testHandler struct {
t *testing.T
wantServer bool
}
func (testHandler) Handled(muxrpc.Method) bool { return true }
func (th testHandler) HandleConnect(ctx context.Context, e muxrpc.Endpoint) {
require.Equal(th.t, th.wantServer, muxrpc.IsServer(e), "server assertion failed")
}
func (th testHandler) HandleCall(ctx context.Context, req *muxrpc.Request) {}
func makeServerHandler(t *testing.T, wantServer bool) func(net.Conn) (muxrpc.Handler, error) {
return func(_ net.Conn) (muxrpc.Handler, error) {
return testHandler{t, wantServer}, nil
}
}