diff --git a/internal/virtual/engine_test.go b/internal/virtual/engine_test.go index 73814ed..abd22ff 100644 --- a/internal/virtual/engine_test.go +++ b/internal/virtual/engine_test.go @@ -492,9 +492,10 @@ func TestFetchFilesErrorCancelsRest(t *testing.T) { } } -// overlapEngine serves fixed member index paths, holding each index file fetch -// until all are in flight or a short wait expires, and records the peak. -func overlapEngine(index map[string][]byte, indexFiles int, peak *atomic.Int32) *Engine { +// overlapEngine serves fixed member index paths and records the peak number of +// index file fetches in flight. Each fetch blocks until want are in flight (or +// fails after 5s); with want 1 it also holds briefly so a stray overlap shows. +func overlapEngine(index map[string][]byte, want int32, peak *atomic.Int32) *Engine { e := fakeEngine(nil) var inFlight atomic.Int32 e.memberPath = func(_ context.Context, _ models.Remote, path string) ([]byte, error) { @@ -509,9 +510,15 @@ func overlapEngine(index map[string][]byte, indexFiles int, peak *atomic.Int32) defer inFlight.Add(-1) for p := peak.Load(); n > p && !peak.CompareAndSwap(p, n); p = peak.Load() { } - for deadline := time.Now().Add(50 * time.Millisecond); peak.Load() < int32(indexFiles) && time.Now().Before(deadline); { + for deadline := time.Now().Add(5 * time.Second); peak.Load() < want; { + if time.Now().After(deadline) { + return nil, fmt.Errorf("%s: only %d of %d fetches in flight", path, peak.Load(), want) + } time.Sleep(time.Millisecond) } + if want == 1 { + time.Sleep(10 * time.Millisecond) + } return body, nil } return e @@ -527,7 +534,7 @@ func TestFetchRPMMemberHonoursParallelFetch(t *testing.T) { } for parallel, want := range map[bool]int32{false: 1, true: 3} { var peak atomic.Int32 - m, err := overlapEngine(index, 3, &peak).fetchRPMMember(context.Background(), "a", parallel) + m, err := overlapEngine(index, want, &peak).fetchRPMMember(context.Background(), "a", parallel) if err != nil { t.Fatal(err) } @@ -552,7 +559,7 @@ func TestFetchDebMemberHonoursParallelFetch(t *testing.T) { } for parallel, want := range map[bool]int32{false: 1, true: 3} { var peak atomic.Int32 - m, err := overlapEngine(index, 3, &peak).fetchDebMember(context.Background(), "a", "dists/s/", parallel) + m, err := overlapEngine(index, want, &peak).fetchDebMember(context.Background(), "a", "dists/s/", parallel) if err != nil { t.Fatal(err) }