github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/credentialvalidator/worker_test.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package credentialvalidator_test 5 6 import ( 7 "time" 8 9 "github.com/juju/errors" 10 "github.com/juju/testing" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 "gopkg.in/juju/names.v2" 14 "gopkg.in/juju/worker.v1/workertest" 15 16 "github.com/juju/juju/api/base" 17 "github.com/juju/juju/core/watcher/watchertest" 18 coretesting "github.com/juju/juju/testing" 19 "github.com/juju/juju/worker/credentialvalidator" 20 ) 21 22 type WorkerSuite struct { 23 testing.IsolationSuite 24 25 facade *mockFacade 26 config credentialvalidator.Config 27 credentialChanges chan struct{} 28 modelCredentialChanges chan struct{} 29 30 credential *base.StoredCredential 31 exists bool 32 } 33 34 var _ = gc.Suite(&WorkerSuite{}) 35 36 func (s *WorkerSuite) SetUpTest(c *gc.C) { 37 s.IsolationSuite.SetUpTest(c) 38 39 s.credential = &base.StoredCredential{credentialTag, true} 40 s.credentialChanges = make(chan struct{}) 41 s.exists = true 42 s.modelCredentialChanges = make(chan struct{}) 43 s.facade = &mockFacade{ 44 Stub: &testing.Stub{}, 45 credential: s.credential, 46 exists: s.exists, 47 watcher: watchertest.NewMockNotifyWatcher(s.credentialChanges), 48 modelWatcher: watchertest.NewMockNotifyWatcher(s.modelCredentialChanges), 49 } 50 51 s.config = credentialvalidator.Config{ 52 Facade: s.facade, 53 } 54 } 55 56 func (s *WorkerSuite) TestStartStop(c *gc.C) { 57 w, err := testWorker(s.config) 58 c.Assert(err, jc.ErrorIsNil) 59 workertest.CheckAlive(c, w) 60 workertest.CleanKill(c, w) 61 62 err = workertest.CheckKilled(c, w) 63 c.Assert(err, jc.ErrorIsNil) 64 err = workertest.CheckKilled(c, s.facade.watcher) 65 c.Assert(err, jc.ErrorIsNil) 66 err = workertest.CheckKilled(c, s.facade.modelWatcher) 67 c.Assert(err, jc.ErrorIsNil) 68 s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential", "WatchCredential") 69 } 70 71 func (s *WorkerSuite) TestStartStopNoCredential(c *gc.C) { 72 s.facade.setupModelHasNoCredential() 73 w, err := testWorker(s.config) 74 c.Assert(err, jc.ErrorIsNil) 75 workertest.CheckAlive(c, w) 76 workertest.CleanKill(c, w) 77 78 err = workertest.CheckKilled(c, w) 79 c.Assert(err, jc.ErrorIsNil) 80 workertest.CheckNilOrKill(c, s.facade.watcher) 81 err = workertest.CheckKilled(c, s.facade.modelWatcher) 82 c.Assert(err, jc.ErrorIsNil) 83 s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential") 84 } 85 86 func (s *WorkerSuite) TestModelCredentialError(c *gc.C) { 87 s.facade.SetErrors(errors.New("mc fail")) 88 89 worker, err := testWorker(s.config) 90 c.Check(err, gc.ErrorMatches, "mc fail") 91 c.Assert(worker, gc.IsNil) 92 s.facade.CheckCallNames(c, "ModelCredential") 93 } 94 95 func (s *WorkerSuite) TestModelCredentialWatcherError(c *gc.C) { 96 s.facade.SetErrors(nil, // ModelCredential call 97 errors.New("mcw fail"), // WatchModelCredential call 98 ) 99 100 worker, err := testWorker(s.config) 101 c.Check(err, gc.ErrorMatches, "mcw fail") 102 c.Assert(worker, gc.IsNil) 103 s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential") 104 } 105 106 func (s *WorkerSuite) TestWatchError(c *gc.C) { 107 s.facade.SetErrors(nil, // ModelCredential call 108 nil, // WatchModelCredential call 109 errors.New("watch fail"), // WatchCredential call 110 ) 111 112 worker, err := testWorker(s.config) 113 c.Assert(err, gc.ErrorMatches, "watch fail") 114 c.Assert(worker, gc.IsNil) 115 s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential", "WatchCredential") 116 } 117 118 func (s *WorkerSuite) TestModelCredentialNotNeeded(c *gc.C) { 119 s.facade.setupModelHasNoCredential() 120 worker, err := testWorker(s.config) 121 c.Assert(err, jc.ErrorIsNil) 122 123 workertest.CheckAlive(c, worker) 124 workertest.CleanKill(c, worker) 125 s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential") 126 } 127 128 func (s *WorkerSuite) TestCredentialChangeToInvalid(c *gc.C) { 129 worker, err := testWorker(s.config) 130 c.Assert(err, jc.ErrorIsNil) 131 132 s.facade.credential.Valid = false 133 s.sendChange(c) 134 135 err = workertest.CheckKilled(c, worker) 136 c.Check(err, gc.Equals, credentialvalidator.ErrValidityChanged) 137 s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential", "WatchCredential", "ModelCredential") 138 } 139 140 func (s *WorkerSuite) TestCredentialChangeFromInvalid(c *gc.C) { 141 s.facade.credential.Valid = false 142 worker, err := testWorker(s.config) 143 c.Assert(err, jc.ErrorIsNil) 144 145 s.facade.credential.Valid = true 146 s.sendChange(c) 147 148 err = workertest.CheckKilled(c, worker) 149 c.Check(err, gc.Equals, credentialvalidator.ErrValidityChanged) 150 s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential", "WatchCredential", "ModelCredential") 151 } 152 153 func (s *WorkerSuite) TestNoRelevantCredentialChange(c *gc.C) { 154 worker, err := testWorker(s.config) 155 c.Assert(err, jc.ErrorIsNil) 156 157 s.sendChange(c) 158 s.sendChange(c) 159 160 workertest.CheckAlive(c, worker) 161 workertest.CleanKill(c, worker) 162 s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential", "WatchCredential", "ModelCredential", "ModelCredential") 163 } 164 165 func (s *WorkerSuite) TestModelCredentialNoChanged(c *gc.C) { 166 worker, err := testWorker(s.config) 167 c.Assert(err, jc.ErrorIsNil) 168 169 s.sendModelChange(c) 170 171 workertest.CheckAlive(c, worker) 172 workertest.CleanKill(c, worker) 173 s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential", "WatchCredential", "ModelCredential") 174 } 175 176 func (s *WorkerSuite) TestModelCredentialChanged(c *gc.C) { 177 worker, err := testWorker(s.config) 178 c.Assert(err, jc.ErrorIsNil) 179 180 s.facade.credential.CloudCredential = names.NewCloudCredentialTag("cloud/anotheruser/credential").String() 181 s.sendModelChange(c) 182 183 err = workertest.CheckKilled(c, worker) 184 c.Check(err, gc.Equals, credentialvalidator.ErrModelCredentialChanged) 185 s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential", "WatchCredential", "ModelCredential") 186 } 187 188 func (s *WorkerSuite) sendModelChange(c *gc.C) { 189 select { 190 case s.modelCredentialChanges <- struct{}{}: 191 case <-time.After(coretesting.LongWait): 192 c.Fatal("timed out sending model credential change") 193 } 194 } 195 196 func (s *WorkerSuite) sendChange(c *gc.C) { 197 select { 198 case s.credentialChanges <- struct{}{}: 199 case <-time.After(coretesting.LongWait): 200 c.Fatal("timed out sending credential change") 201 } 202 } 203 204 var testWorker = credentialvalidator.NewWorker