github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/state/upgrades_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package state
     5  
     6  import (
     7  	"github.com/juju/mgo/v3"
     8  	"github.com/juju/mgo/v3/bson"
     9  	jc "github.com/juju/testing/checkers"
    10  	"github.com/juju/utils/v3"
    11  	"github.com/kr/pretty"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/storage/provider"
    15  	coretesting "github.com/juju/juju/testing"
    16  )
    17  
    18  type upgradesSuite struct {
    19  	internalStateSuite
    20  }
    21  
    22  var _ = gc.Suite(&upgradesSuite{})
    23  
    24  //nolint:unused
    25  type expectUpgradedData struct {
    26  	coll     *mgo.Collection
    27  	expected []bson.M
    28  	filter   bson.D
    29  }
    30  
    31  //nolint:unused
    32  func upgradedData(coll *mgo.Collection, expected []bson.M) expectUpgradedData {
    33  	return expectUpgradedData{
    34  		coll:     coll,
    35  		expected: expected,
    36  	}
    37  }
    38  
    39  //nolint:unused
    40  func (s *upgradesSuite) assertUpgradedData(c *gc.C, upgrade func(*StatePool) error, expect ...expectUpgradedData) {
    41  	// Two rounds to check idempotency.
    42  	for i := 0; i < 2; i++ {
    43  		c.Logf("Run: %d", i)
    44  		err := upgrade(s.pool)
    45  		c.Assert(err, jc.ErrorIsNil)
    46  
    47  		for _, expect := range expect {
    48  			var docs []bson.M
    49  			err = expect.coll.Find(expect.filter).Sort("_id").All(&docs)
    50  			c.Assert(err, jc.ErrorIsNil)
    51  			for i, d := range docs {
    52  				doc := d
    53  				delete(doc, "txn-queue")
    54  				delete(doc, "txn-revno")
    55  				delete(doc, "version")
    56  				docs[i] = doc
    57  			}
    58  			c.Assert(docs, jc.DeepEquals, expect.expected,
    59  				gc.Commentf("differences: %s", pretty.Diff(docs, expect.expected)))
    60  		}
    61  	}
    62  }
    63  
    64  //nolint:unused
    65  func (s *upgradesSuite) makeModel(c *gc.C, name string, attr coretesting.Attrs) *State {
    66  	uuid := utils.MustNewUUID()
    67  	cfg := coretesting.CustomModelConfig(c, coretesting.Attrs{
    68  		"name": name,
    69  		"uuid": uuid.String(),
    70  	}.Merge(attr))
    71  	m, err := s.state.Model()
    72  	c.Assert(err, jc.ErrorIsNil)
    73  	_, st, err := s.controller.NewModel(ModelArgs{
    74  		Type:                    ModelTypeIAAS,
    75  		CloudName:               "dummy",
    76  		CloudRegion:             "dummy-region",
    77  		Config:                  cfg,
    78  		Owner:                   m.Owner(),
    79  		StorageProviderRegistry: provider.CommonStorageProviders(),
    80  	})
    81  	c.Assert(err, jc.ErrorIsNil)
    82  	return st
    83  }