| 719 | } |
| 720 | |
| 721 | func WorkspaceAgentScriptTiming(t testing.TB, db database.Store, orig database.WorkspaceAgentScriptTiming) database.WorkspaceAgentScriptTiming { |
| 722 | // retry a few times in case of a unique constraint violation |
| 723 | for i := 0; i < 10; i++ { |
| 724 | timing, err := db.InsertWorkspaceAgentScriptTimings(genCtx, database.InsertWorkspaceAgentScriptTimingsParams{ |
| 725 | StartedAt: takeFirst(orig.StartedAt, dbtime.Now()), |
| 726 | EndedAt: takeFirst(orig.EndedAt, dbtime.Now()), |
| 727 | Stage: takeFirst(orig.Stage, database.WorkspaceAgentScriptTimingStageStart), |
| 728 | ScriptID: takeFirst(orig.ScriptID, uuid.New()), |
| 729 | ExitCode: takeFirst(orig.ExitCode, 0), |
| 730 | Status: takeFirst(orig.Status, database.WorkspaceAgentScriptTimingStatusOk), |
| 731 | }) |
| 732 | if err == nil { |
| 733 | return timing |
| 734 | } |
| 735 | // Some tests run WorkspaceAgentScriptTiming in a loop and run into |
| 736 | // a unique violation - 2 rows get the same started_at value. |
| 737 | if (database.IsUniqueViolation(err, database.UniqueWorkspaceAgentScriptTimingsScriptIDStartedAtKey) && orig.StartedAt == time.Time{}) { |
| 738 | // Wait 1 millisecond so dbtime.Now() changes |
| 739 | time.Sleep(time.Millisecond * 1) |
| 740 | continue |
| 741 | } |
| 742 | require.NoError(t, err, "insert workspace agent script") |
| 743 | } |
| 744 | panic("failed to insert workspace agent script timing") |
| 745 | } |
| 746 | |
| 747 | func WorkspaceAgentDevcontainer(t testing.TB, db database.Store, orig database.WorkspaceAgentDevcontainer) database.WorkspaceAgentDevcontainer { |
| 748 | devcontainers, err := db.InsertWorkspaceAgentDevcontainers(genCtx, database.InsertWorkspaceAgentDevcontainersParams{ |