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  }