diff --git a/agent/agenttest/agent.go b/agent/agenttest/agent.go new file mode 100644 index 0000000000000..77b7c6e368822 --- /dev/null +++ b/agent/agenttest/agent.go @@ -0,0 +1,57 @@ +package agenttest + +import ( + "context" + "net/url" + "testing" + + "github.com/stretchr/testify/assert" + + "cdr.dev/slog" + "cdr.dev/slog/sloggers/slogtest" + "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/codersdk/agentsdk" +) + +// New starts a new agent for use in tests. +// The agent will use the provided coder URL and session token. +// The options passed to agent.New() can be modified by passing an optional +// variadic func(*agent.Options). +// Returns the agent. Closing the agent is handled by the test cleanup. +// It is the responsibility of the caller to call coderdtest.AwaitWorkspaceAgents +// to ensure agent is connected. +func New(t testing.TB, coderURL *url.URL, agentToken string, opts ...func(*agent.Options)) agent.Agent { + t.Helper() + + var o agent.Options + log := slogtest.Make(t, nil).Leveled(slog.LevelDebug).Named("agent") + o.Logger = log + + for _, opt := range opts { + opt(&o) + } + + if o.Client == nil { + agentClient := agentsdk.New(coderURL) + agentClient.SetSessionToken(agentToken) + agentClient.SDK.SetLogger(log) + o.Client = agentClient + } + + if o.ExchangeToken == nil { + o.ExchangeToken = func(_ context.Context) (string, error) { + return agentToken, nil + } + } + + if o.LogDir == "" { + o.LogDir = t.TempDir() + } + + agt := agent.New(o) + t.Cleanup(func() { + assert.NoError(t, agt.Close(), "failed to close agent during cleanup") + }) + + return agt +} diff --git a/cli/configssh_test.go b/cli/configssh_test.go index 44246da2596e7..141609f25bf53 100644 --- a/cli/configssh_test.go +++ b/cli/configssh_test.go @@ -19,13 +19,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "cdr.dev/slog/sloggers/slogtest" - - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/cli/clitest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/provisionersdk/proto" "github.com/coder/coder/v2/pty/ptytest" @@ -102,15 +99,7 @@ func TestConfigSSH(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent"), - }) - defer func() { - _ = agentCloser.Close() - }() + _ = agenttest.New(t, client.URL, authToken) resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) agentConn, err := client.DialWorkspaceAgent(context.Background(), resources[0].Agents[0].ID, nil) require.NoError(t, err) diff --git a/cli/gitssh_test.go b/cli/gitssh_test.go index 3e5045acf0288..103ce34cf723b 100644 --- a/cli/gitssh_test.go +++ b/cli/gitssh_test.go @@ -20,15 +20,18 @@ import ( "github.com/stretchr/testify/require" gossh "golang.org/x/crypto/ssh" + "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/cli/clitest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/codersdk" + "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/pty/ptytest" "github.com/coder/coder/v2/testutil" ) -func prepareTestGitSSH(ctx context.Context, t *testing.T) (*codersdk.Client, string, gossh.PublicKey) { +func prepareTestGitSSH(ctx context.Context, t *testing.T) (*agentsdk.Client, string, gossh.PublicKey) { t.Helper() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) @@ -57,13 +60,12 @@ func prepareTestGitSSH(ctx context.Context, t *testing.T) (*codersdk.Client, str coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) // start workspace agent - inv, root := clitest.New(t, "agent", "--agent-token", agentToken, "--agent-url", client.URL.String()) - agentClient := codersdk.New(client.URL) + agentClient := agentsdk.New(client.URL) agentClient.SetSessionToken(agentToken) - clitest.SetupConfig(t, agentClient, root) - clitest.Start(t, inv) - - coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) + _ = agenttest.New(t, client.URL, agentToken, func(o *agent.Options) { + o.Client = agentClient + }) + _ = coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) return agentClient, agentToken, pubkey } @@ -140,7 +142,7 @@ func TestGitSSH(t *testing.T) { // set to agent config dir inv, _ := clitest.New(t, "gitssh", - "--agent-url", client.URL.String(), + "--agent-url", client.SDK.URL.String(), "--agent-token", token, "--", fmt.Sprintf("-p%d", addr.Port), @@ -203,7 +205,7 @@ func TestGitSSH(t *testing.T) { pty := ptytest.New(t) cmdArgs := []string{ "gitssh", - "--agent-url", client.URL.String(), + "--agent-url", client.SDK.URL.String(), "--agent-token", token, "--", "-F", config, diff --git a/cli/ping_test.go b/cli/ping_test.go index d054cbf38057a..f2bd4b5ff88a1 100644 --- a/cli/ping_test.go +++ b/cli/ping_test.go @@ -6,11 +6,9 @@ import ( "github.com/stretchr/testify/assert" - "cdr.dev/slog/sloggers/slogtest" - - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/cli/clitest" - "github.com/coder/coder/v2/codersdk/agentsdk" + "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/pty/ptytest" "github.com/coder/coder/v2/testutil" ) @@ -29,15 +27,8 @@ func TestPing(t *testing.T) { inv.Stderr = pty.Output() inv.Stdout = pty.Output() - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(agentToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent"), - }) - defer func() { - _ = agentCloser.Close() - }() + _ = agenttest.New(t, client.URL, agentToken) + _ = coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() diff --git a/cli/portforward_test.go b/cli/portforward_test.go index 920980e72fc2e..d2d497485c403 100644 --- a/cli/portforward_test.go +++ b/cli/portforward_test.go @@ -14,13 +14,11 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "cdr.dev/slog" - "cdr.dev/slog/sloggers/slogtest" "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/cli/clitest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/pty/ptytest" "github.com/coder/coder/v2/testutil" @@ -317,23 +315,11 @@ func runAgent(t *testing.T, client *codersdk.Client, userID uuid.UUID) codersdk. workspace := coderdtest.CreateWorkspace(t, client, orgID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug).Named("agent") - agentClient := agentsdk.New(client.URL) - agentClient.SDK.SetLogger(logger) - agentClient.SDK.SetSessionToken(agentToken) - agnt := agent.New(agent.Options{ - Client: agentClient, - Logger: logger, - LogDir: t.TempDir(), - ExchangeToken: func(ctx context.Context) (string, error) { - return agentToken, nil + _ = agenttest.New(t, client.URL, agentToken, + func(o *agent.Options) { + o.SSHMaxTimeout = 60 * time.Second }, - SSHMaxTimeout: time.Second * 60, - }) - t.Cleanup(func() { - err := agnt.Close() - assert.NoError(t, err) - }) + ) coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) return workspace diff --git a/cli/speedtest_test.go b/cli/speedtest_test.go index 5fc9aedbe2e79..f16b769cc85e7 100644 --- a/cli/speedtest_test.go +++ b/cli/speedtest_test.go @@ -9,12 +9,11 @@ import ( "cdr.dev/slog" "cdr.dev/slog/sloggers/slogtest" - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/cli" "github.com/coder/coder/v2/cli/clitest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/pty/ptytest" "github.com/coder/coder/v2/testutil" ) @@ -26,13 +25,7 @@ func TestSpeedtest(t *testing.T) { t.Skip("This test takes a minimum of 5ms per a hardcoded value in Tailscale!") } client, workspace, agentToken := setupWorkspaceForAgent(t, nil) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(agentToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent").Leveled(slog.LevelDebug), - }) - defer agentCloser.Close() + _ = agenttest.New(t, client.URL, agentToken) coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) diff --git a/cli/ssh_test.go b/cli/ssh_test.go index 971dc2873ffdc..2a371d5d0544f 100644 --- a/cli/ssh_test.go +++ b/cli/ssh_test.go @@ -30,12 +30,12 @@ import ( "cdr.dev/slog/sloggers/slogtest" "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/cli/clitest" "github.com/coder/coder/v2/cli/cliui" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/database" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/provisionersdk/proto" "github.com/coder/coder/v2/pty" @@ -103,15 +103,8 @@ func TestSSH(t *testing.T) { }) pty.ExpectMatch("Waiting") - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(agentToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent"), - }) - defer func() { - _ = agentCloser.Close() - }() + _ = agenttest.New(t, client.URL, agentToken) + coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) // Shells on Mac, Windows, and Linux all exit shells with the "exit" command. pty.WriteLine("exit") @@ -167,15 +160,8 @@ func TestSSH(t *testing.T) { }) pty.ExpectMatch("Waiting") - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(agentToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent"), - }) - defer func() { - _ = agentCloser.Close() - }() + _ = agenttest.New(t, client.URL, agentToken) + coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) // Ensure the agent is connected. pty.WriteLine("echo hell'o'") @@ -196,14 +182,9 @@ func TestSSH(t *testing.T) { _, _ = tGoContext(t, func(ctx context.Context) { // Run this async so the SSH command has to wait for // the build and agent to connect! - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(agentToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent"), - }) + _ = agenttest.New(t, client.URL, agentToken) + coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) <-ctx.Done() - _ = agentCloser.Close() }) clientOutput, clientInput := io.Pipe() @@ -264,14 +245,9 @@ func TestSSH(t *testing.T) { _, _ = tGoContext(t, func(ctx context.Context) { // Run this async so the SSH command has to wait for // the build and agent to connect. - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(agentToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent"), - }) + _ = agenttest.New(t, client.URL, agentToken) + coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) <-ctx.Done() - _ = agentCloser.Close() }) clientOutput, clientInput := io.Pipe() @@ -333,13 +309,8 @@ func TestSSH(t *testing.T) { client, workspace, agentToken := setupWorkspaceForAgent(t, nil) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(agentToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent"), - }) - defer agentCloser.Close() + _ = agenttest.New(t, client.URL, agentToken) + coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) // Generate private key. privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) @@ -424,13 +395,8 @@ func TestSSH(t *testing.T) { client, workspace, agentToken := setupWorkspaceForAgent(t, nil) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(agentToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent"), - }) - defer agentCloser.Close() + _ = agenttest.New(t, client.URL, agentToken) + coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() @@ -475,15 +441,8 @@ func TestSSH(t *testing.T) { pty.ExpectMatch("Waiting") - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(agentToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent"), - }) - defer func() { - _ = agentCloser.Close() - }() + agenttest.New(t, client.URL, agentToken) + coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) // Shells on Mac, Windows, and Linux all exit shells with the "exit" command. pty.WriteLine("exit") @@ -651,16 +610,12 @@ Expire-Date: 0 client, workspace, agentToken := setupWorkspaceForAgent(t, nil) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(agentToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - EnvironmentVariables: map[string]string{ + _ = agenttest.New(t, client.URL, agentToken, func(o *agent.Options) { + o.EnvironmentVariables = map[string]string{ "GNUPGHOME": gnupgHomeWorkspace, - }, - Logger: slogtest.Make(t, nil).Named("agent"), + } }) - defer agentCloser.Close() + coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) inv, root := clitest.New(t, "ssh", diff --git a/cli/vscodessh_test.go b/cli/vscodessh_test.go index 2c1afd6135587..dc3e65f5bdb9c 100644 --- a/cli/vscodessh_test.go +++ b/cli/vscodessh_test.go @@ -9,13 +9,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "cdr.dev/slog/sloggers/slogtest" - - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/cli/clitest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/pty/ptytest" "github.com/coder/coder/v2/testutil" ) @@ -29,16 +26,8 @@ func TestVSCodeSSH(t *testing.T) { user, err := client.User(ctx, codersdk.Me) require.NoError(t, err) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(agentToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent"), - }) - defer func() { - _ = agentCloser.Close() - }() - coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) + _ = agenttest.New(t, client.URL, agentToken) + _ = coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) fs := afero.NewMemMapFs() err = afero.WriteFile(fs, "/url", []byte(client.URL.String()), 0o600) diff --git a/coderd/activitybump_test.go b/coderd/activitybump_test.go index ff17a3038ad4c..53792434bb7bc 100644 --- a/coderd/activitybump_test.go +++ b/coderd/activitybump_test.go @@ -9,14 +9,13 @@ import ( "github.com/stretchr/testify/require" "cdr.dev/slog/sloggers/slogtest" - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/database" "github.com/coder/coder/v2/coderd/database/dbtestutil" "github.com/coder/coder/v2/coderd/database/dbtime" "github.com/coder/coder/v2/coderd/schedule" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/testutil" ) @@ -86,15 +85,7 @@ func TestWorkspaceActivityBump(t *testing.T) { require.NoError(t, err) } - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(agentToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent"), - }) - t.Cleanup(func() { - _ = agentCloser.Close() - }) + _ = agenttest.New(t, client.URL, agentToken) coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) // Sanity-check that deadline is near. diff --git a/coderd/coderd_test.go b/coderd/coderd_test.go index 6edf4657cc903..f767e3a7d3571 100644 --- a/coderd/coderd_test.go +++ b/coderd/coderd_test.go @@ -22,12 +22,11 @@ import ( "cdr.dev/slog" "cdr.dev/slog/sloggers/slogtest" - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/buildinfo" "github.com/coder/coder/v2/coderd" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/tailnet" "github.com/coder/coder/v2/testutil" @@ -189,15 +188,8 @@ func TestDERPForceWebSockets(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent").Leveled(slog.LevelDebug), - }) - defer func() { - _ = agentCloser.Close() - }() + _ = agenttest.New(t, client.URL, authToken) + _ = coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() diff --git a/coderd/coderdtest/coderdtest.go b/coderd/coderdtest/coderdtest.go index bee336c79e712..c91481d0d3a5c 100644 --- a/coderd/coderdtest/coderdtest.go +++ b/coderd/coderdtest/coderdtest.go @@ -798,7 +798,7 @@ func AwaitWorkspaceBuildJob(t *testing.T, client *codersdk.Client, build uuid.UU // AwaitWorkspaceAgents waits for all resources with agents to be connected. If // specific agents are provided, it will wait for those agents to be connected // but will not fail if other agents are not connected. -func AwaitWorkspaceAgents(t *testing.T, client *codersdk.Client, workspaceID uuid.UUID, agentNames ...string) []codersdk.WorkspaceResource { +func AwaitWorkspaceAgents(t testing.TB, client *codersdk.Client, workspaceID uuid.UUID, agentNames ...string) []codersdk.WorkspaceResource { t.Helper() agentNamesMap := make(map[string]struct{}, len(agentNames)) diff --git a/coderd/insights_test.go b/coderd/insights_test.go index 8be3f4b5e6076..d9b4832ec8e43 100644 --- a/coderd/insights_test.go +++ b/coderd/insights_test.go @@ -19,7 +19,7 @@ import ( "cdr.dev/slog" "cdr.dev/slog/sloggers/slogtest" - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/coderd/batchstats" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/database" @@ -58,17 +58,8 @@ func TestDeploymentInsights(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Logger: slogtest.Make(t, nil), - Client: agentClient, - }) - defer func() { - _ = agentCloser.Close() - }() + _ = agenttest.New(t, client.URL, authToken) resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() @@ -145,15 +136,7 @@ func TestUserLatencyInsights(t *testing.T) { coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) // Start an agent so that we can generate stats. - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Logger: logger.Named("agent"), - Client: agentClient, - }) - defer func() { - _ = agentCloser.Close() - }() + _ = agenttest.New(t, client.URL, authToken) resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) // Start must be at the beginning of the day, initialize it early in case diff --git a/coderd/templates_test.go b/coderd/templates_test.go index 528485ac2faf5..3e5ad54e733f6 100644 --- a/coderd/templates_test.go +++ b/coderd/templates_test.go @@ -12,7 +12,7 @@ import ( "github.com/stretchr/testify/require" "cdr.dev/slog/sloggers/slogtest" - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/coderd/audit" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/database" @@ -20,7 +20,6 @@ import ( "github.com/coder/coder/v2/coderd/schedule" "github.com/coder/coder/v2/coderd/util/ptr" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/testutil" ) @@ -1218,15 +1217,7 @@ func TestTemplateMetrics(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Logger: slogtest.Make(t, nil), - Client: agentClient, - }) - defer func() { - _ = agentCloser.Close() - }() + _ = agenttest.New(t, client.URL, authToken) resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) diff --git a/coderd/workspaceagents_test.go b/coderd/workspaceagents_test.go index 4547588ecddaf..d519466a80957 100644 --- a/coderd/workspaceagents_test.go +++ b/coderd/workspaceagents_test.go @@ -20,7 +20,7 @@ import ( "cdr.dev/slog" "cdr.dev/slog/sloggers/slogtest" - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/database" "github.com/coder/coder/v2/coderd/database/dbtime" @@ -484,20 +484,12 @@ func TestWorkspaceAgentListen(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent").Leveled(slog.LevelDebug), - }) - defer func() { - _ = agentCloser.Close() - }() + _ = agenttest.New(t, client.URL, authToken) + resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() - resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) conn, err := client.DialWorkspaceAgent(ctx, resources[0].Agents[0].ID, nil) require.NoError(t, err) defer func() { @@ -585,13 +577,7 @@ func TestWorkspaceAgentTailnet(t *testing.T) { coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) daemonCloser.Close() - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent").Leveled(slog.LevelDebug), - }) - defer agentCloser.Close() + _ = agenttest.New(t, client.URL, authToken) resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) ctx, cancelFunc := context.WithCancel(context.Background()) @@ -646,11 +632,7 @@ func TestWorkspaceAgentTailnetDirectDisabled(t *testing.T) { require.NoError(t, err) require.True(t, manifest.DisableDirectConnections) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent").Leveled(slog.LevelDebug), - }) - defer agentCloser.Close() + _ = agenttest.New(t, client.URL, authToken) resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) agentID := resources[0].Agents[0].ID @@ -729,17 +711,8 @@ func TestWorkspaceAgentListeningPorts(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent").Leveled(slog.LevelDebug), - }) - t.Cleanup(func() { - _ = agentCloser.Close() - }) + _ = agenttest.New(t, client.URL, authToken) resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) - return client, uint16(coderdPort), resources[0].Agents[0].ID } @@ -1457,15 +1430,8 @@ func TestWorkspaceAgent_UpdatedDERP(t *testing.T) { coderdtest.AwaitTemplateVersionJob(t, client, version.ID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(agentToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: logger.Named("agent"), - }) - defer func() { - _ = agentCloser.Close() - }() + + agentCloser := agenttest.New(t, client.URL, agentToken) resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) agentID := resources[0].Agents[0].ID diff --git a/coderd/workspaceapps/db_test.go b/coderd/workspaceapps/db_test.go index 3be987e28ca23..b201b3e7c57a6 100644 --- a/coderd/workspaceapps/db_test.go +++ b/coderd/workspaceapps/db_test.go @@ -17,14 +17,12 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "cdr.dev/slog/sloggers/slogtest" - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/httpapi" "github.com/coder/coder/v2/coderd/httpmw" "github.com/coder/coder/v2/coderd/workspaceapps" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/provisionersdk/proto" "github.com/coder/coder/v2/testutil" @@ -173,15 +171,7 @@ func Test_ResolveRequest(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, firstUser.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(agentAuthToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent"), - }) - t.Cleanup(func() { - _ = agentCloser.Close() - }) + _ = agenttest.New(t, client.URL, agentAuthToken) resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID, agentName) agentID := uuid.Nil diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index 83884f862489c..f629ad773aa32 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -19,7 +19,7 @@ import ( "cdr.dev/slog" "cdr.dev/slog/sloggers/slogtest" - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/coderd/audit" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/database" @@ -33,7 +33,6 @@ import ( "github.com/coder/coder/v2/coderd/schedule/cron" "github.com/coder/coder/v2/coderd/util/ptr" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/cryptorand" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/provisionersdk/proto" @@ -1348,17 +1347,8 @@ func TestWorkspaceFilterManual(t *testing.T) { workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent").Leveled(slog.LevelDebug), - }) - defer func() { - _ = agentCloser.Close() - }() - - coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) + _ = agenttest.New(t, client.URL, authToken) + _ = coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() @@ -2268,21 +2258,14 @@ func TestWorkspaceWatcher(t *testing.T) { wait("agent timeout after create", nil) wait("agent timeout after start", nil) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: logger.Named("agent"), - }) - defer func() { - _ = agentCloser.Close() - }() + agt := agenttest.New(t, client.URL, authToken) + _ = coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) wait("agent connected/ready", func(w codersdk.Workspace) bool { return w.LatestBuild.Resources[0].Agents[0].Status == codersdk.WorkspaceAgentConnected && w.LatestBuild.Resources[0].Agents[0].LifecycleState == codersdk.WorkspaceAgentLifecycleReady }) - agentCloser.Close() + agt.Close() wait("agent disconnected", func(w codersdk.Workspace) bool { return w.LatestBuild.Resources[0].Agents[0].Status == codersdk.WorkspaceAgentDisconnected }) diff --git a/enterprise/coderd/workspaceproxy_test.go b/enterprise/coderd/workspaceproxy_test.go index 745a1af2c11bc..1a7b5ce71409c 100644 --- a/enterprise/coderd/workspaceproxy_test.go +++ b/enterprise/coderd/workspaceproxy_test.go @@ -14,16 +14,13 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "cdr.dev/slog" - "cdr.dev/slog/sloggers/slogtest" - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/buildinfo" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/database" "github.com/coder/coder/v2/coderd/database/dbtestutil" "github.com/coder/coder/v2/coderd/workspaceapps" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/enterprise/coderd/coderdenttest" "github.com/coder/coder/v2/enterprise/coderd/license" "github.com/coder/coder/v2/enterprise/wsproxy/wsproxysdk" @@ -677,17 +674,8 @@ func TestIssueSignedAppToken(t *testing.T) { workspace.LatestBuild = build // Connect an agent to the workspace - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent").Leveled(slog.LevelDebug), - }) - t.Cleanup(func() { - _ = agentCloser.Close() - }) - - coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) + _ = agenttest.New(t, client.URL, authToken) + _ = coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) createProxyCtx := testutil.Context(t, testutil.WaitLong) proxyRes, err := client.CreateWorkspaceProxy(createProxyCtx, codersdk.CreateWorkspaceProxyRequest{ @@ -787,16 +775,8 @@ func TestReconnectingPTYSignedToken(t *testing.T) { // Connect an agent to the workspace agentID := build.Resources[0].Agents[0].ID - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent").Leveled(slog.LevelDebug), - }) - t.Cleanup(func() { - _ = agentCloser.Close() - }) - coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) + _ = agenttest.New(t, client.URL, authToken) + _ = coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) proxyURL, err := url.Parse(fmt.Sprintf("https://%s.com", namesgenerator.GetRandomName(1))) require.NoError(t, err) diff --git a/enterprise/wsproxy/wsproxy_test.go b/enterprise/wsproxy/wsproxy_test.go index 3b2caf38f1254..be5c1eee7949d 100644 --- a/enterprise/wsproxy/wsproxy_test.go +++ b/enterprise/wsproxy/wsproxy_test.go @@ -15,7 +15,7 @@ import ( "cdr.dev/slog" "cdr.dev/slog/sloggers/slogtest" - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/cli/clibase" "github.com/coder/coder/v2/coderd" "github.com/coder/coder/v2/coderd/coderdtest" @@ -23,7 +23,6 @@ import ( "github.com/coder/coder/v2/coderd/httpmw" "github.com/coder/coder/v2/coderd/workspaceapps/apptest" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/enterprise/coderd/coderdenttest" "github.com/coder/coder/v2/enterprise/coderd/license" "github.com/coder/coder/v2/provisioner/echo" @@ -184,16 +183,8 @@ resourceLoop: require.NotEqual(t, uuid.Nil, agentID) // Connect an agent to the workspace - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent").Leveled(slog.LevelDebug), - }) - t.Cleanup(func() { - _ = agentCloser.Close() - }) - coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) + _ = agenttest.New(t, client.URL, authToken) + _ = coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) t.Run("ReturnedInDERPMap", func(t *testing.T) { t.Parallel() @@ -417,16 +408,8 @@ resourceLoop: require.NotEqual(t, uuid.Nil, agentID) // Connect an agent to the workspace - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent").Leveled(slog.LevelDebug), - }) - t.Cleanup(func() { - _ = agentCloser.Close() - }) - coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) + _ = agenttest.New(t, client.URL, authToken) + _ = coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) // Connect to the workspace agent. ctx := testutil.Context(t, testutil.WaitLong) diff --git a/scaletest/agentconn/run_test.go b/scaletest/agentconn/run_test.go index 4d3ffb8d0da2d..70f373dc735de 100644 --- a/scaletest/agentconn/run_test.go +++ b/scaletest/agentconn/run_test.go @@ -13,12 +13,10 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/require" - "cdr.dev/slog/sloggers/slogtest" - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/httpapi" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/provisionersdk/proto" "github.com/coder/coder/v2/scaletest/agentconn" @@ -258,16 +256,7 @@ func setupRunnerTest(t *testing.T) (client *codersdk.Client, agentID uuid.UUID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, nil).Named("agent"), - }) - t.Cleanup(func() { - _ = agentCloser.Close() - }) - + _ = agenttest.New(t, client.URL, authToken) resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) return client, resources[0].Agents[0].ID } diff --git a/scaletest/dashboard/run_test.go b/scaletest/dashboard/run_test.go index 88c4aecb9b8b6..bd18359e19eed 100644 --- a/scaletest/dashboard/run_test.go +++ b/scaletest/dashboard/run_test.go @@ -19,6 +19,7 @@ import ( func Test_Run(t *testing.T) { t.Parallel() + t.Skip("To be fixed by https://github.com/coder/coder/issues/9131") if testutil.RaceEnabled() { t.Skip("skipping timing-sensitive test because of race detector") } diff --git a/scaletest/reconnectingpty/run_test.go b/scaletest/reconnectingpty/run_test.go index 81de3dcfb9da8..407f1562b59bd 100644 --- a/scaletest/reconnectingpty/run_test.go +++ b/scaletest/reconnectingpty/run_test.go @@ -9,13 +9,10 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/require" - "cdr.dev/slog" - "cdr.dev/slog/sloggers/slogtest" - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/httpapi" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/provisionersdk/proto" "github.com/coder/coder/v2/scaletest/reconnectingpty" @@ -279,16 +276,7 @@ func setupRunnerTest(t *testing.T) (client *codersdk.Client, agentID uuid.UUID) workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID) - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - Logger: slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}).Named("agent").Leveled(slog.LevelDebug), - }) - t.Cleanup(func() { - _ = agentCloser.Close() - }) - + _ = agenttest.New(t, client.URL, authToken) resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) require.Eventually(t, func() bool { t.Log("agent id", resources[0].Agents[0].ID) diff --git a/scaletest/workspacetraffic/run_test.go b/scaletest/workspacetraffic/run_test.go index 961263e972e1c..043ed31cb8533 100644 --- a/scaletest/workspacetraffic/run_test.go +++ b/scaletest/workspacetraffic/run_test.go @@ -10,10 +10,9 @@ import ( "golang.org/x/exp/slices" - "github.com/coder/coder/v2/agent" + "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/provisionersdk/proto" "github.com/coder/coder/v2/scaletest/workspacetraffic" @@ -33,6 +32,7 @@ func TestRun(t *testing.T) { t.Skip("Race detector enabled, skipping time-sensitive test.") } + //nolint:dupl t.Run("PTY", func(t *testing.T) { t.Parallel() // We need to stand up an in-memory coderd and run a fake workspace. @@ -73,20 +73,12 @@ func TestRun(t *testing.T) { ) // We also need a running agent to run this test. - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - }) - + _ = agenttest.New(t, client.URL, authToken) + resources := coderdtest.AwaitWorkspaceAgents(t, client, ws.ID) ctx, cancel := context.WithCancel(context.Background()) t.Cleanup(cancel) - t.Cleanup(func() { - _ = agentCloser.Close() - }) // Make sure the agent is connected before we go any further. - resources := coderdtest.AwaitWorkspaceAgents(t, client, ws.ID) var agentID uuid.UUID for _, res := range resources { for _, agt := range res.Agents { @@ -159,6 +151,7 @@ func TestRun(t *testing.T) { assert.Zero(t, writeMetrics.Errors()) }) + //nolint:dupl t.Run("SSH", func(t *testing.T) { t.Parallel() // We need to stand up an in-memory coderd and run a fake workspace. @@ -199,20 +192,13 @@ func TestRun(t *testing.T) { ) // We also need a running agent to run this test. - agentClient := agentsdk.New(client.URL) - agentClient.SetSessionToken(authToken) - agentCloser := agent.New(agent.Options{ - Client: agentClient, - }) + _ = agenttest.New(t, client.URL, authToken) + resources := coderdtest.AwaitWorkspaceAgents(t, client, ws.ID) ctx, cancel := context.WithCancel(context.Background()) - t.Cleanup(func() { - cancel() - _ = agentCloser.Close() - }) + t.Cleanup(cancel) // Make sure the agent is connected before we go any further. - resources := coderdtest.AwaitWorkspaceAgents(t, client, ws.ID) var agentID uuid.UUID for _, res := range resources { for _, agt := range res.Agents {