github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/apiserver/cleaner/cleaner_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package cleaner_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/testing"
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/apiserver/cleaner"
    13  	"github.com/juju/juju/apiserver/common"
    14  	"github.com/juju/juju/apiserver/params"
    15  	apiservertesting "github.com/juju/juju/apiserver/testing"
    16  	"github.com/juju/juju/state"
    17  	coretesting "github.com/juju/juju/testing"
    18  )
    19  
    20  type CleanerSuite struct {
    21  	coretesting.BaseSuite
    22  
    23  	st         *mockState
    24  	api        *cleaner.CleanerAPI
    25  	authoriser apiservertesting.FakeAuthorizer
    26  }
    27  
    28  var _ = gc.Suite(&CleanerSuite{})
    29  
    30  func (s *CleanerSuite) SetUpTest(c *gc.C) {
    31  	s.BaseSuite.SetUpTest(c)
    32  
    33  	s.authoriser = apiservertesting.FakeAuthorizer{
    34  		EnvironManager: true,
    35  	}
    36  	s.st = &mockState{&testing.Stub{}, false}
    37  	cleaner.PatchState(s, s.st)
    38  	var err error
    39  	res := common.NewResources()
    40  	s.api, err = cleaner.NewCleanerAPI(nil, res, s.authoriser)
    41  	c.Assert(err, jc.ErrorIsNil)
    42  	c.Assert(s.api, gc.NotNil)
    43  }
    44  
    45  func (s *CleanerSuite) TestNewCleanerAPIRequiresEnvironManager(c *gc.C) {
    46  	anAuthoriser := s.authoriser
    47  	anAuthoriser.EnvironManager = false
    48  	api, err := cleaner.NewCleanerAPI(nil, nil, anAuthoriser)
    49  	c.Assert(api, gc.IsNil)
    50  	c.Assert(err, gc.ErrorMatches, "permission denied")
    51  	c.Assert(common.ServerError(err), jc.Satisfies, params.IsCodeUnauthorized)
    52  }
    53  
    54  func (s *CleanerSuite) TestWatchCleanupsSuccess(c *gc.C) {
    55  	_, err := s.api.WatchCleanups()
    56  	c.Assert(err, jc.ErrorIsNil)
    57  	s.st.CheckCallNames(c, "WatchCleanups")
    58  }
    59  
    60  func (s *CleanerSuite) TestWatchCleanupsFailure(c *gc.C) {
    61  	s.st.SetErrors(errors.New("boom!"))
    62  	s.st.watchCleanupsFails = true
    63  
    64  	result, err := s.api.WatchCleanups()
    65  	c.Assert(err, jc.ErrorIsNil)
    66  	c.Assert(result.Error.Error(), gc.Equals, "boom!")
    67  	s.st.CheckCallNames(c, "WatchCleanups")
    68  }
    69  
    70  func (s *CleanerSuite) TestCleanupSuccess(c *gc.C) {
    71  	err := s.api.Cleanup()
    72  	c.Assert(err, jc.ErrorIsNil)
    73  	s.st.CheckCallNames(c, "Cleanup")
    74  }
    75  
    76  func (s *CleanerSuite) TestCleanupFailure(c *gc.C) {
    77  	s.st.SetErrors(errors.New("Boom!"))
    78  	err := s.api.Cleanup()
    79  	c.Assert(err, gc.ErrorMatches, "Boom!")
    80  	s.st.CheckCallNames(c, "Cleanup")
    81  }
    82  
    83  type mockState struct {
    84  	*testing.Stub
    85  	watchCleanupsFails bool
    86  }
    87  
    88  type cleanupWatcher struct {
    89  	out chan struct{}
    90  	st  *mockState
    91  }
    92  
    93  func (w *cleanupWatcher) Changes() <-chan struct{} {
    94  	return w.out
    95  }
    96  
    97  func (w *cleanupWatcher) Stop() error {
    98  	return nil
    99  }
   100  
   101  func (w *cleanupWatcher) Kill() {
   102  }
   103  
   104  func (w *cleanupWatcher) Wait() error {
   105  	return nil
   106  }
   107  
   108  func (w *cleanupWatcher) Err() error {
   109  	return w.st.NextErr()
   110  }
   111  
   112  func (st *mockState) WatchCleanups() state.NotifyWatcher {
   113  	w := &cleanupWatcher{
   114  		out: make(chan struct{}, 1),
   115  		st:  st,
   116  	}
   117  	if st.watchCleanupsFails {
   118  		close(w.out)
   119  	} else {
   120  		w.out <- struct{}{}
   121  	}
   122  	st.MethodCall(st, "WatchCleanups")
   123  	return w
   124  }
   125  
   126  func (st *mockState) Cleanup() error {
   127  	st.MethodCall(st, "Cleanup")
   128  	return st.NextErr()
   129  }