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

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