distribution's two windows and the builder's old-form window each closed for good on a read that named no node (an empty node_haves, an unread placement): the second of a kind (security-upgrade review F3). delivery.StepWindow over delivery.WindowHeld is the one rule both call; a read naming no node judges nothing, as a first view's empty answer at revision 0 (ADR 0615). Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
42 lines
2.1 KiB
Go
42 lines
2.1 KiB
Go
package delivery
|
|
|
|
import (
|
|
"slices"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// The one rule every window keeper steps by (design 51; security-upgrade review F3): a read naming no node judges
|
|
// nothing, so an empty node_haves or an unread placement never closes a window.
|
|
func TestStepWindow(t *testing.T) {
|
|
now := time.Date(2026, 11, 4, 17, 0, 0, 0, time.UTC)
|
|
week := 7 * 24 * time.Hour
|
|
long := now.Add(-8 * 24 * time.Hour)
|
|
open := WindowHeld{Open: true, Holding: []string{"n1"}, Since: map[string]time.Time{"n1": long}}
|
|
for _, c := range []struct {
|
|
name string
|
|
w WindowHeld
|
|
named, holding []string
|
|
open, closed bool
|
|
holds, overdue []string
|
|
}{
|
|
{"a read naming no node leaves an open window open, its holder still overdue", open, nil, nil, true, false, []string{"n1"}, []string{"n1"}},
|
|
{"a read naming no node leaves a closed window closed", WindowHeld{Closed: long}, nil, nil, false, false, nil, nil},
|
|
{"a read naming nodes, none holding, closes an open window once", open, []string{"n1", "n2"}, nil, false, true, nil, nil},
|
|
{"a closed window a read finds unheld stays closed, said no more", WindowHeld{Closed: long, LastHolding: []string{"n1"}}, []string{"n1"}, nil, false, false, nil, nil},
|
|
{"a new holder opens it, since now, not overdue", WindowHeld{}, []string{"n1", "n2"}, []string{"n2"}, true, false, []string{"n2"}, nil},
|
|
{"a holder keeps its since and is overdue past the bound", open, []string{"n1", "n2"}, []string{"n2", "n1"}, true, false, []string{"n1", "n2"}, []string{"n1"}},
|
|
} {
|
|
next, closed, overdue := StepWindow(c.w, c.named, c.holding, now, week)
|
|
if next.Open != c.open || closed != c.closed || !slices.Equal(next.Holding, c.holds) || !slices.Equal(overdue, c.overdue) {
|
|
t.Errorf("%s: open %v closed %v holding %v overdue %v", c.name, next.Open, closed, next.Holding, overdue)
|
|
}
|
|
if closed && (!next.Closed.Equal(now) || !slices.Equal(next.LastHolding, c.w.Holding)) {
|
|
t.Errorf("%s: closed at %v, last held by %v", c.name, next.Closed, next.LastHolding)
|
|
}
|
|
if !c.open && !closed && !next.Closed.Equal(c.w.Closed) {
|
|
t.Errorf("%s: its last close moved to %v", c.name, next.Closed)
|
|
}
|
|
}
|
|
}
|