constellation/internal/compatibility/compatibility_test.go
Otto Bittner c275464634 cli: change upgrade-plan to upgrade-check
Upgrade check is used to find updates for the current cluster.
Optionally the found upgrades can be persisted to the config
for consumption by the upgrade-execute cmd.
The old `upgrade execute` in this commit does not work with
the new `upgrade plan`.
The current versions are read from the cluster.
Supported versions are read from the cli and the versionsapi.
Adds a new config field MicroserviceVersion that will be used
by `upgrade execute` to update the service versions.
The field is optional until 2.7
A deprecation warning for the upgrade key is printed during
config validation.
Kubernetes versions now specify the patch version to make it
explicit for users if an upgrade changes the k8s version.
2023-02-08 12:30:01 +01:00

266 lines
5.1 KiB
Go

/*
Copyright (c) Edgeless Systems GmbH
SPDX-License-Identifier: AGPL-3.0-only
*/
package compatibility
import (
"testing"
"github.com/edgelesssys/constellation/v2/internal/constants"
"github.com/stretchr/testify/assert"
)
func TestFilterNewerVersion(t *testing.T) {
imageList := []string{
"v0.0.0",
"v1.0.0",
"v1.0.1",
"v1.0.2",
"v1.1.0",
}
testCases := map[string]struct {
images []string
version string
wantImages []string
}{
"filters <= v1.0.0": {
images: imageList,
version: "v1.0.0",
wantImages: []string{
"v1.0.1",
"v1.0.2",
"v1.1.0",
},
},
"no compatible images": {
images: imageList,
version: "v999.999.999",
},
}
for name, tc := range testCases {
t.Run(name, func(t *testing.T) {
assert := assert.New(t)
compatibleImages := FilterNewerVersion(tc.version, tc.images)
assert.EqualValues(tc.wantImages, compatibleImages)
})
}
}
func TestNextMinorVersion(t *testing.T) {
testCases := map[string]struct {
version string
wantNextMinorVersion string
wantErr bool
}{
"gets next": {
version: "v1.0.0",
wantNextMinorVersion: "v1.1",
},
"gets next from minor version": {
version: "v1.0",
wantNextMinorVersion: "v1.1",
},
"empty version": {
wantErr: true,
},
}
for name, tc := range testCases {
t.Run(name, func(t *testing.T) {
assert := assert.New(t)
gotNext, err := NextMinorVersion(tc.version)
if tc.wantErr {
assert.Error(err)
return
}
assert.NoError(err)
assert.Equal(tc.wantNextMinorVersion, gotNext)
})
}
}
func TestCLIWith(t *testing.T) {
testCases := map[string]struct {
cli string
target string
wantError bool
}{
"success": {
cli: "v0.0.0",
target: "v0.0.0",
},
"different major version": {
cli: "v1",
target: "v2",
wantError: true,
},
"major version diff too large": {
cli: "v1.0",
target: "v1.2",
wantError: true,
},
"a has to be the newer version": {
cli: "v2.4.0",
target: "v2.5.0",
wantError: true,
},
"pre prelease version ordering is correct": {
cli: "v2.5.0-pre",
target: "v2.4.0",
},
"pre prelease version ordering is correct #2": {
cli: "v2.4.0",
target: "v2.5.0-pre",
wantError: true,
},
"pre release versions match": {
cli: "v2.6.0-pre",
target: "v2.6.0-pre",
},
"pseudo version is newer than first pre release": {
cli: "v2.6.0-pre",
target: "v2.6.0-pre.0.20230125085856-aaaaaaaaaaaa",
wantError: true,
},
}
for name, tc := range testCases {
t.Run(name, func(t *testing.T) {
assert := assert.New(t)
constants.VersionInfo = tc.cli
err := BinaryWith(tc.target)
if tc.wantError {
assert.Error(err)
return
}
assert.NoError(err)
})
}
}
func TestIsValidUpgrade(t *testing.T) {
testCases := map[string]struct {
a string
b string
wantError bool
}{
"success": {
a: "v0.0.0",
b: "v0.1.0",
},
"different major version": {
a: "v1",
b: "v2",
wantError: true,
},
"minor version diff too large": {
a: "v1.0",
b: "v1.2",
wantError: true,
},
"b has to be the newer version": {
a: "v2.5.0",
b: "v2.4.0",
wantError: true,
},
"pre prelease version ordering is correct": {
a: "v2.4.0",
b: "v2.5.0-pre",
},
"wrong pre release ordering creates error": {
a: "v2.5.0-pre",
b: "v2.4.0",
wantError: true,
},
"pre release versions are equal": {
a: "v2.6.0-pre",
b: "v2.6.0-pre",
wantError: true,
},
"pseudo version is newer than first pre release": {
a: "v2.6.0-pre.0.20230125085856-aaaaaaaaaaaa",
b: "v2.6.0-pre",
wantError: true,
},
}
for name, tc := range testCases {
t.Run(name, func(t *testing.T) {
assert := assert.New(t)
err := IsValidUpgrade(tc.a, tc.b)
if tc.wantError {
assert.Error(err)
return
}
assert.NoError(err)
})
}
}
func TestParseCanonicalSemver(t *testing.T) {
testCases := map[string]struct {
version string
major int
minor int
wantError bool
}{
"canonical input": {
version: "v1.1.1",
major: 1,
minor: 1,
},
"vMAJOR.MINOR input": {
version: "v1.1",
major: 1,
minor: 1,
},
"vMAJOR input": {
version: "v1",
major: 1,
minor: 0,
},
"invalid (go)semver": {
version: "1.1", // valid semver, but invalid according to go's semver
wantError: true,
},
"invalid (go)semver #2": {
version: "asdf",
wantError: true,
},
"invalid (go)semver #3": {
version: "v1.1.1.1.1",
wantError: true,
},
"pseudoversion": {
version: "v2.6.0-pre.0.20230125085856-aaaaaaaaaaaa",
major: 2,
minor: 6,
},
}
for name, tc := range testCases {
t.Run(name, func(t *testing.T) {
assert := assert.New(t)
major, minor, err := parseCanonicalSemver(tc.version)
if tc.wantError {
assert.Error(err)
return
}
assert.NoError(err)
assert.Equal(tc.major, major)
assert.Equal(tc.minor, minor)
})
}
}