mirror of
https://github.com/coder/coder.git
synced 2025-07-12 00:14:10 +00:00
* feat: Add peerbroker proxy for agent connections Agents will connect using this proxy. Eventually we'll intercept some of these messages for validation, but that's not necessary right now. * Add ASCII chart
82 lines
2.2 KiB
Go
82 lines
2.2 KiB
Go
package peerbroker_test
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/pion/webrtc/v3"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"cdr.dev/slog"
|
|
"cdr.dev/slog/sloggers/slogtest"
|
|
"github.com/coder/coder/database"
|
|
"github.com/coder/coder/peer"
|
|
"github.com/coder/coder/peerbroker"
|
|
"github.com/coder/coder/peerbroker/proto"
|
|
"github.com/coder/coder/provisionersdk"
|
|
)
|
|
|
|
func TestProxy(t *testing.T) {
|
|
t.Parallel()
|
|
ctx := context.Background()
|
|
channelID := "hello"
|
|
pubsub := database.NewPubsubInMemory()
|
|
dialerClient, dialerServer := provisionersdk.TransportPipe()
|
|
defer dialerClient.Close()
|
|
defer dialerServer.Close()
|
|
listenerClient, listenerServer := provisionersdk.TransportPipe()
|
|
defer listenerClient.Close()
|
|
defer listenerServer.Close()
|
|
|
|
listener, err := peerbroker.Listen(listenerServer, &peer.ConnOptions{
|
|
Logger: slogtest.Make(t, nil).Named("server").Leveled(slog.LevelDebug),
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
proxyCloser, err := peerbroker.ProxyDial(proto.NewDRPCPeerBrokerClient(provisionersdk.Conn(listenerClient)), peerbroker.ProxyOptions{
|
|
ChannelID: channelID,
|
|
Logger: slogtest.Make(t, nil).Named("proxy-listen").Leveled(slog.LevelDebug),
|
|
Pubsub: pubsub,
|
|
})
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
_ = proxyCloser.Close()
|
|
})
|
|
|
|
var wg sync.WaitGroup
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
err = peerbroker.ProxyListen(ctx, dialerServer, peerbroker.ProxyOptions{
|
|
ChannelID: channelID,
|
|
Logger: slogtest.Make(t, nil).Named("proxy-dial").Leveled(slog.LevelDebug),
|
|
Pubsub: pubsub,
|
|
})
|
|
require.NoError(t, err)
|
|
}()
|
|
|
|
api := proto.NewDRPCPeerBrokerClient(provisionersdk.Conn(dialerClient))
|
|
stream, err := api.NegotiateConnection(ctx)
|
|
require.NoError(t, err)
|
|
clientConn, err := peerbroker.Dial(stream, []webrtc.ICEServer{{
|
|
URLs: []string{"stun:stun.l.google.com:19302"},
|
|
}}, &peer.ConnOptions{
|
|
Logger: slogtest.Make(t, nil).Named("client").Leveled(slog.LevelDebug),
|
|
})
|
|
require.NoError(t, err)
|
|
defer clientConn.Close()
|
|
|
|
serverConn, err := listener.Accept()
|
|
require.NoError(t, err)
|
|
defer serverConn.Close()
|
|
_, err = serverConn.Ping()
|
|
require.NoError(t, err)
|
|
|
|
_, err = clientConn.Ping()
|
|
require.NoError(t, err)
|
|
|
|
_ = dialerServer.Close()
|
|
wg.Wait()
|
|
}
|