github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/lifeflag/manifold_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package lifeflag_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/names/v5"
     9  	"github.com/juju/testing"
    10  	jc "github.com/juju/testing/checkers"
    11  	"github.com/juju/worker/v3"
    12  	"github.com/juju/worker/v3/dependency"
    13  	dt "github.com/juju/worker/v3/dependency/testing"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/agent"
    17  	"github.com/juju/juju/api/base"
    18  	"github.com/juju/juju/cmd/jujud/agent/engine"
    19  	"github.com/juju/juju/core/life"
    20  	"github.com/juju/juju/worker/lifeflag"
    21  )
    22  
    23  type ManifoldSuite struct {
    24  	testing.IsolationSuite
    25  }
    26  
    27  var _ = gc.Suite(&ManifoldSuite{})
    28  
    29  func (*ManifoldSuite) TestInputs(c *gc.C) {
    30  	manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{
    31  		APICallerName: "boris",
    32  	})
    33  	c.Check(manifold.Inputs, jc.DeepEquals, []string{"boris"})
    34  }
    35  
    36  func (*ManifoldSuite) TestFilter(c *gc.C) {
    37  	expect := errors.New("squish")
    38  	manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{
    39  		Filter: func(error) error { return expect },
    40  	})
    41  	actual := manifold.Filter(errors.New("blarg"))
    42  	c.Check(actual, gc.Equals, expect)
    43  }
    44  
    45  func (*ManifoldSuite) TestOutputBadWorker(c *gc.C) {
    46  	manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{})
    47  	worker := struct{ worker.Worker }{}
    48  	var flag engine.Flag
    49  	err := manifold.Output(worker, &flag)
    50  	c.Check(err, gc.ErrorMatches, "expected in to implement Flag; got a .*")
    51  }
    52  
    53  func (*ManifoldSuite) TestOutputBadTarget(c *gc.C) {
    54  	manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{})
    55  	worker := &lifeflag.Worker{}
    56  	var flag interface{}
    57  	err := manifold.Output(worker, &flag)
    58  	c.Check(err, gc.ErrorMatches, "expected out to be a \\*Flag; got a .*")
    59  }
    60  
    61  func (*ManifoldSuite) TestOutputSuccess(c *gc.C) {
    62  	manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{})
    63  	worker := &lifeflag.Worker{}
    64  	var flag engine.Flag
    65  	err := manifold.Output(worker, &flag)
    66  	c.Check(err, jc.ErrorIsNil)
    67  	c.Check(flag, gc.Equals, worker)
    68  }
    69  
    70  func (*ManifoldSuite) TestMissingAPICaller(c *gc.C) {
    71  	context := dt.StubContext(nil, map[string]interface{}{
    72  		"api-caller": dependency.ErrMissing,
    73  	})
    74  	manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{
    75  		APICallerName: "api-caller",
    76  	})
    77  
    78  	worker, err := manifold.Start(context)
    79  	c.Check(worker, gc.IsNil)
    80  	c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing)
    81  }
    82  
    83  func (*ManifoldSuite) TestNewWorkerError(c *gc.C) {
    84  	expectFacade := struct{ lifeflag.Facade }{}
    85  	expectEntity := names.NewMachineTag("33")
    86  	context := dt.StubContext(nil, map[string]interface{}{
    87  		"api-caller": struct{ base.APICaller }{},
    88  	})
    89  	manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{
    90  		APICallerName: "api-caller",
    91  		Entity:        expectEntity,
    92  		Result:        life.IsNotAlive,
    93  		NewFacade: func(_ base.APICaller) (lifeflag.Facade, error) {
    94  			return expectFacade, nil
    95  		},
    96  		NewWorker: func(config lifeflag.Config) (worker.Worker, error) {
    97  			c.Check(config.Facade, gc.Equals, expectFacade)
    98  			c.Check(config.Entity, gc.Equals, expectEntity)
    99  			c.Check(config.Result, gc.NotNil) // uncomparable
   100  			return nil, errors.New("boof")
   101  		},
   102  	})
   103  
   104  	worker, err := manifold.Start(context)
   105  	c.Check(worker, gc.IsNil)
   106  	c.Check(err, gc.ErrorMatches, "boof")
   107  }
   108  
   109  func (*ManifoldSuite) TestNewWorkerSuccess(c *gc.C) {
   110  	expectWorker := &struct{ worker.Worker }{}
   111  	context := dt.StubContext(nil, map[string]interface{}{
   112  		"api-caller": struct{ base.APICaller }{},
   113  	})
   114  	manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{
   115  		APICallerName: "api-caller",
   116  		NewFacade: func(_ base.APICaller) (lifeflag.Facade, error) {
   117  			return struct{ lifeflag.Facade }{}, nil
   118  		},
   119  		NewWorker: func(_ lifeflag.Config) (worker.Worker, error) {
   120  			return expectWorker, nil
   121  		},
   122  	})
   123  
   124  	worker, err := manifold.Start(context)
   125  	c.Check(worker, gc.Equals, expectWorker)
   126  	c.Check(err, jc.ErrorIsNil)
   127  }
   128  
   129  func (*ManifoldSuite) TestNewWorkerSuccessWithAgentName(c *gc.C) {
   130  	expectWorker := &struct{ worker.Worker }{}
   131  	context := dt.StubContext(nil, map[string]interface{}{
   132  		"api-caller": struct{ base.APICaller }{},
   133  		"agent-name": &fakeAgent{config: fakeConfig{tag: names.NewUnitTag("ubuntu/0")}},
   134  	})
   135  	manifold := lifeflag.Manifold(lifeflag.ManifoldConfig{
   136  		APICallerName: "api-caller",
   137  		AgentName:     "agent-name",
   138  		NewFacade: func(_ base.APICaller) (lifeflag.Facade, error) {
   139  			return struct{ lifeflag.Facade }{}, nil
   140  		},
   141  		NewWorker: func(config lifeflag.Config) (worker.Worker, error) {
   142  			c.Check(config.Entity, gc.Equals, names.NewUnitTag("ubuntu/0"))
   143  			return expectWorker, nil
   144  		},
   145  	})
   146  
   147  	worker, err := manifold.Start(context)
   148  	c.Check(worker, gc.Equals, expectWorker)
   149  	c.Check(err, jc.ErrorIsNil)
   150  }
   151  
   152  type fakeAgent struct {
   153  	agent.Agent
   154  	config fakeConfig
   155  }
   156  
   157  func (f *fakeAgent) CurrentConfig() agent.Config {
   158  	return &f.config
   159  }
   160  
   161  type fakeConfig struct {
   162  	agent.Config
   163  	tag names.Tag
   164  }
   165  
   166  func (f *fakeConfig) Tag() names.Tag {
   167  	return f.tag
   168  }