safing-portbase/modules/worker_test.go
2022-02-01 13:12:46 +01:00

65 lines
1.5 KiB
Go

package modules
import (
"context"
"errors"
"sync"
"testing"
"time"
)
var (
wModule = initNewModule("worker test module", nil, nil, nil)
errTest = errors.New("test error")
)
func TestWorker(t *testing.T) { //nolint:paralleltest // Too much interference expected.
// test basic functionality
err := wModule.RunWorker("test worker", func(ctx context.Context) error {
return nil
})
if err != nil {
t.Errorf("worker failed (should not): %s", err)
}
// test returning an error
err = wModule.RunWorker("test worker", func(ctx context.Context) error {
return errTest
})
if !errors.Is(err, errTest) {
t.Errorf("worker failed with unexpected error: %s", err)
}
// test service functionality
failCnt := 0
var sWTestGroup sync.WaitGroup
sWTestGroup.Add(1)
wModule.StartServiceWorker("test service-worker", 2*time.Millisecond, func(ctx context.Context) error {
failCnt++
t.Logf("service-worker test run #%d", failCnt)
if failCnt >= 3 {
sWTestGroup.Done()
return nil
}
return errTest
})
// wait for service-worker to complete test
sWTestGroup.Wait()
if failCnt != 3 {
t.Errorf("service-worker failed to restart")
}
// test panic recovery
err = wModule.RunWorker("test worker", func(ctx context.Context) error {
var a []byte
_ = a[0]
return nil
})
t.Logf("panic error message: %s", err)
panicked, mErr := IsPanic(err)
if !panicked {
t.Errorf("failed to return *ModuleError, got %+v", err)
} else {
t.Logf("panic stack trace:\n%s", mErr.StackTrace)
}
}