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 }