88 lines
2.9 KiB
Go
88 lines
2.9 KiB
Go
package view
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.novox.be/novox/mesh-sdk/go/delivery"
|
|
)
|
|
|
|
func stepAsk(t *testing.T, id, kind string, at time.Time) []byte {
|
|
t.Helper()
|
|
b, err := delivery.EncodeStepAsk(delivery.StepAsk{ID: id, Kind: kind, Language: delivery.AskGo, Asker: "mesh-delivery-checker", At: at,
|
|
Check: &delivery.CheckJob{Fetch: map[string]any{"repository": "novox/x", "commit": "0123456789abcdef0123456789abcdef01234567"}, Levels: []string{delivery.LevelUnit}}})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return b
|
|
}
|
|
|
|
// fakeSeats is the check worker of the go seat with three asks waiting and one held, the oldest at t0.
|
|
func fakeSeats(t *testing.T, now time.Time) *Backlog {
|
|
worker, _ := delivery.AskWorker(delivery.AskGo, delivery.AskCheck)
|
|
subject, _ := delivery.AskSubject(delivery.AskGo, delivery.AskCheck)
|
|
oldest := stepAsk(t, "m0000001aaaaaa", delivery.AskCheck, now.Add(-90*time.Second))
|
|
return &Backlog{Now: func() time.Time { return now },
|
|
Info: func(stream, w string) (uint64, uint64, uint64, error) {
|
|
switch w {
|
|
case worker:
|
|
return 3, 1, 42, nil
|
|
case "SEAT_NODE_BUILD_IMAGE_DELIVERY_worker":
|
|
return 0, 0, 1, fmt.Errorf("the worker is not there")
|
|
}
|
|
return 0, 0, 1, nil
|
|
},
|
|
Message: func(stream, s string, seq uint64) ([]byte, error) {
|
|
if s != subject || seq != 42 {
|
|
return nil, fmt.Errorf("asked %s at %d", s, seq)
|
|
}
|
|
return oldest, nil
|
|
}}
|
|
}
|
|
|
|
func TestThreeWaitingAsksAreShownWithTheOldestsAge(t *testing.T) { // 1887/A8a AC
|
|
now := time.Date(2026, 10, 23, 12, 0, 0, 0, time.UTC)
|
|
m := New()
|
|
m.SetBacklog(fakeSeats(t, now))
|
|
rows := m.Snapshot().Backlog
|
|
var check, image *BacklogRow
|
|
for i := range rows {
|
|
switch {
|
|
case rows[i].Language == "go" && rows[i].Kind == "check":
|
|
check = &rows[i]
|
|
case rows[i].Language == "image" && rows[i].Kind == "delivery":
|
|
image = &rows[i]
|
|
default:
|
|
t.Errorf("a quiet seat is listed: %+v", rows[i])
|
|
}
|
|
}
|
|
if check == nil || check.Waiting != 3 || check.Held != 1 || check.OldestSecs != 90 || !check.Oldest.Equal(now.Add(-90*time.Second)) || check.Error != "" {
|
|
t.Fatalf("check row = %+v", check)
|
|
}
|
|
if image == nil || image.Error == "" {
|
|
t.Errorf("a worker that cannot be read is dropped: %+v", rows)
|
|
}
|
|
var out strings.Builder
|
|
Table(&out, m.Snapshot())
|
|
for _, w := range []string{"BACKLOG OF BUILD ASKS", "go", "check", "3", "1m30s", "unreadable"} {
|
|
if !strings.Contains(out.String(), w) {
|
|
t.Errorf("table lacks %q:\n%s", w, out.String())
|
|
}
|
|
}
|
|
rec := httptest.NewRecorder()
|
|
Web(m).ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/", nil))
|
|
if !strings.Contains(rec.Body.String(), "BACKLOG OF BUILD ASKS") || !strings.Contains(rec.Body.String(), "1m30s") {
|
|
t.Errorf("page lacks the backlog:\n%s", rec.Body.String())
|
|
}
|
|
}
|
|
|
|
func TestNoBacklogReaderGivesNoRows(t *testing.T) {
|
|
if got := New().Snapshot().Backlog; got == nil || len(got) != 0 {
|
|
t.Errorf("backlog = %#v", got)
|
|
}
|
|
}
|