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  }