Implement catalog startup diagnostics (T-616)

This commit is contained in:
ila
2026-07-19 22:22:46 +08:00
parent 06234e11bf
commit 2c561894fd
28 changed files with 715 additions and 23 deletions
@@ -0,0 +1,22 @@
package main
import (
"context"
"testing"
"softbox.local/core/application"
)
func TestStartCatalogBootstrapPublishesThroughRuntime(t *testing.T) {
runtime := application.NewRuntime(1)
done := startCatalogBootstrap(context.Background(), runtime, application.CatalogSnapshotLoaderFunc(func(context.Context) (application.CatalogSnapshot, error) {
return application.CatalogSnapshot{Source: application.CatalogSourceRemote, Items: []application.CatalogListItem{{ID: "tool", Name: "Tool", Version: "1.0.0"}}}, nil
}))
if err := <-done; err != nil {
t.Fatalf("bootstrap error = %v", err)
}
event := <-runtime.Events()
if event.Type != application.EventCatalogRefreshed {
t.Fatalf("event type = %q", event.Type)
}
}
+24
View File
@@ -35,6 +35,10 @@ func main() {
}
func run() error {
return runWithCatalogLoader(application.UnconfiguredCatalogLoader{})
}
func runWithCatalogLoader(loader application.CatalogSnapshotLoader) error {
platform := windows.New()
window := new(app.Window)
window.Option(
@@ -59,10 +63,18 @@ func run() error {
window.Invalidate,
)
}()
catalogDone := startCatalogBootstrap(eventContext, runtime, loader)
defer func() {
cancelEvents()
runtime.Close()
relay.Close()
if bootstrapErr := <-catalogDone; bootstrapErr != nil &&
!errors.Is(bootstrapErr, context.Canceled) &&
!errors.Is(bootstrapErr, application.ErrCatalogSourceUnconfigured) &&
!errors.Is(bootstrapErr, application.ErrRuntimeClosed) &&
!errors.Is(bootstrapErr, application.ErrEventRelayClosed) {
log.Printf("%s catalog bootstrap failed", core.ProductName)
}
if pumpErr := <-pumpDone; pumpErr != nil &&
!errors.Is(pumpErr, context.Canceled) &&
!errors.Is(pumpErr, application.ErrEventRelayClosed) {
@@ -85,3 +97,15 @@ func run() error {
}
}
}
func startCatalogBootstrap(
ctx context.Context,
runtime *application.Runtime,
loader application.CatalogSnapshotLoader,
) <-chan error {
done := make(chan error, 1)
go func() {
done <- application.NewCatalogBootstrap(loader, runtime).Run(ctx)
}()
return done
}