github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/api/facadeversions_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package api_test
     5  
     6  import (
     7  	"github.com/juju/collections/set"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/api"
    12  	"github.com/juju/juju/apiserver"
    13  	"github.com/juju/juju/core/facades"
    14  	coretesting "github.com/juju/juju/testing"
    15  )
    16  
    17  type facadeVersionSuite struct {
    18  	coretesting.BaseSuite
    19  }
    20  
    21  var _ = gc.Suite(&facadeVersionSuite{})
    22  
    23  func (s *facadeVersionSuite) TestFacadeVersionsMatchServerVersions(c *gc.C) {
    24  	// The client side code doesn't want to directly import the server side
    25  	// code just to list out what versions are available. However, we do
    26  	// want to make sure that the two sides are kept in sync.
    27  	clientFacadeNames := set.NewStrings()
    28  	for name, versions := range api.SupportedFacadeVersions() {
    29  		clientFacadeNames.Add(name)
    30  		// All versions should now be non-zero.
    31  		c.Check(set.NewInts(versions...).Contains(0), jc.IsFalse)
    32  	}
    33  	allServerFacades := apiserver.AllFacades().List()
    34  	serverFacadeNames := set.NewStrings()
    35  	serverFacadeBestVersions := make(facades.FacadeVersions, len(allServerFacades))
    36  	for _, facade := range allServerFacades {
    37  		serverFacadeNames.Add(facade.Name)
    38  		serverFacadeBestVersions[facade.Name] = facade.Versions
    39  	}
    40  	// First check that both sides know about all the same versions
    41  	c.Check(serverFacadeNames.Difference(clientFacadeNames).SortedValues(), gc.HasLen, 0)
    42  	c.Check(clientFacadeNames.Difference(serverFacadeNames).SortedValues(), gc.HasLen, 0)
    43  	// Next check that the best versions match
    44  	c.Check(api.SupportedFacadeVersions(), jc.DeepEquals, serverFacadeBestVersions)
    45  }
    46  
    47  func checkBestVersion(c *gc.C, desiredVersion, versions []int, expectedVersion int) {
    48  	resultVersion := facades.BestVersion(desiredVersion, versions)
    49  	c.Check(resultVersion, gc.Equals, expectedVersion)
    50  }
    51  
    52  func (*facadeVersionSuite) TestBestVersionDesiredAvailable(c *gc.C) {
    53  	checkBestVersion(c, []int{0}, []int{0, 1, 2}, 0)
    54  	checkBestVersion(c, []int{0, 1}, []int{0, 1, 2}, 1)
    55  	checkBestVersion(c, []int{0, 1, 2}, []int{0, 1, 2}, 2)
    56  }
    57  
    58  func (*facadeVersionSuite) TestBestVersionDesiredNewer(c *gc.C) {
    59  	checkBestVersion(c, []int{1, 2, 3}, []int{0}, 0)
    60  	checkBestVersion(c, []int{1, 2, 3}, []int{0, 1, 2}, 2)
    61  }
    62  
    63  func (*facadeVersionSuite) TestBestVersionDesiredGap(c *gc.C) {
    64  	checkBestVersion(c, []int{1}, []int{0, 2}, 0)
    65  }
    66  
    67  func (*facadeVersionSuite) TestBestVersionNoVersions(c *gc.C) {
    68  	checkBestVersion(c, []int{0}, []int{}, 0)
    69  	checkBestVersion(c, []int{1}, []int{}, 0)
    70  	checkBestVersion(c, []int{0}, []int(nil), 0)
    71  	checkBestVersion(c, []int{1}, []int(nil), 0)
    72  }
    73  
    74  func (*facadeVersionSuite) TestBestVersionNotSorted(c *gc.C) {
    75  	checkBestVersion(c, []int{0}, []int{0, 3, 1, 2}, 0)
    76  	checkBestVersion(c, []int{3}, []int{0, 3, 1, 2}, 3)
    77  	checkBestVersion(c, []int{1}, []int{0, 3, 1, 2}, 1)
    78  	checkBestVersion(c, []int{2}, []int{0, 3, 1, 2}, 2)
    79  }
    80  
    81  func (s *facadeVersionSuite) TestBestFacadeVersionExactMatch(c *gc.C) {
    82  	s.PatchValue(api.FacadeVersions, map[string]facades.FacadeVersion{"Client": {1}})
    83  	st := api.NewTestingState(api.TestingStateParams{
    84  		FacadeVersions: map[string][]int{
    85  			"Client": {0, 1},
    86  		}})
    87  	c.Check(st.BestFacadeVersion("Client"), gc.Equals, 1)
    88  }
    89  
    90  func (s *facadeVersionSuite) TestBestFacadeVersionNewerServer(c *gc.C) {
    91  	s.PatchValue(api.FacadeVersions, map[string]facades.FacadeVersion{"Client": {1}})
    92  	st := api.NewTestingState(api.TestingStateParams{
    93  		FacadeVersions: map[string][]int{
    94  			"Client": {0, 1, 2},
    95  		}})
    96  	c.Check(st.BestFacadeVersion("Client"), gc.Equals, 1)
    97  }
    98  
    99  func (s *facadeVersionSuite) TestBestFacadeVersionNewerClient(c *gc.C) {
   100  	s.PatchValue(api.FacadeVersions, map[string]facades.FacadeVersion{"Client": {1, 2}})
   101  	st := api.NewTestingState(api.TestingStateParams{
   102  		FacadeVersions: map[string][]int{
   103  			"Client": {0, 1},
   104  		}})
   105  	c.Check(st.BestFacadeVersion("Client"), gc.Equals, 1)
   106  }
   107  
   108  func (s *facadeVersionSuite) TestBestFacadeVersionServerUnknown(c *gc.C) {
   109  	s.PatchValue(api.FacadeVersions, map[string]facades.FacadeVersion{"TestingAPI": {1, 2}})
   110  	st := api.NewTestingState(api.TestingStateParams{
   111  		FacadeVersions: map[string][]int{
   112  			"Client": {0, 1},
   113  		}})
   114  	c.Check(st.BestFacadeVersion("TestingAPI"), gc.Equals, 0)
   115  }