44 lines
876 B
Go
44 lines
876 B
Go
package xlgo_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
xlgo "github.com/EthanCodeCraft/xlgo-core"
|
|
)
|
|
|
|
func TestAppGoWaitsOnShutdown(t *testing.T) {
|
|
app := xlgo.New()
|
|
|
|
started := make(chan struct{})
|
|
exited := make(chan struct{})
|
|
app.Go(func(ctx context.Context) {
|
|
close(started)
|
|
<-ctx.Done()
|
|
// 模拟收尾
|
|
time.Sleep(10 * time.Millisecond)
|
|
close(exited)
|
|
})
|
|
|
|
<-started
|
|
|
|
// Shutdown 应 cancel ctx 并等待 goroutine 退出
|
|
done := make(chan error, 1)
|
|
go func() { done <- app.Shutdown() }()
|
|
select {
|
|
case <-exited:
|
|
// goroutine 在 cancel 后退出,符合预期
|
|
case <-time.After(2 * time.Second):
|
|
t.Fatal("App.Go goroutine did not exit after Shutdown cancel")
|
|
}
|
|
select {
|
|
case err := <-done:
|
|
if err != nil {
|
|
t.Errorf("Shutdown returned error: %v", err)
|
|
}
|
|
case <-time.After(2 * time.Second):
|
|
t.Fatal("Shutdown did not return")
|
|
}
|
|
}
|