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  }