github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/restorewatcher/worker_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package restorewatcher_test 5 6 import ( 7 "time" 8 9 "github.com/juju/errors" 10 "github.com/juju/testing" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 "gopkg.in/juju/worker.v1/workertest" 14 15 "github.com/juju/juju/state" 16 statetesting "github.com/juju/juju/state/testing" 17 coretesting "github.com/juju/juju/testing" 18 "github.com/juju/juju/worker/restorewatcher" 19 ) 20 21 type WorkerSuite struct { 22 testing.IsolationSuite 23 watcher *mockRestoreInfoWatcher 24 stub testing.Stub 25 config restorewatcher.Config 26 } 27 28 var _ = gc.Suite(&WorkerSuite{}) 29 30 func (s *WorkerSuite) SetUpTest(c *gc.C) { 31 s.IsolationSuite.SetUpTest(c) 32 s.watcher = &mockRestoreInfoWatcher{ 33 status: state.RestorePending, 34 changes: make(chan struct{}), 35 } 36 s.stub.ResetCalls() 37 s.config = restorewatcher.Config{ 38 RestoreInfoWatcher: s.watcher, 39 } 40 } 41 42 func (s *WorkerSuite) TestValidateRestoreInfoWatcher(c *gc.C) { 43 s.config.RestoreInfoWatcher = nil 44 _, err := restorewatcher.NewWorker(s.config) 45 c.Assert(err, gc.ErrorMatches, "nil RestoreInfoWatcher not valid") 46 } 47 48 func (s *WorkerSuite) TestStartStop(c *gc.C) { 49 w, err := restorewatcher.NewWorker(s.config) 50 c.Assert(err, jc.ErrorIsNil) 51 workertest.CleanKill(c, w) 52 } 53 54 func (s *WorkerSuite) TestWorkerObservesChanges(c *gc.C) { 55 w, err := restorewatcher.NewWorker(s.config) 56 c.Assert(err, jc.ErrorIsNil) 57 defer workertest.CleanKill(c, w) 58 59 c.Assert(w.RestoreStatus(), gc.Equals, state.RestorePending) 60 61 s.watcher.status = state.RestoreFailed 62 // Send two changes, to ensure the first one is processed. 63 for i := 0; i < 2; i++ { 64 select { 65 case s.watcher.changes <- struct{}{}: 66 case <-time.After(coretesting.LongWait): 67 c.Fatal("timed out sending watcher change") 68 } 69 } 70 c.Assert(w.RestoreStatus(), gc.Equals, state.RestoreFailed) 71 } 72 73 func (s *WorkerSuite) TestErrorTerminatesWorker(c *gc.C) { 74 s.watcher.SetErrors(nil, errors.New("burp")) 75 76 w, err := restorewatcher.NewWorker(s.config) 77 c.Assert(err, jc.ErrorIsNil) 78 defer workertest.DirtyKill(c, w) 79 80 s.watcher.status = state.RestoreFailed 81 select { 82 case s.watcher.changes <- struct{}{}: 83 case <-time.After(coretesting.LongWait): 84 c.Fatal("timed out sending watcher change") 85 } 86 87 err = workertest.CheckKilled(c, w) 88 c.Assert(err, gc.ErrorMatches, "burp") 89 } 90 91 type mockRestoreInfoWatcher struct { 92 testing.Stub 93 changes chan struct{} 94 status state.RestoreStatus 95 } 96 97 func (w *mockRestoreInfoWatcher) WatchRestoreInfoChanges() state.NotifyWatcher { 98 w.MethodCall(w, "WatchRestoreInfoChanges") 99 return statetesting.NewMockNotifyWatcher(w.changes) 100 } 101 102 func (w *mockRestoreInfoWatcher) RestoreStatus() (state.RestoreStatus, error) { 103 w.MethodCall(w, "RestoreStatus") 104 return w.status, w.NextErr() 105 }