mirror of
https://github.com/safing/portbase
synced 2025-04-10 20:49:09 +00:00
65 lines
1.5 KiB
Go
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)
|
|
}
|
|
}
|