diff --git a/src/restic/worker/pool_test.go b/src/restic/worker/pool_test.go index 16b285702..78cda9cd7 100644 --- a/src/restic/worker/pool_test.go +++ b/src/restic/worker/pool_test.go @@ -94,29 +94,32 @@ var errCancelled = errors.New("cancelled") type Job struct { suc chan struct{} - d time.Duration -} - -func wait(job worker.Job, done <-chan struct{}) (interface{}, error) { - j := job.Data.(Job) - select { - case j.suc <- struct{}{}: - return time.Now(), nil - case <-time.After(j.d): - return time.Now(), nil - case <-done: - return nil, errCancelled - } } func TestPoolCancel(t *testing.T) { - jobCh, resCh, p := newBufferedPool(20, concurrency, wait) + barrier := make(chan struct{}) - suc := make(chan struct{}, 1) - for i := 0; i < 20; i++ { - jobCh <- worker.Job{Data: Job{suc: suc, d: time.Second}} + wait := func(job worker.Job, done <-chan struct{}) (interface{}, error) { + j := job.Data.(Job) + + <-barrier + + select { + case j.suc <- struct{}{}: + return time.Now(), nil + case <-done: + return nil, errCancelled + } } + jobCh, resCh, p := newBufferedPool(20, concurrency, wait) + + suc := make(chan struct{}) + for i := 0; i < 20; i++ { + jobCh <- worker.Job{Data: Job{suc: suc}} + } + + close(barrier) <-suc p.Cancel() p.Wait()