github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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/clock/testclock"
    10  	"github.com/juju/errors"
    11  	"github.com/juju/testing"
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  	"gopkg.in/juju/names.v2"
    15  	"gopkg.in/juju/worker.v1"
    16  	"gopkg.in/juju/worker.v1/dependency"
    17  	dt "gopkg.in/juju/worker.v1/dependency/testing"
    18  
    19  	"github.com/juju/juju/api/base"
    20  	"github.com/juju/juju/cmd/jujud/agent/engine"
    21  	coretesting "github.com/juju/juju/testing"
    22  	"github.com/juju/juju/worker/singular"
    23  )
    24  
    25  type ManifoldSuite struct {
    26  	testing.IsolationSuite
    27  }
    28  
    29  var _ = gc.Suite(&ManifoldSuite{})
    30  
    31  func (s *ManifoldSuite) TestInputs(c *gc.C) {
    32  	manifold := singular.Manifold(singular.ManifoldConfig{
    33  		ClockName:     "harriet",
    34  		APICallerName: "kim",
    35  	})
    36  	expectInputs := []string{"harriet", "kim"}
    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 engine.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, _ *testclock.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, _ *testclock.Clock, _ func()) {
    63  		var out engine.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  	})
    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) TestStartMissingAPICaller(c *gc.C) {
    85  	manifold := singular.Manifold(singular.ManifoldConfig{
    86  		ClockName:     "clock",
    87  		APICallerName: "api-caller",
    88  	})
    89  	context := dt.StubContext(nil, map[string]interface{}{
    90  		"clock":      &fakeClock{},
    91  		"api-caller": dependency.ErrMissing,
    92  	})
    93  
    94  	worker, err := manifold.Start(context)
    95  	c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing)
    96  	c.Check(worker, gc.IsNil)
    97  }
    98  
    99  func (s *ManifoldSuite) TestStartNewFacadeError(c *gc.C) {
   100  	expectAPICaller := &fakeAPICaller{}
   101  	manifold := singular.Manifold(singular.ManifoldConfig{
   102  		ClockName:     "clock",
   103  		APICallerName: "api-caller",
   104  		Claimant:      names.NewMachineTag("123"),
   105  		Entity:        coretesting.ModelTag,
   106  		NewFacade: func(apiCaller base.APICaller, claimant names.MachineTag, entity names.Tag) (singular.Facade, error) {
   107  			c.Check(apiCaller, gc.Equals, expectAPICaller)
   108  			c.Check(claimant.String(), gc.Equals, "machine-123")
   109  			c.Check(entity, gc.Equals, coretesting.ModelTag)
   110  			return nil, errors.New("grark plop")
   111  		},
   112  	})
   113  	context := dt.StubContext(nil, map[string]interface{}{
   114  		"clock":      &fakeClock{},
   115  		"api-caller": expectAPICaller,
   116  	})
   117  
   118  	worker, err := manifold.Start(context)
   119  	c.Check(err, gc.ErrorMatches, "grark plop")
   120  	c.Check(worker, gc.IsNil)
   121  }
   122  
   123  func (s *ManifoldSuite) TestStartNewWorkerError(c *gc.C) {
   124  	expectFacade := &fakeFacade{}
   125  	manifold := singular.Manifold(singular.ManifoldConfig{
   126  		ClockName:     "clock",
   127  		APICallerName: "api-caller",
   128  		Duration:      time.Minute,
   129  		NewFacade: func(base.APICaller, names.MachineTag, names.Tag) (singular.Facade, error) {
   130  			return expectFacade, nil
   131  		},
   132  		NewWorker: func(config singular.FlagConfig) (worker.Worker, error) {
   133  			c.Check(config.Facade, gc.Equals, expectFacade)
   134  			err := config.Validate()
   135  			c.Check(err, jc.ErrorIsNil)
   136  			return nil, errors.New("blomp tik")
   137  		},
   138  	})
   139  	context := dt.StubContext(nil, map[string]interface{}{
   140  		"clock":      &fakeClock{},
   141  		"api-caller": &fakeAPICaller{},
   142  	})
   143  
   144  	worker, err := manifold.Start(context)
   145  	c.Check(err, gc.ErrorMatches, "blomp tik")
   146  	c.Check(worker, gc.IsNil)
   147  }
   148  
   149  func (s *ManifoldSuite) TestStartSuccess(c *gc.C) {
   150  	var stub testing.Stub
   151  	expectWorker := newStubWorker(&stub)
   152  	manifold := singular.Manifold(singular.ManifoldConfig{
   153  		ClockName:     "clock",
   154  		APICallerName: "api-caller",
   155  		NewFacade: func(base.APICaller, names.MachineTag, names.Tag) (singular.Facade, error) {
   156  			return &fakeFacade{}, nil
   157  		},
   158  		NewWorker: func(_ singular.FlagConfig) (worker.Worker, error) {
   159  			return expectWorker, nil
   160  		},
   161  	})
   162  	context := dt.StubContext(nil, map[string]interface{}{
   163  		"clock":      &fakeClock{},
   164  		"api-caller": &fakeAPICaller{},
   165  	})
   166  
   167  	worker, err := manifold.Start(context)
   168  	c.Check(err, jc.ErrorIsNil)
   169  
   170  	var out engine.Flag
   171  	err = manifold.Output(worker, &out)
   172  	c.Check(err, jc.ErrorIsNil)
   173  	c.Check(out.Check(), jc.IsTrue)
   174  
   175  	c.Check(worker.Wait(), jc.ErrorIsNil)
   176  	stub.CheckCallNames(c, "Check", "Wait")
   177  }
   178  
   179  func (s *ManifoldSuite) TestWorkerBouncesOnRefresh(c *gc.C) {
   180  	var stub testing.Stub
   181  	stub.SetErrors(singular.ErrRefresh)
   182  	errWorker := newStubWorker(&stub)
   183  
   184  	manifold := singular.Manifold(singular.ManifoldConfig{
   185  		ClockName:     "clock",
   186  		APICallerName: "api-caller",
   187  		NewFacade: func(base.APICaller, names.MachineTag, names.Tag) (singular.Facade, error) {
   188  			return &fakeFacade{}, nil
   189  		},
   190  		NewWorker: func(_ singular.FlagConfig) (worker.Worker, error) {
   191  			return errWorker, nil
   192  		},
   193  	})
   194  	context := dt.StubContext(nil, map[string]interface{}{
   195  		"clock":      &fakeClock{},
   196  		"api-caller": &fakeAPICaller{},
   197  	})
   198  
   199  	worker, err := manifold.Start(context)
   200  	c.Check(err, jc.ErrorIsNil)
   201  	c.Check(worker.Wait(), gc.Equals, dependency.ErrBounce)
   202  }