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:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user