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 }