github.com/Cloud-Foundations/Dominator@v0.3.4/lib/concurrent/impl_test.go (about) 1 package concurrent 2 3 import ( 4 "errors" 5 "testing" 6 "time" 7 ) 8 9 var ( 10 waitForReturn = make(chan struct{}, 10) 11 waitToGoodReturn = make(chan struct{}, 10) 12 waitToBadReturn = make(chan struct{}, 10) 13 ) 14 15 func badFunc() error { 16 <-waitToBadReturn 17 waitForReturn <- struct{}{} 18 return errors.New("injected error") 19 } 20 21 func goodFunc() error { 22 <-waitToGoodReturn 23 waitForReturn <- struct{}{} 24 return nil 25 } 26 27 func TestReapAllGood(t *testing.T) { 28 state := NewState(2) 29 state.GoRun(goodFunc) 30 state.GoRun(goodFunc) 31 if len(waitForReturn) > 0 { 32 t.Fatalf("Premature returns: %d", len(waitForReturn)) 33 } 34 waitToGoodReturn <- struct{}{} 35 waitToGoodReturn <- struct{}{} 36 if err := state.Reap(); err != nil { 37 t.Fatalf("Error reaping: %s", err) 38 } 39 if len(waitForReturn) != 2 { 40 t.Fatalf("Expected 2 returns, got: %d", len(waitForReturn)) 41 } 42 <-waitForReturn 43 <-waitForReturn 44 } 45 46 func TestReapGoodAndBad(t *testing.T) { 47 state := NewState(2) 48 state.GoRun(goodFunc) 49 state.GoRun(badFunc) 50 if len(waitForReturn) > 0 { 51 t.Fatalf("Premature returns: %d", len(waitForReturn)) 52 } 53 waitToBadReturn <- struct{}{} 54 reapError := make(chan error, 1) 55 go func() { 56 reapError <- state.Reap() 57 }() 58 timer := time.NewTimer(20 * time.Millisecond) 59 select { 60 case err := <-reapError: 61 t.Fatalf("Premature reap, err: %s", err) 62 case <-timer.C: 63 } 64 waitToGoodReturn <- struct{}{} 65 if err := <-reapError; err == nil { 66 t.Fatal("No error reaped") 67 } 68 if len(waitForReturn) != 2 { 69 t.Fatalf("Expected 2 returns, got: %d", len(waitForReturn)) 70 } 71 } 72 73 func TestReapBadGoodGood(t *testing.T) { 74 state := NewState(1) 75 state.GoRun(badFunc) 76 waitToBadReturn <- struct{}{} 77 state.GoRun(goodFunc) 78 waitToGoodReturn <- struct{}{} 79 state.GoRun(goodFunc) 80 waitToGoodReturn <- struct{}{} 81 <-waitForReturn 82 <-waitForReturn 83 <-waitForReturn 84 if err := state.Reap(); err == nil { 85 t.Fatal("No error reaped") 86 } 87 }