FILE / ScuroNeko/Laniakea

tgapi/pool_test.go

Исходный файл и его история в репозитории.
FILE main
Files
ScuroNeko 29b208eeec
Golang lint / lint (push) Successful in 11m32s
(new): v1.2 release
2026-08-19 14:58:25 +03:00

91 lines
2.2 KiB
Go

package tgapi
import (
"context"
"errors"
"testing"
)
func TestWorkerPoolSubmitAfterStop(t *testing.T) {
pool := newWorkerPool(1, 1)
pool.start()
pool.stop()
if _, err := pool.submit(context.Background(), func(context.Context) (any, error) {
return nil, nil
}); !errors.Is(err, ErrPoolStopped) {
t.Fatalf("expected ErrPoolStopped, got %v", err)
}
}
func TestWorkerPoolRecoversTaskPanicAndContinues(t *testing.T) {
pool := newWorkerPool(1, 2)
pool.start()
defer pool.stop()
panicked, err := pool.submit(context.Background(), func(context.Context) (any, error) {
panic("boom")
})
if err != nil {
t.Fatalf("submit panic task returned error: %v", err)
}
result := <-panicked
if !errors.Is(result.err, ErrPoolWorkerPanic) {
t.Fatalf("expected ErrPoolWorkerPanic, got %v", result.err)
}
continued, err := pool.submit(context.Background(), func(context.Context) (any, error) {
return "ok", nil
})
if err != nil {
t.Fatalf("submit follow-up returned error: %v", err)
}
result = <-continued
if result.err != nil || result.value != "ok" {
t.Fatalf("worker did not continue: %#v", result)
}
}
func TestWorkerPoolQueueFull(t *testing.T) {
pool := newWorkerPool(1, 1)
pool.start()
defer pool.stop()
started := make(chan struct{})
release := make(chan struct{})
firstResult, err := pool.submit(context.Background(), func(context.Context) (any, error) {
close(started)
<-release
return "first", nil
})
if err != nil {
t.Fatalf("first submit returned error: %v", err)
}
<-started
secondResult, err := pool.submit(context.Background(), func(context.Context) (any, error) {
return "second", nil
})
if err != nil {
t.Fatalf("second submit returned error: %v", err)
}
if _, err := pool.submit(context.Background(), func(context.Context) (any, error) {
return "third", nil
}); !errors.Is(err, ErrPoolQueueFull) {
t.Fatalf("expected ErrPoolQueueFull, got %v", err)
}
close(release)
first := <-firstResult
if first.err != nil || first.value != "first" {
t.Fatalf("unexpected first result: %+v", first)
}
second := <-secondResult
if second.err != nil || second.value != "second" {
t.Fatalf("unexpected second result: %+v", second)
}
}