github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/machineactions/fixture_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Copyright 2016 Cloudbase Solutions SRL 3 // Licensed under the AGPLv3, see LICENCE file for details. 4 5 package machineactions_test 6 7 import ( 8 "errors" 9 10 "github.com/juju/testing" 11 "gopkg.in/juju/names.v2" 12 "gopkg.in/juju/worker.v1" 13 "gopkg.in/juju/worker.v1/workertest" 14 15 "github.com/juju/juju/api/machineactions" 16 "github.com/juju/juju/apiserver/params" 17 "github.com/juju/juju/core/watcher" 18 ) 19 20 var actionNotFoundErr = errors.New("action not found") 21 22 func mockHandleAction(stub *testing.Stub) func(string, map[string]interface{}) (map[string]interface{}, error) { 23 return func(name string, params map[string]interface{}) (map[string]interface{}, error) { 24 stub.AddCall("HandleAction", name) 25 return nil, stub.NextErr() 26 } 27 } 28 29 // mockFacade implements machineactions.Facade for use in the tests. 30 type mockFacade struct { 31 stub *testing.Stub 32 runningActions []params.ActionResult 33 watcherSendInvalidValues bool 34 } 35 36 // RunningActions is part of the machineactions.Facade interface. 37 func (mock *mockFacade) RunningActions(agent names.MachineTag) ([]params.ActionResult, error) { 38 mock.stub.AddCall("RunningActions", agent) 39 if err := mock.stub.NextErr(); err != nil { 40 return nil, err 41 } 42 return mock.runningActions, nil 43 } 44 45 // RunningActions is part of the machineactions.Facade interface. 46 func (mock *mockFacade) Action(tag names.ActionTag) (*machineactions.Action, error) { 47 mock.stub.AddCall("Action", tag) 48 if err := mock.stub.NextErr(); err != nil { 49 return nil, err 50 } 51 return tagToActionMap[tag], nil 52 } 53 54 // ActionBegin is part of the machineactions.Facade interface. 55 func (mock *mockFacade) ActionBegin(tag names.ActionTag) error { 56 mock.stub.AddCall("ActionBegin", tag) 57 return mock.stub.NextErr() 58 } 59 60 // ActionFinish is part of the machineactions.Facade interface. 61 func (mock *mockFacade) ActionFinish(tag names.ActionTag, status string, results map[string]interface{}, message string) error { 62 mock.stub.AddCall("ActionFinish", tag, status, message) 63 return mock.stub.NextErr() 64 } 65 66 // Watch is part of the machineactions.Facade interface. 67 func (mock *mockFacade) WatchActionNotifications(agent names.MachineTag) (watcher.StringsWatcher, error) { 68 mock.stub.AddCall("WatchActionNotifications", agent) 69 if err := mock.stub.NextErr(); err != nil { 70 return nil, err 71 } 72 return newStubWatcher(mock.watcherSendInvalidValues), nil 73 } 74 75 // stubWatcher implements watcher.StringsWatcher and supplied canned 76 // data over the Changes() channel. 77 type stubWatcher struct { 78 worker.Worker 79 changes chan []string 80 } 81 82 func newStubWatcher(watcherSendInvalidValues bool) *stubWatcher { 83 changes := make(chan []string, 3) 84 changes <- []string{firstActionID, secondActionID} 85 changes <- []string{thirdActionID} 86 if watcherSendInvalidValues { 87 changes <- []string{"invalid-action-id"} 88 } 89 return &stubWatcher{ 90 Worker: workertest.NewErrorWorker(nil), 91 changes: changes, 92 } 93 } 94 95 // Changes is part of the watcher.StringsWatcher interface. 96 func (stubWatcher *stubWatcher) Changes() watcher.StringsChannel { 97 return stubWatcher.changes 98 } 99 100 var ( 101 firstAction = machineactions.NewAction("foo", nil) 102 secondAction = machineactions.NewAction("baz", nil) 103 thirdAction = machineactions.NewAction("boo", nil) 104 firstActionID = "11234567-89ab-cdef-0123-456789abcdef" 105 secondActionID = "21234567-89ab-cdef-0123-456789abcdef" 106 thirdActionID = "31234567-89ab-cdef-0123-456789abcdef" 107 firstActionTag = names.NewActionTag(firstActionID) 108 secondActionTag = names.NewActionTag(secondActionID) 109 thirdActionTag = names.NewActionTag(thirdActionID) 110 tagToActionMap = map[names.ActionTag]*machineactions.Action{ 111 firstActionTag: firstAction, 112 secondActionTag: secondAction, 113 thirdActionTag: thirdAction, 114 } 115 fakeRunningActions = []params.ActionResult{ 116 {Action: ¶ms.Action{Tag: thirdActionTag.String()}}, 117 } 118 )