github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/worker/dependency/util_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package dependency_test
     5  
     6  import (
     7  	"time"
     8  
     9  	gc "gopkg.in/check.v1"
    10  	"launchpad.net/tomb"
    11  
    12  	coretesting "github.com/juju/juju/testing"
    13  	"github.com/juju/juju/worker"
    14  	"github.com/juju/juju/worker/dependency"
    15  )
    16  
    17  type manifoldHarness struct {
    18  	inputs []string
    19  	errors chan error
    20  	starts chan struct{}
    21  }
    22  
    23  func newManifoldHarness(inputs ...string) *manifoldHarness {
    24  	return &manifoldHarness{
    25  		inputs: inputs,
    26  		errors: make(chan error, 1000),
    27  		starts: make(chan struct{}, 1000),
    28  	}
    29  }
    30  
    31  func (ews *manifoldHarness) Manifold() dependency.Manifold {
    32  	return dependency.Manifold{
    33  		Inputs: ews.inputs,
    34  		Start:  ews.start,
    35  	}
    36  }
    37  
    38  func (ews *manifoldHarness) start(getResource dependency.GetResourceFunc) (worker.Worker, error) {
    39  	for _, resourceName := range ews.inputs {
    40  		if err := getResource(resourceName, nil); err != nil {
    41  			return nil, err
    42  		}
    43  	}
    44  	w := &minimalWorker{}
    45  	go func() {
    46  		defer w.tomb.Done()
    47  		ews.starts <- struct{}{}
    48  		select {
    49  		case <-w.tomb.Dying():
    50  		case err := <-ews.errors:
    51  			w.tomb.Kill(err)
    52  		}
    53  	}()
    54  	return w, nil
    55  }
    56  
    57  func (ews *manifoldHarness) AssertOneStart(c *gc.C) {
    58  	ews.AssertStart(c)
    59  	ews.AssertNoStart(c)
    60  }
    61  
    62  func (ews *manifoldHarness) AssertStart(c *gc.C) {
    63  	select {
    64  	case <-ews.starts:
    65  	case <-time.After(coretesting.LongWait):
    66  		c.Fatalf("never started")
    67  	}
    68  }
    69  
    70  func (ews *manifoldHarness) AssertNoStart(c *gc.C) {
    71  	select {
    72  	case <-time.After(coretesting.ShortWait):
    73  	case <-ews.starts:
    74  		c.Fatalf("started unexpectedly")
    75  	}
    76  }
    77  
    78  func (ews *manifoldHarness) InjectError(c *gc.C, err error) {
    79  	select {
    80  	case ews.errors <- err:
    81  	case <-time.After(coretesting.LongWait):
    82  		c.Fatalf("never sent")
    83  	}
    84  }
    85  
    86  type minimalWorker struct {
    87  	tomb tomb.Tomb
    88  }
    89  
    90  func (w *minimalWorker) Kill() {
    91  	w.tomb.Kill(nil)
    92  }
    93  
    94  func (w *minimalWorker) Wait() error {
    95  	return w.tomb.Wait()
    96  }
    97  
    98  func startMinimalWorker(_ dependency.GetResourceFunc) (worker.Worker, error) {
    99  	w := &minimalWorker{}
   100  	go func() {
   101  		<-w.tomb.Dying()
   102  		w.tomb.Done()
   103  	}()
   104  	return w, nil
   105  }
   106  
   107  func nothingFatal(_ error) bool {
   108  	return false
   109  }