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