rutina/rutina_test.go
2022-08-06 13:30:40 +03:00

109 lines
2.1 KiB
Go
Executable file

package rutina
import (
"context"
"errors"
"testing"
"time"
)
func TestSuccess(t *testing.T) {
r := New()
counter := 0
f := func(name string, ttl time.Duration) error {
counter++
<-time.After(ttl)
counter--
t.Log(name)
return nil
}
r.Go(func(ctx context.Context) error {
return f("one", 1*time.Second)
})
r.Go(func(ctx context.Context) error {
return f("two", 2*time.Second)
})
r.Go(func(ctx context.Context) error {
return f("three", 3*time.Second)
})
if err := r.Wait(); err != nil {
t.Error("Unexpected error", err)
}
if counter == 0 {
t.Log("All routines done")
} else {
t.Error("Not all routines stopped")
}
}
func TestError(t *testing.T) {
r := New()
f := func(name string, ttl time.Duration) error {
<-time.After(ttl)
t.Log(name)
return errors.New("error from " + name)
}
r.Go(func(ctx context.Context) error {
return f("one", 1*time.Second)
})
r.Go(func(ctx context.Context) error {
return f("two", 2*time.Second)
})
r.Go(func(ctx context.Context) error {
return f("three", 3*time.Second)
})
if err := r.Wait(); err != nil {
if err.Error() != "error from one" {
t.Error("Must be error from first routine")
}
t.Log(err)
}
t.Log("All routines done")
}
func TestErrorWithRestart(t *testing.T) {
maxCount := 2
r := New()
r.Go(func(ctx context.Context) error {
return nil
})
r.Go(func(ctx context.Context) error {
return errors.New("error")
}, RunOptions{
OnError: Restart,
MaxCount: &maxCount,
})
err := r.Wait()
if err != ErrRunLimit {
t.Error("Must be an error ErrRunLimit from r.Wait since all restarts was executed")
}
}
func TestContext(t *testing.T) {
r := New()
cc := false
r.Go(func(ctx context.Context) error {
<-time.After(1 * time.Second)
return nil
}, RunOptions{OnDone: Shutdown})
r.Go(func(ctx context.Context) error {
select {
case <-ctx.Done():
cc = true
return nil
case <-time.After(3 * time.Second):
return errors.New("Timeout")
}
})
if err := r.Wait(); err != nil {
t.Error("Unexpected error", err)
}
if cc {
t.Log("Second routine successfully complete by context done")
} else {
t.Error("Routine not completed by context")
}
}