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

     1  // Copyright 2022 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package stateconverter_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/errors"
    10  	"github.com/juju/names/v5"
    11  	jc "github.com/juju/testing/checkers"
    12  	"github.com/juju/worker/v3/workertest"
    13  	"go.uber.org/mock/gomock"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/api/base"
    17  	"github.com/juju/juju/testing"
    18  	"github.com/juju/juju/worker/stateconverter"
    19  	"github.com/juju/juju/worker/stateconverter/mocks"
    20  )
    21  
    22  var _ = gc.Suite(&manifoldConfigSuite{})
    23  
    24  type manifoldConfigSuite struct {
    25  	machiner *mocks.MockMachiner
    26  	agent    *mocks.MockAgent
    27  	config   *mocks.MockConfig
    28  	context  *mocks.MockContext
    29  }
    30  
    31  func (s *manifoldConfigSuite) TestValidateAgentNameFail(c *gc.C) {
    32  	cfg := stateconverter.ManifoldConfig{}
    33  	err := cfg.Validate()
    34  	c.Assert(err.Error(), gc.Equals, errors.NotValidf("empty AgentName").Error())
    35  }
    36  
    37  func (s *manifoldConfigSuite) TestValidateAPICallerFail(c *gc.C) {
    38  	cfg := stateconverter.ManifoldConfig{
    39  		AgentName: "machine-2",
    40  	}
    41  	err := cfg.Validate()
    42  	c.Assert(err.Error(), gc.Equals, errors.NotValidf("empty APICallerName").Error())
    43  }
    44  
    45  func (s *manifoldConfigSuite) TestValidateLoggerFail(c *gc.C) {
    46  	cfg := stateconverter.ManifoldConfig{
    47  		AgentName:     "machine-2",
    48  		APICallerName: "machiner",
    49  	}
    50  	err := cfg.Validate()
    51  	c.Assert(err.Error(), gc.Equals, errors.NotValidf("nil Logger").Error())
    52  }
    53  
    54  func (s *manifoldConfigSuite) TestValidateSuccess(c *gc.C) {
    55  	cfg := stateconverter.ManifoldConfig{
    56  		AgentName:     "machine-2",
    57  		APICallerName: "machiner",
    58  		Logger:        &fakeLogger{},
    59  	}
    60  	err := cfg.Validate()
    61  	c.Assert(err, jc.ErrorIsNil)
    62  }
    63  
    64  func (s *manifoldConfigSuite) TestManifoldStart(c *gc.C) {
    65  	defer s.setupMocks(c).Finish()
    66  
    67  	done := make(chan any)
    68  	cfg := stateconverter.ManifoldConfig{
    69  		AgentName:     "agent-name",
    70  		APICallerName: "machiner",
    71  		Logger:        &fakeLogger{},
    72  		NewMachinerAPI: func(_ base.APICaller) stateconverter.Machiner {
    73  			return s.machiner
    74  		},
    75  	}
    76  	gomock.InOrder(
    77  		s.context.EXPECT().Get(cfg.AgentName, gomock.Any()).SetArg(1, s.agent).Return(nil),
    78  		s.agent.EXPECT().CurrentConfig().Return(s.config),
    79  		s.config.EXPECT().Tag().Return(names.NewMachineTag("3")),
    80  		s.machiner.EXPECT().Machine(names.NewMachineTag("3")).DoAndReturn(func(_ names.MachineTag) (stateconverter.Machine, error) {
    81  			close(done)
    82  			return nil, errors.New("nope")
    83  		}),
    84  	)
    85  	manifold := stateconverter.Manifold(cfg)
    86  	w, err := manifold.Start(s.context)
    87  	c.Assert(err, jc.ErrorIsNil)
    88  	c.Assert(w, gc.NotNil)
    89  	select {
    90  	case <-done:
    91  	case <-time.After(testing.ShortWait):
    92  		c.Fatal("timed out waiting for calls")
    93  	}
    94  	err = workertest.CheckKill(c, w)
    95  	c.Assert(err, gc.ErrorMatches, `nope`)
    96  }
    97  
    98  func (s *manifoldConfigSuite) setupMocks(c *gc.C) *gomock.Controller {
    99  	ctrl := gomock.NewController(c)
   100  	s.agent = mocks.NewMockAgent(ctrl)
   101  	s.config = mocks.NewMockConfig(ctrl)
   102  	s.context = mocks.NewMockContext(ctrl)
   103  	s.machiner = mocks.NewMockMachiner(ctrl)
   104  	return ctrl
   105  }
   106  
   107  type fakeLogger struct{}
   108  
   109  func (l *fakeLogger) Debugf(format string, args ...interface{})    {}
   110  func (l *fakeLogger) Criticalf(format string, args ...interface{}) {}
   111  func (l *fakeLogger) Tracef(format string, args ...interface{})    {}