@@ -5,6 +5,8 @@ package database_test
5
5
import (
6
6
"context"
7
7
"database/sql"
8
+ "encoding/json"
9
+ "sort"
8
10
"testing"
9
11
"time"
10
12
@@ -314,3 +316,76 @@ func TestDefaultProxy(t *testing.T) {
314
316
require .NoError (t , err , "get deployment id" )
315
317
require .Equal (t , depID , found )
316
318
}
319
+
320
+ func TestQueuePosition (t * testing.T ) {
321
+ t .Parallel ()
322
+
323
+ if testing .Short () {
324
+ t .SkipNow ()
325
+ }
326
+ sqlDB := testSQLDB (t )
327
+ err := migrations .Up (sqlDB )
328
+ require .NoError (t , err )
329
+ db := database .New (sqlDB )
330
+ ctx := testutil .Context (t , testutil .WaitLong )
331
+
332
+ org := dbgen .Organization (t , db , database.Organization {})
333
+ jobCount := 10
334
+ jobs := []database.ProvisionerJob {}
335
+ jobIDs := []uuid.UUID {}
336
+ for i := 0 ; i < jobCount ; i ++ {
337
+ job := dbgen .ProvisionerJob (t , db , database.ProvisionerJob {
338
+ OrganizationID : org .ID ,
339
+ Tags : database.StringMap {},
340
+ })
341
+ jobs = append (jobs , job )
342
+ jobIDs = append (jobIDs , job .ID )
343
+
344
+ // We need a slight amount of time between each insertion to ensure that
345
+ // the queue position is correct... it's sorted by `created_at`.
346
+ time .Sleep (time .Millisecond )
347
+ }
348
+
349
+ queued , err := db .GetProvisionerJobsByIDsWithQueuePosition (ctx , jobIDs )
350
+ require .NoError (t , err )
351
+ require .Len (t , queued , jobCount )
352
+ sort .Slice (queued , func (i , j int ) bool {
353
+ return queued [i ].QueuePosition < queued [j ].QueuePosition
354
+ })
355
+ // Ensure that the queue positions are correct based on insertion ID!
356
+ for index , job := range queued {
357
+ require .Equal (t , job .QueuePosition , int64 (index + 1 ))
358
+ require .Equal (t , job .ProvisionerJob .ID , jobs [index ].ID )
359
+ }
360
+
361
+ job , err := db .AcquireProvisionerJob (ctx , database.AcquireProvisionerJobParams {
362
+ StartedAt : sql.NullTime {
363
+ Time : database .Now (),
364
+ Valid : true ,
365
+ },
366
+ Types : database .AllProvisionerTypeValues (),
367
+ WorkerID : uuid.NullUUID {
368
+ UUID : uuid .New (),
369
+ Valid : true ,
370
+ },
371
+ Tags : json .RawMessage ("{}" ),
372
+ })
373
+ require .NoError (t , err )
374
+ require .Equal (t , jobs [0 ].ID , job .ID )
375
+
376
+ queued , err = db .GetProvisionerJobsByIDsWithQueuePosition (ctx , jobIDs )
377
+ require .NoError (t , err )
378
+ require .Len (t , queued , jobCount )
379
+ sort .Slice (queued , func (i , j int ) bool {
380
+ return queued [i ].QueuePosition < queued [j ].QueuePosition
381
+ })
382
+ // Ensure that queue positions are updated now that the first job has been acquired!
383
+ for index , job := range queued {
384
+ if index == 0 {
385
+ require .Equal (t , job .QueuePosition , int64 (0 ))
386
+ continue
387
+ }
388
+ require .Equal (t , job .QueuePosition , int64 (index ))
389
+ require .Equal (t , job .ProvisionerJob .ID , jobs [index ].ID )
390
+ }
391
+ }
0 commit comments