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  }