35 lines
997 B
Go
35 lines
997 B
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"sync/atomic"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// While a container waits, a pass is asked for every so often, not at some long interval; with nothing waiting, none
|
|
// (novox/hq ADR 0335 §2, ADR 0360 §11).
|
|
func TestAWaitIsAskedAgainSoon(t *testing.T) {
|
|
if BusyAskEvery > time.Minute {
|
|
t.Fatalf("a waiting container is asked every %s", BusyAskEvery)
|
|
}
|
|
var asked atomic.Int32
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
busyWaiting.Store(false)
|
|
t.Cleanup(func() { busyWaiting.Store(false) })
|
|
go busyPasses(ctx, func() { asked.Add(1) }, 10*time.Millisecond)
|
|
time.Sleep(100 * time.Millisecond)
|
|
if n := asked.Load(); n != 0 {
|
|
t.Fatalf("%d passes were asked with nothing waiting", n)
|
|
}
|
|
busyWaiting.Store(true)
|
|
deadline := time.Now().Add(2 * time.Second)
|
|
for asked.Load() == 0 && time.Now().Before(deadline) {
|
|
time.Sleep(10 * time.Millisecond)
|
|
}
|
|
if asked.Load() == 0 {
|
|
t.Fatal("no pass was asked while a container waits")
|
|
}
|
|
}
|