Give the words' zone through a seam, so no test writes time.Local under the race detector (novox/hq issue 443)
mesh/merge-gate pass: builds mesh-controller → novox; no bus step; every machine composes with the change as it did without (4 of 4 compose)
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery delivered
mesh/delivery-group group fix/443-a-stalled-lines-times-are-local delivered: every member is delivered
mesh/merge-gate pass: builds mesh-controller → novox; no bus step; every machine composes with the change as it did without (4 of 4 compose)
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery delivered
mesh/delivery-group group fix/443-a-stalled-lines-times-are-local delivered: every member is delivered
This commit is contained in:
@@ -61,6 +61,10 @@ type waitingCheck struct {
|
|||||||
// wordsNow is the time the words are said at, which says whether a time needs its day; a seam a test replaces.
|
// wordsNow is the time the words are said at, which says whether a time needs its day; a seam a test replaces.
|
||||||
var wordsNow = time.Now
|
var wordsNow = time.Now
|
||||||
|
|
||||||
|
// wordsZone is the zone a stalled line's times are said in: the controller's local zone, as every other time in its
|
||||||
|
// messages. A seam a test replaces, so that no test writes time.Local, which every goroutine of the package reads.
|
||||||
|
var wordsZone = func() *time.Location { return time.Local }
|
||||||
|
|
||||||
// operatorsOnly is whether the table leaves H2 nothing to do for the line: the state is the operator's.
|
// operatorsOnly is whether the table leaves H2 nothing to do for the line: the state is the operator's.
|
||||||
func (l stalledLine) operatorsOnly() bool { return l.H2 == "" || strings.HasPrefix(l.H2, "none") }
|
func (l stalledLine) operatorsOnly() bool { return l.H2 == "" || strings.HasPrefix(l.H2, "none") }
|
||||||
|
|
||||||
|
|||||||
@@ -921,7 +921,7 @@ func sinceWords(since string) string {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return ", since a time the forge did not say"
|
return ", since a time the forge did not say"
|
||||||
}
|
}
|
||||||
local, today := at.Local(), wordsNow().Local()
|
local, today := at.In(wordsZone()), wordsNow().In(wordsZone())
|
||||||
if local.YearDay() == today.YearDay() && local.Year() == today.Year() {
|
if local.YearDay() == today.YearDay() && local.Year() == today.Year() {
|
||||||
return " since " + local.Format("15:04")
|
return " since " + local.Format("15:04")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -408,10 +408,12 @@ func TestAnUnansweredMergeCheckSaysWhichCheckAndWhatToDo(t *testing.T) {
|
|||||||
// the finished words it gave before, and the controller words it in its local zone, as every other time in a message.
|
// the finished words it gave before, and the controller words it in its local zone, as every other time in a message.
|
||||||
// The line is the one mesh-delivery says, as in the report of issue 443, with the checks it now carries.
|
// The line is the one mesh-delivery says, as in the report of issue 443, with the checks it now carries.
|
||||||
func TestAnUnansweredMergeChecksTimeIsSaidInLocalTime(t *testing.T) {
|
func TestAnUnansweredMergeChecksTimeIsSaidInLocalTime(t *testing.T) {
|
||||||
was, wasNow := time.Local, wordsNow
|
// The operator's zone given through the seam, never by writing time.Local: other tests' goroutines read it, and
|
||||||
time.Local = time.FixedZone("CEST", 2*60*60)
|
// the build seat runs the suite under the race detector.
|
||||||
|
wasZone, wasNow := wordsZone, wordsNow
|
||||||
|
wordsZone = func() *time.Location { return time.FixedZone("CEST", 2*60*60) }
|
||||||
wordsNow = func() time.Time { return time.Date(2026, 10, 11, 1, 12, 39, 0, time.UTC) }
|
wordsNow = func() time.Time { return time.Date(2026, 10, 11, 1, 12, 39, 0, time.UTC) }
|
||||||
t.Cleanup(func() { time.Local, wordsNow = was, wasNow })
|
t.Cleanup(func() { wordsZone, wordsNow = wasZone, wasNow })
|
||||||
|
|
||||||
var l stalledLine
|
var l stalledLine
|
||||||
if err := json.Unmarshal([]byte(`{"id":"novox/mesh-controller@c11222026a3b","number":212,"state":"unanswered",`+
|
if err := json.Unmarshal([]byte(`{"id":"novox/mesh-controller@c11222026a3b","number":212,"state":"unanswered",`+
|
||||||
|
|||||||
Reference in New Issue
Block a user