github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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/core/status" 16 "github.com/juju/juju/core/watcher/watchertest" 17 "github.com/juju/juju/state" 18 ) 19 20 type applicationSuite struct { 21 uniterSuite 22 23 apiApplication *uniter.Application 24 } 25 26 var _ = gc.Suite(&applicationSuite{}) 27 28 func (s *applicationSuite) SetUpTest(c *gc.C) { 29 s.uniterSuite.SetUpTest(c) 30 31 var err error 32 s.apiApplication, err = s.uniter.Application(s.wordpressApplication.Tag().(names.ApplicationTag)) 33 c.Assert(err, jc.ErrorIsNil) 34 } 35 36 func (s *applicationSuite) TestNameTagAndString(c *gc.C) { 37 c.Assert(s.apiApplication.Name(), gc.Equals, s.wordpressApplication.Name()) 38 c.Assert(s.apiApplication.String(), gc.Equals, s.wordpressApplication.String()) 39 c.Assert(s.apiApplication.Tag(), gc.Equals, s.wordpressApplication.Tag().(names.ApplicationTag)) 40 } 41 42 func (s *applicationSuite) TestWatch(c *gc.C) { 43 c.Assert(s.apiApplication.Life(), gc.Equals, params.Alive) 44 45 w, err := s.apiApplication.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.wordpressApplication.SetExposed() 55 c.Assert(err, jc.ErrorIsNil) 56 wc.AssertOneChange() 57 58 // Destroy the application and check it's detected. 59 err = s.wordpressApplication.Destroy() 60 c.Assert(err, jc.ErrorIsNil) 61 wc.AssertOneChange() 62 } 63 64 func (s *applicationSuite) TestRefresh(c *gc.C) { 65 c.Assert(s.apiApplication.Life(), gc.Equals, params.Alive) 66 67 err := s.wordpressApplication.Destroy() 68 c.Assert(err, jc.ErrorIsNil) 69 c.Assert(s.apiApplication.Life(), gc.Equals, params.Alive) 70 71 err = s.apiApplication.Refresh() 72 c.Assert(err, jc.ErrorIsNil) 73 c.Assert(s.apiApplication.Life(), gc.Equals, params.Dying) 74 } 75 76 func (s *applicationSuite) TestCharmURL(c *gc.C) { 77 // Get the charm URL through state calls. 78 curl, force := s.wordpressApplication.CharmURL() 79 c.Assert(curl, gc.DeepEquals, s.wordpressCharm.URL()) 80 c.Assert(force, jc.IsFalse) 81 82 // Now check the same through the API. 83 curl, force, err := s.apiApplication.CharmURL() 84 c.Assert(err, jc.ErrorIsNil) 85 c.Assert(curl, gc.DeepEquals, s.wordpressCharm.URL()) 86 c.Assert(force, jc.IsFalse) 87 } 88 89 func (s *applicationSuite) TestCharmModifiedVersion(c *gc.C) { 90 // Get the charm URL through state calls. 91 ver, err := s.apiApplication.CharmModifiedVersion() 92 c.Assert(err, jc.ErrorIsNil) 93 c.Assert(ver, gc.Equals, s.wordpressApplication.CharmModifiedVersion()) 94 } 95 96 func (s *applicationSuite) TestSetApplicationStatus(c *gc.C) { 97 message := "a test message" 98 stat, err := s.wordpressApplication.Status() 99 c.Assert(err, jc.ErrorIsNil) 100 c.Assert(stat.Status, gc.Not(gc.Equals), status.Active) 101 c.Assert(stat.Message, gc.Not(gc.Equals), message) 102 103 err = s.apiApplication.SetStatus(s.wordpressUnit.Name(), status.Active, message, map[string]interface{}{}) 104 c.Check(err, gc.ErrorMatches, `"wordpress/0" is not leader of "wordpress"`) 105 106 s.claimLeadership(c, s.wordpressUnit, s.wordpressApplication) 107 108 err = s.apiApplication.SetStatus(s.wordpressUnit.Name(), status.Active, message, map[string]interface{}{}) 109 c.Check(err, jc.ErrorIsNil) 110 111 stat, err = s.wordpressApplication.Status() 112 c.Check(err, jc.ErrorIsNil) 113 c.Check(stat.Status, gc.Equals, status.Active) 114 c.Check(stat.Message, gc.Equals, message) 115 } 116 117 func (s *applicationSuite) TestApplicationStatus(c *gc.C) { 118 message := "a test message" 119 stat, err := s.wordpressApplication.Status() 120 c.Assert(err, jc.ErrorIsNil) 121 c.Assert(stat.Status, gc.Not(gc.Equals), status.Active) 122 c.Assert(stat.Message, gc.Not(gc.Equals), message) 123 124 now := time.Now() 125 sInfo := status.StatusInfo{ 126 Status: status.Active, 127 Message: message, 128 Data: map[string]interface{}{}, 129 Since: &now, 130 } 131 err = s.wordpressApplication.SetStatus(sInfo) 132 c.Check(err, jc.ErrorIsNil) 133 134 stat, err = s.wordpressApplication.Status() 135 c.Check(err, jc.ErrorIsNil) 136 c.Check(stat.Status, gc.Equals, status.Active) 137 c.Check(stat.Message, gc.Equals, message) 138 139 result, err := s.apiApplication.Status(s.wordpressUnit.Name()) 140 c.Check(err, gc.ErrorMatches, `"wordpress/0" is not leader of "wordpress"`) 141 142 s.claimLeadership(c, s.wordpressUnit, s.wordpressApplication) 143 result, err = s.apiApplication.Status(s.wordpressUnit.Name()) 144 c.Check(err, jc.ErrorIsNil) 145 c.Check(result.Application.Status, gc.Equals, status.Active.String()) 146 } 147 148 func (s *applicationSuite) claimLeadership(c *gc.C, unit *state.Unit, app *state.Application) { 149 claimer := s.State.LeadershipClaimer() 150 err := claimer.ClaimLeadership(app.Name(), unit.Name(), time.Minute) 151 c.Assert(err, jc.ErrorIsNil) 152 }