mirror of
https://github.com/safing/portbase
synced 2025-09-01 18:19:57 +00:00
63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
package modules
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
wModule = initNewModule("worker test module", nil, nil, nil)
|
|
errTest = errors.New("test error")
|
|
)
|
|
|
|
func TestWorker(t *testing.T) {
|
|
// test basic functionality
|
|
err := wModule.StartWorker("test worker", false, func(ctx context.Context) error {
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
t.Errorf("worker failed (should not): %s", err)
|
|
}
|
|
|
|
// test returning an error
|
|
err = wModule.StartWorker("test worker", false, func(ctx context.Context) error {
|
|
return errTest
|
|
})
|
|
if err != errTest {
|
|
t.Errorf("worker failed with unexpected error: %s", err)
|
|
}
|
|
|
|
// test service functionality
|
|
serviceBackoffDuration = 2 * time.Millisecond // speed up backoff
|
|
failCnt := 0
|
|
err = wModule.StartWorker("test worker", true, func(ctx context.Context) error {
|
|
failCnt++
|
|
t.Logf("service-worker test run #%d", failCnt)
|
|
if failCnt >= 3 {
|
|
return nil
|
|
}
|
|
return errTest
|
|
})
|
|
if err == errTest {
|
|
t.Errorf("service-worker failed with unexpected error: %s", err)
|
|
}
|
|
if failCnt != 3 {
|
|
t.Errorf("service-worker failed to restart")
|
|
}
|
|
|
|
// test panic recovery
|
|
err = wModule.StartWorker("test worker", false, func(ctx context.Context) error {
|
|
var a []byte
|
|
_ = a[0] //nolint // we want to runtime panic!
|
|
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)
|
|
}
|
|
}
|