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

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package machineundertaker_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/loggo"
     9  	"github.com/juju/names/v5"
    10  	"github.com/juju/testing"
    11  	jc "github.com/juju/testing/checkers"
    12  	"github.com/juju/worker/v3"
    13  	"github.com/juju/worker/v3/dependency"
    14  	dt "github.com/juju/worker/v3/dependency/testing"
    15  	gc "gopkg.in/check.v1"
    16  
    17  	"github.com/juju/juju/api/base"
    18  	apitesting "github.com/juju/juju/api/base/testing"
    19  	"github.com/juju/juju/environs"
    20  	"github.com/juju/juju/worker/common"
    21  	"github.com/juju/juju/worker/machineundertaker"
    22  )
    23  
    24  type manifoldSuite struct {
    25  	testing.IsolationSuite
    26  }
    27  
    28  var _ = gc.Suite(&manifoldSuite{})
    29  
    30  func (*manifoldSuite) TestMissingCaller(c *gc.C) {
    31  	manifold := makeManifold(nil, nil)
    32  	result, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
    33  		"the-caller":  dependency.ErrMissing,
    34  		"the-environ": &fakeEnviron{},
    35  	}))
    36  	c.Assert(result, gc.IsNil)
    37  	c.Assert(errors.Cause(err), gc.Equals, dependency.ErrMissing)
    38  }
    39  
    40  func (*manifoldSuite) TestMissingEnviron(c *gc.C) {
    41  	manifold := makeManifold(nil, nil)
    42  	result, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
    43  		"the-caller":  &fakeAPICaller{},
    44  		"the-environ": dependency.ErrMissing,
    45  	}))
    46  	c.Assert(result, gc.IsNil)
    47  	c.Assert(errors.Cause(err), gc.Equals, dependency.ErrMissing)
    48  }
    49  
    50  func (*manifoldSuite) TestAPIError(c *gc.C) {
    51  	manifold := makeManifold(nil, nil)
    52  	result, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
    53  		"the-caller":  &fakeAPICaller{},
    54  		"the-environ": &fakeEnviron{},
    55  	}))
    56  	c.Assert(result, gc.IsNil)
    57  	c.Assert(err, gc.ErrorMatches, "machine undertaker client requires a model API connection")
    58  }
    59  
    60  func (*manifoldSuite) TestWorkerError(c *gc.C) {
    61  	manifold := makeManifold(nil, errors.New("boglodite"))
    62  	result, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
    63  		"the-caller":  apitesting.APICallerFunc(nil),
    64  		"the-environ": &fakeEnviron{},
    65  	}))
    66  	c.Assert(result, gc.IsNil)
    67  	c.Assert(err, gc.ErrorMatches, "boglodite")
    68  }
    69  
    70  func (*manifoldSuite) TestSuccess(c *gc.C) {
    71  	w := fakeWorker{name: "Boris"}
    72  	manifold := makeManifold(&w, nil)
    73  	result, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
    74  		"the-caller":  apitesting.APICallerFunc(nil),
    75  		"the-environ": &fakeEnviron{},
    76  	}))
    77  	c.Assert(err, jc.ErrorIsNil)
    78  	c.Assert(result, gc.DeepEquals, &w)
    79  }
    80  
    81  func makeManifold(workerResult worker.Worker, workerError error) dependency.Manifold {
    82  	return machineundertaker.Manifold(machineundertaker.ManifoldConfig{
    83  		APICallerName: "the-caller",
    84  		EnvironName:   "the-environ",
    85  		Logger:        loggo.GetLogger("test"),
    86  		NewWorker: func(machineundertaker.Facade, environs.Environ, common.CredentialAPI, machineundertaker.Logger) (worker.Worker, error) {
    87  			return workerResult, workerError
    88  		},
    89  		NewCredentialValidatorFacade: func(base.APICaller) (common.CredentialAPI, error) {
    90  			return &fakeCredentialAPI{}, nil
    91  		},
    92  	})
    93  }
    94  
    95  type fakeAPICaller struct {
    96  	base.APICaller
    97  }
    98  
    99  func (c *fakeAPICaller) ModelTag() (names.ModelTag, bool) {
   100  	return names.ModelTag{}, false
   101  }
   102  
   103  type fakeWorker struct {
   104  	worker.Worker
   105  	name string
   106  }