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

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package presence_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/clock/testclock"
    10  	"github.com/juju/errors"
    11  	"github.com/juju/loggo"
    12  	"github.com/juju/pubsub"
    13  	"github.com/juju/testing"
    14  	jc "github.com/juju/testing/checkers"
    15  	gc "gopkg.in/check.v1"
    16  	"gopkg.in/juju/names.v2"
    17  	"gopkg.in/juju/worker.v1"
    18  	"gopkg.in/juju/worker.v1/dependency"
    19  	dt "gopkg.in/juju/worker.v1/dependency/testing"
    20  
    21  	"github.com/juju/juju/agent"
    22  	corepresence "github.com/juju/juju/core/presence"
    23  	"github.com/juju/juju/worker/presence"
    24  )
    25  
    26  type ManifoldSuite struct {
    27  	testing.IsolationSuite
    28  	config presence.ManifoldConfig
    29  }
    30  
    31  var _ = gc.Suite(&ManifoldSuite{})
    32  
    33  func (s *ManifoldSuite) SetUpTest(c *gc.C) {
    34  	s.IsolationSuite.SetUpTest(c)
    35  	s.config = presence.ManifoldConfig{
    36  		AgentName:              "agent",
    37  		CentralHubName:         "central-hub",
    38  		StateConfigWatcherName: "state-config",
    39  		Recorder:               corepresence.New(testclock.NewClock(time.Now())),
    40  		Logger:                 loggo.GetLogger("test"),
    41  		NewWorker: func(presence.WorkerConfig) (worker.Worker, error) {
    42  			return nil, errors.New("boom")
    43  		},
    44  	}
    45  }
    46  
    47  func (s *ManifoldSuite) manifold() dependency.Manifold {
    48  	return presence.Manifold(s.config)
    49  }
    50  
    51  func (s *ManifoldSuite) TestInputs(c *gc.C) {
    52  	c.Check(s.manifold().Inputs, jc.DeepEquals, []string{"agent", "central-hub", "state-config"})
    53  }
    54  
    55  func (s *ManifoldSuite) TestConfigValidation(c *gc.C) {
    56  	err := s.config.Validate()
    57  	c.Assert(err, jc.ErrorIsNil)
    58  }
    59  
    60  func (s *ManifoldSuite) TestConfigValidationMissingAgentName(c *gc.C) {
    61  	s.config.AgentName = ""
    62  	err := s.config.Validate()
    63  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    64  	c.Check(err, gc.ErrorMatches, "missing AgentName not valid")
    65  }
    66  
    67  func (s *ManifoldSuite) TestConfigValidationMissingCentralHubName(c *gc.C) {
    68  	s.config.CentralHubName = ""
    69  	err := s.config.Validate()
    70  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    71  	c.Check(err, gc.ErrorMatches, "missing CentralHubName not valid")
    72  }
    73  
    74  func (s *ManifoldSuite) TestConfigValidationMissingStateConfigWatcherName(c *gc.C) {
    75  	s.config.StateConfigWatcherName = ""
    76  	err := s.config.Validate()
    77  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    78  	c.Check(err, gc.ErrorMatches, "missing StateConfigWatcherName not valid")
    79  }
    80  
    81  func (s *ManifoldSuite) TestConfigValidationMissingRecorder(c *gc.C) {
    82  	s.config.Recorder = nil
    83  	err := s.config.Validate()
    84  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    85  	c.Check(err, gc.ErrorMatches, "missing Recorder not valid")
    86  }
    87  
    88  func (s *ManifoldSuite) TestConfigValidationMissingLogger(c *gc.C) {
    89  	s.config.Logger = nil
    90  	err := s.config.Validate()
    91  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    92  	c.Check(err, gc.ErrorMatches, "missing Logger not valid")
    93  }
    94  
    95  func (s *ManifoldSuite) TestConfigValidationMissingNewWorker(c *gc.C) {
    96  	s.config.NewWorker = nil
    97  	err := s.config.Validate()
    98  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    99  	c.Check(err, gc.ErrorMatches, "missing NewWorker not valid")
   100  }
   101  
   102  func (s *ManifoldSuite) TestConfigNewWorker(c *gc.C) {
   103  	// This test will fail at compile time if the presence.NewWorker function
   104  	// has a different signature to the NewWorker config attribute for ManifoldConfig.
   105  	s.config.NewWorker = presence.NewWorker
   106  }
   107  
   108  func (s *ManifoldSuite) TestManifoldCallsValidate(c *gc.C) {
   109  	context := dt.StubContext(nil, map[string]interface{}{})
   110  	s.config.Recorder = nil
   111  	worker, err := s.manifold().Start(context)
   112  	c.Check(worker, gc.IsNil)
   113  	c.Check(err, jc.Satisfies, errors.IsNotValid)
   114  	c.Check(err, gc.ErrorMatches, `missing Recorder not valid`)
   115  }
   116  
   117  func (s *ManifoldSuite) TestAgentMissing(c *gc.C) {
   118  	context := dt.StubContext(nil, map[string]interface{}{
   119  		"agent": dependency.ErrMissing,
   120  	})
   121  
   122  	worker, err := s.manifold().Start(context)
   123  	c.Check(worker, gc.IsNil)
   124  	c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing)
   125  }
   126  
   127  func (s *ManifoldSuite) TestCentralHubMissing(c *gc.C) {
   128  	context := dt.StubContext(nil, map[string]interface{}{
   129  		"agent":       &fakeAgent{tag: names.NewMachineTag("42")},
   130  		"central-hub": dependency.ErrMissing,
   131  	})
   132  
   133  	worker, err := s.manifold().Start(context)
   134  	c.Check(worker, gc.IsNil)
   135  	c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing)
   136  }
   137  
   138  func (s *ManifoldSuite) TestNotAServer(c *gc.C) {
   139  	context := dt.StubContext(nil, map[string]interface{}{
   140  		"agent":        &fakeAgent{tag: names.NewMachineTag("42")},
   141  		"central-hub":  pubsub.NewStructuredHub(nil),
   142  		"state-config": false,
   143  	})
   144  
   145  	worker, err := s.manifold().Start(context)
   146  	c.Check(worker, gc.IsNil)
   147  	c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing)
   148  }
   149  
   150  func (s *ManifoldSuite) TestNewWorkerArgs(c *gc.C) {
   151  	hub := pubsub.NewStructuredHub(nil)
   152  	var config presence.WorkerConfig
   153  	s.config.NewWorker = func(c presence.WorkerConfig) (worker.Worker, error) {
   154  		config = c
   155  		return &fakeWorker{}, nil
   156  	}
   157  
   158  	context := dt.StubContext(nil, map[string]interface{}{
   159  		"agent":        &fakeAgent{tag: names.NewMachineTag("42")},
   160  		"central-hub":  hub,
   161  		"state-config": true,
   162  	})
   163  
   164  	worker, err := s.manifold().Start(context)
   165  	c.Check(err, jc.ErrorIsNil)
   166  	c.Check(worker, gc.NotNil)
   167  
   168  	c.Check(config.Origin, gc.Equals, "machine-42")
   169  	c.Check(config.Hub, gc.Equals, hub)
   170  	c.Check(config.Recorder, gc.Equals, s.config.Recorder)
   171  }
   172  
   173  type fakeWorker struct {
   174  	worker.Worker
   175  }
   176  
   177  type fakeAgent struct {
   178  	agent.Agent
   179  	agent.Config
   180  
   181  	tag names.Tag
   182  }
   183  
   184  // The fake is its own config.
   185  func (f *fakeAgent) CurrentConfig() agent.Config {
   186  	return f
   187  }
   188  
   189  func (f *fakeAgent) Tag() names.Tag {
   190  	return f.tag
   191  }