github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/lifeflag/manifold_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package lifeflag_test 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/names/v5" 9 "github.com/juju/testing" 10 jc "github.com/juju/testing/checkers" 11 "github.com/juju/worker/v3" 12 "github.com/juju/worker/v3/dependency" 13 dt "github.com/juju/worker/v3/dependency/testing" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/agent" 17 "github.com/juju/juju/api/base" 18 "github.com/juju/juju/cmd/jujud/agent/engine" 19 "github.com/juju/juju/core/life" 20 "github.com/juju/juju/worker/lifeflag" 21 ) 22 23 type ManifoldSuite struct { 24 testing.IsolationSuite 25 } 26 27 var _ = gc.Suite(&ManifoldSuite{}) 28 29 func (*ManifoldSuite) TestInputs(c *gc.C) { 30 manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{ 31 APICallerName: "boris", 32 }) 33 c.Check(manifold.Inputs, jc.DeepEquals, []string{"boris"}) 34 } 35 36 func (*ManifoldSuite) TestFilter(c *gc.C) { 37 expect := errors.New("squish") 38 manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{ 39 Filter: func(error) error { return expect }, 40 }) 41 actual := manifold.Filter(errors.New("blarg")) 42 c.Check(actual, gc.Equals, expect) 43 } 44 45 func (*ManifoldSuite) TestOutputBadWorker(c *gc.C) { 46 manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{}) 47 worker := struct{ worker.Worker }{} 48 var flag engine.Flag 49 err := manifold.Output(worker, &flag) 50 c.Check(err, gc.ErrorMatches, "expected in to implement Flag; got a .*") 51 } 52 53 func (*ManifoldSuite) TestOutputBadTarget(c *gc.C) { 54 manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{}) 55 worker := &lifeflag.Worker{} 56 var flag interface{} 57 err := manifold.Output(worker, &flag) 58 c.Check(err, gc.ErrorMatches, "expected out to be a \\*Flag; got a .*") 59 } 60 61 func (*ManifoldSuite) TestOutputSuccess(c *gc.C) { 62 manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{}) 63 worker := &lifeflag.Worker{} 64 var flag engine.Flag 65 err := manifold.Output(worker, &flag) 66 c.Check(err, jc.ErrorIsNil) 67 c.Check(flag, gc.Equals, worker) 68 } 69 70 func (*ManifoldSuite) TestMissingAPICaller(c *gc.C) { 71 context := dt.StubContext(nil, map[string]interface{}{ 72 "api-caller": dependency.ErrMissing, 73 }) 74 manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{ 75 APICallerName: "api-caller", 76 }) 77 78 worker, err := manifold.Start(context) 79 c.Check(worker, gc.IsNil) 80 c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing) 81 } 82 83 func (*ManifoldSuite) TestNewWorkerError(c *gc.C) { 84 expectFacade := struct{ lifeflag.Facade }{} 85 expectEntity := names.NewMachineTag("33") 86 context := dt.StubContext(nil, map[string]interface{}{ 87 "api-caller": struct{ base.APICaller }{}, 88 }) 89 manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{ 90 APICallerName: "api-caller", 91 Entity: expectEntity, 92 Result: life.IsNotAlive, 93 NewFacade: func(_ base.APICaller) (lifeflag.Facade, error) { 94 return expectFacade, nil 95 }, 96 NewWorker: func(config lifeflag.Config) (worker.Worker, error) { 97 c.Check(config.Facade, gc.Equals, expectFacade) 98 c.Check(config.Entity, gc.Equals, expectEntity) 99 c.Check(config.Result, gc.NotNil) // uncomparable 100 return nil, errors.New("boof") 101 }, 102 }) 103 104 worker, err := manifold.Start(context) 105 c.Check(worker, gc.IsNil) 106 c.Check(err, gc.ErrorMatches, "boof") 107 } 108 109 func (*ManifoldSuite) TestNewWorkerSuccess(c *gc.C) { 110 expectWorker := &struct{ worker.Worker }{} 111 context := dt.StubContext(nil, map[string]interface{}{ 112 "api-caller": struct{ base.APICaller }{}, 113 }) 114 manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{ 115 APICallerName: "api-caller", 116 NewFacade: func(_ base.APICaller) (lifeflag.Facade, error) { 117 return struct{ lifeflag.Facade }{}, nil 118 }, 119 NewWorker: func(_ lifeflag.Config) (worker.Worker, error) { 120 return expectWorker, nil 121 }, 122 }) 123 124 worker, err := manifold.Start(context) 125 c.Check(worker, gc.Equals, expectWorker) 126 c.Check(err, jc.ErrorIsNil) 127 } 128 129 func (*ManifoldSuite) TestNewWorkerSuccessWithAgentName(c *gc.C) { 130 expectWorker := &struct{ worker.Worker }{} 131 context := dt.StubContext(nil, map[string]interface{}{ 132 "api-caller": struct{ base.APICaller }{}, 133 "agent-name": &fakeAgent{config: fakeConfig{tag: names.NewUnitTag("ubuntu/0")}}, 134 }) 135 manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{ 136 APICallerName: "api-caller", 137 AgentName: "agent-name", 138 NewFacade: func(_ base.APICaller) (lifeflag.Facade, error) { 139 return struct{ lifeflag.Facade }{}, nil 140 }, 141 NewWorker: func(config lifeflag.Config) (worker.Worker, error) { 142 c.Check(config.Entity, gc.Equals, names.NewUnitTag("ubuntu/0")) 143 return expectWorker, nil 144 }, 145 }) 146 147 worker, err := manifold.Start(context) 148 c.Check(worker, gc.Equals, expectWorker) 149 c.Check(err, jc.ErrorIsNil) 150 } 151 152 type fakeAgent struct { 153 agent.Agent 154 config fakeConfig 155 } 156 157 func (f *fakeAgent) CurrentConfig() agent.Config { 158 return &f.config 159 } 160 161 type fakeConfig struct { 162 agent.Config 163 tag names.Tag 164 } 165 166 func (f *fakeConfig) Tag() names.Tag { 167 return f.tag 168 }