github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/agent/manifold_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package agent_test
     5  
     6  import (
     7  	"github.com/juju/testing"
     8  	jc "github.com/juju/testing/checkers"
     9  	"github.com/juju/version"
    10  	gc "gopkg.in/check.v1"
    11  	"gopkg.in/juju/names.v2"
    12  	"gopkg.in/juju/worker.v1"
    13  
    14  	coreagent "github.com/juju/juju/agent"
    15  	jujuversion "github.com/juju/juju/version"
    16  	"github.com/juju/juju/worker/agent"
    17  )
    18  
    19  type ManifoldSuite struct {
    20  	testing.IsolationSuite
    21  }
    22  
    23  var _ = gc.Suite(&ManifoldSuite{})
    24  
    25  func (s *ManifoldSuite) TestInputs(c *gc.C) {
    26  	inputAgent := &dummyAgent{}
    27  	manifold := agent.Manifold(inputAgent)
    28  	c.Check(manifold.Inputs, gc.IsNil)
    29  }
    30  
    31  func (s *ManifoldSuite) TestOutput(c *gc.C) {
    32  	inputAgent := &dummyAgent{}
    33  	manifold := agent.Manifold(inputAgent)
    34  
    35  	agentWorker, err := manifold.Start(nil)
    36  	c.Check(err, jc.ErrorIsNil)
    37  	defer assertStop(c, agentWorker)
    38  
    39  	var outputAgent coreagent.Agent
    40  	err = manifold.Output(agentWorker, &outputAgent)
    41  	c.Check(err, jc.ErrorIsNil)
    42  	c.Check(outputAgent, jc.DeepEquals, inputAgent)
    43  }
    44  
    45  func (s *ManifoldSuite) TestOutputStoppedWorker(c *gc.C) {
    46  	inputAgent := &dummyAgent{}
    47  	manifold := agent.Manifold(inputAgent)
    48  
    49  	agentWorker, err := manifold.Start(nil)
    50  	c.Check(err, jc.ErrorIsNil)
    51  	// The lifetime is irrelevant -- the output func will still function
    52  	// whether the (degenerate) worker is alive or not -- so no defer here.
    53  	assertStop(c, agentWorker)
    54  
    55  	var outputAgent coreagent.Agent
    56  	err = manifold.Output(agentWorker, &outputAgent)
    57  	c.Check(err, jc.ErrorIsNil)
    58  	c.Check(outputAgent, jc.DeepEquals, inputAgent)
    59  }
    60  
    61  func (s *ManifoldSuite) TestOutputBadWorker(c *gc.C) {
    62  	inputAgent := &dummyAgent{}
    63  	manifold := agent.Manifold(inputAgent)
    64  
    65  	var badWorker worker.Worker
    66  
    67  	var outputAgent coreagent.Agent
    68  	err := manifold.Output(badWorker, &outputAgent)
    69  	c.Check(err.Error(), gc.Equals, "expected *agent.agentWorker->*agent.Agent; got <nil>->*agent.Agent")
    70  }
    71  
    72  func (s *ManifoldSuite) TestOutputBadTarget(c *gc.C) {
    73  	inputAgent := &dummyAgent{}
    74  	manifold := agent.Manifold(inputAgent)
    75  
    76  	agentWorker, err := manifold.Start(nil)
    77  	c.Check(err, jc.ErrorIsNil)
    78  	defer assertStop(c, agentWorker)
    79  
    80  	var outputNonsense interface{}
    81  	err = manifold.Output(agentWorker, &outputNonsense)
    82  	c.Check(err.Error(), gc.Equals, "expected *agent.agentWorker->*agent.Agent; got *agent.agentWorker->*interface {}")
    83  }
    84  
    85  func (s *ManifoldSuite) TestReport(c *gc.C) {
    86  	s.PatchValue(&jujuversion.Current, version.MustParse("3.2.1"))
    87  
    88  	inputAgent := &dummyAgent{}
    89  	manifold := agent.Manifold(inputAgent)
    90  
    91  	agentWorker, err := manifold.Start(nil)
    92  	c.Check(err, jc.ErrorIsNil)
    93  	defer assertStop(c, agentWorker)
    94  
    95  	reporter, ok := agentWorker.(worker.Reporter)
    96  	c.Assert(ok, jc.IsTrue)
    97  	c.Assert(reporter.Report(), jc.DeepEquals, map[string]interface{}{
    98  		"agent":      "machine-42",
    99  		"model-uuid": "model-uuid",
   100  		"version":    "3.2.1",
   101  	})
   102  }
   103  
   104  type dummyAgent struct {
   105  	coreagent.Agent
   106  }
   107  
   108  func (dummyAgent) CurrentConfig() coreagent.Config {
   109  	return fakeConfig{}
   110  }
   111  
   112  func assertStop(c *gc.C, w worker.Worker) {
   113  	c.Assert(worker.Stop(w), jc.ErrorIsNil)
   114  }
   115  
   116  type fakeConfig struct {
   117  	coreagent.Config
   118  }
   119  
   120  func (fakeConfig) Model() names.ModelTag {
   121  	return names.NewModelTag("model-uuid")
   122  }
   123  
   124  func (fakeConfig) Tag() names.Tag {
   125  	return names.NewMachineTag("42")
   126  }