github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/worker/uniter/operation/util_test.go (about) 1 // Copyright 2014-2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package operation_test 5 6 import ( 7 "github.com/juju/errors" 8 utilexec "github.com/juju/utils/exec" 9 corecharm "gopkg.in/juju/charm.v4" 10 "gopkg.in/juju/charm.v4/hooks" 11 12 "github.com/juju/juju/worker/uniter/charm" 13 "github.com/juju/juju/worker/uniter/hook" 14 "github.com/juju/juju/worker/uniter/operation" 15 "github.com/juju/juju/worker/uniter/runner" 16 ) 17 18 type MockGetArchiveInfo struct { 19 gotCharmURL *corecharm.URL 20 info charm.BundleInfo 21 err error 22 } 23 24 func (mock *MockGetArchiveInfo) Call(charmURL *corecharm.URL) (charm.BundleInfo, error) { 25 mock.gotCharmURL = charmURL 26 return mock.info, mock.err 27 } 28 29 type MockSetCurrentCharm struct { 30 gotCharmURL *corecharm.URL 31 err error 32 } 33 34 func (mock *MockSetCurrentCharm) Call(charmURL *corecharm.URL) error { 35 mock.gotCharmURL = charmURL 36 return mock.err 37 } 38 39 type DeployCallbacks struct { 40 operation.Callbacks 41 *MockGetArchiveInfo 42 *MockSetCurrentCharm 43 MockClearResolvedFlag *MockNoArgs 44 MockInitializeMetricsCollector *MockNoArgs 45 } 46 47 func (cb *DeployCallbacks) GetArchiveInfo(charmURL *corecharm.URL) (charm.BundleInfo, error) { 48 return cb.MockGetArchiveInfo.Call(charmURL) 49 } 50 51 func (cb *DeployCallbacks) SetCurrentCharm(charmURL *corecharm.URL) error { 52 return cb.MockSetCurrentCharm.Call(charmURL) 53 } 54 55 func (cb *DeployCallbacks) ClearResolvedFlag() error { 56 return cb.MockClearResolvedFlag.Call() 57 } 58 59 func (cb *DeployCallbacks) InitializeMetricsCollector() error { 60 return cb.MockInitializeMetricsCollector.Call() 61 } 62 63 type MockBundleInfo struct { 64 charm.BundleInfo 65 } 66 67 type MockStage struct { 68 gotInfo *charm.BundleInfo 69 gotAbort *<-chan struct{} 70 err error 71 } 72 73 func (mock *MockStage) Call(info charm.BundleInfo, abort <-chan struct{}) error { 74 mock.gotInfo = &info 75 mock.gotAbort = &abort 76 return mock.err 77 } 78 79 type MockNoArgs struct { 80 called bool 81 err error 82 } 83 84 func (mock *MockNoArgs) Call() error { 85 mock.called = true 86 return mock.err 87 } 88 89 type MockDeployer struct { 90 charm.Deployer 91 *MockStage 92 MockDeploy *MockNoArgs 93 MockNotifyRevert *MockNoArgs 94 MockNotifyResolved *MockNoArgs 95 } 96 97 func (d *MockDeployer) Stage(info charm.BundleInfo, abort <-chan struct{}) error { 98 return d.MockStage.Call(info, abort) 99 } 100 101 func (d *MockDeployer) Deploy() error { 102 return d.MockDeploy.Call() 103 } 104 105 func (d *MockDeployer) NotifyRevert() error { 106 return d.MockNotifyRevert.Call() 107 } 108 109 func (d *MockDeployer) NotifyResolved() error { 110 return d.MockNotifyResolved.Call() 111 } 112 113 type MockFailAction struct { 114 gotActionId *string 115 gotMessage *string 116 err error 117 } 118 119 func (mock *MockFailAction) Call(actionId, message string) error { 120 mock.gotActionId = &actionId 121 mock.gotMessage = &message 122 return mock.err 123 } 124 125 type MockAcquireExecutionLock struct { 126 gotMessage *string 127 didUnlock bool 128 err error 129 } 130 131 func (mock *MockAcquireExecutionLock) Call(message string) (func(), error) { 132 mock.gotMessage = &message 133 if mock.err != nil { 134 return nil, mock.err 135 } 136 return func() { mock.didUnlock = true }, nil 137 } 138 139 type RunActionCallbacks struct { 140 operation.Callbacks 141 *MockFailAction 142 *MockAcquireExecutionLock 143 } 144 145 func (cb *RunActionCallbacks) FailAction(actionId, message string) error { 146 return cb.MockFailAction.Call(actionId, message) 147 } 148 149 func (cb *RunActionCallbacks) AcquireExecutionLock(message string) (func(), error) { 150 return cb.MockAcquireExecutionLock.Call(message) 151 } 152 153 type RunCommandsCallbacks struct { 154 operation.Callbacks 155 *MockAcquireExecutionLock 156 } 157 158 func (cb *RunCommandsCallbacks) AcquireExecutionLock(message string) (func(), error) { 159 return cb.MockAcquireExecutionLock.Call(message) 160 } 161 162 type MockPrepareHook struct { 163 gotHook *hook.Info 164 name string 165 err error 166 } 167 168 func (mock *MockPrepareHook) Call(hookInfo hook.Info) (string, error) { 169 mock.gotHook = &hookInfo 170 return mock.name, mock.err 171 } 172 173 type PrepareHookCallbacks struct { 174 operation.Callbacks 175 *MockPrepareHook 176 MockClearResolvedFlag *MockNoArgs 177 } 178 179 func (cb *PrepareHookCallbacks) PrepareHook(hookInfo hook.Info) (string, error) { 180 return cb.MockPrepareHook.Call(hookInfo) 181 } 182 183 func (cb *PrepareHookCallbacks) ClearResolvedFlag() error { 184 return cb.MockClearResolvedFlag.Call() 185 } 186 187 type MockNotify struct { 188 gotName *string 189 gotContext *runner.Context 190 } 191 192 func (mock *MockNotify) Call(hookName string, ctx runner.Context) { 193 mock.gotName = &hookName 194 mock.gotContext = &ctx 195 } 196 197 type ExecuteHookCallbacks struct { 198 *PrepareHookCallbacks 199 *MockAcquireExecutionLock 200 MockNotifyHookCompleted *MockNotify 201 MockNotifyHookFailed *MockNotify 202 } 203 204 func (cb *ExecuteHookCallbacks) AcquireExecutionLock(message string) (func(), error) { 205 return cb.MockAcquireExecutionLock.Call(message) 206 } 207 208 func (cb *ExecuteHookCallbacks) NotifyHookCompleted(hookName string, ctx runner.Context) { 209 cb.MockNotifyHookCompleted.Call(hookName, ctx) 210 } 211 212 func (cb *ExecuteHookCallbacks) NotifyHookFailed(hookName string, ctx runner.Context) { 213 cb.MockNotifyHookFailed.Call(hookName, ctx) 214 } 215 216 type MockCommitHook struct { 217 gotHook *hook.Info 218 err error 219 } 220 221 func (mock *MockCommitHook) Call(hookInfo hook.Info) error { 222 mock.gotHook = &hookInfo 223 return mock.err 224 } 225 226 type CommitHookCallbacks struct { 227 operation.Callbacks 228 *MockCommitHook 229 } 230 231 func (cb *CommitHookCallbacks) CommitHook(hookInfo hook.Info) error { 232 return cb.MockCommitHook.Call(hookInfo) 233 } 234 235 type MockUpdateRelations struct { 236 gotIds *[]int 237 err error 238 } 239 240 func (mock *MockUpdateRelations) Call(ids []int) error { 241 mock.gotIds = &ids 242 return mock.err 243 } 244 245 type UpdateRelationsCallbacks struct { 246 operation.Callbacks 247 *MockUpdateRelations 248 } 249 250 func (cb *UpdateRelationsCallbacks) UpdateRelations(ids []int) error { 251 return cb.MockUpdateRelations.Call(ids) 252 } 253 254 type MockNewActionRunner struct { 255 gotActionId *string 256 runner *MockRunner 257 err error 258 } 259 260 func (mock *MockNewActionRunner) Call(actionId string) (runner.Runner, error) { 261 mock.gotActionId = &actionId 262 return mock.runner, mock.err 263 } 264 265 type MockNewHookRunner struct { 266 gotHook *hook.Info 267 runner *MockRunner 268 err error 269 } 270 271 func (mock *MockNewHookRunner) Call(hookInfo hook.Info) (runner.Runner, error) { 272 mock.gotHook = &hookInfo 273 return mock.runner, mock.err 274 } 275 276 type MockNewCommandRunner struct { 277 gotInfo *runner.CommandInfo 278 runner *MockRunner 279 err error 280 } 281 282 func (mock *MockNewCommandRunner) Call(info runner.CommandInfo) (runner.Runner, error) { 283 mock.gotInfo = &info 284 return mock.runner, mock.err 285 } 286 287 type MockRunnerFactory struct { 288 *MockNewActionRunner 289 *MockNewHookRunner 290 *MockNewCommandRunner 291 } 292 293 func (f *MockRunnerFactory) NewActionRunner(actionId string) (runner.Runner, error) { 294 return f.MockNewActionRunner.Call(actionId) 295 } 296 297 func (f *MockRunnerFactory) NewHookRunner(hookInfo hook.Info) (runner.Runner, error) { 298 return f.MockNewHookRunner.Call(hookInfo) 299 } 300 301 func (f *MockRunnerFactory) NewCommandRunner(commandInfo runner.CommandInfo) (runner.Runner, error) { 302 return f.MockNewCommandRunner.Call(commandInfo) 303 } 304 305 type MockContext struct { 306 runner.Context 307 actionData *runner.ActionData 308 } 309 310 func (mock *MockContext) ActionData() (*runner.ActionData, error) { 311 if mock.actionData == nil { 312 return nil, errors.New("not an action context") 313 } 314 return mock.actionData, nil 315 } 316 317 type MockRunAction struct { 318 gotName *string 319 err error 320 } 321 322 func (mock *MockRunAction) Call(actionName string) error { 323 mock.gotName = &actionName 324 return mock.err 325 } 326 327 type MockRunCommands struct { 328 gotCommands *string 329 response *utilexec.ExecResponse 330 err error 331 } 332 333 func (mock *MockRunCommands) Call(commands string) (*utilexec.ExecResponse, error) { 334 mock.gotCommands = &commands 335 return mock.response, mock.err 336 } 337 338 type MockRunHook struct { 339 gotName *string 340 err error 341 } 342 343 func (mock *MockRunHook) Call(hookName string) error { 344 mock.gotName = &hookName 345 return mock.err 346 } 347 348 type MockRunner struct { 349 *MockRunAction 350 *MockRunCommands 351 *MockRunHook 352 context runner.Context 353 } 354 355 func (r *MockRunner) Context() runner.Context { 356 return r.context 357 } 358 359 func (r *MockRunner) RunAction(actionName string) error { 360 return r.MockRunAction.Call(actionName) 361 } 362 363 func (r *MockRunner) RunCommands(commands string) (*utilexec.ExecResponse, error) { 364 return r.MockRunCommands.Call(commands) 365 } 366 367 func (r *MockRunner) RunHook(hookName string) error { 368 return r.MockRunHook.Call(hookName) 369 } 370 371 func NewDeployCallbacks() *DeployCallbacks { 372 return &DeployCallbacks{ 373 MockGetArchiveInfo: &MockGetArchiveInfo{info: &MockBundleInfo{}}, 374 MockSetCurrentCharm: &MockSetCurrentCharm{}, 375 MockClearResolvedFlag: &MockNoArgs{}, 376 } 377 } 378 379 func NewDeployCommitCallbacks(err error) *DeployCallbacks { 380 return &DeployCallbacks{ 381 MockInitializeMetricsCollector: &MockNoArgs{err: err}, 382 } 383 } 384 func NewMockDeployer() *MockDeployer { 385 return &MockDeployer{ 386 MockStage: &MockStage{}, 387 MockDeploy: &MockNoArgs{}, 388 MockNotifyRevert: &MockNoArgs{}, 389 MockNotifyResolved: &MockNoArgs{}, 390 } 391 } 392 393 func NewPrepareHookCallbacks() *PrepareHookCallbacks { 394 return &PrepareHookCallbacks{ 395 MockPrepareHook: &MockPrepareHook{nil, "some-hook-name", nil}, 396 MockClearResolvedFlag: &MockNoArgs{}, 397 } 398 } 399 400 func NewRunActionRunnerFactory(runErr error) *MockRunnerFactory { 401 return &MockRunnerFactory{ 402 MockNewActionRunner: &MockNewActionRunner{ 403 runner: &MockRunner{ 404 MockRunAction: &MockRunAction{err: runErr}, 405 context: &MockContext{ 406 actionData: &runner.ActionData{ActionName: "some-action-name"}, 407 }, 408 }, 409 }, 410 } 411 } 412 413 func NewRunCommandsRunnerFactory(runResponse *utilexec.ExecResponse, runErr error) *MockRunnerFactory { 414 return &MockRunnerFactory{ 415 MockNewCommandRunner: &MockNewCommandRunner{ 416 runner: &MockRunner{ 417 MockRunCommands: &MockRunCommands{response: runResponse, err: runErr}, 418 }, 419 }, 420 } 421 } 422 423 func NewRunHookRunnerFactory(runErr error) *MockRunnerFactory { 424 return &MockRunnerFactory{ 425 MockNewHookRunner: &MockNewHookRunner{ 426 runner: &MockRunner{ 427 MockRunHook: &MockRunHook{err: runErr}, 428 context: &MockContext{}, 429 }, 430 }, 431 } 432 } 433 434 type MockSendResponse struct { 435 gotResponse **utilexec.ExecResponse 436 gotErr *error 437 } 438 439 func (mock *MockSendResponse) Call(response *utilexec.ExecResponse, err error) { 440 mock.gotResponse = &response 441 mock.gotErr = &err 442 } 443 444 var curl = corecharm.MustParseURL 445 var someActionId = "f47ac10b-58cc-4372-a567-0e02b2c3d479" 446 var randomActionId = "9f484882-2f18-4fd2-967d-db9663db7bea" 447 var overwriteState = operation.State{ 448 Kind: operation.Continue, 449 Step: operation.Pending, 450 Started: true, 451 CollectMetricsTime: 1234567, 452 CharmURL: curl("cs:quantal/wordpress-2"), 453 ActionId: &randomActionId, 454 Hook: &hook.Info{Kind: hooks.Install}, 455 } 456 var someCommandArgs = operation.CommandArgs{ 457 Commands: "do something", 458 RelationId: 123, 459 RemoteUnitName: "foo/456", 460 ForceRemoteUnit: true, 461 }