github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/cmd/juju/resolved_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package main
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  	"strings"
    10  
    11  	"github.com/juju/cmd"
    12  
    13  	"github.com/juju/juju/cmd/envcmd"
    14  	jujutesting "github.com/juju/juju/juju/testing"
    15  	"github.com/juju/juju/state"
    16  	"github.com/juju/juju/testcharms"
    17  	"github.com/juju/juju/testing"
    18  )
    19  
    20  type ResolvedSuite struct {
    21  	jujutesting.RepoSuite
    22  }
    23  
    24  var _ = gc.Suite(&ResolvedSuite{})
    25  
    26  func runResolved(c *gc.C, args []string) error {
    27  	_, err := testing.RunCommand(c, envcmd.Wrap(&ResolvedCommand{}), args...)
    28  	return err
    29  }
    30  
    31  var resolvedTests = []struct {
    32  	args []string
    33  	err  string
    34  	unit string
    35  	mode state.ResolvedMode
    36  }{
    37  	{
    38  		err: `no unit specified`,
    39  	}, {
    40  		args: []string{"jeremy-fisher"},
    41  		err:  `invalid unit name "jeremy-fisher"`,
    42  	}, {
    43  		args: []string{"jeremy-fisher/99"},
    44  		err:  `unit "jeremy-fisher/99" not found`,
    45  	}, {
    46  		args: []string{"dummy/0"},
    47  		err:  `unit "dummy/0" is not in an error state`,
    48  		unit: "dummy/0",
    49  		mode: state.ResolvedNone,
    50  	}, {
    51  		args: []string{"dummy/1", "--retry"},
    52  		err:  `unit "dummy/1" is not in an error state`,
    53  		unit: "dummy/1",
    54  		mode: state.ResolvedNone,
    55  	}, {
    56  		args: []string{"dummy/2"},
    57  		unit: "dummy/2",
    58  		mode: state.ResolvedNoHooks,
    59  	}, {
    60  		args: []string{"dummy/2", "--retry"},
    61  		err:  `cannot set resolved mode for unit "dummy/2": already resolved`,
    62  		unit: "dummy/2",
    63  		mode: state.ResolvedNoHooks,
    64  	}, {
    65  		args: []string{"dummy/3", "--retry"},
    66  		unit: "dummy/3",
    67  		mode: state.ResolvedRetryHooks,
    68  	}, {
    69  		args: []string{"dummy/3"},
    70  		err:  `cannot set resolved mode for unit "dummy/3": already resolved`,
    71  		unit: "dummy/3",
    72  		mode: state.ResolvedRetryHooks,
    73  	}, {
    74  		args: []string{"dummy/4", "roflcopter"},
    75  		err:  `unrecognized args: \["roflcopter"\]`,
    76  	},
    77  }
    78  
    79  func (s *ResolvedSuite) TestResolved(c *gc.C) {
    80  	testcharms.Repo.CharmArchivePath(s.SeriesPath, "dummy")
    81  	err := runDeploy(c, "-n", "5", "local:dummy", "dummy")
    82  	c.Assert(err, jc.ErrorIsNil)
    83  
    84  	for _, name := range []string{"dummy/2", "dummy/3", "dummy/4"} {
    85  		u, err := s.State.Unit(name)
    86  		c.Assert(err, jc.ErrorIsNil)
    87  		err = u.SetStatus(state.StatusError, "lol borken", nil)
    88  		c.Assert(err, jc.ErrorIsNil)
    89  	}
    90  
    91  	for i, t := range resolvedTests {
    92  		c.Logf("test %d: %v", i, t.args)
    93  		err := runResolved(c, t.args)
    94  		if t.err != "" {
    95  			c.Assert(err, gc.ErrorMatches, t.err)
    96  		} else {
    97  			c.Assert(err, jc.ErrorIsNil)
    98  		}
    99  		if t.unit != "" {
   100  			unit, err := s.State.Unit(t.unit)
   101  			c.Assert(err, jc.ErrorIsNil)
   102  			c.Assert(unit.Resolved(), gc.Equals, t.mode)
   103  		}
   104  	}
   105  }
   106  
   107  func (s *ResolvedSuite) TestBlockResolved(c *gc.C) {
   108  	testcharms.Repo.CharmArchivePath(s.SeriesPath, "dummy")
   109  	err := runDeploy(c, "-n", "5", "local:dummy", "dummy")
   110  	c.Assert(err, jc.ErrorIsNil)
   111  
   112  	for _, name := range []string{"dummy/2", "dummy/3", "dummy/4"} {
   113  		u, err := s.State.Unit(name)
   114  		c.Assert(err, jc.ErrorIsNil)
   115  		err = u.SetStatus(state.StatusError, "lol borken", nil)
   116  		c.Assert(err, jc.ErrorIsNil)
   117  	}
   118  
   119  	// Block operation
   120  	s.AssertConfigParameterUpdated(c, "block-all-changes", true)
   121  	err = runResolved(c, []string{"dummy/2"})
   122  	c.Assert(err, gc.ErrorMatches, cmd.ErrSilent.Error())
   123  	// msg is logged
   124  	stripped := strings.Replace(c.GetTestLog(), "\n", "", -1)
   125  	c.Check(stripped, gc.Matches, ".*To unblock changes.*")
   126  }