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 }