github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/charmrevision/manifold_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package charmrevision_test 5 6 import ( 7 "time" 8 9 "github.com/juju/clock" 10 "github.com/juju/errors" 11 "github.com/juju/testing" 12 jc "github.com/juju/testing/checkers" 13 "github.com/juju/worker/v3" 14 "github.com/juju/worker/v3/dependency" 15 dt "github.com/juju/worker/v3/dependency/testing" 16 gc "gopkg.in/check.v1" 17 18 "github.com/juju/juju/api/base" 19 "github.com/juju/juju/worker/charmrevision" 20 ) 21 22 type ManifoldSuite struct { 23 testing.IsolationSuite 24 } 25 26 var _ = gc.Suite(&ManifoldSuite{}) 27 28 func (s *ManifoldSuite) TestManifold(c *gc.C) { 29 manifold := charmrevision.Manifold(charmrevision.ManifoldConfig{ 30 APICallerName: "billy", 31 }) 32 33 c.Check(manifold.Inputs, jc.DeepEquals, []string{"billy"}) 34 c.Check(manifold.Start, gc.NotNil) 35 c.Check(manifold.Output, gc.IsNil) 36 } 37 38 func (s *ManifoldSuite) TestMissingAPICaller(c *gc.C) { 39 manifold := charmrevision.Manifold(charmrevision.ManifoldConfig{ 40 APICallerName: "api-caller", 41 Clock: fakeClock{}, 42 }) 43 44 _, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{ 45 "api-caller": dependency.ErrMissing, 46 })) 47 c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing) 48 } 49 50 func (s *ManifoldSuite) TestMissingClock(c *gc.C) { 51 manifold := charmrevision.Manifold(charmrevision.ManifoldConfig{ 52 APICallerName: "api-caller", 53 }) 54 55 _, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{ 56 "api-caller": fakeAPICaller{}, 57 })) 58 c.Check(err, jc.Satisfies, errors.IsNotValid) 59 c.Check(err.Error(), gc.Equals, "nil Clock not valid") 60 } 61 62 func (s *ManifoldSuite) TestNewFacadeError(c *gc.C) { 63 fakeAPICaller := &fakeAPICaller{} 64 65 stub := testing.Stub{} 66 manifold := charmrevision.Manifold(charmrevision.ManifoldConfig{ 67 APICallerName: "api-caller", 68 Clock: fakeClock{}, 69 NewFacade: func(apiCaller base.APICaller) (charmrevision.Facade, error) { 70 stub.AddCall("NewFacade", apiCaller) 71 return nil, errors.New("blefgh") 72 }, 73 }) 74 75 _, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{ 76 "api-caller": fakeAPICaller, 77 })) 78 c.Check(err, gc.ErrorMatches, "cannot create facade: blefgh") 79 stub.CheckCalls(c, []testing.StubCall{{ 80 "NewFacade", []interface{}{fakeAPICaller}, 81 }}) 82 } 83 84 func (s *ManifoldSuite) TestNewWorkerError(c *gc.C) { 85 fakeClock := &fakeClock{} 86 fakeFacade := &fakeFacade{} 87 fakeAPICaller := &fakeAPICaller{} 88 89 stub := testing.Stub{} 90 manifold := charmrevision.Manifold(charmrevision.ManifoldConfig{ 91 APICallerName: "api-caller", 92 Clock: fakeClock, 93 NewFacade: func(apiCaller base.APICaller) (charmrevision.Facade, error) { 94 stub.AddCall("NewFacade", apiCaller) 95 return fakeFacade, nil 96 }, 97 NewWorker: func(config charmrevision.Config) (worker.Worker, error) { 98 stub.AddCall("NewWorker", config) 99 return nil, errors.New("snrght") 100 }, 101 }) 102 103 _, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{ 104 "api-caller": fakeAPICaller, 105 })) 106 c.Check(err, gc.ErrorMatches, "cannot create worker: snrght") 107 stub.CheckCalls(c, []testing.StubCall{{ 108 "NewFacade", []interface{}{fakeAPICaller}, 109 }, { 110 "NewWorker", []interface{}{charmrevision.Config{ 111 RevisionUpdater: fakeFacade, 112 Clock: fakeClock, 113 }}, 114 }}) 115 } 116 117 func (s *ManifoldSuite) TestSuccess(c *gc.C) { 118 fakeClock := &fakeClock{} 119 fakeFacade := &fakeFacade{} 120 fakeWorker := &fakeWorker{} 121 fakeAPICaller := &fakeAPICaller{} 122 123 stub := testing.Stub{} 124 manifold := charmrevision.Manifold(charmrevision.ManifoldConfig{ 125 APICallerName: "api-caller", 126 Clock: fakeClock, 127 Period: 10 * time.Minute, 128 NewFacade: func(apiCaller base.APICaller) (charmrevision.Facade, error) { 129 stub.AddCall("NewFacade", apiCaller) 130 return fakeFacade, nil 131 }, 132 NewWorker: func(config charmrevision.Config) (worker.Worker, error) { 133 stub.AddCall("NewWorker", config) 134 return fakeWorker, nil 135 }, 136 }) 137 138 w, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{ 139 "api-caller": fakeAPICaller, 140 })) 141 c.Check(w, gc.Equals, fakeWorker) 142 c.Check(err, jc.ErrorIsNil) 143 stub.CheckCalls(c, []testing.StubCall{{ 144 "NewFacade", []interface{}{fakeAPICaller}, 145 }, { 146 "NewWorker", []interface{}{charmrevision.Config{ 147 Period: 10 * time.Minute, 148 RevisionUpdater: fakeFacade, 149 Clock: fakeClock, 150 }}, 151 }}) 152 } 153 154 type fakeAPICaller struct { 155 base.APICaller 156 } 157 158 type fakeClock struct { 159 clock.Clock 160 } 161 162 type fakeWorker struct { 163 worker.Worker 164 } 165 166 type fakeFacade struct { 167 charmrevision.Facade 168 }