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  }