github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/api/uniter/application_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 "time" 8 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 "gopkg.in/juju/names.v2" 12 13 "github.com/juju/juju/api/uniter" 14 "github.com/juju/juju/apiserver/params" 15 "github.com/juju/juju/state" 16 "github.com/juju/juju/status" 17 "github.com/juju/juju/watcher/watchertest" 18 ) 19 20 type serviceSuite struct { 21 uniterSuite 22 23 apiService *uniter.Application 24 } 25 26 var _ = gc.Suite(&serviceSuite{}) 27 28 func (s *serviceSuite) SetUpTest(c *gc.C) { 29 s.uniterSuite.SetUpTest(c) 30 31 var err error 32 s.apiService, err = s.uniter.Application(s.wordpressService.Tag().(names.ApplicationTag)) 33 c.Assert(err, jc.ErrorIsNil) 34 } 35 36 func (s *serviceSuite) TestNameTagAndString(c *gc.C) { 37 c.Assert(s.apiService.Name(), gc.Equals, s.wordpressService.Name()) 38 c.Assert(s.apiService.String(), gc.Equals, s.wordpressService.String()) 39 c.Assert(s.apiService.Tag(), gc.Equals, s.wordpressService.Tag().(names.ApplicationTag)) 40 } 41 42 func (s *serviceSuite) TestWatch(c *gc.C) { 43 c.Assert(s.apiService.Life(), gc.Equals, params.Alive) 44 45 w, err := s.apiService.Watch() 46 c.Assert(err, jc.ErrorIsNil) 47 wc := watchertest.NewNotifyWatcherC(c, w, s.BackingState.StartSync) 48 defer wc.AssertStops() 49 50 // Initial event. 51 wc.AssertOneChange() 52 53 // Change something and check it's detected. 54 err = s.wordpressService.SetExposed() 55 c.Assert(err, jc.ErrorIsNil) 56 wc.AssertOneChange() 57 58 // Destroy the service and check it's detected. 59 err = s.wordpressService.Destroy() 60 c.Assert(err, jc.ErrorIsNil) 61 wc.AssertOneChange() 62 } 63 64 func (s *serviceSuite) TestWatchRelations(c *gc.C) { 65 w, err := s.apiService.WatchRelations() 66 c.Assert(err, jc.ErrorIsNil) 67 wc := watchertest.NewStringsWatcherC(c, w, s.BackingState.StartSync) 68 defer wc.AssertStops() 69 70 // Initial event. 71 wc.AssertChange() 72 wc.AssertNoChange() 73 74 // Change something other than the lifecycle and make sure it's 75 // not detected. 76 err = s.wordpressService.SetExposed() 77 c.Assert(err, jc.ErrorIsNil) 78 wc.AssertNoChange() 79 80 // Add another service and relate it to wordpress, 81 // check it's detected. 82 s.addMachineServiceCharmAndUnit(c, "mysql") 83 rel := s.addRelation(c, "wordpress", "mysql") 84 wc.AssertChange(rel.String()) 85 86 // Destroy the relation and check it's detected. 87 err = rel.Destroy() 88 c.Assert(err, jc.ErrorIsNil) 89 wc.AssertChange(rel.String()) 90 wc.AssertNoChange() 91 } 92 93 func (s *serviceSuite) TestRefresh(c *gc.C) { 94 c.Assert(s.apiService.Life(), gc.Equals, params.Alive) 95 96 err := s.wordpressService.Destroy() 97 c.Assert(err, jc.ErrorIsNil) 98 c.Assert(s.apiService.Life(), gc.Equals, params.Alive) 99 100 err = s.apiService.Refresh() 101 c.Assert(err, jc.ErrorIsNil) 102 c.Assert(s.apiService.Life(), gc.Equals, params.Dying) 103 } 104 105 func (s *serviceSuite) TestCharmURL(c *gc.C) { 106 // Get the charm URL through state calls. 107 curl, force := s.wordpressService.CharmURL() 108 c.Assert(curl, gc.DeepEquals, s.wordpressCharm.URL()) 109 c.Assert(force, jc.IsFalse) 110 111 // Now check the same through the API. 112 curl, force, err := s.apiService.CharmURL() 113 c.Assert(err, jc.ErrorIsNil) 114 c.Assert(curl, gc.DeepEquals, s.wordpressCharm.URL()) 115 c.Assert(force, jc.IsFalse) 116 } 117 118 func (s *serviceSuite) TestCharmModifiedVersion(c *gc.C) { 119 // Get the charm URL through state calls. 120 ver, err := s.apiService.CharmModifiedVersion() 121 c.Assert(err, jc.ErrorIsNil) 122 c.Assert(ver, gc.Equals, s.wordpressService.CharmModifiedVersion()) 123 } 124 125 func (s *serviceSuite) TestSetServiceStatus(c *gc.C) { 126 message := "a test message" 127 stat, err := s.wordpressService.Status() 128 c.Assert(err, jc.ErrorIsNil) 129 c.Assert(stat.Status, gc.Not(gc.Equals), status.Active) 130 c.Assert(stat.Message, gc.Not(gc.Equals), message) 131 132 err = s.apiService.SetStatus(s.wordpressUnit.Name(), status.Active, message, map[string]interface{}{}) 133 c.Check(err, gc.ErrorMatches, `"wordpress/0" is not leader of "wordpress"`) 134 135 s.claimLeadership(c, s.wordpressUnit, s.wordpressService) 136 137 err = s.apiService.SetStatus(s.wordpressUnit.Name(), status.Active, message, map[string]interface{}{}) 138 c.Check(err, jc.ErrorIsNil) 139 140 stat, err = s.wordpressService.Status() 141 c.Check(err, jc.ErrorIsNil) 142 c.Check(stat.Status, gc.Equals, status.Active) 143 c.Check(stat.Message, gc.Equals, message) 144 } 145 146 func (s *serviceSuite) TestServiceStatus(c *gc.C) { 147 message := "a test message" 148 stat, err := s.wordpressService.Status() 149 c.Assert(err, jc.ErrorIsNil) 150 c.Assert(stat.Status, gc.Not(gc.Equals), status.Active) 151 c.Assert(stat.Message, gc.Not(gc.Equals), message) 152 153 now := time.Now() 154 sInfo := status.StatusInfo{ 155 Status: status.Active, 156 Message: message, 157 Data: map[string]interface{}{}, 158 Since: &now, 159 } 160 err = s.wordpressService.SetStatus(sInfo) 161 c.Check(err, jc.ErrorIsNil) 162 163 stat, err = s.wordpressService.Status() 164 c.Check(err, jc.ErrorIsNil) 165 c.Check(stat.Status, gc.Equals, status.Active) 166 c.Check(stat.Message, gc.Equals, message) 167 168 result, err := s.apiService.Status(s.wordpressUnit.Name()) 169 c.Check(err, gc.ErrorMatches, `"wordpress/0" is not leader of "wordpress"`) 170 171 s.claimLeadership(c, s.wordpressUnit, s.wordpressService) 172 result, err = s.apiService.Status(s.wordpressUnit.Name()) 173 c.Check(err, jc.ErrorIsNil) 174 c.Check(result.Application.Status, gc.Equals, status.Active.String()) 175 } 176 177 func (s *serviceSuite) claimLeadership(c *gc.C, unit *state.Unit, service *state.Application) { 178 claimer := s.State.LeadershipClaimer() 179 err := claimer.ClaimLeadership(service.Name(), unit.Name(), time.Minute) 180 c.Assert(err, jc.ErrorIsNil) 181 }