github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/api/uniter/relation_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package uniter_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  	"gopkg.in/juju/charm.v6-unstable"
    10  	"gopkg.in/juju/names.v2"
    11  
    12  	"github.com/juju/juju/api/uniter"
    13  	"github.com/juju/juju/apiserver/params"
    14  )
    15  
    16  type relationSuite struct {
    17  	uniterSuite
    18  	commonRelationSuiteMixin
    19  
    20  	apiRelation *uniter.Relation
    21  }
    22  
    23  var _ = gc.Suite(&relationSuite{})
    24  
    25  func (s *relationSuite) SetUpTest(c *gc.C) {
    26  	s.uniterSuite.SetUpTest(c)
    27  	s.commonRelationSuiteMixin.SetUpTest(c, s.uniterSuite)
    28  
    29  	var err error
    30  	s.apiRelation, err = s.uniter.Relation(s.stateRelation.Tag().(names.RelationTag))
    31  	c.Assert(err, jc.ErrorIsNil)
    32  }
    33  
    34  func (s *relationSuite) TearDownTest(c *gc.C) {
    35  	s.uniterSuite.TearDownTest(c)
    36  }
    37  
    38  func (s *relationSuite) TestString(c *gc.C) {
    39  	c.Assert(s.apiRelation.String(), gc.Equals, "wordpress:db mysql:server")
    40  }
    41  
    42  func (s *relationSuite) TestIdAndTag(c *gc.C) {
    43  	c.Assert(s.apiRelation.Id(), gc.Equals, s.stateRelation.Id())
    44  	c.Assert(s.apiRelation.Tag(), gc.Equals, s.stateRelation.Tag().(names.RelationTag))
    45  }
    46  
    47  func (s *relationSuite) TestRefresh(c *gc.C) {
    48  	c.Assert(s.apiRelation.Life(), gc.Equals, params.Alive)
    49  
    50  	// EnterScope with mysqlUnit, so the relation will be set to dying
    51  	// when destroyed later.
    52  	myRelUnit, err := s.stateRelation.Unit(s.mysqlUnit)
    53  	c.Assert(err, jc.ErrorIsNil)
    54  	err = myRelUnit.EnterScope(nil)
    55  	c.Assert(err, jc.ErrorIsNil)
    56  	s.assertInScope(c, myRelUnit, true)
    57  
    58  	// Destroy it - should set it to dying.
    59  	err = s.stateRelation.Destroy()
    60  	c.Assert(err, jc.ErrorIsNil)
    61  	c.Assert(s.apiRelation.Life(), gc.Equals, params.Alive)
    62  
    63  	err = s.apiRelation.Refresh()
    64  	c.Assert(err, jc.ErrorIsNil)
    65  	c.Assert(s.apiRelation.Life(), gc.Equals, params.Dying)
    66  
    67  	// Leave scope with mysqlUnit, so the relation will be removed.
    68  	err = myRelUnit.LeaveScope()
    69  	c.Assert(err, jc.ErrorIsNil)
    70  
    71  	c.Assert(s.apiRelation.Life(), gc.Equals, params.Dying)
    72  	err = s.apiRelation.Refresh()
    73  	c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized)
    74  }
    75  
    76  func (s *relationSuite) TestEndpoint(c *gc.C) {
    77  	apiEndpoint, err := s.apiRelation.Endpoint()
    78  	c.Assert(err, jc.ErrorIsNil)
    79  	c.Assert(apiEndpoint, gc.DeepEquals, &uniter.Endpoint{
    80  		charm.Relation{
    81  			Name:      "db",
    82  			Role:      "requirer",
    83  			Interface: "mysql",
    84  			Optional:  false,
    85  			Limit:     1,
    86  			Scope:     "global",
    87  		},
    88  	})
    89  }
    90  
    91  func (s *relationSuite) TestUnit(c *gc.C) {
    92  	_, err := s.apiRelation.Unit(nil)
    93  	c.Assert(err, gc.ErrorMatches, "unit is nil")
    94  
    95  	apiUnit, err := s.uniter.Unit(names.NewUnitTag("wordpress/0"))
    96  	c.Assert(err, jc.ErrorIsNil)
    97  	apiRelUnit, err := s.apiRelation.Unit(apiUnit)
    98  	c.Assert(err, jc.ErrorIsNil)
    99  	c.Assert(apiRelUnit, gc.NotNil)
   100  	// We just ensure we get the correct type, more tests
   101  	// are done in relationunit_test.go.
   102  	c.Assert(apiRelUnit, gc.FitsTypeOf, (*uniter.RelationUnit)(nil))
   103  }
   104  
   105  func (s *relationSuite) TestRelationById(c *gc.C) {
   106  	apiRel, err := s.uniter.RelationById(s.stateRelation.Id())
   107  	c.Assert(err, jc.ErrorIsNil)
   108  	c.Assert(apiRel, gc.DeepEquals, s.apiRelation)
   109  
   110  	// Add a relation to mysql service, which cannot be retrived.
   111  	otherRel, _, _ := s.addRelatedService(c, "mysql", "logging", s.mysqlUnit)
   112  
   113  	// Test some invalid cases.
   114  	for _, relId := range []int{-1, 42, otherRel.Id()} {
   115  		apiRel, err = s.uniter.RelationById(relId)
   116  		c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized)
   117  		c.Assert(apiRel, gc.IsNil)
   118  	}
   119  }