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.
95 lines
1.8 KiB
95 lines
1.8 KiB
package async_test
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"sync/atomic"
|
|
"syscall"
|
|
"testing"
|
|
"time"
|
|
|
|
"gitoa.ru/go-4devs/closer/async"
|
|
"gitoa.ru/go-4devs/closer/test"
|
|
)
|
|
|
|
func TestAsyncClose(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
c := async.Closer{}
|
|
closedFn := &test.Closed{}
|
|
c.Add(closedFn.CloseFnc("one", 0))
|
|
test.RequireNil(t, c.Close())
|
|
closedFn.TestLen(t, 1)
|
|
|
|
c.Wait(context.Background())
|
|
test.RequireNil(t, c.Close())
|
|
closedFn.TestLen(t, 1)
|
|
|
|
as := async.New(async.WithHandleError(func(e error) {
|
|
if !errors.Is(e, test.ErrClose) {
|
|
t.Fatalf("expect: %s, got:%s", test.ErrClose, e)
|
|
}
|
|
}))
|
|
as.Add(closedFn.CloseFnc("two", 0), func() error {
|
|
test.RequireNil(t, closedFn.CloseFnc("two", 0)())
|
|
|
|
return test.ErrClose
|
|
})
|
|
test.RequireNil(t, as.Close())
|
|
closedFn.TestLen(t, 3)
|
|
|
|
c = async.Closer{}
|
|
closedFn = &test.Closed{}
|
|
c.Add(
|
|
closedFn.CloseFnc("one", time.Millisecond/2),
|
|
closedFn.CloseFnc("two", time.Microsecond),
|
|
closedFn.CloseFnc("three", time.Millisecond/5))
|
|
test.RequireNil(t, c.Close())
|
|
|
|
closedFn.TestLen(t, 3)
|
|
}
|
|
|
|
func TestAsyncWait_Timeout(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
c := &async.Closer{}
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Microsecond)
|
|
defer cancel()
|
|
|
|
var cnt int32
|
|
|
|
go func() {
|
|
c.Wait(ctx)
|
|
atomic.AddInt32(&cnt, 1)
|
|
}()
|
|
|
|
cl := func() error {
|
|
atomic.AddInt32(&cnt, 1)
|
|
|
|
return nil
|
|
}
|
|
|
|
c.Add(cl)
|
|
c.Wait(context.Background())
|
|
|
|
if atomic.LoadInt32(&cnt) != 1 {
|
|
t.Fail()
|
|
}
|
|
}
|
|
|
|
func TestAsyncWait_Syscall(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
c := async.New()
|
|
cl := &test.Closed{}
|
|
|
|
time.AfterFunc(time.Second, func() {
|
|
test.RequireNil(t, syscall.Kill(syscall.Getpid(), syscall.SIGTERM))
|
|
})
|
|
|
|
c.Add(cl.CloseFnc("one", 0), cl.CloseFnc("one", 0))
|
|
c.Wait(context.Background(), syscall.SIGTERM, syscall.SIGINT)
|
|
|
|
cl.TestLen(t, 2)
|
|
}
|
|
|