js/shutdown_test.go

52 lines
1.1 KiB
Go

package js
import (
"context"
"testing"
"time"
)
func TestPoolGracefulShutdown(t *testing.T) {
p := NewPool()
p.Define(`function sleep(ms) {
var start = Date.now();
while (Date.now() - start < ms);
return "done";
}`)
// Start a long running task
errChan := make(chan error, 1)
go func() {
_, err := p.Call(context.Background(), "sleep", []any{500})
errChan <- err
}()
// Give it a moment to start
time.Sleep(100 * time.Millisecond)
// Try to stop the pool
stopCtx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
startStop := time.Now()
if err := p.Stop(stopCtx); err != nil {
t.Fatalf("Stop failed: %v", err)
}
stopDuration := time.Since(startStop)
if stopDuration < 300*time.Millisecond {
t.Errorf("Stop returned too early, expected it to wait for task. Duration: %v", stopDuration)
}
err := <-errChan
if err != nil {
t.Errorf("Call failed: %v", err)
}
// New calls should fail
_, err = p.Call(context.Background(), "sleep", []any{10})
if err == nil || err.Error() != "js.Pool: pool is closed" {
t.Errorf("Expected 'pool is closed' error, got: %v", err)
}
}