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  }