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  }