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