mirror of
https://github.com/coder/coder.git
synced 2025-07-12 00:14:10 +00:00
Adds support to our coordinator implementations to send Error updates before disconnecting clients. I was recently debugging a connection issue where the client was getting repeatedly disconnected from the Coordinator, but since we never send any error information it was really hard without server logs. This PR aims to correct that, by sending a CoordinateResponse with `Error` set in cases where we disconnect a client without them asking us to. It also logs the error whenever we get one in the client controller.
85 lines
2.1 KiB
Go
85 lines
2.1 KiB
Go
package test
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/coder/coder/v2/tailnet"
|
|
)
|
|
|
|
func GracefulDisconnectTest(ctx context.Context, t *testing.T, coordinator tailnet.CoordinatorV2) {
|
|
p1 := NewPeer(ctx, t, coordinator, "p1")
|
|
defer p1.Close(ctx)
|
|
p2 := NewPeer(ctx, t, coordinator, "p2")
|
|
defer p2.Close(ctx)
|
|
p1.AddTunnel(p2.ID)
|
|
p1.UpdateDERP(1)
|
|
p2.UpdateDERP(2)
|
|
|
|
p1.AssertEventuallyHasDERP(p2.ID, 2)
|
|
p2.AssertEventuallyHasDERP(p1.ID, 1)
|
|
|
|
p2.Disconnect()
|
|
p1.AssertEventuallyDisconnected(p2.ID)
|
|
p2.AssertEventuallyResponsesClosed("")
|
|
}
|
|
|
|
func LostTest(ctx context.Context, t *testing.T, coordinator tailnet.CoordinatorV2) {
|
|
p1 := NewPeer(ctx, t, coordinator, "p1")
|
|
defer p1.Close(ctx)
|
|
p2 := NewPeer(ctx, t, coordinator, "p2")
|
|
defer p2.Close(ctx)
|
|
p1.AddTunnel(p2.ID)
|
|
p1.UpdateDERP(1)
|
|
p2.UpdateDERP(2)
|
|
|
|
p1.AssertEventuallyHasDERP(p2.ID, 2)
|
|
p2.AssertEventuallyHasDERP(p1.ID, 1)
|
|
|
|
p2.Close(ctx)
|
|
p1.AssertEventuallyLost(p2.ID)
|
|
}
|
|
|
|
func BidirectionalTunnels(ctx context.Context, t *testing.T, coordinator tailnet.CoordinatorV2) {
|
|
p1 := NewPeer(ctx, t, coordinator, "p1")
|
|
defer p1.Close(ctx)
|
|
p2 := NewPeer(ctx, t, coordinator, "p2")
|
|
defer p2.Close(ctx)
|
|
p1.AddTunnel(p2.ID)
|
|
p2.AddTunnel(p1.ID)
|
|
p1.UpdateDERP(1)
|
|
p2.UpdateDERP(2)
|
|
|
|
p1.AssertEventuallyHasDERP(p2.ID, 2)
|
|
p2.AssertEventuallyHasDERP(p1.ID, 1)
|
|
}
|
|
|
|
func ReadyForHandshakeTest(ctx context.Context, t *testing.T, coordinator tailnet.CoordinatorV2) {
|
|
p1 := NewPeer(ctx, t, coordinator, "p1")
|
|
defer p1.Close(ctx)
|
|
p2 := NewPeer(ctx, t, coordinator, "p2")
|
|
defer p2.Close(ctx)
|
|
p1.AddTunnel(p2.ID)
|
|
p2.AddTunnel(p1.ID)
|
|
p1.UpdateDERP(1)
|
|
p2.UpdateDERP(2)
|
|
|
|
p1.AssertEventuallyHasDERP(p2.ID, 2)
|
|
p2.AssertEventuallyHasDERP(p1.ID, 1)
|
|
p2.ReadyForHandshake(p1.ID)
|
|
p1.AssertEventuallyReadyForHandshake(p2.ID)
|
|
}
|
|
|
|
func ReadyForHandshakeNoPermissionTest(ctx context.Context, t *testing.T, coordinator tailnet.CoordinatorV2) {
|
|
p1 := NewPeer(ctx, t, coordinator, "p1")
|
|
defer p1.Close(ctx)
|
|
p2 := NewPeer(ctx, t, coordinator, "p2")
|
|
defer p2.Close(ctx)
|
|
p1.UpdateDERP(1)
|
|
p2.UpdateDERP(2)
|
|
|
|
p2.ReadyForHandshake(p1.ID)
|
|
p2.AssertEventuallyGetsError(fmt.Sprintf("you do not share a tunnel with %q", p1.ID.String()))
|
|
}
|