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 }