rutina/rutina_test.go
Alexander Kiryukhin 837cfe3223 Refactored
New clean API
Timeouts and restart limits
2020-01-12 16:40:01 +03:00

89 lines
1.8 KiB
Go
Executable file

package rutina
import (
"context"
"errors"
"testing"
"time"
)
func TestSuccess(t *testing.T) {
r := New(nil)
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)
}, nil)
r.Go(func(ctx context.Context) error {
return f("two", 2*time.Second)
}, nil)
r.Go(func(ctx context.Context) error {
return f("three", 3*time.Second)
}, nil)
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(nil)
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)
}, nil)
r.Go(func(ctx context.Context) error {
return f("two", 2*time.Second)
}, nil)
r.Go(func(ctx context.Context) error {
return f("three", 3*time.Second)
}, nil)
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 TestContext(t *testing.T) {
r := New(nil)
cc := false
r.Go(func(ctx context.Context) error {
<-time.After(1 * time.Second)
return nil
}, RunOpt.SetOnDone(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")
}
}, nil)
if err := r.Wait(); err != nil {
t.Error("Unexpected error", err)
}
if cc {
t.Log("Second routine succesfuly complete by context done")
} else {
t.Error("Routine not completed by context")
}
}