github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/worker/singular/manifold_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package singular_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/errors"
    10  	"github.com/juju/names"
    11  	"github.com/juju/testing"
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  
    15  	"github.com/juju/juju/api/base"
    16  	"github.com/juju/juju/cmd/jujud/agent/util"
    17  	coretesting "github.com/juju/juju/testing"
    18  	"github.com/juju/juju/worker"
    19  	"github.com/juju/juju/worker/dependency"
    20  	dt "github.com/juju/juju/worker/dependency/testing"
    21  	"github.com/juju/juju/worker/singular"
    22  )
    23  
    24  type ManifoldSuite struct {
    25  	testing.IsolationSuite
    26  }
    27  
    28  var _ = gc.Suite(&ManifoldSuite{})
    29  
    30  func (s *ManifoldSuite) TestInputs(c *gc.C) {
    31  	manifold := singular.Manifold(singular.ManifoldConfig{
    32  		ClockName:     "harriet",
    33  		APICallerName: "kim",
    34  		AgentName:     "jenny",
    35  	})
    36  	expectInputs := []string{"harriet", "kim", "jenny"}
    37  	c.Check(manifold.Inputs, jc.DeepEquals, expectInputs)
    38  }
    39  
    40  func (s *ManifoldSuite) TestOutputBadWorker(c *gc.C) {
    41  	manifold := singular.Manifold(singular.ManifoldConfig{})
    42  	var out util.Flag
    43  	err := manifold.Output(&fakeWorker{}, &out)
    44  	c.Check(err, gc.ErrorMatches, `expected in to implement Flag; got a .*`)
    45  	c.Check(out, gc.IsNil)
    46  }
    47  
    48  func (s *ManifoldSuite) TestOutputBadResult(c *gc.C) {
    49  	manifold := singular.Manifold(singular.ManifoldConfig{})
    50  	fix := newFixture(c)
    51  	fix.Run(c, func(flag *singular.FlagWorker, _ *coretesting.Clock, _ func()) {
    52  		var out interface{}
    53  		err := manifold.Output(flag, &out)
    54  		c.Check(err, gc.ErrorMatches, `expected out to be a \*Flag; got a .*`)
    55  		c.Check(out, gc.IsNil)
    56  	})
    57  }
    58  
    59  func (s *ManifoldSuite) TestOutputSuccess(c *gc.C) {
    60  	manifold := singular.Manifold(singular.ManifoldConfig{})
    61  	fix := newFixture(c)
    62  	fix.Run(c, func(flag *singular.FlagWorker, _ *coretesting.Clock, _ func()) {
    63  		var out util.Flag
    64  		err := manifold.Output(flag, &out)
    65  		c.Check(err, jc.ErrorIsNil)
    66  		c.Check(out, gc.Equals, flag)
    67  	})
    68  }
    69  
    70  func (s *ManifoldSuite) TestStartMissingClock(c *gc.C) {
    71  	manifold := singular.Manifold(singular.ManifoldConfig{
    72  		ClockName:     "clock",
    73  		APICallerName: "api-caller",
    74  		AgentName:     "agent",
    75  	})
    76  	context := dt.StubContext(nil, map[string]interface{}{
    77  		"clock": dependency.ErrMissing,
    78  	})
    79  
    80  	worker, err := manifold.Start(context)
    81  	c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing)
    82  	c.Check(worker, gc.IsNil)
    83  }
    84  
    85  func (s *ManifoldSuite) TestStartMissingAgent(c *gc.C) {
    86  	manifold := singular.Manifold(singular.ManifoldConfig{
    87  		ClockName:     "clock",
    88  		APICallerName: "api-caller",
    89  		AgentName:     "agent",
    90  	})
    91  	context := dt.StubContext(nil, map[string]interface{}{
    92  		"clock":      &fakeClock{},
    93  		"api-caller": dependency.ErrMissing,
    94  	})
    95  
    96  	worker, err := manifold.Start(context)
    97  	c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing)
    98  	c.Check(worker, gc.IsNil)
    99  }
   100  
   101  func (s *ManifoldSuite) TestStartMissingAPICaller(c *gc.C) {
   102  	manifold := singular.Manifold(singular.ManifoldConfig{
   103  		ClockName:     "clock",
   104  		APICallerName: "api-caller",
   105  		AgentName:     "agent",
   106  	})
   107  	context := dt.StubContext(nil, map[string]interface{}{
   108  		"clock":      &fakeClock{},
   109  		"api-caller": &fakeAPICaller{},
   110  		"agent":      dependency.ErrMissing,
   111  	})
   112  
   113  	worker, err := manifold.Start(context)
   114  	c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing)
   115  	c.Check(worker, gc.IsNil)
   116  }
   117  
   118  func (s *ManifoldSuite) TestStartWrongAgent(c *gc.C) {
   119  	manifold := singular.Manifold(singular.ManifoldConfig{
   120  		ClockName:     "clock",
   121  		APICallerName: "api-caller",
   122  		AgentName:     "agent",
   123  	})
   124  	context := dt.StubContext(nil, map[string]interface{}{
   125  		"clock":      &fakeClock{},
   126  		"api-caller": &fakeAPICaller{},
   127  		"agent":      &mockAgent{wrongKind: true},
   128  	})
   129  
   130  	worker, err := manifold.Start(context)
   131  	c.Check(err, gc.ErrorMatches, "singular flag expected a machine agent")
   132  	c.Check(worker, gc.IsNil)
   133  }
   134  
   135  func (s *ManifoldSuite) TestStartNewFacadeError(c *gc.C) {
   136  	expectAPICaller := &fakeAPICaller{}
   137  	manifold := singular.Manifold(singular.ManifoldConfig{
   138  		ClockName:     "clock",
   139  		APICallerName: "api-caller",
   140  		AgentName:     "agent",
   141  		NewFacade: func(apiCaller base.APICaller, tag names.MachineTag) (singular.Facade, error) {
   142  			c.Check(apiCaller, gc.Equals, expectAPICaller)
   143  			c.Check(tag.String(), gc.Equals, "machine-123")
   144  			return nil, errors.New("grark plop")
   145  		},
   146  	})
   147  	context := dt.StubContext(nil, map[string]interface{}{
   148  		"clock":      &fakeClock{},
   149  		"api-caller": expectAPICaller,
   150  		"agent":      &mockAgent{},
   151  	})
   152  
   153  	worker, err := manifold.Start(context)
   154  	c.Check(err, gc.ErrorMatches, "grark plop")
   155  	c.Check(worker, gc.IsNil)
   156  }
   157  
   158  func (s *ManifoldSuite) TestStartNewWorkerError(c *gc.C) {
   159  	expectFacade := &fakeFacade{}
   160  	manifold := singular.Manifold(singular.ManifoldConfig{
   161  		ClockName:     "clock",
   162  		APICallerName: "api-caller",
   163  		AgentName:     "agent",
   164  		Duration:      time.Minute,
   165  		NewFacade: func(_ base.APICaller, _ names.MachineTag) (singular.Facade, error) {
   166  			return expectFacade, nil
   167  		},
   168  		NewWorker: func(config singular.FlagConfig) (worker.Worker, error) {
   169  			c.Check(config.Facade, gc.Equals, expectFacade)
   170  			err := config.Validate()
   171  			c.Check(err, jc.ErrorIsNil)
   172  			return nil, errors.New("blomp tik")
   173  		},
   174  	})
   175  	context := dt.StubContext(nil, map[string]interface{}{
   176  		"clock":      &fakeClock{},
   177  		"api-caller": &fakeAPICaller{},
   178  		"agent":      &mockAgent{},
   179  	})
   180  
   181  	worker, err := manifold.Start(context)
   182  	c.Check(err, gc.ErrorMatches, "blomp tik")
   183  	c.Check(worker, gc.IsNil)
   184  }
   185  
   186  func (s *ManifoldSuite) TestStartSuccess(c *gc.C) {
   187  	expectWorker := &fakeWorker{}
   188  	manifold := singular.Manifold(singular.ManifoldConfig{
   189  		ClockName:     "clock",
   190  		APICallerName: "api-caller",
   191  		AgentName:     "agent",
   192  		NewFacade: func(_ base.APICaller, _ names.MachineTag) (singular.Facade, error) {
   193  			return &fakeFacade{}, nil
   194  		},
   195  		NewWorker: func(_ singular.FlagConfig) (worker.Worker, error) {
   196  			return expectWorker, nil
   197  		},
   198  	})
   199  	context := dt.StubContext(nil, map[string]interface{}{
   200  		"clock":      &fakeClock{},
   201  		"api-caller": &fakeAPICaller{},
   202  		"agent":      &mockAgent{},
   203  	})
   204  
   205  	worker, err := manifold.Start(context)
   206  	c.Check(err, jc.ErrorIsNil)
   207  	c.Check(worker, gc.Equals, expectWorker)
   208  }