github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/raft/raftflag/manifold_test.go (about)

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package raftflag_test
     5  
     6  import (
     7  	"github.com/hashicorp/raft"
     8  	"github.com/juju/errors"
     9  	"github.com/juju/testing"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  	"gopkg.in/juju/worker.v1"
    13  	"gopkg.in/juju/worker.v1/dependency"
    14  	dt "gopkg.in/juju/worker.v1/dependency/testing"
    15  
    16  	"github.com/juju/juju/cmd/jujud/agent/engine"
    17  	"github.com/juju/juju/worker/raft/raftflag"
    18  )
    19  
    20  type ManifoldSuite struct {
    21  	testing.IsolationSuite
    22  
    23  	manifold dependency.Manifold
    24  	context  dependency.Context
    25  	raft     *raft.Raft
    26  	worker   *mockWorker
    27  	stub     testing.Stub
    28  }
    29  
    30  var _ = gc.Suite(&ManifoldSuite{})
    31  
    32  func (s *ManifoldSuite) SetUpTest(c *gc.C) {
    33  	s.IsolationSuite.SetUpTest(c)
    34  
    35  	s.raft = &raft.Raft{}
    36  	s.worker = &mockWorker{}
    37  	s.stub.ResetCalls()
    38  
    39  	s.context = s.newContext(nil)
    40  	s.manifold = raftflag.Manifold(raftflag.ManifoldConfig{
    41  		RaftName:  "raft",
    42  		NewWorker: s.newWorker,
    43  	})
    44  }
    45  
    46  func (s *ManifoldSuite) newContext(overlay map[string]interface{}) dependency.Context {
    47  	resources := map[string]interface{}{
    48  		"raft": s.raft,
    49  	}
    50  	for k, v := range overlay {
    51  		resources[k] = v
    52  	}
    53  	return dt.StubContext(nil, resources)
    54  }
    55  
    56  func (s *ManifoldSuite) newWorker(config raftflag.Config) (worker.Worker, error) {
    57  	s.stub.MethodCall(s, "NewWorker", config)
    58  	if err := s.stub.NextErr(); err != nil {
    59  		return nil, err
    60  	}
    61  	return s.worker, nil
    62  }
    63  
    64  var expectedInputs = []string{"raft"}
    65  
    66  func (s *ManifoldSuite) TestInputs(c *gc.C) {
    67  	c.Assert(s.manifold.Inputs, jc.SameContents, expectedInputs)
    68  }
    69  
    70  func (s *ManifoldSuite) TestMissingInputs(c *gc.C) {
    71  	for _, input := range expectedInputs {
    72  		context := s.newContext(map[string]interface{}{
    73  			input: dependency.ErrMissing,
    74  		})
    75  		_, err := s.manifold.Start(context)
    76  		c.Assert(errors.Cause(err), gc.Equals, dependency.ErrMissing)
    77  	}
    78  }
    79  
    80  func (s *ManifoldSuite) TestStart(c *gc.C) {
    81  	s.startWorkerClean(c)
    82  
    83  	s.stub.CheckCallNames(c, "NewWorker")
    84  	args := s.stub.Calls()[0].Args
    85  	c.Assert(args, gc.HasLen, 1)
    86  	c.Assert(args[0], jc.DeepEquals, raftflag.Config{
    87  		Raft: s.raft,
    88  	})
    89  }
    90  
    91  func (s *ManifoldSuite) TestErrRefresh(c *gc.C) {
    92  	w := s.startWorkerClean(c)
    93  
    94  	s.worker.SetErrors(raftflag.ErrRefresh)
    95  	err := w.Wait()
    96  	c.Assert(err, gc.Equals, dependency.ErrBounce)
    97  }
    98  
    99  func (s *ManifoldSuite) TestOutput(c *gc.C) {
   100  	s.startWorkerClean(c)
   101  
   102  	var flag engine.Flag
   103  	err := s.manifold.Output(s.worker, &flag)
   104  	c.Assert(err, jc.ErrorIsNil)
   105  	c.Assert(flag, gc.Equals, s.worker)
   106  }
   107  
   108  func (s *ManifoldSuite) startWorkerClean(c *gc.C) worker.Worker {
   109  	w, err := s.manifold.Start(s.context)
   110  	c.Assert(err, jc.ErrorIsNil)
   111  	return w
   112  }
   113  
   114  type mockWorker struct {
   115  	testing.Stub
   116  	worker.Worker
   117  	engine.Flag
   118  }
   119  
   120  func (w *mockWorker) Wait() error {
   121  	return w.NextErr()
   122  }