Make serve_stale refresh test deterministic (#172)

TestServeStaleMemberDoesNotBlockMerge reads the fetch counter right after the merges return, but the counted fetch runs inside the background refresh goroutine, so a slow schedule sees 1 instead of 2.

- signal from the stub fetch when the background refresh starts
- wait on that signal (5s timeout) before checking the fetch count
- raise the refresh-reaches-merge deadline to 5s

Reviewed-on: #172
Co-authored-by: unkin-agent <unkin-agent@unkin.net>
Co-committed-by: unkin-agent <unkin-agent@unkin.net>
This commit was merged in pull request #172.
This commit is contained in:
2026-10-25 20:22:09 +11:00
committed by BenVincent
parent f1b78988e4
commit a75aef8ded
+11 -1
View File
@@ -55,9 +55,14 @@ func fetchRepomd(t *testing.T, e *Engine) string {
func TestServeStaleMemberDoesNotBlockMerge(t *testing.T) {
release := make(chan struct{})
refreshing := make(chan struct{}, 1)
var slow atomic.Bool
e, calls := staleEngine(true, func() *RPMMember {
if slow.Load() {
select {
case refreshing <- struct{}{}:
default:
}
<-release
return rpmPkgMember("a", "2")
}
@@ -78,12 +83,17 @@ func TestServeStaleMemberDoesNotBlockMerge(t *testing.T) {
t.Fatal("merge blocked on a serve_stale member refresh")
}
}
select {
case <-refreshing:
case <-time.After(5 * time.Second):
t.Fatal("background refresh never started")
}
if n := calls.Load(); n != 2 {
t.Fatalf("member fetched %d times, want 2 (cold + one single-flighted refresh)", n)
}
close(release)
deadline := time.Now().Add(time.Second)
deadline := time.Now().Add(5 * time.Second)
for fetchRepomd(t, e) == v1 {
if time.Now().After(deadline) {
t.Fatal("background refresh never reached a merge")