github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/containerbroker/manifold_test.go (about)

     1  // Copyright 2019 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package containerbroker_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/testing"
     9  	worker "github.com/juju/worker/v3"
    10  	"go.uber.org/mock/gomock"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/container/broker"
    14  	"github.com/juju/juju/environs"
    15  	"github.com/juju/juju/worker/containerbroker"
    16  	"github.com/juju/juju/worker/containerbroker/mocks"
    17  )
    18  
    19  type manifoldConfigSuite struct {
    20  	testing.IsolationSuite
    21  }
    22  
    23  var _ = gc.Suite(&manifoldConfigSuite{})
    24  
    25  func (s *manifoldConfigSuite) TestInvalidConfigValidate(c *gc.C) {
    26  	ctrl := gomock.NewController(c)
    27  	defer ctrl.Finish()
    28  
    29  	testcases := []struct {
    30  		description string
    31  		config      containerbroker.ManifoldConfig
    32  		err         string
    33  	}{
    34  		{
    35  			description: "Test empty configuration",
    36  			config:      containerbroker.ManifoldConfig{},
    37  			err:         "empty AgentName not valid",
    38  		},
    39  		{
    40  			description: "Test no agent name",
    41  			config:      containerbroker.ManifoldConfig{},
    42  			err:         "empty AgentName not valid",
    43  		},
    44  		{
    45  			description: "Test no api caller name",
    46  			config: containerbroker.ManifoldConfig{
    47  				AgentName: "agent-name",
    48  			},
    49  			err: "empty APICallerName not valid",
    50  		},
    51  		{
    52  			description: "Test no machine lock",
    53  			config: containerbroker.ManifoldConfig{
    54  				AgentName:     "agent-name",
    55  				APICallerName: "api-caller-name",
    56  			},
    57  			err: "nil MachineLock not valid",
    58  		},
    59  		{
    60  			description: "Test no broker func",
    61  			config: containerbroker.ManifoldConfig{
    62  				AgentName:     "agent-name",
    63  				APICallerName: "api-caller-name",
    64  				MachineLock:   mocks.NewMockLock(ctrl),
    65  			},
    66  			err: "nil NewBrokerFunc not valid",
    67  		},
    68  		{
    69  			description: "Test no tracker func",
    70  			config: containerbroker.ManifoldConfig{
    71  				AgentName:     "agent-name",
    72  				APICallerName: "api-caller-name",
    73  				MachineLock:   mocks.NewMockLock(ctrl),
    74  				NewBrokerFunc: func(broker.Config) (environs.InstanceBroker, error) {
    75  					return mocks.NewMockInstanceBroker(ctrl), nil
    76  				},
    77  			},
    78  			err: "nil NewTracker not valid",
    79  		},
    80  	}
    81  	for i, test := range testcases {
    82  		c.Logf("%d %s", i, test.description)
    83  		err := test.config.Validate()
    84  		c.Assert(err, gc.ErrorMatches, test.err)
    85  	}
    86  }
    87  
    88  func (s *manifoldConfigSuite) TestValidConfigValidate(c *gc.C) {
    89  	ctrl := gomock.NewController(c)
    90  	defer ctrl.Finish()
    91  
    92  	config := containerbroker.ManifoldConfig{
    93  		AgentName:     "agent",
    94  		APICallerName: "api-caller",
    95  		MachineLock:   mocks.NewMockLock(ctrl),
    96  		NewBrokerFunc: func(broker.Config) (environs.InstanceBroker, error) {
    97  			return mocks.NewMockInstanceBroker(ctrl), nil
    98  		},
    99  		NewTracker: func(containerbroker.Config) (worker.Worker, error) {
   100  			return mocks.NewMockWorker(ctrl), nil
   101  		},
   102  	}
   103  	err := config.Validate()
   104  	c.Assert(err, gc.IsNil)
   105  }
   106  
   107  type manifoldSuite struct {
   108  	testing.IsolationSuite
   109  
   110  	context     *mocks.MockContext
   111  	agent       *mocks.MockAgent
   112  	agentConfig *mocks.MockConfig
   113  	broker      *mocks.MockInstanceBroker
   114  	apiCaller   *mocks.MockAPICaller
   115  	worker      *mocks.MockWorker
   116  	machineLock *mocks.MockLock
   117  }
   118  
   119  var _ = gc.Suite(&manifoldSuite{})
   120  
   121  func (s *manifoldSuite) setup(c *gc.C) *gomock.Controller {
   122  	ctrl := gomock.NewController(c)
   123  
   124  	s.context = mocks.NewMockContext(ctrl)
   125  	s.agent = mocks.NewMockAgent(ctrl)
   126  	s.agentConfig = mocks.NewMockConfig(ctrl)
   127  	s.broker = mocks.NewMockInstanceBroker(ctrl)
   128  	s.apiCaller = mocks.NewMockAPICaller(ctrl)
   129  	s.worker = mocks.NewMockWorker(ctrl)
   130  	s.machineLock = mocks.NewMockLock(ctrl)
   131  
   132  	return ctrl
   133  }
   134  
   135  func (s *manifoldSuite) TestNewTrackerIsCalled(c *gc.C) {
   136  	defer s.setup(c).Finish()
   137  
   138  	s.behaviourContext()
   139  	s.behaviourAgent()
   140  
   141  	config := containerbroker.ManifoldConfig{
   142  		APICallerName: "baz",
   143  		AgentName:     "moon",
   144  		MachineLock:   s.machineLock,
   145  		NewBrokerFunc: func(broker.Config) (environs.InstanceBroker, error) {
   146  			return s.broker, nil
   147  		},
   148  		NewTracker: func(cfg containerbroker.Config) (worker.Worker, error) {
   149  			return s.worker, nil
   150  		},
   151  	}
   152  	manifold := containerbroker.Manifold(config)
   153  	result, err := manifold.Start(s.context)
   154  	c.Assert(err, gc.IsNil)
   155  	c.Assert(result, gc.Equals, s.worker)
   156  }
   157  
   158  func (s *manifoldSuite) TestNewTrackerReturnsError(c *gc.C) {
   159  	defer s.setup(c).Finish()
   160  
   161  	s.behaviourContext()
   162  	s.behaviourAgent()
   163  
   164  	config := containerbroker.ManifoldConfig{
   165  		AgentName:     "moon",
   166  		APICallerName: "baz",
   167  		MachineLock:   s.machineLock,
   168  		NewBrokerFunc: func(broker.Config) (environs.InstanceBroker, error) {
   169  			return s.broker, nil
   170  		},
   171  		NewTracker: func(cfg containerbroker.Config) (worker.Worker, error) {
   172  			return nil, errors.New("errored")
   173  		},
   174  	}
   175  	manifold := containerbroker.Manifold(config)
   176  	_, err := manifold.Start(s.context)
   177  	c.Assert(err, gc.ErrorMatches, "errored")
   178  }
   179  
   180  func (s *manifoldSuite) behaviourContext() {
   181  	cExp := s.context.EXPECT()
   182  	cExp.Get("moon", gomock.Any()).SetArg(1, s.agent).Return(nil)
   183  	cExp.Get("baz", gomock.Any()).SetArg(1, s.apiCaller).Return(nil)
   184  }
   185  
   186  func (s *manifoldSuite) behaviourAgent() {
   187  	aExp := s.agent.EXPECT()
   188  	aExp.CurrentConfig().Return(s.agentConfig)
   189  }