Files
coder/tailnet/test/integration/suite.go

83 lines
2.5 KiB
Go

//go:build linux
// +build linux
package integration
import (
"net/http"
"net/url"
"testing"
"time"
"github.com/stretchr/testify/require"
"cdr.dev/slog"
"github.com/coder/coder/v2/tailnet"
"github.com/coder/coder/v2/testutil"
)
// nolint:revive
func sendRestart(t *testing.T, serverURL *url.URL, derp bool, coordinator bool) {
t.Helper()
ctx := testutil.Context(t, 2*time.Second)
serverURL, err := url.Parse(serverURL.String() + "/restart")
q := serverURL.Query()
if derp {
q.Set("derp", "true")
}
if coordinator {
q.Set("coordinator", "true")
}
serverURL.RawQuery = q.Encode()
require.NoError(t, err)
req, err := http.NewRequestWithContext(ctx, http.MethodPost, serverURL.String(), nil)
require.NoError(t, err)
resp, err := http.DefaultClient.Do(req)
require.NoError(t, err)
defer resp.Body.Close()
require.Equal(t, http.StatusOK, resp.StatusCode, "unexpected status code %d", resp.StatusCode)
}
// TODO: instead of reusing one conn for each suite, maybe we should make a new
// one for each subtest?
func TestSuite(t *testing.T, _ slog.Logger, serverURL *url.URL, conn *tailnet.Conn, _, peer Client) {
t.Parallel()
t.Run("Connectivity", func(t *testing.T) {
t.Parallel()
peerIP := tailnet.IPFromUUID(peer.ID)
_, _, _, err := conn.Ping(testutil.Context(t, testutil.WaitLong), peerIP)
require.NoError(t, err, "ping peer")
})
t.Run("RestartDERP", func(t *testing.T) {
peerIP := tailnet.IPFromUUID(peer.ID)
_, _, _, err := conn.Ping(testutil.Context(t, testutil.WaitLong), peerIP)
require.NoError(t, err, "ping peer")
sendRestart(t, serverURL, true, false)
_, _, _, err = conn.Ping(testutil.Context(t, testutil.WaitLong), peerIP)
require.NoError(t, err, "ping peer after derp restart")
})
t.Run("RestartCoordinator", func(t *testing.T) {
peerIP := tailnet.IPFromUUID(peer.ID)
_, _, _, err := conn.Ping(testutil.Context(t, testutil.WaitLong), peerIP)
require.NoError(t, err, "ping peer")
sendRestart(t, serverURL, false, true)
_, _, _, err = conn.Ping(testutil.Context(t, testutil.WaitLong), peerIP)
require.NoError(t, err, "ping peer after coordinator restart")
})
t.Run("RestartBoth", func(t *testing.T) {
peerIP := tailnet.IPFromUUID(peer.ID)
_, _, _, err := conn.Ping(testutil.Context(t, testutil.WaitLong), peerIP)
require.NoError(t, err, "ping peer")
sendRestart(t, serverURL, true, true)
_, _, _, err = conn.Ping(testutil.Context(t, testutil.WaitLong), peerIP)
require.NoError(t, err, "ping peer after restart")
})
}