@@ -312,7 +312,7 @@ mod tests {
312
312
use std:: str:: FromStr ;
313
313
314
314
use super :: * ;
315
- use crate :: { tests:: run_db_test, Commit , CommitType , Date } ;
315
+ use crate :: { tests:: run_db_test, Commit , CommitJobState , CommitJobType , CommitType , Date } ;
316
316
317
317
/// Create a Commit
318
318
fn create_commit ( commit_sha : & str , time : chrono:: DateTime < Utc > , r#type : CommitType ) -> Commit {
@@ -323,6 +323,29 @@ mod tests {
323
323
}
324
324
}
325
325
326
+ /// Create a CommitJob
327
+ fn create_commit_job (
328
+ sha : & str ,
329
+ parent_sha : & str ,
330
+ commit_time : chrono:: DateTime < Utc > ,
331
+ target : Target ,
332
+ job_type : CommitJobType ,
333
+ state : CommitJobState ,
334
+ ) -> CommitJob {
335
+ CommitJob {
336
+ sha : sha. to_string ( ) ,
337
+ parent_sha : parent_sha. to_string ( ) ,
338
+ commit_time : Date ( commit_time) ,
339
+ target,
340
+ include : None ,
341
+ exclude : None ,
342
+ runs : None ,
343
+ backends : None ,
344
+ job_type,
345
+ state,
346
+ }
347
+ }
348
+
326
349
#[ tokio:: test]
327
350
async fn pstat_returns_empty_vector_when_empty ( ) {
328
351
run_db_test ( |ctx| async {
@@ -381,4 +404,122 @@ mod tests {
381
404
} )
382
405
. await ;
383
406
}
407
+
408
+ #[ tokio:: test]
409
+ async fn take_commit_job ( ) {
410
+ run_db_test ( |ctx| async {
411
+ // ORDER:
412
+ // Releases first
413
+ // Master commits second, order by oldest PR ascending
414
+ // Try commits last, order by oldest PR ascending
415
+
416
+ let db = ctx. db_client ( ) . connection ( ) . await ;
417
+ let time = chrono:: DateTime :: from_str ( "2021-09-01T00:00:00.000Z" ) . unwrap ( ) ;
418
+
419
+ // Try commits
420
+ let try_job_1 = create_commit_job (
421
+ "sha1" ,
422
+ "p1" ,
423
+ time,
424
+ Target :: X86_64UnknownLinuxGnu ,
425
+ CommitJobType :: Try { pr : 1 } ,
426
+ CommitJobState :: Queued ,
427
+ ) ;
428
+ let try_job_2 = create_commit_job (
429
+ "sha2" ,
430
+ "p2" ,
431
+ time,
432
+ Target :: X86_64UnknownLinuxGnu ,
433
+ CommitJobType :: Try { pr : 2 } ,
434
+ CommitJobState :: Queued ,
435
+ ) ;
436
+
437
+ // Master commits
438
+ let master_job_1 = create_commit_job (
439
+ "sha3" ,
440
+ "p3" ,
441
+ time,
442
+ Target :: X86_64UnknownLinuxGnu ,
443
+ CommitJobType :: Master { pr : 3 } ,
444
+ CommitJobState :: Queued ,
445
+ ) ;
446
+ let master_job_2 = create_commit_job (
447
+ "sha4" ,
448
+ "p4" ,
449
+ time,
450
+ Target :: X86_64UnknownLinuxGnu ,
451
+ CommitJobType :: Master { pr : 4 } ,
452
+ CommitJobState :: Queued ,
453
+ ) ;
454
+
455
+ // Release commits
456
+ let release_job_1 = create_commit_job (
457
+ "sha5" ,
458
+ "p5" ,
459
+ time,
460
+ Target :: X86_64UnknownLinuxGnu ,
461
+ CommitJobType :: Release { tag : "tag1" . into ( ) } ,
462
+ CommitJobState :: Queued ,
463
+ ) ;
464
+ let release_job_2 = create_commit_job (
465
+ "sha6" ,
466
+ "p6" ,
467
+ time,
468
+ Target :: X86_64UnknownLinuxGnu ,
469
+ CommitJobType :: Release { tag : "tag2" . into ( ) } ,
470
+ CommitJobState :: Queued ,
471
+ ) ;
472
+
473
+ // Shuffle the insert order a bit
474
+ let all_commits = vec ! [
475
+ release_job_1,
476
+ master_job_2,
477
+ try_job_1,
478
+ release_job_2,
479
+ master_job_1,
480
+ try_job_2,
481
+ ] ;
482
+
483
+ // queue all the jobs
484
+ for commit in all_commits {
485
+ db. enqueue_commit_job ( & commit) . await ;
486
+ }
487
+
488
+ // Now we test the ordering: after each dequeue we immediately mark
489
+ // the job as finished for the sake of testing so it can't be
490
+ // returned again in the test.
491
+ //
492
+ // The priority should be;
493
+ //
494
+ // 1. Release commits (oldest tag first)
495
+ // 2. Master commits (oldest PR first)
496
+ // 3. Try commits (oldest PR first)
497
+ //
498
+ // Given the data we inserted above the expected SHA order is:
499
+ // sha5, sha6, sha3, sha4, sha1, sha2.
500
+
501
+ let machine = "machine-1" ;
502
+ let target = Target :: X86_64UnknownLinuxGnu ;
503
+ let expected = [ "sha5" , "sha6" , "sha3" , "sha4" , "sha1" , "sha2" ] ;
504
+
505
+ for & sha in & expected {
506
+ let job = db. take_commit_job ( machine, target) . await ;
507
+ assert ! ( job. is_some( ) , "expected a job for sha {sha}" ) ;
508
+ let job = job. unwrap ( ) ;
509
+ assert_eq ! ( job. sha, sha, "jobs dequeued out of priority order" ) ;
510
+
511
+ // Mark the job finished so it is not returned again.
512
+ db. finish_commit_job ( machine, target, sha. to_string ( ) ) . await ;
513
+ }
514
+
515
+ // After all six jobs have been taken, the queue should be empty.
516
+ assert ! (
517
+ db. take_commit_job( machine, target) . await . is_none( ) ,
518
+ "queue should be empty after draining all jobs"
519
+ ) ;
520
+
521
+ Ok ( ctx)
522
+ } )
523
+ . await ;
524
+ }
384
525
}
0 commit comments