github.com/safing/portbase@v0.19.5/modules/worker_test.go (about) 1 package modules 2 3 import ( 4 "context" 5 "errors" 6 "sync" 7 "testing" 8 "time" 9 ) 10 11 var ( 12 wModule = initNewModule("worker test module", nil, nil, nil) 13 errTest = errors.New("test error") 14 ) 15 16 func TestWorker(t *testing.T) { //nolint:paralleltest // Too much interference expected. 17 // test basic functionality 18 err := wModule.RunWorker("test worker", func(ctx context.Context) error { 19 return nil 20 }) 21 if err != nil { 22 t.Errorf("worker failed (should not): %s", err) 23 } 24 25 // test returning an error 26 err = wModule.RunWorker("test worker", func(ctx context.Context) error { 27 return errTest 28 }) 29 if !errors.Is(err, errTest) { 30 t.Errorf("worker failed with unexpected error: %s", err) 31 } 32 33 // test service functionality 34 failCnt := 0 35 var sWTestGroup sync.WaitGroup 36 sWTestGroup.Add(1) 37 wModule.StartServiceWorker("test service-worker", 2*time.Millisecond, func(ctx context.Context) error { 38 failCnt++ 39 t.Logf("service-worker test run #%d", failCnt) 40 if failCnt >= 3 { 41 sWTestGroup.Done() 42 return nil 43 } 44 return errTest 45 }) 46 // wait for service-worker to complete test 47 sWTestGroup.Wait() 48 if failCnt != 3 { 49 t.Errorf("service-worker failed to restart") 50 } 51 52 // test panic recovery 53 err = wModule.RunWorker("test worker", func(ctx context.Context) error { 54 var a []byte 55 _ = a[0] 56 return nil 57 }) 58 t.Logf("panic error message: %s", err) 59 panicked, mErr := IsPanic(err) 60 if !panicked { 61 t.Errorf("failed to return *ModuleError, got %+v", err) 62 } else { 63 t.Logf("panic stack trace:\n%s", mErr.StackTrace) 64 } 65 }