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