github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/charmrevision/charmrevisionmanifold/manifold_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package charmrevisionmanifold_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/errors"
    10  	"github.com/juju/testing"
    11  	jc "github.com/juju/testing/checkers"
    12  	"github.com/juju/utils/clock"
    13  	gc "gopkg.in/check.v1"
    14  
    15  	"github.com/juju/juju/api/base"
    16  	"github.com/juju/juju/worker"
    17  	"github.com/juju/juju/worker/charmrevision"
    18  	"github.com/juju/juju/worker/charmrevision/charmrevisionmanifold"
    19  	"github.com/juju/juju/worker/dependency"
    20  	dt "github.com/juju/juju/worker/dependency/testing"
    21  )
    22  
    23  type ManifoldSuite struct {
    24  	testing.IsolationSuite
    25  }
    26  
    27  var _ = gc.Suite(&ManifoldSuite{})
    28  
    29  func (s *ManifoldSuite) TestManifold(c *gc.C) {
    30  	manifold := charmrevisionmanifold.Manifold(charmrevisionmanifold.ManifoldConfig{
    31  		APICallerName: "billy",
    32  		ClockName:     "bob",
    33  	})
    34  
    35  	c.Check(manifold.Inputs, jc.DeepEquals, []string{"billy", "bob"})
    36  	c.Check(manifold.Start, gc.NotNil)
    37  	c.Check(manifold.Output, gc.IsNil)
    38  }
    39  
    40  func (s *ManifoldSuite) TestMissingAPICaller(c *gc.C) {
    41  	manifold := charmrevisionmanifold.Manifold(charmrevisionmanifold.ManifoldConfig{
    42  		APICallerName: "api-caller",
    43  		ClockName:     "clock",
    44  	})
    45  
    46  	_, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
    47  		"api-caller": dependency.ErrMissing,
    48  		"clock":      fakeClock{},
    49  	}))
    50  	c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing)
    51  }
    52  
    53  func (s *ManifoldSuite) TestMissingClock(c *gc.C) {
    54  	manifold := charmrevisionmanifold.Manifold(charmrevisionmanifold.ManifoldConfig{
    55  		APICallerName: "api-caller",
    56  		ClockName:     "clock",
    57  	})
    58  
    59  	_, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
    60  		"api-caller": fakeAPICaller{},
    61  		"clock":      dependency.ErrMissing,
    62  	}))
    63  	c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing)
    64  }
    65  
    66  func (s *ManifoldSuite) TestNewFacadeError(c *gc.C) {
    67  	fakeAPICaller := &fakeAPICaller{}
    68  
    69  	stub := testing.Stub{}
    70  	manifold := charmrevisionmanifold.Manifold(charmrevisionmanifold.ManifoldConfig{
    71  		APICallerName: "api-caller",
    72  		ClockName:     "clock",
    73  		NewFacade: func(apiCaller base.APICaller) (charmrevisionmanifold.Facade, error) {
    74  			stub.AddCall("NewFacade", apiCaller)
    75  			return nil, errors.New("blefgh")
    76  		},
    77  	})
    78  
    79  	_, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
    80  		"api-caller": fakeAPICaller,
    81  		"clock":      fakeClock{},
    82  	}))
    83  	c.Check(err, gc.ErrorMatches, "cannot create facade: blefgh")
    84  	stub.CheckCalls(c, []testing.StubCall{{
    85  		"NewFacade", []interface{}{fakeAPICaller},
    86  	}})
    87  }
    88  
    89  func (s *ManifoldSuite) TestNewWorkerError(c *gc.C) {
    90  	fakeClock := &fakeClock{}
    91  	fakeFacade := &fakeFacade{}
    92  	fakeAPICaller := &fakeAPICaller{}
    93  
    94  	stub := testing.Stub{}
    95  	manifold := charmrevisionmanifold.Manifold(charmrevisionmanifold.ManifoldConfig{
    96  		APICallerName: "api-caller",
    97  		ClockName:     "clock",
    98  		NewFacade: func(apiCaller base.APICaller) (charmrevisionmanifold.Facade, error) {
    99  			stub.AddCall("NewFacade", apiCaller)
   100  			return fakeFacade, nil
   101  		},
   102  		NewWorker: func(config charmrevision.Config) (worker.Worker, error) {
   103  			stub.AddCall("NewWorker", config)
   104  			return nil, errors.New("snrght")
   105  		},
   106  	})
   107  
   108  	_, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
   109  		"api-caller": fakeAPICaller,
   110  		"clock":      fakeClock,
   111  	}))
   112  	c.Check(err, gc.ErrorMatches, "cannot create worker: snrght")
   113  	stub.CheckCalls(c, []testing.StubCall{{
   114  		"NewFacade", []interface{}{fakeAPICaller},
   115  	}, {
   116  		"NewWorker", []interface{}{charmrevision.Config{
   117  			RevisionUpdater: fakeFacade,
   118  			Clock:           fakeClock,
   119  		}},
   120  	}})
   121  }
   122  
   123  func (s *ManifoldSuite) TestSuccess(c *gc.C) {
   124  	fakeClock := &fakeClock{}
   125  	fakeFacade := &fakeFacade{}
   126  	fakeWorker := &fakeWorker{}
   127  	fakeAPICaller := &fakeAPICaller{}
   128  
   129  	stub := testing.Stub{}
   130  	manifold := charmrevisionmanifold.Manifold(charmrevisionmanifold.ManifoldConfig{
   131  		APICallerName: "api-caller",
   132  		ClockName:     "clock",
   133  		Period:        10 * time.Minute,
   134  		NewFacade: func(apiCaller base.APICaller) (charmrevisionmanifold.Facade, error) {
   135  			stub.AddCall("NewFacade", apiCaller)
   136  			return fakeFacade, nil
   137  		},
   138  		NewWorker: func(config charmrevision.Config) (worker.Worker, error) {
   139  			stub.AddCall("NewWorker", config)
   140  			return fakeWorker, nil
   141  		},
   142  	})
   143  
   144  	w, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
   145  		"api-caller": fakeAPICaller,
   146  		"clock":      fakeClock,
   147  	}))
   148  	c.Check(w, gc.Equals, fakeWorker)
   149  	c.Check(err, jc.ErrorIsNil)
   150  	stub.CheckCalls(c, []testing.StubCall{{
   151  		"NewFacade", []interface{}{fakeAPICaller},
   152  	}, {
   153  		"NewWorker", []interface{}{charmrevision.Config{
   154  			Period:          10 * time.Minute,
   155  			RevisionUpdater: fakeFacade,
   156  			Clock:           fakeClock,
   157  		}},
   158  	}})
   159  }
   160  
   161  type fakeAPICaller struct {
   162  	base.APICaller
   163  }
   164  
   165  type fakeClock struct {
   166  	clock.Clock
   167  }
   168  
   169  type fakeWorker struct {
   170  	worker.Worker
   171  }
   172  
   173  type fakeFacade struct {
   174  	charmrevisionmanifold.Facade
   175  }