github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/state/status_util_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 "regexp" 8 "time" 9 10 "github.com/juju/clock" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/core/status" 15 "github.com/juju/juju/state" 16 ) 17 18 type statusSetter interface { 19 SetStatus(status.StatusInfo) error 20 } 21 22 func primeStatusHistory(c *gc.C, clock clock.Clock, entity statusSetter, 23 statusVal status.Status, count int, nextData func(int) map[string]interface{}, delta time.Duration, info string) { 24 now := clock.Now().Add(-delta) 25 for i := 0; i < count; i++ { 26 c.Logf("setting status for %v", entity) 27 data := nextData(i) 28 t := now.Add(time.Duration(i) * time.Second) 29 s := status.StatusInfo{ 30 Status: statusVal, 31 Message: info, 32 Data: data, 33 Since: &t, 34 } 35 err := entity.SetStatus(s) 36 c.Assert(err, jc.ErrorIsNil) 37 } 38 } 39 40 func checkInitialWorkloadStatus(c *gc.C, statusInfo status.StatusInfo) { 41 c.Check(statusInfo.Status, gc.Equals, status.Waiting) 42 c.Check(statusInfo.Message, gc.Equals, "waiting for machine") 43 c.Check(statusInfo.Data, gc.HasLen, 0) 44 c.Check(statusInfo.Since, gc.NotNil) 45 } 46 47 func primeUnitStatusHistory(c *gc.C, clock clock.Clock, unit *state.Unit, count int, delta time.Duration) { 48 primeStatusHistory(c, clock, unit, status.Active, count, func(i int) map[string]interface{} { 49 return map[string]interface{}{"$foo": i, "$delta": delta} 50 }, delta, "") 51 } 52 53 func checkPrimedUnitStatus(c *gc.C, statusInfo status.StatusInfo, expect int, expectDelta time.Duration) { 54 c.Check(statusInfo.Status, gc.Equals, status.Active) 55 c.Check(statusInfo.Message, gc.Equals, "") 56 c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{"$foo": expect, "$delta": int64(expectDelta)}) 57 c.Check(statusInfo.Since, gc.NotNil) 58 } 59 60 func checkInitialUnitAgentStatus(c *gc.C, statusInfo status.StatusInfo) { 61 c.Check(statusInfo.Status, gc.Equals, status.Allocating) 62 c.Check(statusInfo.Message, gc.Equals, "") 63 c.Check(statusInfo.Data, gc.HasLen, 0) 64 c.Assert(statusInfo.Since, gc.NotNil) 65 } 66 67 func primeUnitAgentStatusHistory(c *gc.C, clock clock.Clock, agent *state.UnitAgent, count int, delta time.Duration, info string) { 68 primeStatusHistory(c, clock, agent, status.Executing, count, func(i int) map[string]interface{} { 69 return map[string]interface{}{"$bar": i, "$delta": delta} 70 }, delta, info) 71 } 72 73 func checkPrimedUnitAgentStatus(c *gc.C, statusInfo status.StatusInfo, expect int, expectDelta time.Duration) { 74 checkPrimedUnitAgentStatusWithCustomMessage(c, statusInfo, expect, expectDelta, "") 75 } 76 77 func checkPrimedUnitAgentStatusWithCustomMessage(c *gc.C, statusInfo status.StatusInfo, expect int, expectDelta time.Duration, info string) { 78 c.Check(statusInfo.Message, gc.Equals, info) 79 c.Check(statusInfo.Status, gc.Equals, status.Executing) 80 c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{"$bar": expect, "$delta": int64(expectDelta)}) 81 c.Check(statusInfo.Since, gc.NotNil) 82 } 83 84 func checkPrimedUnitAgentStatusWithRegexMessage(c *gc.C, statusInfo status.StatusInfo, message *regexp.Regexp) { 85 c.Check(message.MatchString(statusInfo.Message), jc.IsTrue) 86 c.Check(statusInfo.Status, gc.Equals, status.Executing) 87 c.Check(statusInfo.Since, gc.NotNil) 88 }