You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

164 lines
3.1 KiB

package daemon_test
import (
"context"
"errors"
"sync/atomic"
"testing"
"time"
"gitoa.ru/go-4devs/daemon"
)
//nolint: gochecknoglobals
var (
ctx = context.Background()
errJob = errors.New("error job")
jobName = "job name"
jobNameOption = daemon.WithName(jobName)
)
func createJob(count *int32, d time.Duration, err error, opts ...daemon.Option) *daemon.Job {
opts = append(opts, jobNameOption)
return daemon.NewJob(func(ctx context.Context) error {
if d > 0 {
<-time.After(d)
}
atomic.AddInt32(count, 1)
return err
}, opts...)
}
func TestDoJobSuccess(t *testing.T) {
t.Parallel()
var (
cnt int32
cnt2 int32
runm int32
clm int32
)
m := daemon.New()
m.Do(ctx, createJob(&cnt, 0, nil), daemon.WithFreq(time.Second/3))
mwRun := func(ctx context.Context, next daemon.Run) error {
atomic.AddInt32(&runm, 1)
return next(ctx)
}
mwStop := func(ctx context.Context, next daemon.Run) error {
atomic.AddInt32(&clm, 1)
return next(ctx)
}
m.Do(ctx, createJob(&cnt2, 0, nil,
daemon.WithRunMiddleware(mwRun, mwRun, mwRun),
daemon.WithStopMiddleware(mwStop, mwStop, mwStop),
), daemon.WithFreq(time.Second/10))
time.AfterFunc(time.Second, func() {
requireNil(t, m.Close())
})
m.Wait()
requireTrue(t, cnt > 2)
requireTrue(t, cnt2 >= 10)
requireTrue(t, cnt2*3 == runm)
requireTrue(t, clm == 3)
}
func requireNil(t *testing.T, ex interface{}) {
t.Helper()
if ex != nil {
t.Fatal("expect nil")
}
}
func requireTrue(t *testing.T, ex bool) {
t.Helper()
if !ex {
t.Fatal("expect true")
}
}
func TestDoJobStop(t *testing.T) {
t.Parallel()
m := daemon.New()
var cnt int32
m.Do(ctx, createJob(&cnt, 0, daemon.StopJob(nil)), daemon.WithFreq(time.Nanosecond))
m.Wait()
requireTrue(t, cnt == 1)
}
func TestDoJobDelay(t *testing.T) {
t.Parallel()
var cnt int32
m := daemon.New()
m.Do(ctx, createJob(&cnt, 0, daemon.DelayJob(time.Second/3, nil)), daemon.WithFreq(time.Second))
time.AfterFunc(time.Second, func() {
requireNil(t, m.Close())
})
m.Wait()
requireTrue(t, cnt > 2)
}
func TestDoJobSkipErr(t *testing.T) {
t.Parallel()
var cnt int32
m := daemon.New()
m.Do(ctx, createJob(&cnt, 0, errJob), daemon.WithFreq(time.Second/3))
time.AfterFunc(time.Second, func() {
requireNil(t, m.Close())
})
m.Wait()
requireTrue(t, cnt > 2)
}
func TestDoJobRetryErr(t *testing.T) {
t.Parallel()
var cnt int32
m := daemon.New()
m.Do(ctx, createJob(&cnt, time.Millisecond, errJob, daemon.Retry(3, daemon.StopJob)), daemon.WithFreq(time.Nanosecond))
m.Wait()
requireTrue(t, cnt == 3)
}
func TestDoJobName(t *testing.T) {
t.Parallel()
j := daemon.NewJob(func(ctx context.Context) error {
return nil
})
requireTrue(t, j.String() == "daemon_test.TestDoJobName.func1")
jn := daemon.NewJob(func(ctx context.Context) error {
return nil
}, jobNameOption)
requireTrue(t, jn.String() == "job name")
}
func TestDoManagerRetryErr(t *testing.T) {
t.Parallel()
var cnt int32
m := daemon.New(daemon.Retry(3, daemon.StopJob))
m.Do(ctx, createJob(&cnt, 0, errJob), daemon.WithFreq(time.Second/5))
m.Wait()
requireTrue(t, cnt == 3)
}