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  }