Add HTTP /v1 MVC, TCP send path, groups with server-side member-avatar collage, object-storage upload, and friends/favorites around the architecture-v3 layout. Co-authored-by: Cursor <cursoragent@cursor.com>
73 lines
1.5 KiB
Go
73 lines
1.5 KiB
Go
package tcp
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"spark-server/internal/pkg/errs"
|
|
)
|
|
|
|
func TestTaskPoolRunsJob(t *testing.T) {
|
|
p := NewTaskPool(1, 4)
|
|
defer p.Close()
|
|
done := make(chan struct{})
|
|
err := p.Submit(context.Background(), func() { close(done) })
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
select {
|
|
case <-done:
|
|
case <-time.After(time.Second):
|
|
t.Fatal("timeout")
|
|
}
|
|
}
|
|
|
|
func TestTaskPoolRecoversPanic(t *testing.T) {
|
|
p := NewTaskPool(1, 4)
|
|
defer p.Close()
|
|
if err := p.Submit(context.Background(), func() { panic("boom") }); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
done := make(chan struct{})
|
|
deadline := time.Now().Add(2 * time.Second)
|
|
for time.Now().Before(deadline) {
|
|
if err := p.Submit(context.Background(), func() { close(done) }); err == nil {
|
|
break
|
|
}
|
|
time.Sleep(10 * time.Millisecond)
|
|
}
|
|
select {
|
|
case <-done:
|
|
case <-time.After(time.Second):
|
|
t.Fatal("worker lost after panic")
|
|
}
|
|
}
|
|
|
|
func TestTaskPoolBusy(t *testing.T) {
|
|
p := NewTaskPool(1, 1)
|
|
defer p.Close()
|
|
started := make(chan struct{})
|
|
block := make(chan struct{})
|
|
if err := p.Submit(context.Background(), func() { close(started); <-block }); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
<-started
|
|
if err := p.Submit(context.Background(), func() {}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
err := p.Submit(context.Background(), func() {})
|
|
close(block)
|
|
if err != errs.ErrBusy {
|
|
t.Fatalf("want busy, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestTaskPoolClosed(t *testing.T) {
|
|
p := NewTaskPool(1, 1)
|
|
p.Close()
|
|
if !p.Closed() {
|
|
t.Fatal("closed")
|
|
}
|
|
}
|