github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/payload/state/unit_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package state_test 5 6 import ( 7 "github.com/juju/errors" 8 jc "github.com/juju/testing/checkers" 9 "github.com/juju/utils" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/payload" 13 "github.com/juju/juju/payload/state" 14 ) 15 16 var _ = gc.Suite(&unitPayloadsSuite{}) 17 18 type unitPayloadsSuite struct { 19 basePayloadsSuite 20 id string 21 } 22 23 func (s *unitPayloadsSuite) newID() (string, error) { 24 s.stub.AddCall("newID") 25 if err := s.stub.NextErr(); err != nil { 26 return "", errors.Trace(err) 27 } 28 29 return s.id, nil 30 } 31 32 func (s *unitPayloadsSuite) TestNewID(c *gc.C) { 33 id, err := state.NewID() 34 c.Assert(err, jc.ErrorIsNil) 35 36 c.Check(id, jc.Satisfies, utils.IsValidUUIDString) 37 } 38 39 func (s *unitPayloadsSuite) TestTrackOkay(c *gc.C) { 40 s.id = "f47ac10b-58cc-4372-a567-0e02b2c3d479" 41 pl := s.newPayload("docker", "payloadA/payloadA-xyz") 42 43 ps := state.UnitPayloads{ 44 Persist: s.persist, 45 Unit: "a-service/0", 46 } 47 ps = state.SetNewID(ps, s.newID) 48 49 err := ps.Track(pl) 50 c.Assert(err, jc.ErrorIsNil) 51 52 s.stub.CheckCallNames(c, "newID", "Track") 53 c.Check(s.persist.payloads, gc.HasLen, 1) 54 s.persist.checkPayload(c, s.id, pl) 55 } 56 57 func (s *unitPayloadsSuite) TestTrackInvalid(c *gc.C) { 58 s.id = "f47ac10b-58cc-4372-a567-0e02b2c3d479" 59 pl := s.newPayload("", "payloadA/payloadA-xyz") 60 61 ps := state.UnitPayloads{ 62 Persist: s.persist, 63 Unit: "a-service/0", 64 } 65 ps = state.SetNewID(ps, s.newID) 66 67 err := ps.Track(pl) 68 69 c.Check(err, jc.Satisfies, errors.IsNotValid) 70 } 71 72 func (s *unitPayloadsSuite) TestTrackEnsureDefinitionFailed(c *gc.C) { 73 s.id = "f47ac10b-58cc-4372-a567-0e02b2c3d479" 74 failure := errors.Errorf("<failed!>") 75 s.stub.SetErrors(failure) 76 pl := s.newPayload("docker", "payloadA/payloadA-xyz") 77 78 ps := state.UnitPayloads{ 79 Persist: s.persist, 80 Unit: "a-service/0", 81 } 82 ps = state.SetNewID(ps, s.newID) 83 84 err := ps.Track(pl) 85 86 c.Check(errors.Cause(err), gc.Equals, failure) 87 } 88 89 func (s *unitPayloadsSuite) TestTrackInsertFailed(c *gc.C) { 90 s.id = "f47ac10b-58cc-4372-a567-0e02b2c3d479" 91 failure := errors.Errorf("<failed!>") 92 s.stub.SetErrors(failure) 93 pl := s.newPayload("docker", "payloadA/payloadA-xyz") 94 95 ps := state.UnitPayloads{ 96 Persist: s.persist, 97 Unit: "a-service/0", 98 } 99 ps = state.SetNewID(ps, s.newID) 100 101 err := ps.Track(pl) 102 103 c.Check(errors.Cause(err), gc.Equals, failure) 104 } 105 106 func (s *unitPayloadsSuite) TestTrackAlreadyExists(c *gc.C) { 107 s.id = "f47ac10b-58cc-4372-a567-0e02b2c3d479" 108 pl := s.newPayload("docker", "payloadA/payloadA-xyz") 109 s.persist.setPayload(s.id, &pl) 110 111 ps := state.UnitPayloads{ 112 Persist: s.persist, 113 Unit: "a-service/0", 114 } 115 ps = state.SetNewID(ps, s.newID) 116 117 err := ps.Track(pl) 118 119 c.Check(err, jc.Satisfies, errors.IsNotValid) 120 } 121 122 func (s *unitPayloadsSuite) TestSetStatusOkay(c *gc.C) { 123 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 124 pl := s.newPayload("docker", "payloadA/payloadA-xyz") 125 s.persist.setPayload(id, &pl) 126 127 ps := state.UnitPayloads{ 128 Persist: s.persist, 129 Unit: "a-service/0", 130 } 131 132 err := ps.SetStatus(id, payload.StateRunning) 133 c.Assert(err, jc.ErrorIsNil) 134 135 s.stub.CheckCallNames(c, "SetStatus") 136 current := s.persist.payloads[id] 137 c.Check(current.Status, jc.DeepEquals, payload.StateRunning) 138 } 139 140 func (s *unitPayloadsSuite) TestSetStatusFailed(c *gc.C) { 141 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 142 failure := errors.Errorf("<failed!>") 143 s.stub.SetErrors(failure) 144 pl := s.newPayload("docker", "payloadA/payloadA-xyz") 145 s.persist.setPayload(id, &pl) 146 147 ps := state.UnitPayloads{ 148 Persist: s.persist, 149 Unit: "a-service/0", 150 } 151 err := ps.SetStatus(id, payload.StateRunning) 152 153 c.Check(errors.Cause(err), gc.Equals, failure) 154 } 155 156 func (s *unitPayloadsSuite) TestSetStatusMissing(c *gc.C) { 157 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 158 ps := state.UnitPayloads{ 159 Persist: s.persist, 160 Unit: "a-service/0", 161 } 162 err := ps.SetStatus(id, payload.StateRunning) 163 164 c.Check(err, jc.Satisfies, errors.IsNotFound) 165 } 166 167 func (s *unitPayloadsSuite) TestListOkay(c *gc.C) { 168 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 169 otherID := "f47ac10b-58cc-4372-a567-0e02b2c3d480" 170 pl := s.newPayload("docker", "payloadA/payloadA-xyz") 171 other := s.newPayload("docker", "payloadB/payloadB-abc") 172 s.persist.setPayload(id, &pl) 173 s.persist.setPayload(otherID, &other) 174 175 ps := state.UnitPayloads{ 176 Persist: s.persist, 177 Unit: "a-service/0", 178 } 179 results, err := ps.List(id) 180 c.Assert(err, jc.ErrorIsNil) 181 182 s.stub.CheckCallNames(c, "List") 183 c.Check(results, jc.DeepEquals, []payload.Result{{ 184 ID: id, 185 Payload: &payload.FullPayloadInfo{Payload: pl}, 186 }}) 187 } 188 189 func (s *unitPayloadsSuite) TestListAll(c *gc.C) { 190 id1 := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 191 id2 := "f47ac10b-58cc-4372-a567-0e02b2c3d480" 192 pl1 := s.newPayload("docker", "payloadA/payloadA-xyz") 193 pl2 := s.newPayload("docker", "payloadB/payloadB-abc") 194 s.persist.setPayload(id1, &pl1) 195 s.persist.setPayload(id2, &pl2) 196 fpi1 := payload.FullPayloadInfo{Payload: pl1} 197 fpi2 := payload.FullPayloadInfo{Payload: pl2} 198 199 ps := state.UnitPayloads{ 200 Persist: s.persist, 201 Unit: "a-service/0", 202 } 203 results, err := ps.List() 204 c.Assert(err, jc.ErrorIsNil) 205 206 s.stub.CheckCallNames(c, "ListAll", "LookUp", "LookUp") 207 c.Assert(results, gc.HasLen, 2) 208 if results[0].Payload.Name == "payloadA" { 209 c.Check(results[0].Payload, jc.DeepEquals, &fpi1) 210 c.Check(results[1].Payload, jc.DeepEquals, &fpi2) 211 } else { 212 c.Check(results[0].Payload, jc.DeepEquals, &fpi2) 213 c.Check(results[1].Payload, jc.DeepEquals, &fpi1) 214 } 215 } 216 217 func (s *unitPayloadsSuite) TestListFailed(c *gc.C) { 218 failure := errors.Errorf("<failed!>") 219 s.stub.SetErrors(failure) 220 221 ps := state.UnitPayloads{ 222 Persist: s.persist, 223 Unit: "a-service/0", 224 } 225 _, err := ps.List() 226 227 s.stub.CheckCallNames(c, "ListAll") 228 c.Check(errors.Cause(err), gc.Equals, failure) 229 } 230 231 func (s *unitPayloadsSuite) TestListMissing(c *gc.C) { 232 missingID := "f47ac10b-58cc-4372-a567-0e02b2c3d480" 233 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 234 pl := s.newPayload("docker", "payloadA/payloadA-xyz") 235 s.persist.setPayload(id, &pl) 236 237 ps := state.UnitPayloads{ 238 Persist: s.persist, 239 Unit: "a-service/0", 240 } 241 results, err := ps.List(id, missingID) 242 c.Assert(err, jc.ErrorIsNil) 243 244 c.Assert(results, gc.HasLen, 2) 245 c.Check(results[1].Error, gc.NotNil) 246 results[1].Error = nil 247 c.Check(results, jc.DeepEquals, []payload.Result{{ 248 ID: id, 249 Payload: &payload.FullPayloadInfo{Payload: pl}, 250 }, { 251 ID: missingID, 252 NotFound: true, 253 }}) 254 } 255 256 func (s *unitPayloadsSuite) TestUntrackOkay(c *gc.C) { 257 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 258 pl := s.newPayload("docker", "payloadA/payloadA-xyz") 259 s.persist.setPayload(id, &pl) 260 261 ps := state.UnitPayloads{ 262 Persist: s.persist, 263 Unit: "a-service/0", 264 } 265 err := ps.Untrack(id) 266 c.Assert(err, jc.ErrorIsNil) 267 268 s.stub.CheckCallNames(c, "Untrack") 269 c.Check(s.persist.payloads, gc.HasLen, 0) 270 } 271 272 func (s *unitPayloadsSuite) TestUntrackMissing(c *gc.C) { 273 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 274 ps := state.UnitPayloads{ 275 Persist: s.persist, 276 Unit: "a-service/0", 277 } 278 err := ps.Untrack(id) 279 c.Assert(err, jc.ErrorIsNil) 280 281 s.stub.CheckCallNames(c, "Untrack") 282 c.Check(s.persist.payloads, gc.HasLen, 0) 283 } 284 285 func (s *unitPayloadsSuite) TestUntrackFailed(c *gc.C) { 286 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 287 failure := errors.Errorf("<failed!>") 288 s.stub.SetErrors(failure) 289 290 ps := state.UnitPayloads{ 291 Persist: s.persist, 292 Unit: "a-service/0", 293 } 294 err := ps.Untrack(id) 295 296 s.stub.CheckCallNames(c, "Untrack") 297 c.Check(errors.Cause(err), gc.Equals, failure) 298 }