@@ -21,7 +21,9 @@ import (
2121 "github.com/coder/coder/v2/coderd/coderdtest"
2222 "github.com/coder/coder/v2/coderd/database"
2323 "github.com/coder/coder/v2/coderd/database/dbfake"
24+ "github.com/coder/coder/v2/coderd/database/dbtestutil"
2425 "github.com/coder/coder/v2/codersdk"
26+ "github.com/coder/coder/v2/codersdk/agentsdk"
2527 "github.com/coder/coder/v2/codersdk/workspacesdk"
2628 "github.com/coder/coder/v2/provisionersdk/proto"
2729 "github.com/coder/coder/v2/testutil"
@@ -321,6 +323,56 @@ func TestWorkspaceAgent(t *testing.T) {
321323 })
322324}
323325
326+ func TestAgent_Prebuild (t * testing.T ) {
327+ t .Parallel ()
328+
329+ db , pubsub := dbtestutil .NewDB (t )
330+ client := coderdtest .New (t , & coderdtest.Options {
331+ Database : db ,
332+ Pubsub : pubsub ,
333+ })
334+ user := coderdtest .CreateFirstUser (t , client )
335+ r := dbfake .WorkspaceBuild (t , db , database.WorkspaceTable {
336+ OrganizationID : user .OrganizationID ,
337+ OwnerID : user .UserID ,
338+ }).WithAgent (func (a []* proto.Agent ) []* proto.Agent {
339+ a [0 ].Scripts = []* proto.Script {
340+ {
341+ DisplayName : "Prebuild Test Script" ,
342+ Script : "sleep 5" , // Make reinitiazation take long enough to assert that it happened
343+ RunOnStart : true ,
344+ },
345+ }
346+ return a
347+ }).Do ()
348+
349+ // Spin up an agent
350+ logDir := t .TempDir ()
351+ inv , _ := clitest .New (t ,
352+ "agent" ,
353+ "--auth" , "token" ,
354+ "--agent-token" , r .AgentToken ,
355+ "--agent-url" , client .URL .String (),
356+ "--log-dir" , logDir ,
357+ )
358+ clitest .Start (t , inv )
359+
360+ // Check that the agent is in a happy steady state
361+ waiter := coderdtest .NewWorkspaceAgentWaiter (t , client , r .Workspace .ID )
362+ waiter .WaitFor (coderdtest .AgentReady )
363+
364+ // Trigger reinitialization
365+ channel := agentsdk .PrebuildClaimedChannel (r .Workspace .ID )
366+ err := pubsub .Publish (channel , []byte (user .UserID .String ()))
367+ require .NoError (t , err )
368+
369+ // Check that the agent reinitializes
370+ waiter .WaitFor (coderdtest .AgentNotReady )
371+
372+ // Check that reinitialization completed
373+ waiter .WaitFor (coderdtest .AgentReady )
374+ }
375+
324376func matchAgentWithVersion (rs []codersdk.WorkspaceResource ) bool {
325377 if len (rs ) < 1 {
326378 return false
0 commit comments