github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/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/names/v5"
    13  	"github.com/juju/pubsub/v2"
    14  	"github.com/juju/testing"
    15  	jc "github.com/juju/testing/checkers"
    16  	"github.com/juju/worker/v3"
    17  	"github.com/juju/worker/v3/dependency"
    18  	dt "github.com/juju/worker/v3/dependency/testing"
    19  	gc "gopkg.in/check.v1"
    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  		Recorder:       corepresence.New(testclock.NewClock(time.Now())),
    39  		Logger:         loggo.GetLogger("test"),
    40  		NewWorker: func(presence.WorkerConfig) (worker.Worker, error) {
    41  			return nil, errors.New("boom")
    42  		},
    43  	}
    44  }
    45  
    46  func (s *ManifoldSuite) manifold() dependency.Manifold {
    47  	return presence.Manifold(s.config)
    48  }
    49  
    50  func (s *ManifoldSuite) TestInputs(c *gc.C) {
    51  	c.Check(s.manifold().Inputs, jc.DeepEquals, []string{"agent", "central-hub"})
    52  }
    53  
    54  func (s *ManifoldSuite) TestConfigValidation(c *gc.C) {
    55  	err := s.config.Validate()
    56  	c.Assert(err, jc.ErrorIsNil)
    57  }
    58  
    59  func (s *ManifoldSuite) TestConfigValidationMissingAgentName(c *gc.C) {
    60  	s.config.AgentName = ""
    61  	err := s.config.Validate()
    62  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    63  	c.Check(err, gc.ErrorMatches, "missing AgentName not valid")
    64  }
    65  
    66  func (s *ManifoldSuite) TestConfigValidationMissingCentralHubName(c *gc.C) {
    67  	s.config.CentralHubName = ""
    68  	err := s.config.Validate()
    69  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    70  	c.Check(err, gc.ErrorMatches, "missing CentralHubName not valid")
    71  }
    72  
    73  func (s *ManifoldSuite) TestConfigValidationMissingRecorder(c *gc.C) {
    74  	s.config.Recorder = nil
    75  	err := s.config.Validate()
    76  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    77  	c.Check(err, gc.ErrorMatches, "missing Recorder not valid")
    78  }
    79  
    80  func (s *ManifoldSuite) TestConfigValidationMissingLogger(c *gc.C) {
    81  	s.config.Logger = nil
    82  	err := s.config.Validate()
    83  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    84  	c.Check(err, gc.ErrorMatches, "missing Logger not valid")
    85  }
    86  
    87  func (s *ManifoldSuite) TestConfigValidationMissingNewWorker(c *gc.C) {
    88  	s.config.NewWorker = nil
    89  	err := s.config.Validate()
    90  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    91  	c.Check(err, gc.ErrorMatches, "missing NewWorker not valid")
    92  }
    93  
    94  func (s *ManifoldSuite) TestConfigNewWorker(c *gc.C) {
    95  	// This test will fail at compile time if the presence.NewWorker function
    96  	// has a different signature to the NewWorker config attribute for ManifoldConfig.
    97  	s.config.NewWorker = presence.NewWorker
    98  }
    99  
   100  func (s *ManifoldSuite) TestManifoldCallsValidate(c *gc.C) {
   101  	context := dt.StubContext(nil, map[string]interface{}{})
   102  	s.config.Recorder = nil
   103  	worker, err := s.manifold().Start(context)
   104  	c.Check(worker, gc.IsNil)
   105  	c.Check(err, jc.Satisfies, errors.IsNotValid)
   106  	c.Check(err, gc.ErrorMatches, `missing Recorder not valid`)
   107  }
   108  
   109  func (s *ManifoldSuite) TestAgentMissing(c *gc.C) {
   110  	context := dt.StubContext(nil, map[string]interface{}{
   111  		"agent": dependency.ErrMissing,
   112  	})
   113  
   114  	worker, err := s.manifold().Start(context)
   115  	c.Check(worker, gc.IsNil)
   116  	c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing)
   117  }
   118  
   119  func (s *ManifoldSuite) TestCentralHubMissing(c *gc.C) {
   120  	context := dt.StubContext(nil, map[string]interface{}{
   121  		"agent":       &fakeAgent{tag: names.NewMachineTag("42")},
   122  		"central-hub": dependency.ErrMissing,
   123  	})
   124  
   125  	worker, err := s.manifold().Start(context)
   126  	c.Check(worker, gc.IsNil)
   127  	c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing)
   128  }
   129  
   130  func (s *ManifoldSuite) TestNewWorkerArgs(c *gc.C) {
   131  	hub := pubsub.NewStructuredHub(nil)
   132  	var config presence.WorkerConfig
   133  	s.config.NewWorker = func(c presence.WorkerConfig) (worker.Worker, error) {
   134  		config = c
   135  		return &fakeWorker{}, nil
   136  	}
   137  
   138  	context := dt.StubContext(nil, map[string]interface{}{
   139  		"agent":       &fakeAgent{tag: names.NewMachineTag("42")},
   140  		"central-hub": hub,
   141  	})
   142  
   143  	worker, err := s.manifold().Start(context)
   144  	c.Check(err, jc.ErrorIsNil)
   145  	c.Check(worker, gc.NotNil)
   146  
   147  	c.Check(config.Origin, gc.Equals, "machine-42")
   148  	c.Check(config.Hub, gc.Equals, hub)
   149  	c.Check(config.Recorder, gc.Equals, s.config.Recorder)
   150  }
   151  
   152  type fakeWorker struct {
   153  	worker.Worker
   154  }
   155  
   156  type fakeAgent struct {
   157  	agent.Agent
   158  	agent.Config
   159  
   160  	tag names.Tag
   161  }
   162  
   163  // The fake is its own config.
   164  func (f *fakeAgent) CurrentConfig() agent.Config {
   165  	return f
   166  }
   167  
   168  func (f *fakeAgent) Tag() names.Tag {
   169  	return f.tag
   170  }