github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/credentialvalidator/worker_test.go (about)

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package credentialvalidator_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/names.v2"
    14  	"gopkg.in/juju/worker.v1/workertest"
    15  
    16  	"github.com/juju/juju/api/base"
    17  	"github.com/juju/juju/core/watcher/watchertest"
    18  	coretesting "github.com/juju/juju/testing"
    19  	"github.com/juju/juju/worker/credentialvalidator"
    20  )
    21  
    22  type WorkerSuite struct {
    23  	testing.IsolationSuite
    24  
    25  	facade                 *mockFacade
    26  	config                 credentialvalidator.Config
    27  	credentialChanges      chan struct{}
    28  	modelCredentialChanges chan struct{}
    29  
    30  	credential *base.StoredCredential
    31  	exists     bool
    32  }
    33  
    34  var _ = gc.Suite(&WorkerSuite{})
    35  
    36  func (s *WorkerSuite) SetUpTest(c *gc.C) {
    37  	s.IsolationSuite.SetUpTest(c)
    38  
    39  	s.credential = &base.StoredCredential{credentialTag, true}
    40  	s.credentialChanges = make(chan struct{})
    41  	s.exists = true
    42  	s.modelCredentialChanges = make(chan struct{})
    43  	s.facade = &mockFacade{
    44  		Stub:         &testing.Stub{},
    45  		credential:   s.credential,
    46  		exists:       s.exists,
    47  		watcher:      watchertest.NewMockNotifyWatcher(s.credentialChanges),
    48  		modelWatcher: watchertest.NewMockNotifyWatcher(s.modelCredentialChanges),
    49  	}
    50  
    51  	s.config = credentialvalidator.Config{
    52  		Facade: s.facade,
    53  	}
    54  }
    55  
    56  func (s *WorkerSuite) TestStartStop(c *gc.C) {
    57  	w, err := testWorker(s.config)
    58  	c.Assert(err, jc.ErrorIsNil)
    59  	workertest.CheckAlive(c, w)
    60  	workertest.CleanKill(c, w)
    61  
    62  	err = workertest.CheckKilled(c, w)
    63  	c.Assert(err, jc.ErrorIsNil)
    64  	err = workertest.CheckKilled(c, s.facade.watcher)
    65  	c.Assert(err, jc.ErrorIsNil)
    66  	err = workertest.CheckKilled(c, s.facade.modelWatcher)
    67  	c.Assert(err, jc.ErrorIsNil)
    68  	s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential", "WatchCredential")
    69  }
    70  
    71  func (s *WorkerSuite) TestStartStopNoCredential(c *gc.C) {
    72  	s.facade.setupModelHasNoCredential()
    73  	w, err := testWorker(s.config)
    74  	c.Assert(err, jc.ErrorIsNil)
    75  	workertest.CheckAlive(c, w)
    76  	workertest.CleanKill(c, w)
    77  
    78  	err = workertest.CheckKilled(c, w)
    79  	c.Assert(err, jc.ErrorIsNil)
    80  	workertest.CheckNilOrKill(c, s.facade.watcher)
    81  	err = workertest.CheckKilled(c, s.facade.modelWatcher)
    82  	c.Assert(err, jc.ErrorIsNil)
    83  	s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential")
    84  }
    85  
    86  func (s *WorkerSuite) TestModelCredentialError(c *gc.C) {
    87  	s.facade.SetErrors(errors.New("mc fail"))
    88  
    89  	worker, err := testWorker(s.config)
    90  	c.Check(err, gc.ErrorMatches, "mc fail")
    91  	c.Assert(worker, gc.IsNil)
    92  	s.facade.CheckCallNames(c, "ModelCredential")
    93  }
    94  
    95  func (s *WorkerSuite) TestModelCredentialWatcherError(c *gc.C) {
    96  	s.facade.SetErrors(nil, // ModelCredential call
    97  		errors.New("mcw fail"), // WatchModelCredential call
    98  	)
    99  
   100  	worker, err := testWorker(s.config)
   101  	c.Check(err, gc.ErrorMatches, "mcw fail")
   102  	c.Assert(worker, gc.IsNil)
   103  	s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential")
   104  }
   105  
   106  func (s *WorkerSuite) TestWatchError(c *gc.C) {
   107  	s.facade.SetErrors(nil, // ModelCredential call
   108  		nil,                      // WatchModelCredential call
   109  		errors.New("watch fail"), // WatchCredential call
   110  	)
   111  
   112  	worker, err := testWorker(s.config)
   113  	c.Assert(err, gc.ErrorMatches, "watch fail")
   114  	c.Assert(worker, gc.IsNil)
   115  	s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential", "WatchCredential")
   116  }
   117  
   118  func (s *WorkerSuite) TestModelCredentialNotNeeded(c *gc.C) {
   119  	s.facade.setupModelHasNoCredential()
   120  	worker, err := testWorker(s.config)
   121  	c.Assert(err, jc.ErrorIsNil)
   122  
   123  	workertest.CheckAlive(c, worker)
   124  	workertest.CleanKill(c, worker)
   125  	s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential")
   126  }
   127  
   128  func (s *WorkerSuite) TestCredentialChangeToInvalid(c *gc.C) {
   129  	worker, err := testWorker(s.config)
   130  	c.Assert(err, jc.ErrorIsNil)
   131  
   132  	s.facade.credential.Valid = false
   133  	s.sendChange(c)
   134  
   135  	err = workertest.CheckKilled(c, worker)
   136  	c.Check(err, gc.Equals, credentialvalidator.ErrValidityChanged)
   137  	s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential", "WatchCredential", "ModelCredential")
   138  }
   139  
   140  func (s *WorkerSuite) TestCredentialChangeFromInvalid(c *gc.C) {
   141  	s.facade.credential.Valid = false
   142  	worker, err := testWorker(s.config)
   143  	c.Assert(err, jc.ErrorIsNil)
   144  
   145  	s.facade.credential.Valid = true
   146  	s.sendChange(c)
   147  
   148  	err = workertest.CheckKilled(c, worker)
   149  	c.Check(err, gc.Equals, credentialvalidator.ErrValidityChanged)
   150  	s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential", "WatchCredential", "ModelCredential")
   151  }
   152  
   153  func (s *WorkerSuite) TestNoRelevantCredentialChange(c *gc.C) {
   154  	worker, err := testWorker(s.config)
   155  	c.Assert(err, jc.ErrorIsNil)
   156  
   157  	s.sendChange(c)
   158  	s.sendChange(c)
   159  
   160  	workertest.CheckAlive(c, worker)
   161  	workertest.CleanKill(c, worker)
   162  	s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential", "WatchCredential", "ModelCredential", "ModelCredential")
   163  }
   164  
   165  func (s *WorkerSuite) TestModelCredentialNoChanged(c *gc.C) {
   166  	worker, err := testWorker(s.config)
   167  	c.Assert(err, jc.ErrorIsNil)
   168  
   169  	s.sendModelChange(c)
   170  
   171  	workertest.CheckAlive(c, worker)
   172  	workertest.CleanKill(c, worker)
   173  	s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential", "WatchCredential", "ModelCredential")
   174  }
   175  
   176  func (s *WorkerSuite) TestModelCredentialChanged(c *gc.C) {
   177  	worker, err := testWorker(s.config)
   178  	c.Assert(err, jc.ErrorIsNil)
   179  
   180  	s.facade.credential.CloudCredential = names.NewCloudCredentialTag("cloud/anotheruser/credential").String()
   181  	s.sendModelChange(c)
   182  
   183  	err = workertest.CheckKilled(c, worker)
   184  	c.Check(err, gc.Equals, credentialvalidator.ErrModelCredentialChanged)
   185  	s.facade.CheckCallNames(c, "ModelCredential", "WatchModelCredential", "WatchCredential", "ModelCredential")
   186  }
   187  
   188  func (s *WorkerSuite) sendModelChange(c *gc.C) {
   189  	select {
   190  	case s.modelCredentialChanges <- struct{}{}:
   191  	case <-time.After(coretesting.LongWait):
   192  		c.Fatal("timed out sending model credential change")
   193  	}
   194  }
   195  
   196  func (s *WorkerSuite) sendChange(c *gc.C) {
   197  	select {
   198  	case s.credentialChanges <- struct{}{}:
   199  	case <-time.After(coretesting.LongWait):
   200  		c.Fatal("timed out sending credential change")
   201  	}
   202  }
   203  
   204  var testWorker = credentialvalidator.NewWorker