github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/apiserver/common/block_test.go (about)

     1  // Copyright 2012-2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package common_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/names"
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/apiserver/common"
    13  	"github.com/juju/juju/apiserver/params"
    14  	"github.com/juju/juju/state"
    15  	"github.com/juju/juju/testing"
    16  )
    17  
    18  type mockBlock struct {
    19  	t state.BlockType
    20  	m string
    21  }
    22  
    23  func (m mockBlock) Id() string { return "" }
    24  
    25  func (m mockBlock) Tag() (names.Tag, error) { return names.NewEnvironTag("mocktesting"), nil }
    26  
    27  func (m mockBlock) Type() state.BlockType { return m.t }
    28  
    29  func (m mockBlock) Message() string { return m.m }
    30  
    31  type blockCheckerSuite struct {
    32  	testing.FakeJujuHomeSuite
    33  	aBlock                  state.Block
    34  	destroy, remove, change state.Block
    35  
    36  	blockchecker *common.BlockChecker
    37  }
    38  
    39  var _ = gc.Suite(&blockCheckerSuite{})
    40  
    41  func (s *blockCheckerSuite) SetUpTest(c *gc.C) {
    42  	s.FakeJujuHomeSuite.SetUpTest(c)
    43  	s.destroy = mockBlock{t: state.DestroyBlock, m: "Mock BLOCK testing: DESTROY"}
    44  	s.remove = mockBlock{t: state.RemoveBlock, m: "Mock BLOCK testing: REMOVE"}
    45  	s.change = mockBlock{t: state.ChangeBlock, m: "Mock BLOCK testing: CHANGE"}
    46  	s.blockchecker = common.NewBlockChecker(s)
    47  }
    48  
    49  func (mock *blockCheckerSuite) GetBlockForType(t state.BlockType) (state.Block, bool, error) {
    50  	if mock.aBlock.Type() == t {
    51  		return mock.aBlock, true, nil
    52  	} else {
    53  		return nil, false, nil
    54  	}
    55  }
    56  
    57  func (s *blockCheckerSuite) TestDestroyBlockChecker(c *gc.C) {
    58  	s.aBlock = s.destroy
    59  	s.assertErrorBlocked(c, true, s.blockchecker.DestroyAllowed(), s.destroy.Message())
    60  
    61  	s.aBlock = s.remove
    62  	s.assertErrorBlocked(c, true, s.blockchecker.DestroyAllowed(), s.remove.Message())
    63  
    64  	s.aBlock = s.change
    65  	s.assertErrorBlocked(c, true, s.blockchecker.DestroyAllowed(), s.change.Message())
    66  }
    67  
    68  func (s *blockCheckerSuite) TestRemoveBlockChecker(c *gc.C) {
    69  	s.aBlock = s.destroy
    70  	s.assertErrorBlocked(c, false, s.blockchecker.RemoveAllowed(), s.destroy.Message())
    71  
    72  	s.aBlock = s.remove
    73  	s.assertErrorBlocked(c, true, s.blockchecker.RemoveAllowed(), s.remove.Message())
    74  
    75  	s.aBlock = s.change
    76  	s.assertErrorBlocked(c, true, s.blockchecker.RemoveAllowed(), s.change.Message())
    77  }
    78  
    79  func (s *blockCheckerSuite) TestChangeBlockChecker(c *gc.C) {
    80  	s.aBlock = s.destroy
    81  	s.assertErrorBlocked(c, false, s.blockchecker.ChangeAllowed(), s.destroy.Message())
    82  
    83  	s.aBlock = s.remove
    84  	s.assertErrorBlocked(c, false, s.blockchecker.ChangeAllowed(), s.remove.Message())
    85  
    86  	s.aBlock = s.change
    87  	s.assertErrorBlocked(c, true, s.blockchecker.ChangeAllowed(), s.change.Message())
    88  }
    89  
    90  func (s *blockCheckerSuite) assertErrorBlocked(c *gc.C, blocked bool, err error, msg string) {
    91  	if blocked {
    92  		c.Assert(params.IsCodeOperationBlocked(err), jc.IsTrue)
    93  		c.Assert(err, gc.ErrorMatches, msg)
    94  	} else {
    95  		c.Assert(errors.Cause(err), jc.ErrorIsNil)
    96  	}
    97  }