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  }