github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/machineactions/manifold_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Copyright 2016 Cloudbase Solutions 3 // Licensed under the AGPLv3, see LICENCE file for details. 4 5 package machineactions_test 6 7 import ( 8 "github.com/juju/errors" 9 "github.com/juju/testing" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 "gopkg.in/juju/names.v2" 13 14 "github.com/juju/juju/agent" 15 "github.com/juju/juju/api/base" 16 "github.com/juju/juju/worker" 17 "github.com/juju/juju/worker/dependency" 18 dt "github.com/juju/juju/worker/dependency/testing" 19 "github.com/juju/juju/worker/machineactions" 20 ) 21 22 type ManifoldSuite struct { 23 testing.IsolationSuite 24 context dependency.Context 25 fakeAgent agent.Agent 26 fakeCaller base.APICaller 27 fakeFacade machineactions.Facade 28 fakeWorker worker.Worker 29 newFacade func(machineactions.Facade) func(base.APICaller) machineactions.Facade 30 newWorker func(worker.Worker, error) func(machineactions.WorkerConfig) (worker.Worker, error) 31 } 32 33 var _ = gc.Suite(&ManifoldSuite{}) 34 35 func (s *ManifoldSuite) SetUpSuite(c *gc.C) { 36 s.IsolationSuite.SetUpSuite(c) 37 s.fakeAgent = &fakeAgent{tag: fakeTag} 38 s.fakeCaller = &fakeCaller{} 39 40 s.context = dt.StubContext(nil, map[string]interface{}{ 41 "wut": s.fakeAgent, 42 "exactly": s.fakeCaller, 43 }) 44 45 s.newFacade = func(facade machineactions.Facade) func(base.APICaller) machineactions.Facade { 46 s.fakeFacade = facade 47 return func(apiCaller base.APICaller) machineactions.Facade { 48 c.Assert(apiCaller, gc.Equals, s.fakeCaller) 49 return facade 50 } 51 } 52 s.newWorker = func(w worker.Worker, err error) func(machineactions.WorkerConfig) (worker.Worker, error) { 53 s.fakeWorker = w 54 return func(wc machineactions.WorkerConfig) (worker.Worker, error) { 55 c.Assert(wc.Facade, gc.Equals, s.fakeFacade) 56 c.Assert(wc.MachineTag, gc.Equals, fakeTag) 57 c.Assert(wc.HandleAction, gc.Equals, fakeHandleAction) 58 return w, err 59 } 60 } 61 } 62 63 func (s *ManifoldSuite) TestInputs(c *gc.C) { 64 manifold := machineactions.Manifold(machineactions.ManifoldConfig{ 65 AgentName: "wut", 66 APICallerName: "exactly", 67 }) 68 c.Check(manifold.Inputs, jc.DeepEquals, []string{"wut", "exactly"}) 69 } 70 71 func (s *ManifoldSuite) TestStartMissingAgent(c *gc.C) { 72 manifold := machineactions.Manifold(machineactions.ManifoldConfig{ 73 AgentName: "wut", 74 APICallerName: "exactly", 75 }) 76 context := dt.StubContext(nil, map[string]interface{}{ 77 "wut": dependency.ErrMissing, 78 }) 79 80 w, err := manifold.Start(context) 81 c.Assert(errors.Cause(err), gc.Equals, dependency.ErrMissing) 82 c.Assert(w, gc.IsNil) 83 } 84 85 func (s *ManifoldSuite) TestStartMissingAPI(c *gc.C) { 86 manifold := machineactions.Manifold(machineactions.ManifoldConfig{ 87 AgentName: "wut", 88 APICallerName: "exactly", 89 }) 90 context := dt.StubContext(nil, map[string]interface{}{ 91 "wut": &fakeAgent{}, 92 "exactly": dependency.ErrMissing, 93 }) 94 95 w, err := manifold.Start(context) 96 c.Assert(errors.Cause(err), gc.Equals, dependency.ErrMissing) 97 c.Assert(w, gc.IsNil) 98 } 99 100 func (s *ManifoldSuite) TestStartWorkerError(c *gc.C) { 101 manifold := machineactions.Manifold(machineactions.ManifoldConfig{ 102 AgentName: "wut", 103 APICallerName: "exactly", 104 NewFacade: s.newFacade(&fakeFacade{}), 105 NewWorker: s.newWorker(nil, errors.New("blam")), 106 }) 107 108 w, err := manifold.Start(s.context) 109 c.Assert(err, gc.ErrorMatches, "blam") 110 c.Assert(w, gc.IsNil) 111 } 112 113 func (s *ManifoldSuite) TestStartSuccess(c *gc.C) { 114 fakeWorker := &fakeWorker{} 115 manifold := machineactions.Manifold(machineactions.ManifoldConfig{ 116 AgentName: "wut", 117 APICallerName: "exactly", 118 NewFacade: s.newFacade(&fakeFacade{}), 119 NewWorker: s.newWorker(fakeWorker, nil), 120 }) 121 122 w, err := manifold.Start(s.context) 123 c.Assert(err, jc.ErrorIsNil) 124 c.Assert(w, gc.Equals, fakeWorker) 125 } 126 127 func (s *ManifoldSuite) TestInvalidTag(c *gc.C) { 128 fakeWorker := &fakeWorker{} 129 manifold := machineactions.Manifold(machineactions.ManifoldConfig{ 130 AgentName: "wut", 131 APICallerName: "exactly", 132 NewFacade: s.newFacade(&fakeFacade{}), 133 NewWorker: s.newWorker(fakeWorker, nil), 134 }) 135 context := dt.StubContext(nil, map[string]interface{}{ 136 "wut": &fakeAgent{tag: fakeTagErr}, 137 "exactly": s.fakeCaller, 138 }) 139 140 w, err := manifold.Start(context) 141 c.Assert(err, gc.ErrorMatches, "this manifold can only be used inside a machine") 142 c.Assert(w, gc.IsNil) 143 } 144 145 var fakeTag = names.NewMachineTag("4") 146 var fakeTagErr = names.NewUnitTag("whatatag/0") 147 148 type fakeAgent struct { 149 agent.Agent 150 tag names.Tag 151 } 152 153 func (mock *fakeAgent) CurrentConfig() agent.Config { 154 return &fakeConfig{tag: mock.tag} 155 } 156 157 type fakeConfig struct { 158 agent.Config 159 tag names.Tag 160 } 161 162 func (mock *fakeConfig) Tag() names.Tag { 163 return mock.tag 164 } 165 166 type fakeCaller struct { 167 base.APICaller 168 } 169 170 type fakeFacade struct { 171 machineactions.Facade 172 } 173 174 type fakeWorker struct { 175 worker.Worker 176 } 177 178 var fakeHandleAction = func(name string, params map[string]interface{}) (results map[string]interface{}, err error) { 179 return nil, nil 180 }