go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/sdk/cron/job_scheduler_test.go (about) 1 /* 2 3 Copyright (c) 2023 - Present. Will Charczuk. All rights reserved. 4 Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository. 5 6 */ 7 8 package cron 9 10 import ( 11 "context" 12 "fmt" 13 "sync" 14 "testing" 15 16 . "go.charczuk.com/sdk/assert" 17 ) 18 19 var todo = context.TODO() 20 21 func Test_JobScheduler_handlesJobPanics(t *testing.T) { 22 manager := New() 23 waitGroup := sync.WaitGroup{} 24 waitGroup.Add(1) 25 26 var didRun bool 27 action := func(ctx context.Context) error { 28 defer waitGroup.Done() 29 didRun = true 30 panic("this is only a test") 31 } 32 err := manager.Register(todo, NewJob(OptJobName("panic-test"), OptJobAction(action))) 33 ItsNil(t, err) 34 _, err = manager.RunJob(todo, "panic-test") 35 ItsNil(t, err) 36 waitGroup.Wait() 37 ItsEqual(t, true, didRun, "should complete") 38 } 39 40 func Test_JobScheduler_jobLifecycleHooks(t *testing.T) { 41 jm := New() 42 _ = jm.StartAsync(todo) 43 defer func() { _ = jm.Stop(todo) }() 44 45 var shouldFail bool 46 job := newLifecycleTest(func(ctx context.Context) error { 47 defer func() { 48 shouldFail = !shouldFail 49 }() 50 if shouldFail { 51 return fmt.Errorf("only a test") 52 } 53 return nil 54 }) 55 _ = jm.Register(todo, job) 56 57 successSignal := job.SuccessSignal 58 ji, err := jm.RunJob(todo, job.Name()) 59 ItsNil(t, err) 60 <-ji.Finished 61 <-successSignal 62 63 brokenSignal := job.BrokenSignal 64 _, err = jm.RunJob(todo, job.Name()) 65 ItsNil(t, err) 66 <-ji.Finished 67 <-brokenSignal 68 69 fixedSignal := job.FixedSignal 70 ji, err = jm.RunJob(todo, job.Name()) 71 ItsNil(t, err) 72 <-ji.Finished 73 <-fixedSignal 74 75 ItsEqual(t, 3, job.Starts) 76 ItsEqual(t, 3, job.Completes) 77 ItsEqual(t, 1, job.Failures) 78 ItsEqual(t, 2, job.Successes) 79 }