github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/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  }