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  }