github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/cmd/juju/block/block_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package block_test
     5  
     6  import (
     7  	"strings"
     8  
     9  	"github.com/juju/cmd"
    10  	"github.com/juju/errors"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/apiserver/common"
    15  	"github.com/juju/juju/cmd/envcmd"
    16  	"github.com/juju/juju/cmd/juju/block"
    17  	"github.com/juju/juju/testing"
    18  )
    19  
    20  type BlockCommandSuite struct {
    21  	ProtectionCommandSuite
    22  	mockClient *block.MockBlockClient
    23  }
    24  
    25  func (s *BlockCommandSuite) SetUpTest(c *gc.C) {
    26  	s.FakeJujuHomeSuite.SetUpTest(c)
    27  	s.mockClient = &block.MockBlockClient{}
    28  	s.PatchValue(block.BlockClient, func(p *block.BaseBlockCommand) (block.BlockClientAPI, error) {
    29  		return s.mockClient, nil
    30  	})
    31  }
    32  
    33  var _ = gc.Suite(&BlockCommandSuite{})
    34  
    35  func (s *BlockCommandSuite) assertBlock(c *gc.C, operation, message string) {
    36  	expectedOp := block.TypeFromOperation(operation)
    37  	c.Assert(s.mockClient.BlockType, gc.DeepEquals, expectedOp)
    38  	c.Assert(s.mockClient.Msg, gc.DeepEquals, message)
    39  }
    40  
    41  func (s *BlockCommandSuite) TestBlockCmdMoreArgs(c *gc.C) {
    42  	_, err := testing.RunCommand(c, envcmd.Wrap(&block.DestroyCommand{}), "change", "too much")
    43  	c.Assert(
    44  		err,
    45  		gc.ErrorMatches,
    46  		`.*can only specify block message.*`)
    47  }
    48  
    49  func (s *BlockCommandSuite) TestBlockCmdNoMessage(c *gc.C) {
    50  	command := block.DestroyCommand{}
    51  	_, err := testing.RunCommand(c, envcmd.Wrap(&command))
    52  	c.Assert(err, jc.ErrorIsNil)
    53  	s.assertBlock(c, command.Info().Name, "")
    54  }
    55  
    56  func (s *BlockCommandSuite) TestBlockDestroyOperations(c *gc.C) {
    57  	command := block.DestroyCommand{}
    58  	_, err := testing.RunCommand(c, envcmd.Wrap(&command), "TestBlockDestroyOperations")
    59  	c.Assert(err, jc.ErrorIsNil)
    60  	s.assertBlock(c, command.Info().Name, "TestBlockDestroyOperations")
    61  }
    62  
    63  func (s *BlockCommandSuite) TestBlockRemoveOperations(c *gc.C) {
    64  	command := block.RemoveCommand{}
    65  	_, err := testing.RunCommand(c, envcmd.Wrap(&command), "TestBlockRemoveOperations")
    66  	c.Assert(err, jc.ErrorIsNil)
    67  	s.assertBlock(c, command.Info().Name, "TestBlockRemoveOperations")
    68  }
    69  
    70  func (s *BlockCommandSuite) TestBlockChangeOperations(c *gc.C) {
    71  	command := block.ChangeCommand{}
    72  	_, err := testing.RunCommand(c, envcmd.Wrap(&command), "TestBlockChangeOperations")
    73  	c.Assert(err, jc.ErrorIsNil)
    74  	s.assertBlock(c, command.Info().Name, "TestBlockChangeOperations")
    75  }
    76  
    77  func (s *BlockCommandSuite) processErrorTest(c *gc.C, tstError error, blockType block.Block, expectedError error, expectedWarning string) {
    78  	if tstError != nil {
    79  		c.Assert(errors.Cause(block.ProcessBlockedError(tstError, blockType)), gc.Equals, expectedError)
    80  	} else {
    81  		c.Assert(block.ProcessBlockedError(tstError, blockType), jc.ErrorIsNil)
    82  	}
    83  	// warning displayed
    84  	logOutputText := strings.Replace(c.GetTestLog(), "\n", "", -1)
    85  	c.Assert(logOutputText, gc.Matches, expectedWarning)
    86  }
    87  
    88  func (s *BlockCommandSuite) TestProcessErrOperationBlocked(c *gc.C) {
    89  	s.processErrorTest(c, common.ErrOperationBlocked("operations that remove"), block.BlockRemove, cmd.ErrSilent, ".*operations that remove.*")
    90  	s.processErrorTest(c, common.ErrOperationBlocked("destroy-environment operation has been blocked"), block.BlockDestroy, cmd.ErrSilent, ".*destroy-environment operation has been blocked.*")
    91  }
    92  
    93  func (s *BlockCommandSuite) TestProcessErrNil(c *gc.C) {
    94  	s.processErrorTest(c, nil, block.BlockDestroy, nil, "")
    95  }
    96  
    97  func (s *BlockCommandSuite) TestProcessErrAny(c *gc.C) {
    98  	err := errors.New("Test error Processing")
    99  	s.processErrorTest(c, err, block.BlockDestroy, err, "")
   100  }