github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/core/model/upgradeseries_test.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package model_test 5 6 import ( 7 jc "github.com/juju/testing/checkers" 8 gc "gopkg.in/check.v1" 9 10 "github.com/juju/juju/core/model" 11 "github.com/juju/juju/testing" 12 ) 13 14 type upgradeSeriesGraphSuite struct { 15 testing.BaseSuite 16 } 17 18 var _ = gc.Suite(&upgradeSeriesGraphSuite{}) 19 20 func (*upgradeSeriesGraphSuite) TestUpgradeSeriesGraphValidate(c *gc.C) { 21 graph := model.UpgradeSeriesGraph() 22 err := graph.Validate() 23 c.Assert(err, jc.ErrorIsNil) 24 } 25 26 func (*upgradeSeriesGraphSuite) TestValidate(c *gc.C) { 27 graph := model.Graph(map[model.UpgradeSeriesStatus][]model.UpgradeSeriesStatus{ 28 model.UpgradeSeriesNotStarted: { 29 model.UpgradeSeriesPrepareStarted, 30 }, 31 }) 32 err := graph.Validate() 33 c.Assert(err, gc.ErrorMatches, `vertex "not started" edge to vertex "prepare started" is not valid`) 34 } 35 36 type upgradeSeriesFSMSuite struct { 37 testing.BaseSuite 38 } 39 40 var _ = gc.Suite(&upgradeSeriesFSMSuite{}) 41 42 func (*upgradeSeriesFSMSuite) TestTransitionTo(c *gc.C) { 43 for _, t := range []struct { 44 expected model.UpgradeSeriesStatus 45 state model.UpgradeSeriesStatus 46 valid bool 47 }{ 48 { 49 expected: model.UpgradeSeriesPrepareStarted, 50 state: model.UpgradeSeriesPrepareStarted, 51 valid: true, 52 }, 53 { 54 expected: model.UpgradeSeriesNotStarted, 55 state: model.UpgradeSeriesStatus("GTFO"), 56 valid: false, 57 }, 58 } { 59 fsm, err := model.NewUpgradeSeriesFSM(model.UpgradeSeriesGraph(), model.UpgradeSeriesNotStarted) 60 c.Assert(err, jc.ErrorIsNil) 61 62 allowed := fsm.TransitionTo(t.state) 63 c.Assert(allowed, gc.Equals, t.valid) 64 c.Assert(fsm.State(), gc.Equals, t.expected) 65 } 66 } 67 68 func (*upgradeSeriesFSMSuite) TestTransitionGraph(c *gc.C) { 69 dag := model.UpgradeSeriesGraph() 70 for state, vertices := range dag { 71 c.Logf("current state %q", state) 72 73 for _, vertex := range vertices { 74 fsm, err := model.NewUpgradeSeriesFSM(dag, state) 75 c.Assert(err, jc.ErrorIsNil) 76 77 allowed := fsm.TransitionTo(vertex) 78 c.Assert(allowed, jc.IsTrue, gc.Commentf("transition %q to %q", fsm.State(), vertex)) 79 } 80 } 81 } 82 83 func (*upgradeSeriesFSMSuite) TestTransitionGraphChildren(c *gc.C) { 84 dag := model.UpgradeSeriesGraph() 85 for state, vertices := range dag { 86 c.Logf("current state %q", state) 87 88 for _, vertex := range vertices { 89 fsm, err := model.NewUpgradeSeriesFSM(dag, state) 90 c.Assert(err, jc.ErrorIsNil) 91 92 allowed := fsm.TransitionTo(vertex) 93 c.Assert(allowed, jc.IsTrue) 94 95 // Can we transition to the child vertex? 96 children := dag[vertex] 97 if len(children) == 0 { 98 continue 99 } 100 allowed = fsm.TransitionTo(children[0]) 101 c.Assert(allowed, jc.IsTrue, gc.Commentf("transition %q to %q", fsm.State(), children[0])) 102 } 103 } 104 }