code.vegaprotocol.io/vega@v0.79.0/libs/version/version_test.go (about) 1 // Copyright (C) 2023 Gobalsky Labs Limited 2 // 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU Affero General Public License as 5 // published by the Free Software Foundation, either version 3 of the 6 // License, or (at your option) any later version. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU Affero General Public License for more details. 12 // 13 // You should have received a copy of the GNU Affero General Public License 14 // along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 package version_test 17 18 import ( 19 "testing" 20 21 "code.vegaprotocol.io/vega/libs/version" 22 23 "github.com/blang/semver/v4" 24 "github.com/stretchr/testify/assert" 25 "github.com/stretchr/testify/require" 26 ) 27 28 func TestCheckVersion(t *testing.T) { 29 t.Run("Checking current version succeeds", testCheckingCurrentVersionSucceeds) 30 t.Run("Verifying unreleased version succeeds", testVerifyingUnreleasedVersionSucceeds) 31 } 32 33 func testCheckingCurrentVersionSucceeds(t *testing.T) { 34 tcs := []struct { 35 name string 36 currentVersion string 37 releases []string 38 expectedResult *semver.Version 39 }{ 40 { 41 name: "stable release against older stable releases should not update", 42 currentVersion: "v0.4.0", 43 releases: []string{"v0.2.0", "v0.3.0"}, 44 expectedResult: nil, // means no update 45 }, { 46 name: "stable release against newer stable releases should update to latest stable release", 47 currentVersion: "v0.1.0", 48 releases: []string{"v0.2.0", "v0.3.0"}, 49 expectedResult: toSemVer(t, "0.3.0"), 50 }, { 51 name: "stable release against same stable release should not update", 52 currentVersion: "v0.3.0", 53 releases: []string{"v0.2.0", "v0.3.0"}, 54 expectedResult: nil, // means no update 55 }, { 56 name: "stable against newer pre-release should update to latest stable release", 57 currentVersion: "v0.1.0", 58 releases: []string{"v0.2.0", "v0.3.0-alpha"}, 59 expectedResult: toSemVer(t, "0.2.0"), 60 }, { 61 name: "stable release against older pre-release should not update", 62 currentVersion: "v0.3.0", 63 releases: []string{"v0.2.0", "v0.3.0-alpha"}, 64 expectedResult: nil, // means no update 65 }, { 66 name: "pre-release against newer stable release should update to latest stable release", 67 currentVersion: "v0.3.0-alpha", 68 releases: []string{"v0.2.0", "v0.3.0"}, 69 expectedResult: toSemVer(t, "0.3.0"), 70 }, { 71 name: "pre-release against older stable release should not update", 72 currentVersion: "v0.4.0-alpha", 73 releases: []string{"v0.2.0", "v0.3.0"}, 74 expectedResult: nil, // means no update 75 }, { 76 name: "pre-release against newer pre-release should update to latest pre-release", 77 currentVersion: "v0.4.0-alpha", 78 releases: []string{"v0.2.0", "v0.3.0", "v0.4.0-alpha", "v0.4.0-beta"}, 79 expectedResult: toSemVer(t, "0.4.0-beta"), 80 }, { 81 name: "pre-release against same pre-release should not update", 82 currentVersion: "v0.4.0-alpha", 83 releases: []string{"v0.2.0", "v0.3.0", "v0.4.0-alpha"}, 84 expectedResult: nil, // means no update 85 }, { 86 name: "pre-release against newer pre-release separated by stable releases should update to latest stable release", 87 currentVersion: "v0.2.0-alpha", 88 releases: []string{"v0.2.0-alpha", "v0.2.0", "v0.3.0-alpha", "v0.3.0", "v0.3.1", "v0.4.0-alpha"}, 89 expectedResult: toSemVer(t, "0.3.1"), 90 }, { 91 name: "pre-release against newer development pre-release should not update", 92 currentVersion: "v0.4.0-alpha", 93 releases: []string{"v0.2.0", "v0.3.0", "v0.4.0-alpha+dev"}, 94 expectedResult: nil, // means no update 95 }, { 96 name: "development pre-release against non-development pre-release should update to non-development pre-release", 97 currentVersion: "v0.4.0-alpha+dev", 98 releases: []string{"v0.2.0", "v0.3.0", "v0.4.0-alpha"}, 99 expectedResult: toSemVer(t, "0.4.0-alpha"), 100 }, { 101 name: "development pre-release against newer pre-release should update to latest pre-release", 102 currentVersion: "v0.4.0-alpha+dev", 103 releases: []string{"v0.2.0", "v0.3.0", "v0.4.0-alpha", "v0.4.0-beta"}, 104 expectedResult: toSemVer(t, "0.4.0-beta"), 105 }, 106 } 107 108 for _, tc := range tcs { 109 t.Run(tc.name, func(tt *testing.T) { 110 // given 111 releasesGetter := func() ([]*version.Version, error) { 112 versions := make([]*version.Version, 0, len(tc.releases)) 113 for _, release := range tc.releases { 114 fromString, err := version.NewVersionFromString(release) 115 if err != nil { 116 tt.Fatalf("couldn't format version \"%s\" for test", release) 117 } 118 versions = append(versions, fromString) 119 } 120 return versions, nil 121 } 122 123 // when 124 newerVersion, err := version.Check(releasesGetter, tc.currentVersion) 125 126 // then 127 require.NoError(tt, err) 128 assert.Equal(tt, tc.expectedResult, newerVersion) 129 }) 130 } 131 } 132 133 func testVerifyingUnreleasedVersionSucceeds(t *testing.T) { 134 tcs := []struct { 135 name string 136 version string 137 isUnreleased bool 138 }{ 139 { 140 name: "stable version is not unreleased", 141 version: "0.1.0", 142 isUnreleased: false, 143 }, { 144 name: "pre-release version is unreleased", 145 version: "0.1.0-pre", 146 isUnreleased: true, 147 }, { 148 name: "development build on stable version is unreleased", 149 version: "0.1.0+dev", 150 isUnreleased: true, 151 }, { 152 name: "development pre-release version is unreleased", 153 version: "0.1.0-alpha+dev", 154 isUnreleased: true, 155 }, { 156 name: "annotated build on pre-release version is unreleased", 157 version: "0.1.0-alpha+12345", 158 isUnreleased: true, 159 }, { 160 name: "non-semver version is unreleased", 161 version: "test", 162 isUnreleased: true, 163 }, 164 } 165 166 for _, tc := range tcs { 167 t.Run(tc.name, func(tt *testing.T) { 168 // when 169 isUnreleased := version.IsUnreleased(tc.version) 170 171 // then 172 assert.Equal(tt, tc.isUnreleased, isUnreleased) 173 }) 174 } 175 } 176 177 func toSemVer(t *testing.T, s string) *semver.Version { 178 t.Helper() 179 expectVersion, err := semver.New(s) 180 if err != nil { 181 t.Fatalf("couldn't parse the semver: %v", err) 182 } 183 return expectVersion 184 }