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 }