github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/api/agent/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 "github.com/juju/charm/v12" 8 "github.com/juju/names/v5" 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/api/agent/uniter" 13 basetesting "github.com/juju/juju/api/base/testing" 14 "github.com/juju/juju/core/life" 15 "github.com/juju/juju/core/relation" 16 "github.com/juju/juju/rpc/params" 17 "github.com/juju/juju/testing" 18 ) 19 20 type relationSuite struct { 21 testing.BaseSuite 22 } 23 24 var _ = gc.Suite(&relationSuite{}) 25 26 func (s *relationSuite) TestRelation(c *gc.C) { 27 apiCaller := basetesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 28 c.Assert(objType, gc.Equals, "Uniter") 29 c.Assert(request, gc.Equals, "Relation") 30 c.Assert(arg, gc.DeepEquals, params.RelationUnits{ 31 RelationUnits: []params.RelationUnit{ 32 {Relation: "relation-wordpress.db#mysql.server", Unit: "unit-mysql-0"}, 33 }, 34 }) 35 c.Assert(result, gc.FitsTypeOf, ¶ms.RelationResults{}) 36 *(result.(*params.RelationResults)) = params.RelationResults{ 37 Results: []params.RelationResult{{ 38 Life: life.Alive, 39 Suspended: false, 40 Id: 666, 41 Key: "wordpress:db mysql:server", 42 Endpoint: params.Endpoint{ 43 Relation: params.CharmRelation{ 44 Name: "db", 45 Role: "requirer", 46 Interface: "mysql", 47 Optional: true, 48 Limit: 1, 49 Scope: "global", 50 }, 51 }, 52 OtherApplication: "mysql", 53 }}, 54 } 55 return nil 56 }) 57 client := uniter.NewState(apiCaller, names.NewUnitTag("mysql/0")) 58 tag := names.NewRelationTag("wordpress:db mysql:server") 59 rel, err := client.Relation(tag) 60 c.Assert(err, jc.ErrorIsNil) 61 c.Assert(rel.Id(), gc.Equals, 666) 62 c.Assert(rel.Tag(), gc.Equals, tag) 63 c.Assert(rel.Life(), gc.Equals, life.Alive) 64 c.Assert(rel.String(), gc.Equals, tag.Id()) 65 c.Assert(rel.OtherApplication(), gc.Equals, "mysql") 66 ep, err := rel.Endpoint() 67 c.Assert(err, jc.ErrorIsNil) 68 c.Assert(ep, jc.DeepEquals, &uniter.Endpoint{ 69 charm.Relation{ 70 Name: "db", 71 Role: "requirer", 72 Interface: "mysql", 73 Optional: true, 74 Limit: 1, 75 Scope: "global", 76 }, 77 }) 78 } 79 80 func (s *relationSuite) TestRefresh(c *gc.C) { 81 apiCaller := basetesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 82 c.Assert(objType, gc.Equals, "Uniter") 83 c.Assert(request, gc.Equals, "Relation") 84 c.Assert(arg, gc.DeepEquals, params.RelationUnits{ 85 RelationUnits: []params.RelationUnit{ 86 {Relation: "relation-wordpress.db#mysql.server", Unit: "unit-mysql-0"}, 87 }, 88 }) 89 c.Assert(result, gc.FitsTypeOf, ¶ms.RelationResults{}) 90 *(result.(*params.RelationResults)) = params.RelationResults{ 91 Results: []params.RelationResult{{ 92 Life: life.Dying, 93 Suspended: true, 94 }}, 95 } 96 return nil 97 }) 98 99 client := uniter.NewState(apiCaller, names.NewUnitTag("mysql/0")) 100 tag := names.NewRelationTag("wordpress:db mysql:server") 101 rel := uniter.CreateRelation(client, tag) 102 err := rel.Refresh() 103 c.Assert(err, jc.ErrorIsNil) 104 c.Assert(rel.Life(), gc.Equals, life.Dying) 105 c.Assert(rel.Suspended(), jc.IsTrue) 106 } 107 108 func (s *relationSuite) TestSuspended(c *gc.C) { 109 apiCaller := basetesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 110 return nil 111 }) 112 client := uniter.NewState(apiCaller, names.NewUnitTag("mysql/0")) 113 tag := names.NewRelationTag("wordpress:db mysql:server") 114 rel := uniter.CreateRelation(client, tag) 115 c.Assert(rel.Suspended(), jc.IsFalse) 116 rel.UpdateSuspended(true) 117 c.Assert(rel.Suspended(), jc.IsTrue) 118 } 119 120 func (s *relationSuite) TestSetStatus(c *gc.C) { 121 statusSet := false 122 apiCaller := basetesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 123 c.Assert(objType, gc.Equals, "Uniter") 124 c.Assert(request, gc.Equals, "SetRelationStatus") 125 c.Assert(arg, gc.DeepEquals, params.RelationStatusArgs{ 126 Args: []params.RelationStatusArg{{ 127 UnitTag: "unit-mysql-0", 128 RelationId: 666, 129 Status: params.Suspended, 130 }}, 131 }) 132 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 133 *(result.(*params.ErrorResults)) = params.ErrorResults{ 134 Results: []params.ErrorResult{{}}, 135 } 136 statusSet = true 137 return nil 138 }) 139 client := uniter.NewState(apiCaller, names.NewUnitTag("mysql/0")) 140 tag := names.NewRelationTag("wordpress:db mysql:server") 141 rel := uniter.CreateRelation(client, tag) 142 err := rel.SetStatus(relation.Suspended) 143 c.Assert(err, jc.ErrorIsNil) 144 c.Assert(statusSet, jc.IsTrue) 145 } 146 147 func (s *relationSuite) TestRelationById(c *gc.C) { 148 apiCaller := basetesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 149 c.Assert(objType, gc.Equals, "Uniter") 150 c.Assert(request, gc.Equals, "RelationById") 151 c.Assert(arg, gc.DeepEquals, params.RelationIds{RelationIds: []int{666}}) 152 c.Assert(result, gc.FitsTypeOf, ¶ms.RelationResults{}) 153 *(result.(*params.RelationResults)) = params.RelationResults{ 154 Results: []params.RelationResult{{ 155 Id: 666, 156 Life: life.Alive, 157 Suspended: true, 158 Key: "wordpress:db mysql:server", 159 }}, 160 } 161 return nil 162 }) 163 client := uniter.NewState(apiCaller, names.NewUnitTag("mysql/0")) 164 165 rel, err := client.RelationById(666) 166 c.Assert(rel.Id(), gc.Equals, 666) 167 c.Assert(rel.Tag(), gc.Equals, names.NewRelationTag("wordpress:db mysql:server")) 168 c.Assert(rel.Life(), gc.Equals, life.Alive) 169 c.Assert(rel.Suspended(), jc.IsTrue) 170 c.Assert(rel.String(), gc.Equals, "wordpress:db mysql:server") 171 c.Assert(err, jc.ErrorIsNil) 172 }