package buildstep import ( "context" "encoding/json" "sync" "testing" "time" "git.novox.be/novox/mesh-sdk/go/delivery" ) // 1921/S10 (the operator's yes to D1, ADR 0541): a check's levels run side by side: the integration level has started // before the unit level ends. The answer holds the levels in their order, so with the unit level failing it still names // the unit level first; the integration level's answer is kept after it for the log. func TestACheckRunsItsLevelsSideBySideAndAnswersThemInOrder(t *testing.T) { integrationStarted := make(chan struct{}) var once sync.Once var mu sync.Mutex unitWaited := false steps := AskSteps{ Fetch: func(context.Context, map[string]any) (any, error) { return map[string]any{"workspace": "/w", "modules": []string{"."}}, nil }, Test: func(ctx context.Context, args map[string]any) (any, error) { switch args["level"] { case delivery.LevelUnit: select { case <-integrationStarted: mu.Lock() unitWaited = true mu.Unlock() case <-time.After(2 * time.Second): } return map[string]any{"passed": false, "level": "unit"}, nil default: once.Do(func() { close(integrationStarted) }) return map[string]any{"passed": true, "level": "integration"}, nil } }, } out, err := RunAsk(context.Background(), steps, ask(delivery.CheckJob{Levels: []string{delivery.LevelUnit, delivery.LevelIntegration}, Fetch: map[string]any{"repository": "novox/x", "commit": runCommit}})) if err != nil { t.Fatal(err) } mu.Lock() defer mu.Unlock() if !unitWaited { t.Error("the integration level did not start while the unit level ran") } a := out.(delivery.CheckAnswer) if len(a.Levels) != 2 || a.Levels[0].Level != delivery.LevelUnit || a.Levels[1].Level != delivery.LevelIntegration { t.Fatalf("levels %+v, want unit then integration", a.Levels) } var first struct{ Passed bool } if err := json.Unmarshal(a.Levels[0].Tests[0], &first); err != nil || first.Passed { t.Errorf("the first level's result %s, want the unit level's failure", a.Levels[0].Tests[0]) } }