61 lines
2.0 KiB
Go
61 lines
2.0 KiB
Go
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])
|
|
}
|
|
}
|