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  }