| // Copyright 2021 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package pool |
| |
| import ( |
| "context" |
| "io" |
| "testing" |
| ) |
| |
| func TestEmptyPool(t *testing.T) { |
| p := New(context.Background(), []Worker{}) |
| if err := p.Run(); err != nil { |
| t.Fatalf("got error from empty pool: %v", err) |
| } |
| } |
| |
| type countCloser struct { |
| c int |
| } |
| |
| func (c *countCloser) Close() error { |
| c.c++ |
| return nil |
| } |
| |
| type boolWorker struct { |
| countCloser |
| exec bool |
| } |
| |
| func (b *boolWorker) Run(_ context.Context) error { |
| b.exec = true |
| return Done |
| } |
| |
| func TestPool(t *testing.T) { |
| workers := []Worker{ |
| &boolWorker{}, |
| &boolWorker{}, |
| &boolWorker{}, |
| &boolWorker{}, |
| } |
| p := New(context.Background(), workers) |
| if err := p.Run(); err != nil { |
| t.Fatalf("got error from good pool: %v", err) |
| } |
| for _, w := range workers { |
| if !w.(*boolWorker).exec { |
| t.Fatal("found worker that was never executed") |
| } |
| } |
| } |
| |
| type badWorker struct { |
| countCloser |
| } |
| |
| func (b *badWorker) Run(_ context.Context) error { |
| return io.EOF |
| } |
| |
| func TestPoolError(t *testing.T) { |
| workers := []Worker{ |
| &boolWorker{}, |
| &boolWorker{}, |
| &boolWorker{}, |
| &badWorker{}, |
| } |
| p := New(context.Background(), workers) |
| if err := p.Run(); err == nil { |
| t.Fatal("expected error from bad worker") |
| } else if err != io.EOF { |
| t.Fatalf("unexpected error from pool: %v", err) |
| } |
| } |
| |
| type foreverWorker struct { |
| countCloser |
| } |
| |
| func (f *foreverWorker) Run(ctx context.Context) error { |
| return nil |
| } |
| |
| func TestPoolCancel(t *testing.T) { |
| workers := []Worker{ |
| &foreverWorker{}, |
| &foreverWorker{}, |
| &foreverWorker{}, |
| &foreverWorker{}, |
| } |
| ctx := context.Background() |
| ctx, cancel := context.WithCancel(ctx) |
| p := New(ctx, workers) |
| cancel() |
| if err := p.Run(); err != nil { |
| t.Fatalf("got error from good pool: %v", err) |
| } |
| } |