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