github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/machineactions/manifold_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Copyright 2016 Cloudbase Solutions
     3  // Licensed under the AGPLv3, see LICENCE file for details.
     4  
     5  package machineactions_test
     6  
     7  import (
     8  	"github.com/juju/errors"
     9  	"github.com/juju/testing"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  	"gopkg.in/juju/names.v2"
    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/machineactions"
    20  )
    21  
    22  type ManifoldSuite struct {
    23  	testing.IsolationSuite
    24  	context    dependency.Context
    25  	fakeAgent  agent.Agent
    26  	fakeCaller base.APICaller
    27  	fakeFacade machineactions.Facade
    28  	fakeWorker worker.Worker
    29  	newFacade  func(machineactions.Facade) func(base.APICaller) machineactions.Facade
    30  	newWorker  func(worker.Worker, error) func(machineactions.WorkerConfig) (worker.Worker, error)
    31  }
    32  
    33  var _ = gc.Suite(&ManifoldSuite{})
    34  
    35  func (s *ManifoldSuite) SetUpSuite(c *gc.C) {
    36  	s.IsolationSuite.SetUpSuite(c)
    37  	s.fakeAgent = &fakeAgent{tag: fakeTag}
    38  	s.fakeCaller = &fakeCaller{}
    39  
    40  	s.context = dt.StubContext(nil, map[string]interface{}{
    41  		"wut":     s.fakeAgent,
    42  		"exactly": s.fakeCaller,
    43  	})
    44  
    45  	s.newFacade = func(facade machineactions.Facade) func(base.APICaller) machineactions.Facade {
    46  		s.fakeFacade = facade
    47  		return func(apiCaller base.APICaller) machineactions.Facade {
    48  			c.Assert(apiCaller, gc.Equals, s.fakeCaller)
    49  			return facade
    50  		}
    51  	}
    52  	s.newWorker = func(w worker.Worker, err error) func(machineactions.WorkerConfig) (worker.Worker, error) {
    53  		s.fakeWorker = w
    54  		return func(wc machineactions.WorkerConfig) (worker.Worker, error) {
    55  			c.Assert(wc.Facade, gc.Equals, s.fakeFacade)
    56  			c.Assert(wc.MachineTag, gc.Equals, fakeTag)
    57  			c.Assert(wc.HandleAction, gc.Equals, fakeHandleAction)
    58  			return w, err
    59  		}
    60  	}
    61  }
    62  
    63  func (s *ManifoldSuite) TestInputs(c *gc.C) {
    64  	manifold := machineactions.Manifold(machineactions.ManifoldConfig{
    65  		AgentName:     "wut",
    66  		APICallerName: "exactly",
    67  	})
    68  	c.Check(manifold.Inputs, jc.DeepEquals, []string{"wut", "exactly"})
    69  }
    70  
    71  func (s *ManifoldSuite) TestStartMissingAgent(c *gc.C) {
    72  	manifold := machineactions.Manifold(machineactions.ManifoldConfig{
    73  		AgentName:     "wut",
    74  		APICallerName: "exactly",
    75  	})
    76  	context := dt.StubContext(nil, map[string]interface{}{
    77  		"wut": dependency.ErrMissing,
    78  	})
    79  
    80  	w, err := manifold.Start(context)
    81  	c.Assert(errors.Cause(err), gc.Equals, dependency.ErrMissing)
    82  	c.Assert(w, gc.IsNil)
    83  }
    84  
    85  func (s *ManifoldSuite) TestStartMissingAPI(c *gc.C) {
    86  	manifold := machineactions.Manifold(machineactions.ManifoldConfig{
    87  		AgentName:     "wut",
    88  		APICallerName: "exactly",
    89  	})
    90  	context := dt.StubContext(nil, map[string]interface{}{
    91  		"wut":     &fakeAgent{},
    92  		"exactly": dependency.ErrMissing,
    93  	})
    94  
    95  	w, err := manifold.Start(context)
    96  	c.Assert(errors.Cause(err), gc.Equals, dependency.ErrMissing)
    97  	c.Assert(w, gc.IsNil)
    98  }
    99  
   100  func (s *ManifoldSuite) TestStartWorkerError(c *gc.C) {
   101  	manifold := machineactions.Manifold(machineactions.ManifoldConfig{
   102  		AgentName:     "wut",
   103  		APICallerName: "exactly",
   104  		NewFacade:     s.newFacade(&fakeFacade{}),
   105  		NewWorker:     s.newWorker(nil, errors.New("blam")),
   106  	})
   107  
   108  	w, err := manifold.Start(s.context)
   109  	c.Assert(err, gc.ErrorMatches, "blam")
   110  	c.Assert(w, gc.IsNil)
   111  }
   112  
   113  func (s *ManifoldSuite) TestStartSuccess(c *gc.C) {
   114  	fakeWorker := &fakeWorker{}
   115  	manifold := machineactions.Manifold(machineactions.ManifoldConfig{
   116  		AgentName:     "wut",
   117  		APICallerName: "exactly",
   118  		NewFacade:     s.newFacade(&fakeFacade{}),
   119  		NewWorker:     s.newWorker(fakeWorker, nil),
   120  	})
   121  
   122  	w, err := manifold.Start(s.context)
   123  	c.Assert(err, jc.ErrorIsNil)
   124  	c.Assert(w, gc.Equals, fakeWorker)
   125  }
   126  
   127  func (s *ManifoldSuite) TestInvalidTag(c *gc.C) {
   128  	fakeWorker := &fakeWorker{}
   129  	manifold := machineactions.Manifold(machineactions.ManifoldConfig{
   130  		AgentName:     "wut",
   131  		APICallerName: "exactly",
   132  		NewFacade:     s.newFacade(&fakeFacade{}),
   133  		NewWorker:     s.newWorker(fakeWorker, nil),
   134  	})
   135  	context := dt.StubContext(nil, map[string]interface{}{
   136  		"wut":     &fakeAgent{tag: fakeTagErr},
   137  		"exactly": s.fakeCaller,
   138  	})
   139  
   140  	w, err := manifold.Start(context)
   141  	c.Assert(err, gc.ErrorMatches, "this manifold can only be used inside a machine")
   142  	c.Assert(w, gc.IsNil)
   143  }
   144  
   145  var fakeTag = names.NewMachineTag("4")
   146  var fakeTagErr = names.NewUnitTag("whatatag/0")
   147  
   148  type fakeAgent struct {
   149  	agent.Agent
   150  	tag names.Tag
   151  }
   152  
   153  func (mock *fakeAgent) CurrentConfig() agent.Config {
   154  	return &fakeConfig{tag: mock.tag}
   155  }
   156  
   157  type fakeConfig struct {
   158  	agent.Config
   159  	tag names.Tag
   160  }
   161  
   162  func (mock *fakeConfig) Tag() names.Tag {
   163  	return mock.tag
   164  }
   165  
   166  type fakeCaller struct {
   167  	base.APICaller
   168  }
   169  
   170  type fakeFacade struct {
   171  	machineactions.Facade
   172  }
   173  
   174  type fakeWorker struct {
   175  	worker.Worker
   176  }
   177  
   178  var fakeHandleAction = func(name string, params map[string]interface{}) (results map[string]interface{}, err error) {
   179  	return nil, nil
   180  }