github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/state/sequence_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 jc "github.com/juju/testing/checkers" 8 gc "gopkg.in/check.v1" 9 "gopkg.in/mgo.v2/bson" 10 11 "github.com/juju/juju/state" 12 ) 13 14 var _ = gc.Suite(&sequenceSuite{}) 15 16 type sequenceSuite struct { 17 ConnSuite 18 } 19 20 func (s *sequenceSuite) TestSequence(c *gc.C) { 21 s.incAndCheck(c, s.State, "foo", 0) 22 s.checkDocCount(c, 1) 23 s.checkDoc(c, s.State.ModelUUID(), "foo", 1) 24 25 s.incAndCheck(c, s.State, "foo", 1) 26 s.checkDocCount(c, 1) 27 s.checkDoc(c, s.State.ModelUUID(), "foo", 2) 28 } 29 30 func (s *sequenceSuite) TestMultipleSequences(c *gc.C) { 31 s.incAndCheck(c, s.State, "foo", 0) 32 s.incAndCheck(c, s.State, "bar", 0) 33 s.incAndCheck(c, s.State, "bar", 1) 34 s.incAndCheck(c, s.State, "foo", 1) 35 s.incAndCheck(c, s.State, "bar", 2) 36 37 s.checkDocCount(c, 2) 38 s.checkDoc(c, s.State.ModelUUID(), "foo", 2) 39 s.checkDoc(c, s.State.ModelUUID(), "bar", 3) 40 } 41 42 func (s *sequenceSuite) TestSequenceWithMultipleEnvs(c *gc.C) { 43 state1 := s.State 44 state2 := s.Factory.MakeModel(c, nil) 45 defer state2.Close() 46 47 s.incAndCheck(c, state1, "foo", 0) 48 s.incAndCheck(c, state2, "foo", 0) 49 s.incAndCheck(c, state1, "foo", 1) 50 s.incAndCheck(c, state2, "foo", 1) 51 s.incAndCheck(c, state1, "foo", 2) 52 53 s.checkDocCount(c, 2) 54 s.checkDoc(c, state1.ModelUUID(), "foo", 3) 55 s.checkDoc(c, state2.ModelUUID(), "foo", 2) 56 } 57 58 func (s *sequenceSuite) incAndCheck(c *gc.C, st *state.State, name string, expectedCount int) { 59 value, err := state.Sequence(st, name) 60 c.Assert(err, jc.ErrorIsNil) 61 c.Check(value, gc.Equals, expectedCount) 62 } 63 64 func (s *sequenceSuite) checkDocCount(c *gc.C, expectedCount int) { 65 coll, closer := state.GetRawCollection(s.State, "sequence") 66 defer closer() 67 count, err := coll.Count() 68 c.Assert(err, jc.ErrorIsNil) 69 c.Check(count, gc.Equals, expectedCount) 70 } 71 72 func (s *sequenceSuite) checkDoc(c *gc.C, modelUUID, name string, value int) { 73 coll, closer := state.GetRawCollection(s.State, "sequence") 74 defer closer() 75 76 docID := modelUUID + ":" + name 77 var doc bson.M 78 err := coll.FindId(docID).One(&doc) 79 c.Assert(err, jc.ErrorIsNil) 80 c.Check(doc["_id"], gc.Equals, docID) 81 c.Check(doc["name"], gc.Equals, name) 82 c.Check(doc["model-uuid"], gc.Equals, modelUUID) 83 c.Check(doc["counter"], gc.Equals, value) 84 }