github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/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 jc "github.com/juju/testing/checkers" 8 "github.com/juju/utils/set" 9 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/api" 12 "github.com/juju/juju/apiserver/common" 13 "github.com/juju/juju/component/all" 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, version := range *api.FacadeVersions { 29 clientFacadeNames.Add(name) 30 // All versions should now be non-zero. 31 c.Check(version, jc.GreaterThan, 0) 32 } 33 // Register the components. 34 all.RegisterForServer() 35 allServerFacades := common.Facades.List() 36 serverFacadeNames := set.NewStrings() 37 serverFacadeBestVersions := make(map[string]int, len(allServerFacades)) 38 for _, facade := range allServerFacades { 39 serverFacadeNames.Add(facade.Name) 40 serverFacadeBestVersions[facade.Name] = facade.Versions[len(facade.Versions)-1] 41 } 42 // First check that both sides know about all the same versions 43 c.Check(serverFacadeNames.Difference(clientFacadeNames).SortedValues(), gc.HasLen, 0) 44 c.Check(clientFacadeNames.Difference(serverFacadeNames).SortedValues(), gc.HasLen, 0) 45 // Next check that the best versions match 46 c.Check(*api.FacadeVersions, jc.DeepEquals, serverFacadeBestVersions) 47 } 48 49 func checkBestVersion(c *gc.C, desiredVersion int, versions []int, expectedVersion int) { 50 resultVersion := api.BestVersion(desiredVersion, versions) 51 c.Check(resultVersion, gc.Equals, expectedVersion) 52 } 53 54 func (*facadeVersionSuite) TestBestVersionDesiredAvailable(c *gc.C) { 55 checkBestVersion(c, 0, []int{0, 1, 2}, 0) 56 checkBestVersion(c, 1, []int{0, 1, 2}, 1) 57 checkBestVersion(c, 2, []int{0, 1, 2}, 2) 58 } 59 60 func (*facadeVersionSuite) TestBestVersionDesiredNewer(c *gc.C) { 61 checkBestVersion(c, 3, []int{0}, 0) 62 checkBestVersion(c, 3, []int{0, 1, 2}, 2) 63 } 64 65 func (*facadeVersionSuite) TestBestVersionDesiredGap(c *gc.C) { 66 checkBestVersion(c, 1, []int{0, 2}, 0) 67 } 68 69 func (*facadeVersionSuite) TestBestVersionNoVersions(c *gc.C) { 70 checkBestVersion(c, 0, []int{}, 0) 71 checkBestVersion(c, 1, []int{}, 0) 72 checkBestVersion(c, 0, []int(nil), 0) 73 checkBestVersion(c, 1, []int(nil), 0) 74 } 75 76 func (*facadeVersionSuite) TestBestVersionNotSorted(c *gc.C) { 77 checkBestVersion(c, 0, []int{0, 3, 1, 2}, 0) 78 checkBestVersion(c, 3, []int{0, 3, 1, 2}, 3) 79 checkBestVersion(c, 1, []int{0, 3, 1, 2}, 1) 80 checkBestVersion(c, 2, []int{0, 3, 1, 2}, 2) 81 } 82 83 func (s *facadeVersionSuite) TestBestFacadeVersionExactMatch(c *gc.C) { 84 s.PatchValue(api.FacadeVersions, map[string]int{"Client": 1}) 85 st := api.NewTestingState(api.TestingStateParams{ 86 FacadeVersions: map[string][]int{ 87 "Client": {0, 1}, 88 }}) 89 c.Check(st.BestFacadeVersion("Client"), gc.Equals, 1) 90 } 91 92 func (s *facadeVersionSuite) TestBestFacadeVersionNewerServer(c *gc.C) { 93 s.PatchValue(api.FacadeVersions, map[string]int{"Client": 1}) 94 st := api.NewTestingState(api.TestingStateParams{ 95 FacadeVersions: map[string][]int{ 96 "Client": {0, 1, 2}, 97 }}) 98 c.Check(st.BestFacadeVersion("Client"), gc.Equals, 1) 99 } 100 101 func (s *facadeVersionSuite) TestBestFacadeVersionNewerClient(c *gc.C) { 102 s.PatchValue(api.FacadeVersions, map[string]int{"Client": 2}) 103 st := api.NewTestingState(api.TestingStateParams{ 104 FacadeVersions: map[string][]int{ 105 "Client": {0, 1}, 106 }}) 107 c.Check(st.BestFacadeVersion("Client"), gc.Equals, 1) 108 } 109 110 func (s *facadeVersionSuite) TestBestFacadeVersionServerUnknown(c *gc.C) { 111 s.PatchValue(api.FacadeVersions, map[string]int{"TestingAPI": 2}) 112 st := api.NewTestingState(api.TestingStateParams{ 113 FacadeVersions: map[string][]int{ 114 "Client": {0, 1}, 115 }}) 116 c.Check(st.BestFacadeVersion("TestingAPI"), gc.Equals, 0) 117 }