github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/state/status_application_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package state_test 5 6 import ( 7 "time" // Only used for time types. 8 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/core/status" 13 "github.com/juju/juju/state" 14 "github.com/juju/juju/testing" 15 ) 16 17 type ApplicationStatusSuite struct { 18 ConnSuite 19 application *state.Application 20 } 21 22 var _ = gc.Suite(&ApplicationStatusSuite{}) 23 24 func (s *ApplicationStatusSuite) SetUpTest(c *gc.C) { 25 s.ConnSuite.SetUpTest(c) 26 s.application = s.Factory.MakeApplication(c, nil) 27 } 28 29 func (s *ApplicationStatusSuite) TestInitialStatus(c *gc.C) { 30 s.checkInitialStatus(c) 31 } 32 33 func (s *ApplicationStatusSuite) checkInitialStatus(c *gc.C) { 34 statusInfo, err := s.application.Status() 35 c.Check(err, jc.ErrorIsNil) 36 c.Check(statusInfo.Status, gc.Equals, status.Unset) 37 c.Check(statusInfo.Message, gc.Equals, "") 38 c.Check(statusInfo.Data, gc.HasLen, 0) 39 c.Check(statusInfo.Since, gc.NotNil) 40 } 41 42 func (s *ApplicationStatusSuite) TestSetUnknownStatus(c *gc.C) { 43 now := testing.ZeroTime() 44 sInfo := status.StatusInfo{ 45 Status: status.Status("vliegkat"), 46 Message: "orville", 47 Since: &now, 48 } 49 err := s.application.SetStatus(sInfo) 50 c.Check(err, gc.ErrorMatches, `cannot set invalid status "vliegkat"`) 51 52 s.checkInitialStatus(c) 53 } 54 55 func (s *ApplicationStatusSuite) TestSetOverwritesData(c *gc.C) { 56 now := testing.ZeroTime() 57 sInfo := status.StatusInfo{ 58 Status: status.Active, 59 Message: "healthy", 60 Data: map[string]interface{}{ 61 "pew.pew": "zap", 62 }, 63 Since: &now, 64 } 65 err := s.application.SetStatus(sInfo) 66 c.Check(err, jc.ErrorIsNil) 67 68 s.checkGetSetStatus(c) 69 } 70 71 func (s *ApplicationStatusSuite) TestGetSetStatusAlive(c *gc.C) { 72 s.checkGetSetStatus(c) 73 } 74 75 func (s *ApplicationStatusSuite) checkGetSetStatus(c *gc.C) { 76 now := testing.ZeroTime() 77 sInfo := status.StatusInfo{ 78 Status: status.Active, 79 Message: "healthy", 80 Data: map[string]interface{}{ 81 "$ping": map[string]interface{}{ 82 "foo.bar": 123, 83 }, 84 }, 85 Since: &now, 86 } 87 err := s.application.SetStatus(sInfo) 88 c.Check(err, jc.ErrorIsNil) 89 90 application, err := s.State.Application(s.application.Name()) 91 c.Assert(err, jc.ErrorIsNil) 92 93 statusInfo, err := application.Status() 94 c.Check(err, jc.ErrorIsNil) 95 c.Check(statusInfo.Status, gc.Equals, status.Active) 96 c.Check(statusInfo.Message, gc.Equals, "healthy") 97 c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{ 98 "$ping": map[string]interface{}{ 99 "foo.bar": 123, 100 }, 101 }) 102 c.Check(statusInfo.Since, gc.NotNil) 103 } 104 105 func (s *ApplicationStatusSuite) TestGetSetStatusDying(c *gc.C) { 106 _, err := s.application.AddUnit(state.AddUnitParams{}) 107 c.Assert(err, jc.ErrorIsNil) 108 err = s.application.Destroy() 109 c.Assert(err, jc.ErrorIsNil) 110 111 s.checkGetSetStatus(c) 112 } 113 114 func (s *ApplicationStatusSuite) TestGetSetStatusGone(c *gc.C) { 115 err := s.application.Destroy() 116 c.Assert(err, jc.ErrorIsNil) 117 118 now := testing.ZeroTime() 119 sInfo := status.StatusInfo{ 120 Status: status.Active, 121 Message: "not really", 122 Since: &now, 123 } 124 err = s.application.SetStatus(sInfo) 125 c.Check(err, gc.ErrorMatches, `cannot set status: application not found`) 126 127 statusInfo, err := s.application.Status() 128 c.Check(err, gc.ErrorMatches, `cannot get status: application not found`) 129 c.Check(statusInfo, gc.DeepEquals, status.StatusInfo{}) 130 } 131 132 func (s *ApplicationStatusSuite) TestSetStatusSince(c *gc.C) { 133 now := testing.ZeroTime() 134 sInfo := status.StatusInfo{ 135 Status: status.Maintenance, 136 Message: "", 137 Since: &now, 138 } 139 err := s.application.SetStatus(sInfo) 140 c.Assert(err, jc.ErrorIsNil) 141 statusInfo, err := s.application.Status() 142 c.Assert(err, jc.ErrorIsNil) 143 firstTime := statusInfo.Since 144 c.Assert(firstTime, gc.NotNil) 145 c.Assert(timeBeforeOrEqual(now, *firstTime), jc.IsTrue) 146 147 // Setting the same status a second time also updates the timestamp. 148 now = now.Add(1 * time.Second) 149 sInfo = status.StatusInfo{ 150 Status: status.Maintenance, 151 Message: "", 152 Since: &now, 153 } 154 err = s.application.SetStatus(sInfo) 155 c.Assert(err, jc.ErrorIsNil) 156 statusInfo, err = s.application.Status() 157 c.Assert(err, jc.ErrorIsNil) 158 c.Assert(timeBeforeOrEqual(*firstTime, *statusInfo.Since), jc.IsTrue) 159 }