github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/featuretests/api_meterstatus_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package featuretests 5 6 import ( 7 "time" 8 9 jc "github.com/juju/testing/checkers" 10 "github.com/juju/utils/v3" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/api/agent/meterstatus" 14 "github.com/juju/juju/core/watcher/watchertest" 15 jujutesting "github.com/juju/juju/juju/testing" 16 "github.com/juju/juju/state" 17 ) 18 19 type meterStatusIntegrationSuite struct { 20 jujutesting.JujuConnSuite 21 22 status meterstatus.MeterStatusClient 23 unit *state.Unit 24 } 25 26 func (s *meterStatusIntegrationSuite) SetUpTest(c *gc.C) { 27 s.JujuConnSuite.SetUpTest(c) 28 s.unit = s.Factory.MakeUnit(c, nil) 29 30 password, err := utils.RandomPassword() 31 c.Assert(err, jc.ErrorIsNil) 32 err = s.unit.SetPassword(password) 33 c.Assert(err, jc.ErrorIsNil) 34 state := s.OpenAPIAs(c, s.unit.UnitTag(), password) 35 s.status = meterstatus.NewClient(state, s.unit.UnitTag()) 36 c.Assert(s.status, gc.NotNil) 37 38 // Ask for the MetricsManager as part of setup, so the metrics 39 // document is created before any of the tests care. 40 _, err = s.State.MetricsManager() 41 c.Assert(err, jc.ErrorIsNil) 42 43 // Ensure that all the creation events have flowed through the system. 44 s.WaitForModelWatchersIdle(c, s.Model.UUID()) 45 } 46 47 func (s *meterStatusIntegrationSuite) TestMeterStatus(c *gc.C) { 48 code, info, err := s.status.MeterStatus() 49 c.Assert(err, jc.ErrorIsNil) 50 c.Assert(code, gc.Equals, "AMBER") 51 c.Assert(info, gc.Equals, "not set") 52 53 err = s.unit.SetMeterStatus("RED", "some status") 54 c.Assert(err, jc.ErrorIsNil) 55 56 code, info, err = s.status.MeterStatus() 57 c.Assert(err, jc.ErrorIsNil) 58 c.Assert(code, gc.Equals, "RED") 59 c.Assert(info, gc.Equals, "some status") 60 } 61 62 func (s *meterStatusIntegrationSuite) TestWatchMeterStatus(c *gc.C) { 63 w, err := s.status.WatchMeterStatus() 64 c.Assert(err, jc.ErrorIsNil) 65 wc := watchertest.NewNotifyWatcherC(c, w) 66 defer wc.AssertStops() 67 68 // Initial event. 69 wc.AssertOneChange() 70 71 err = s.unit.SetMeterStatus("AMBER", "ok") 72 c.Assert(err, jc.ErrorIsNil) 73 wc.AssertOneChange() 74 75 // Non-change is not reported. 76 err = s.unit.SetMeterStatus("AMBER", "ok") 77 c.Assert(err, jc.ErrorIsNil) 78 wc.AssertNoChange() 79 80 mm, err := s.State.MetricsManager() 81 c.Assert(err, jc.ErrorIsNil) 82 err = mm.SetLastSuccessfulSend(time.Now()) 83 c.Assert(err, jc.ErrorIsNil) 84 wc.AssertOneChange() 85 86 // meter status does not change on every failed 87 // attempt to send metrics - on three consecutive 88 // fails, we get a meter status change 89 err = mm.IncrementConsecutiveErrors() 90 c.Assert(err, jc.ErrorIsNil) 91 92 err = mm.IncrementConsecutiveErrors() 93 c.Assert(err, jc.ErrorIsNil) 94 95 err = mm.IncrementConsecutiveErrors() 96 c.Assert(err, jc.ErrorIsNil) 97 98 wc.AssertOneChange() 99 }