1
// Copyright 2016 Canonical Ltd.
2
// Licensed under the LGPLv3, see LICENCE file for details.
4
package migrationflag_test
7
"github.com/juju/errors"
8
"github.com/juju/testing"
9
jc "github.com/juju/testing/checkers"
10
gc "gopkg.in/check.v1"
12
"github.com/juju/juju/api/base"
13
"github.com/juju/juju/cmd/jujud/agent/engine"
14
"github.com/juju/juju/worker"
15
"github.com/juju/juju/worker/dependency"
16
dt "github.com/juju/juju/worker/dependency/testing"
17
"github.com/juju/juju/worker/migrationflag"
20
type ManifoldSuite struct {
21
testing.IsolationSuite
24
var _ = gc.Suite(&ManifoldSuite{})
26
func (*ManifoldSuite) TestInputs(c *gc.C) {
27
manifold := migrationflag.Manifold(validManifoldConfig())
28
c.Check(manifold.Inputs, jc.DeepEquals, []string{"api-caller"})
31
func (*ManifoldSuite) TestOutputBadWorker(c *gc.C) {
32
manifold := migrationflag.Manifold(migrationflag.ManifoldConfig{})
33
in := &struct{ worker.Worker }{}
35
err := manifold.Output(in, &out)
36
c.Check(err, gc.ErrorMatches, "expected in to implement Flag; got a .*")
39
func (*ManifoldSuite) TestOutputBadTarget(c *gc.C) {
40
manifold := migrationflag.Manifold(migrationflag.ManifoldConfig{})
41
in := &migrationflag.Worker{}
43
err := manifold.Output(in, &out)
44
c.Check(err, gc.ErrorMatches, "expected out to be a \\*Flag; got a .*")
47
func (*ManifoldSuite) TestOutputBadInput(c *gc.C) {
48
manifold := migrationflag.Manifold(migrationflag.ManifoldConfig{})
49
in := &migrationflag.Worker{}
51
err := manifold.Output(in, &out)
52
c.Check(err, jc.ErrorIsNil)
53
c.Check(out, gc.Equals, in)
56
func (*ManifoldSuite) TestFilterNil(c *gc.C) {
57
manifold := migrationflag.Manifold(migrationflag.ManifoldConfig{})
58
err := manifold.Filter(nil)
59
c.Check(err, jc.ErrorIsNil)
62
func (*ManifoldSuite) TestFilterErrChanged(c *gc.C) {
63
manifold := migrationflag.Manifold(migrationflag.ManifoldConfig{})
64
err := manifold.Filter(migrationflag.ErrChanged)
65
c.Check(err, gc.Equals, dependency.ErrBounce)
68
func (*ManifoldSuite) TestFilterOther(c *gc.C) {
69
manifold := migrationflag.Manifold(migrationflag.ManifoldConfig{})
70
expect := errors.New("whatever")
71
actual := manifold.Filter(expect)
72
c.Check(actual, gc.Equals, expect)
75
func (*ManifoldSuite) TestStartMissingAPICallerName(c *gc.C) {
76
config := validManifoldConfig()
77
config.APICallerName = ""
78
checkManifoldNotValid(c, config, "empty APICallerName not valid")
81
func (*ManifoldSuite) TestStartMissingCheck(c *gc.C) {
82
config := validManifoldConfig()
84
checkManifoldNotValid(c, config, "nil Check not valid")
87
func (*ManifoldSuite) TestStartMissingNewFacade(c *gc.C) {
88
config := validManifoldConfig()
89
config.NewFacade = nil
90
checkManifoldNotValid(c, config, "nil NewFacade not valid")
93
func (*ManifoldSuite) TestStartMissingNewWorker(c *gc.C) {
94
config := validManifoldConfig()
95
config.NewWorker = nil
96
checkManifoldNotValid(c, config, "nil NewWorker not valid")
99
func (*ManifoldSuite) TestStartMissingAPICaller(c *gc.C) {
100
context := dt.StubContext(nil, map[string]interface{}{
101
"api-caller": dependency.ErrMissing,
103
manifold := migrationflag.Manifold(validManifoldConfig())
105
worker, err := manifold.Start(context)
106
c.Check(worker, gc.IsNil)
107
c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing)
110
func (*ManifoldSuite) TestStartNewFacadeError(c *gc.C) {
111
expectCaller := &stubCaller{}
112
context := dt.StubContext(nil, map[string]interface{}{
113
"api-caller": expectCaller,
115
config := validManifoldConfig()
116
config.NewFacade = func(caller base.APICaller) (migrationflag.Facade, error) {
117
c.Check(caller, gc.Equals, expectCaller)
118
return nil, errors.New("bort")
120
manifold := migrationflag.Manifold(config)
122
worker, err := manifold.Start(context)
123
c.Check(worker, gc.IsNil)
124
c.Check(err, gc.ErrorMatches, "bort")
127
func (*ManifoldSuite) TestStartNewWorkerError(c *gc.C) {
128
context := dt.StubContext(nil, map[string]interface{}{
129
"api-caller": &stubCaller{},
131
expectFacade := &struct{ migrationflag.Facade }{}
132
config := validManifoldConfig()
133
config.NewFacade = func(base.APICaller) (migrationflag.Facade, error) {
134
return expectFacade, nil
136
config.NewWorker = func(workerConfig migrationflag.Config) (worker.Worker, error) {
137
c.Check(workerConfig.Facade, gc.Equals, expectFacade)
138
c.Check(workerConfig.Model, gc.Equals, validUUID)
139
c.Check(workerConfig.Check, gc.NotNil) // uncomparable
140
return nil, errors.New("snerk")
142
manifold := migrationflag.Manifold(config)
144
worker, err := manifold.Start(context)
145
c.Check(worker, gc.IsNil)
146
c.Check(err, gc.ErrorMatches, "snerk")
149
func (*ManifoldSuite) TestStartSuccess(c *gc.C) {
150
context := dt.StubContext(nil, map[string]interface{}{
151
"api-caller": &stubCaller{},
153
expectWorker := &struct{ worker.Worker }{}
154
config := validManifoldConfig()
155
config.NewFacade = func(base.APICaller) (migrationflag.Facade, error) {
156
return &struct{ migrationflag.Facade }{}, nil
158
config.NewWorker = func(migrationflag.Config) (worker.Worker, error) {
159
return expectWorker, nil
161
manifold := migrationflag.Manifold(config)
163
worker, err := manifold.Start(context)
164
c.Check(err, jc.ErrorIsNil)
165
c.Check(worker, gc.Equals, expectWorker)