Files
portmaster/spn/ships/connection_test.go

132 lines
2.5 KiB
Go

package ships
import (
"context"
"fmt"
"net"
"sync"
"testing"
"github.com/stretchr/testify/assert"
"github.com/safing/portmaster/spn/hub"
)
var (
testPort uint16 = 65000
testData = []byte("The quick brown fox jumps over the lazy dog")
localhost = net.IPv4(127, 0, 0, 1)
)
func getTestPort() uint16 {
testPort++
return testPort
}
func getTestBuf() []byte {
return make([]byte, len(testData))
}
func TestConnections(t *testing.T) {
t.Parallel()
registryLock.Lock()
t.Cleanup(func() {
registryLock.Unlock()
})
for k, v := range registry { //nolint:paralleltest // False positive.
protocol, builder := k, v
t.Run(protocol, func(t *testing.T) {
t.Parallel()
var wg sync.WaitGroup
ctx, cancelCtx := context.WithCancel(context.Background())
// docking requests
dockingRequests := make(chan Ship, 1)
transport := &hub.Transport{
Protocol: protocol,
Port: getTestPort(),
}
// create listener
pier, err := builder.EstablishPier(transport, dockingRequests)
if err != nil {
t.Fatal(err)
}
// connect to listener
ship, err := builder.LaunchShip(ctx, transport, localhost)
if err != nil {
t.Fatal(err)
}
// client send
err = ship.Load(testData)
if err != nil {
t.Fatalf("%s failed: %s", ship, err)
}
// dock client
srvShip := <-dockingRequests
if srvShip == nil {
t.Fatalf("%s failed to dock", pier)
}
// server recv
buf := getTestBuf()
_, err = srvShip.UnloadTo(buf)
if err != nil {
t.Fatalf("%s failed: %s", ship, err)
}
// check data
assert.Equal(t, testData, buf, "should match")
fmt.Print(".")
for i := 0; i < 100; i++ {
// server send
err = srvShip.Load(testData)
if err != nil {
t.Fatalf("%s failed: %s", ship, err)
}
// client recv
buf = getTestBuf()
_, err = ship.UnloadTo(buf)
if err != nil {
t.Fatalf("%s failed: %s", ship, err)
}
// check data
assert.Equal(t, testData, buf, "should match")
fmt.Print(".")
// client send
err = ship.Load(testData)
if err != nil {
t.Fatalf("%s failed: %s", ship, err)
}
// server recv
buf = getTestBuf()
_, err = srvShip.UnloadTo(buf)
if err != nil {
t.Fatalf("%s failed: %s", ship, err)
}
// check data
assert.Equal(t, testData, buf, "should match")
fmt.Print(".")
}
ship.Sink()
srvShip.Sink()
pier.Abolish()
cancelCtx()
wg.Wait() // wait for docking procedure to end
})
}
}