(t *testing.T)
| 49 | } |
| 50 | |
| 51 | func TestRollup_TwoInstancesUseLocking(t *testing.T) { |
| 52 | t.Parallel() |
| 53 | |
| 54 | db, ps := dbtestutil.NewDB(t, dbtestutil.WithDumpOnFailure()) |
| 55 | logger := testutil.Logger(t) |
| 56 | |
| 57 | var ( |
| 58 | org = dbgen.Organization(t, db, database.Organization{}) |
| 59 | user = dbgen.User(t, db, database.User{Name: "user1"}) |
| 60 | tpl = dbgen.Template(t, db, database.Template{OrganizationID: org.ID, CreatedBy: user.ID}) |
| 61 | ver = dbgen.TemplateVersion(t, db, database.TemplateVersion{OrganizationID: org.ID, TemplateID: uuid.NullUUID{UUID: tpl.ID, Valid: true}, CreatedBy: user.ID}) |
| 62 | ws = dbgen.Workspace(t, db, database.WorkspaceTable{OrganizationID: org.ID, TemplateID: tpl.ID, OwnerID: user.ID}) |
| 63 | job = dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{OrganizationID: org.ID}) |
| 64 | build = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: job.ID, TemplateVersionID: ver.ID}) |
| 65 | res = dbgen.WorkspaceResource(t, db, database.WorkspaceResource{JobID: build.JobID}) |
| 66 | agent = dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ResourceID: res.ID}) |
| 67 | ) |
| 68 | |
| 69 | refTime := dbtime.Now().Truncate(time.Hour) |
| 70 | _ = dbgen.WorkspaceAgentStat(t, db, database.WorkspaceAgentStat{ |
| 71 | TemplateID: tpl.ID, |
| 72 | WorkspaceID: ws.ID, |
| 73 | AgentID: agent.ID, |
| 74 | UserID: user.ID, |
| 75 | CreatedAt: refTime.Add(-time.Minute), |
| 76 | ConnectionMedianLatencyMS: 1, |
| 77 | ConnectionCount: 1, |
| 78 | SessionCountSSH: 1, |
| 79 | }) |
| 80 | |
| 81 | closeRolluper := func(rolluper *dbrollup.Rolluper, resume chan struct{}) { |
| 82 | close(resume) |
| 83 | err := rolluper.Close() |
| 84 | require.NoError(t, err) |
| 85 | } |
| 86 | |
| 87 | interval := dbrollup.WithInterval(250 * time.Millisecond) |
| 88 | events1 := make(chan dbrollup.Event) |
| 89 | resume1 := make(chan struct{}, 1) |
| 90 | rolluper1 := dbrollup.New( |
| 91 | logger.Named("dbrollup1"), |
| 92 | &wrapUpsertDB{Store: db, resume: resume1}, |
| 93 | interval, |
| 94 | dbrollup.WithEventChannel(events1), |
| 95 | ) |
| 96 | defer closeRolluper(rolluper1, resume1) |
| 97 | |
| 98 | events2 := make(chan dbrollup.Event) |
| 99 | resume2 := make(chan struct{}, 1) |
| 100 | rolluper2 := dbrollup.New( |
| 101 | logger.Named("dbrollup2"), |
| 102 | &wrapUpsertDB{Store: db, resume: resume2}, |
| 103 | interval, |
| 104 | dbrollup.WithEventChannel(events2), |
| 105 | ) |
| 106 | defer closeRolluper(rolluper2, resume2) |
| 107 | |
| 108 | _, _ = <-events1, <-events2 // Deplete init event, resume operation. |
nothing calls this directly
no test coverage detected