github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/caasoperator/remotestate/watcher_test.go (about)

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package remotestate_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/clock/testclock"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  	"gopkg.in/juju/charm.v6"
    13  
    14  	coretesting "github.com/juju/juju/testing"
    15  	"github.com/juju/juju/worker/caasoperator/remotestate"
    16  )
    17  
    18  type WatcherSuite struct {
    19  	coretesting.BaseSuite
    20  
    21  	watcher     *remotestate.RemoteStateWatcher
    22  	appWatcher  *mockNotifyWatcher
    23  	charmGetter *mockCharmGetter
    24  	clock       *testclock.Clock
    25  }
    26  
    27  var _ = gc.Suite(&WatcherSuite{})
    28  
    29  func (s *WatcherSuite) SetUpTest(c *gc.C) {
    30  	s.BaseSuite.SetUpTest(c)
    31  	s.clock = testclock.NewClock(time.Now())
    32  	s.appWatcher = newMockNotifyWatcher()
    33  	s.charmGetter = &mockCharmGetter{}
    34  	w, err := remotestate.NewWatcher(remotestate.WatcherConfig{
    35  		Application:        "gitlab",
    36  		ApplicationWatcher: &mockApplicationWatcher{s.appWatcher},
    37  		CharmGetter:        s.charmGetter,
    38  	})
    39  	c.Assert(err, jc.ErrorIsNil)
    40  	s.watcher = w
    41  }
    42  
    43  func (s *WatcherSuite) TearDownTest(c *gc.C) {
    44  	if s.watcher != nil {
    45  		s.watcher.Kill()
    46  		err := s.watcher.Wait()
    47  		c.Assert(err, jc.ErrorIsNil)
    48  	}
    49  }
    50  
    51  func (s *WatcherSuite) TestInitialSnapshot(c *gc.C) {
    52  	snap := s.watcher.Snapshot()
    53  	c.Assert(snap, jc.DeepEquals, remotestate.Snapshot{})
    54  }
    55  
    56  func (s *WatcherSuite) TestInitialSignal(c *gc.C) {
    57  	s.appWatcher.changes <- struct{}{}
    58  	assertNotifyEvent(c, s.watcher.RemoteStateChanged(), "waiting for remote state change")
    59  }
    60  
    61  func (s *WatcherSuite) signalAll() {
    62  	s.appWatcher.changes <- struct{}{}
    63  }
    64  
    65  func (s *WatcherSuite) TestRemoteStateChanged(c *gc.C) {
    66  	assertOneChange := func() {
    67  		assertNotifyEvent(c, s.watcher.RemoteStateChanged(), "waiting for remote state change")
    68  		assertNoNotifyEvent(c, s.watcher.RemoteStateChanged(), "remote state change")
    69  	}
    70  
    71  	curl := charm.MustParseURL("cs:gitlab-4")
    72  	s.charmGetter.curl = curl
    73  	s.charmGetter.version = 666
    74  	s.charmGetter.force = true
    75  
    76  	s.signalAll()
    77  	assertOneChange()
    78  	snap := s.watcher.Snapshot()
    79  	c.Assert(snap.ForceCharmUpgrade, jc.IsTrue)
    80  	c.Assert(snap, jc.DeepEquals, remotestate.Snapshot{
    81  		CharmModifiedVersion: 666,
    82  		CharmURL:             curl,
    83  		ForceCharmUpgrade:    true,
    84  	})
    85  }