github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/payload/persistence/unit_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package persistence_test 5 6 import ( 7 "fmt" 8 "sort" 9 10 "github.com/juju/errors" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 "gopkg.in/mgo.v2/bson" 14 "gopkg.in/mgo.v2/txn" 15 16 "github.com/juju/juju/payload" 17 "github.com/juju/juju/payload/persistence" 18 ) 19 20 var _ = gc.Suite(&payloadsPersistenceSuite{}) 21 22 type payloadsPersistenceSuite struct { 23 persistence.BaseSuite 24 } 25 26 func (s *payloadsPersistenceSuite) TestTrackOkay(c *gc.C) { 27 pl := s.NewPayload("docker", "payloadA/payloadA-xyz") 28 29 wp := s.NewPersistence() 30 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 31 okay, err := wp.Track(id, pl) 32 c.Assert(err, jc.ErrorIsNil) 33 34 c.Check(okay, jc.IsTrue) 35 s.Stub.CheckCallNames(c, "All", "Run") 36 s.State.CheckOps(c, [][]txn.Op{{ 37 { 38 C: "payloads", 39 Id: "payload#a-unit/0#f47ac10b-58cc-4372-a567-0e02b2c3d479", 40 Assert: txn.DocMissing, 41 Insert: &persistence.PayloadDoc{ 42 DocID: "payload#a-unit/0#f47ac10b-58cc-4372-a567-0e02b2c3d479", 43 UnitID: "a-unit/0", 44 45 Name: "payloadA", 46 Type: "docker", 47 RawID: "payloadA-xyz", 48 State: "running", 49 }, 50 }, 51 }}) 52 } 53 54 func (s *payloadsPersistenceSuite) TestTrackAlreadyExists(c *gc.C) { 55 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 56 57 pl := s.NewPayload("docker", "payloadA/payloadA-xyz") 58 s.SetDoc(id, pl) 59 s.Stub.SetErrors(nil, txn.ErrAborted) 60 61 wp := s.NewPersistence() 62 okay, err := wp.Track(id, pl) 63 64 c.Check(okay, jc.IsFalse) 65 c.Check(err, jc.Satisfies, errors.IsAlreadyExists) 66 s.Stub.CheckCallNames(c, "All") 67 s.State.CheckOps(c, nil) 68 } 69 70 func (s *payloadsPersistenceSuite) TestTrackFailed(c *gc.C) { 71 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 72 failure := errors.Errorf("<failed!>") 73 s.Stub.SetErrors(nil, failure) 74 pl := s.NewPayload("docker", "payloadA") 75 76 pp := s.NewPersistence() 77 _, err := pp.Track(id, pl) 78 79 c.Check(errors.Cause(err), gc.Equals, failure) 80 s.Stub.CheckCallNames(c, "All", "Run") 81 } 82 83 func (s *payloadsPersistenceSuite) TestSetStatusOkay(c *gc.C) { 84 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 85 pl := s.NewPayload("docker", "payloadA/payloadA-xyz") 86 s.SetDoc(id, pl) 87 88 pp := s.NewPersistence() 89 okay, err := pp.SetStatus(id, payload.StateRunning) 90 c.Assert(err, jc.ErrorIsNil) 91 92 c.Check(okay, jc.IsTrue) 93 s.Stub.CheckCallNames(c, "Run") 94 s.State.CheckOps(c, [][]txn.Op{{ 95 { 96 C: "payloads", 97 Id: "payload#a-unit/0#f47ac10b-58cc-4372-a567-0e02b2c3d479", 98 Assert: txn.DocExists, 99 Update: bson.D{ 100 {"$set", bson.D{ 101 {"state", payload.StateRunning}, 102 }}, 103 }, 104 }, 105 }}) 106 } 107 108 func (s *payloadsPersistenceSuite) TestSetStatusMissing(c *gc.C) { 109 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 110 s.Stub.SetErrors(txn.ErrAborted) 111 112 pp := s.NewPersistence() 113 okay, err := pp.SetStatus(id, payload.StateRunning) 114 c.Assert(err, jc.ErrorIsNil) 115 116 c.Check(okay, jc.IsFalse) 117 s.Stub.CheckCallNames(c, "Run") 118 s.State.CheckOps(c, [][]txn.Op{{ 119 { 120 C: "payloads", 121 Id: "payload#a-unit/0#f47ac10b-58cc-4372-a567-0e02b2c3d479", 122 Assert: txn.DocExists, 123 Update: bson.D{ 124 {"$set", bson.D{ 125 {"state", payload.StateRunning}, 126 }}, 127 }, 128 }, 129 }}) 130 } 131 132 func (s *payloadsPersistenceSuite) TestSetStatusFailed(c *gc.C) { 133 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 134 pl := s.NewPayload("docker", "payloadA/payloadA-xyz") 135 s.SetDoc(id, pl) 136 failure := errors.Errorf("<failed!>") 137 s.Stub.SetErrors(failure) 138 139 pp := s.NewPersistence() 140 _, err := pp.SetStatus(id, payload.StateRunning) 141 142 c.Check(errors.Cause(err), gc.Equals, failure) 143 } 144 145 func (s *payloadsPersistenceSuite) TestListOkay(c *gc.C) { 146 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 147 pl := s.NewPayload("docker", "payloadA/xyz") 148 s.SetDoc(id, pl) 149 other := s.NewPayload("docker", "payloadB/abc") 150 s.SetDoc("f47ac10b-58cc-4372-a567-0e02b2c3d480", other) 151 152 pp := s.NewPersistence() 153 payloads, missing, err := pp.List(id) 154 c.Assert(err, jc.ErrorIsNil) 155 156 s.Stub.CheckCallNames(c, "All") 157 s.State.CheckNoOps(c) 158 c.Check(payloads, jc.DeepEquals, []payload.Payload{pl}) 159 c.Check(missing, gc.HasLen, 0) 160 } 161 162 func (s *payloadsPersistenceSuite) TestListSomeMissing(c *gc.C) { 163 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 164 pl := s.NewPayload("docker", "payloadB/abc") 165 s.SetDoc(id, pl) 166 other := s.NewPayload("docker", "payloadA/xyz") 167 s.SetDoc("f47ac10b-58cc-4372-a567-0e02b2c3d480", other) 168 169 missingID := "f47ac10b-58cc-4372-a567-0e02b2c3d481" 170 pp := s.NewPersistence() 171 payloads, missing, err := pp.List(id, missingID) 172 c.Assert(err, jc.ErrorIsNil) 173 174 s.Stub.CheckCallNames(c, "All") 175 s.State.CheckNoOps(c) 176 c.Check(payloads, jc.DeepEquals, []payload.Payload{pl}) 177 c.Check(missing, jc.DeepEquals, []string{missingID}) 178 } 179 180 func (s *payloadsPersistenceSuite) TestListEmpty(c *gc.C) { 181 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 182 pp := s.NewPersistence() 183 payloads, missing, err := pp.List(id) 184 c.Assert(err, jc.ErrorIsNil) 185 186 s.Stub.CheckCallNames(c, "All") 187 s.State.CheckNoOps(c) 188 c.Check(payloads, gc.HasLen, 0) 189 c.Check(missing, jc.DeepEquals, []string{id}) 190 } 191 192 func (s *payloadsPersistenceSuite) TestListFailure(c *gc.C) { 193 failure := errors.Errorf("<failed!>") 194 s.Stub.SetErrors(failure) 195 196 pp := s.NewPersistence() 197 _, _, err := pp.List() 198 199 c.Check(errors.Cause(err), gc.Equals, failure) 200 } 201 202 func (s *payloadsPersistenceSuite) TestListAllOkay(c *gc.C) { 203 existing := s.NewPayloads("docker", "payloadA/xyz", "payloadB/abc") 204 for i, pl := range existing { 205 s.SetDoc(fmt.Sprintf("%d", i), pl) 206 } 207 208 pp := s.NewPersistence() 209 payloads, err := pp.ListAll() 210 c.Assert(err, jc.ErrorIsNil) 211 212 s.Stub.CheckCallNames(c, "All") 213 s.State.CheckNoOps(c) 214 sort.Sort(byName(payloads)) 215 sort.Sort(byName(existing)) 216 c.Check(payloads, jc.DeepEquals, existing) 217 } 218 219 func (s *payloadsPersistenceSuite) TestListAllEmpty(c *gc.C) { 220 pp := s.NewPersistence() 221 payloads, err := pp.ListAll() 222 c.Assert(err, jc.ErrorIsNil) 223 224 s.Stub.CheckCallNames(c, "All") 225 s.State.CheckNoOps(c) 226 c.Check(payloads, gc.HasLen, 0) 227 } 228 229 type byName []payload.Payload 230 231 func (b byName) Len() int { return len(b) } 232 func (b byName) Less(i, j int) bool { return b[i].FullID() < b[j].FullID() } 233 func (b byName) Swap(i, j int) { b[i], b[j] = b[j], b[i] } 234 235 func (s *payloadsPersistenceSuite) TestListAllFailed(c *gc.C) { 236 failure := errors.Errorf("<failed!>") 237 s.Stub.SetErrors(failure) 238 239 pp := s.NewPersistence() 240 _, err := pp.ListAll() 241 242 c.Check(errors.Cause(err), gc.Equals, failure) 243 } 244 245 func (s *payloadsPersistenceSuite) TestUntrackOkay(c *gc.C) { 246 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 247 pl := s.NewPayload("docker", "payloadA/xyz") 248 s.SetDoc(id, pl) 249 250 pp := s.NewPersistence() 251 found, err := pp.Untrack(id) 252 c.Assert(err, jc.ErrorIsNil) 253 254 c.Check(found, jc.IsTrue) 255 s.Stub.CheckCallNames(c, "Run") 256 s.State.CheckOps(c, [][]txn.Op{{ 257 { 258 C: "payloads", 259 Id: "payload#a-unit/0#f47ac10b-58cc-4372-a567-0e02b2c3d479", 260 Assert: txn.DocExists, 261 Remove: true, 262 }, 263 }}) 264 } 265 266 func (s *payloadsPersistenceSuite) TestUntrackMissing(c *gc.C) { 267 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 268 s.Stub.SetErrors(txn.ErrAborted) 269 270 pp := s.NewPersistence() 271 found, err := pp.Untrack(id) 272 c.Assert(err, jc.ErrorIsNil) 273 274 c.Check(found, jc.IsFalse) 275 s.Stub.CheckCallNames(c, "Run") 276 s.State.CheckOps(c, [][]txn.Op{{ 277 { 278 C: "payloads", 279 Id: "payload#a-unit/0#f47ac10b-58cc-4372-a567-0e02b2c3d479", 280 Assert: txn.DocExists, 281 Remove: true, 282 }, 283 }}) 284 } 285 286 func (s *payloadsPersistenceSuite) TestUntrackFailed(c *gc.C) { 287 id := "f47ac10b-58cc-4372-a567-0e02b2c3d479" 288 failure := errors.Errorf("<failed!>") 289 s.Stub.SetErrors(failure) 290 291 pp := s.NewPersistence() 292 _, err := pp.Untrack(id) 293 294 c.Check(errors.Cause(err), gc.Equals, failure) 295 }