github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/worker/leadership/manifold_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package leadership_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  
    14  	"github.com/juju/juju/agent"
    15  	"github.com/juju/juju/api/base"
    16  	"github.com/juju/juju/worker"
    17  	"github.com/juju/juju/worker/dependency"
    18  	dt "github.com/juju/juju/worker/dependency/testing"
    19  	"github.com/juju/juju/worker/leadership"
    20  )
    21  
    22  type ManifoldSuite struct {
    23  	testing.IsolationSuite
    24  	testing.Stub
    25  	manifold dependency.Manifold
    26  }
    27  
    28  var _ = gc.Suite(&ManifoldSuite{})
    29  
    30  func (s *ManifoldSuite) SetUpTest(c *gc.C) {
    31  	s.IsolationSuite.SetUpTest(c)
    32  	s.Stub = testing.Stub{}
    33  	s.manifold = leadership.Manifold(leadership.ManifoldConfig{
    34  		AgentName:           "agent-name",
    35  		APICallerName:       "api-caller-name",
    36  		LeadershipGuarantee: 123456 * time.Millisecond,
    37  	})
    38  }
    39  
    40  func (s *ManifoldSuite) TestInputs(c *gc.C) {
    41  	c.Check(s.manifold.Inputs, jc.DeepEquals, []string{"agent-name", "api-caller-name"})
    42  }
    43  
    44  func (s *ManifoldSuite) TestStartAgentMissing(c *gc.C) {
    45  	getResource := dt.StubGetResource(dt.StubResources{
    46  		"agent-name":      dt.StubResource{Error: dependency.ErrMissing},
    47  		"api-caller-name": dt.StubResource{Output: &dummyApiCaller{}},
    48  	})
    49  
    50  	worker, err := s.manifold.Start(getResource)
    51  	c.Check(worker, gc.IsNil)
    52  	c.Check(err, gc.Equals, dependency.ErrMissing)
    53  }
    54  
    55  func (s *ManifoldSuite) TestStartApiCallerMissing(c *gc.C) {
    56  	getResource := dt.StubGetResource(dt.StubResources{
    57  		"agent-name":      dt.StubResource{Output: &dummyAgent{}},
    58  		"api-caller-name": dt.StubResource{Error: dependency.ErrMissing},
    59  	})
    60  
    61  	worker, err := s.manifold.Start(getResource)
    62  	c.Check(worker, gc.IsNil)
    63  	c.Check(err, gc.Equals, dependency.ErrMissing)
    64  }
    65  
    66  func (s *ManifoldSuite) TestStartError(c *gc.C) {
    67  	dummyAgent := &dummyAgent{}
    68  	dummyApiCaller := &dummyApiCaller{}
    69  	getResource := dt.StubGetResource(dt.StubResources{
    70  		"agent-name":      dt.StubResource{Output: dummyAgent},
    71  		"api-caller-name": dt.StubResource{Output: dummyApiCaller},
    72  	})
    73  	s.PatchValue(leadership.NewManifoldWorker, func(a agent.Agent, apiCaller base.APICaller, guarantee time.Duration) (worker.Worker, error) {
    74  		s.AddCall("newManifoldWorker", a, apiCaller, guarantee)
    75  		return nil, errors.New("blammo")
    76  	})
    77  
    78  	worker, err := s.manifold.Start(getResource)
    79  	c.Check(worker, gc.IsNil)
    80  	c.Check(err, gc.ErrorMatches, "blammo")
    81  	s.CheckCalls(c, []testing.StubCall{{
    82  		FuncName: "newManifoldWorker",
    83  		Args:     []interface{}{dummyAgent, dummyApiCaller, 123456 * time.Millisecond},
    84  	}})
    85  }
    86  
    87  func (s *ManifoldSuite) TestStartSuccess(c *gc.C) {
    88  	dummyAgent := &dummyAgent{}
    89  	dummyApiCaller := &dummyApiCaller{}
    90  	getResource := dt.StubGetResource(dt.StubResources{
    91  		"agent-name":      dt.StubResource{Output: dummyAgent},
    92  		"api-caller-name": dt.StubResource{Output: dummyApiCaller},
    93  	})
    94  	dummyWorker := &dummyWorker{}
    95  	s.PatchValue(leadership.NewManifoldWorker, func(a agent.Agent, apiCaller base.APICaller, guarantee time.Duration) (worker.Worker, error) {
    96  		s.AddCall("newManifoldWorker", a, apiCaller, guarantee)
    97  		return dummyWorker, nil
    98  	})
    99  
   100  	worker, err := s.manifold.Start(getResource)
   101  	c.Check(err, jc.ErrorIsNil)
   102  	c.Check(worker, gc.Equals, dummyWorker)
   103  	s.CheckCalls(c, []testing.StubCall{{
   104  		FuncName: "newManifoldWorker",
   105  		Args:     []interface{}{dummyAgent, dummyApiCaller, 123456 * time.Millisecond},
   106  	}})
   107  }
   108  
   109  func (s *ManifoldSuite) TestOutputBadTarget(c *gc.C) {
   110  	var target interface{}
   111  	err := s.manifold.Output(leadership.DummyTrackerWorker(), &target)
   112  	c.Check(target, gc.IsNil)
   113  	c.Check(err.Error(), gc.Equals, "expected *leadership.tracker->*leadership.Tracker; got *leadership.tracker->*interface {}")
   114  }
   115  
   116  func (s *ManifoldSuite) TestOutputBadWorker(c *gc.C) {
   117  	var target leadership.Tracker
   118  	err := s.manifold.Output(&dummyWorker{}, &target)
   119  	c.Check(target, gc.IsNil)
   120  	c.Check(err.Error(), gc.Equals, "expected *leadership.tracker->*leadership.Tracker; got *leadership_test.dummyWorker->*leadership.Tracker")
   121  }
   122  
   123  func (s *ManifoldSuite) TestOutputSuccess(c *gc.C) {
   124  	source := leadership.DummyTrackerWorker()
   125  	var target leadership.Tracker
   126  	err := s.manifold.Output(source, &target)
   127  	c.Check(err, jc.ErrorIsNil)
   128  	c.Check(target, gc.Equals, source)
   129  }
   130  
   131  type dummyAgent struct {
   132  	agent.Agent
   133  }
   134  
   135  type dummyApiCaller struct {
   136  	base.APICaller
   137  }
   138  
   139  type dummyWorker struct {
   140  	worker.Worker
   141  }