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