@@ -525,6 +525,72 @@ func TestDetectorHungOtherJobTypes(t *testing.T) {
525
525
detector .Wait ()
526
526
}
527
527
528
+ func TestDetectorHungCanceledJob (t * testing.T ) {
529
+ t .Parallel ()
530
+
531
+ var (
532
+ ctx = testutil .Context (t , testutil .WaitLong )
533
+ db , pubsub = dbtestutil .NewDB (t )
534
+ log = slogtest .Make (t , nil )
535
+ tickCh = make (chan time.Time )
536
+ statsCh = make (chan unhanger.Stats )
537
+ )
538
+
539
+ var (
540
+ now = time .Now ()
541
+ tenMinAgo = now .Add (- time .Minute * 10 )
542
+ sixMinAgo = now .Add (- time .Minute * 6 )
543
+ org = dbgen .Organization (t , db , database.Organization {})
544
+ user = dbgen .User (t , db , database.User {})
545
+ file = dbgen .File (t , db , database.File {})
546
+
547
+ // Template import job.
548
+ templateImportJob = dbgen .ProvisionerJob (t , db , database.ProvisionerJob {
549
+ CreatedAt : tenMinAgo ,
550
+ CanceledAt : sql.NullTime {
551
+ Time : tenMinAgo ,
552
+ Valid : true ,
553
+ },
554
+ UpdatedAt : sixMinAgo ,
555
+ StartedAt : sql.NullTime {
556
+ Time : tenMinAgo ,
557
+ Valid : true ,
558
+ },
559
+ OrganizationID : org .ID ,
560
+ InitiatorID : user .ID ,
561
+ Provisioner : database .ProvisionerTypeEcho ,
562
+ StorageMethod : database .ProvisionerStorageMethodFile ,
563
+ FileID : file .ID ,
564
+ Type : database .ProvisionerJobTypeTemplateVersionImport ,
565
+ Input : []byte ("{}" ),
566
+ })
567
+ )
568
+
569
+ t .Log ("template import job ID: " , templateImportJob .ID )
570
+
571
+ detector := unhanger .New (ctx , db , pubsub , log , tickCh ).WithStatsChannel (statsCh )
572
+ detector .Start ()
573
+ tickCh <- now
574
+
575
+ stats := <- statsCh
576
+ require .NoError (t , stats .Error )
577
+ require .Len (t , stats .TerminatedJobIDs , 1 )
578
+ require .Contains (t , stats .TerminatedJobIDs , templateImportJob .ID )
579
+
580
+ // Check that the job was updated.
581
+ job , err := db .GetProvisionerJobByID (ctx , templateImportJob .ID )
582
+ require .NoError (t , err )
583
+ require .WithinDuration (t , now , job .UpdatedAt , 30 * time .Second )
584
+ require .True (t , job .CompletedAt .Valid )
585
+ require .WithinDuration (t , now , job .CompletedAt .Time , 30 * time .Second )
586
+ require .True (t , job .Error .Valid )
587
+ require .Contains (t , job .Error .String , "Build has been detected as hung" )
588
+ require .False (t , job .ErrorCode .Valid )
589
+
590
+ detector .Close ()
591
+ detector .Wait ()
592
+ }
593
+
528
594
func TestDetectorPushesLogs (t * testing.T ) {
529
595
t .Parallel ()
530
596
0 commit comments