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 }