mirror of
https://github.com/gravitational/teleport
synced 2024-10-21 01:34:01 +00:00
279 lines
6.3 KiB
Go
279 lines
6.3 KiB
Go
/*
|
|
Copyright 2022 Gravitational, Inc.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package versioncontrol
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestSecurityPatchAlts(t *testing.T) {
|
|
tts := []struct {
|
|
desc string
|
|
a, b Target
|
|
alt bool
|
|
}{
|
|
{
|
|
desc: "basic alt case",
|
|
a: NewTarget("v1.2.3", SecurityPatch(true), SecurityPatchAlts("v1.2.2", "v1.2.1")),
|
|
b: NewTarget("v1.2.1"),
|
|
alt: true,
|
|
},
|
|
{
|
|
desc: "minimal alt case",
|
|
a: NewTarget("v1.2.3", SecurityPatchAlts("v1.2.1")),
|
|
b: NewTarget("v1.2.1"),
|
|
alt: true,
|
|
},
|
|
{
|
|
desc: "trivial non-alt case",
|
|
a: NewTarget("v1.2.3"),
|
|
b: NewTarget("v1.2.1"),
|
|
alt: false,
|
|
},
|
|
{
|
|
desc: "non-matching non-alt case case",
|
|
a: NewTarget("v1.2.3", SecurityPatchAlts("v1.2.2")),
|
|
b: NewTarget("v1.2.1"),
|
|
alt: false,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tts {
|
|
// check alt status is expected
|
|
require.Equal(t, tt.alt, tt.a.SecurityPatchAltOf(tt.b), "desc=%q", tt.desc)
|
|
// check alt status is bidirectional
|
|
require.Equal(t, tt.alt, tt.b.SecurityPatchAltOf(tt.a), "desc=%q", tt.desc)
|
|
}
|
|
}
|
|
|
|
func TestVisitorBasics(t *testing.T) {
|
|
tts := []struct {
|
|
versions []string
|
|
newest string
|
|
oldest string
|
|
notNewerThan string
|
|
permitPrerelease bool
|
|
desc string
|
|
}{
|
|
{
|
|
versions: []string{
|
|
"v1.2.3",
|
|
"v2.3.4-alpha.1",
|
|
},
|
|
newest: "v1.2.3",
|
|
oldest: "v1.2.3",
|
|
desc: "one stable release",
|
|
},
|
|
{
|
|
versions: []string{
|
|
"v1.2.3",
|
|
"v2.3.4",
|
|
"v2.2.2",
|
|
"v3.5.7",
|
|
"invalid",
|
|
"v0.0.1-alpha.2",
|
|
},
|
|
newest: "v3.5.7",
|
|
oldest: "v1.2.3",
|
|
desc: "mixed releases",
|
|
},
|
|
{
|
|
versions: []string{
|
|
"invalid",
|
|
"12356",
|
|
"127.0.0.1:8080",
|
|
},
|
|
desc: "all invalid",
|
|
},
|
|
{
|
|
versions: []string{
|
|
"v3.4.5-alpha.1",
|
|
"v3.4.4",
|
|
"v0.1.2-alpha.2",
|
|
"v0.1.11",
|
|
},
|
|
newest: "v3.4.5-alpha.1",
|
|
oldest: "v0.1.2-alpha.2",
|
|
permitPrerelease: true,
|
|
desc: "prerelease on",
|
|
},
|
|
{
|
|
versions: []string{
|
|
"v3.4.5-alpha.1",
|
|
"v3.4.4",
|
|
"v0.1.2-alpha.2",
|
|
"v0.1.11",
|
|
},
|
|
newest: "v3.4.4",
|
|
oldest: "v0.1.11",
|
|
permitPrerelease: false,
|
|
desc: "prerelease off",
|
|
},
|
|
{
|
|
versions: []string{
|
|
"v3.4.5-alpha.1",
|
|
"v3.4.4",
|
|
"v0.1.12-alpha.2",
|
|
"v0.1.2",
|
|
},
|
|
newest: "v3.4.5-alpha.1",
|
|
oldest: "v0.1.2",
|
|
permitPrerelease: true,
|
|
desc: "prerelease on (mixed)",
|
|
},
|
|
{
|
|
versions: []string{
|
|
"v1.2.3",
|
|
"v3.4.5",
|
|
"v1.1.1",
|
|
"v2.2.2",
|
|
"v2.1.0",
|
|
},
|
|
notNewerThan: "v2.1.1",
|
|
newest: "v2.1.0",
|
|
oldest: "v1.1.1",
|
|
desc: "not newer than",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tts {
|
|
visitor := Visitor{
|
|
PermitPrerelease: tt.permitPrerelease,
|
|
NotNewerThan: NewTarget(tt.notNewerThan),
|
|
}
|
|
|
|
for _, v := range tt.versions {
|
|
visitor.Visit(Target{LabelVersion: v})
|
|
}
|
|
|
|
require.Equal(t, tt.newest, visitor.Newest().Version(), tt.desc)
|
|
require.Equal(t, tt.oldest, visitor.Oldest().Version(), tt.desc)
|
|
}
|
|
}
|
|
|
|
func TestVisitorRelative(t *testing.T) {
|
|
tts := []struct {
|
|
current Target
|
|
targets []Target
|
|
nextMajor Target
|
|
newestCurrent Target
|
|
newestSec Target
|
|
notNewerThan Target
|
|
desc string
|
|
}{
|
|
{
|
|
current: NewTarget("v1.2.3"),
|
|
targets: []Target{
|
|
NewTarget("v1.3.5", SecurityPatch(true)),
|
|
NewTarget("v2.3.4"),
|
|
NewTarget("v2", SecurityPatch(true)),
|
|
NewTarget("v0.1", SecurityPatch(true)),
|
|
NewTarget("v2.4.2"),
|
|
NewTarget("v1.4.4"),
|
|
NewTarget("v3.4.5"),
|
|
},
|
|
nextMajor: NewTarget("v2.4.2"),
|
|
newestCurrent: NewTarget("v1.4.4"),
|
|
newestSec: NewTarget("v1.3.5", SecurityPatch(true)),
|
|
desc: "broad test case",
|
|
},
|
|
{
|
|
targets: []Target{
|
|
NewTarget("v1.3.5", SecurityPatch(true)),
|
|
NewTarget("v2.3.4"),
|
|
NewTarget("v2", SecurityPatch(true)),
|
|
NewTarget("v0.1", SecurityPatch(true)),
|
|
NewTarget("v2.4.2"),
|
|
NewTarget("v1.4.4"),
|
|
},
|
|
desc: "no current target specified",
|
|
},
|
|
{
|
|
current: NewTarget("v1.2.3"),
|
|
targets: []Target{
|
|
NewTarget("v1.1"),
|
|
NewTarget("v1", SecurityPatch(true)),
|
|
NewTarget("v0.1"),
|
|
},
|
|
newestCurrent: NewTarget("v1.1"),
|
|
newestSec: NewTarget("v1", SecurityPatch(true)),
|
|
desc: "older targets",
|
|
},
|
|
{
|
|
current: NewTarget("v3.5.6"),
|
|
targets: []Target{
|
|
NewTarget("v1.2.3"),
|
|
NewTarget("v2.3.4", SecurityPatch(true)),
|
|
NewTarget("v0.1.2"),
|
|
},
|
|
desc: "too old",
|
|
},
|
|
{
|
|
current: NewTarget("v1.2.3"),
|
|
targets: []Target{
|
|
NewTarget("v3.4.5"),
|
|
NewTarget("v3", SecurityPatch(true)),
|
|
NewTarget("v12.13.14"),
|
|
},
|
|
desc: "too new",
|
|
},
|
|
{
|
|
current: NewTarget("v9"),
|
|
targets: []Target{
|
|
NewTarget("v10.0.1"),
|
|
NewTarget("v10", SecurityPatch(true)),
|
|
NewTarget("v9.0.1"),
|
|
NewTarget("v9", SecurityPatch(true)),
|
|
},
|
|
nextMajor: NewTarget("v10.0.1"),
|
|
newestCurrent: NewTarget("v9.0.1"),
|
|
newestSec: NewTarget("v9", SecurityPatch(true)),
|
|
desc: "carry the one",
|
|
},
|
|
{
|
|
current: NewTarget("v1.5.9"),
|
|
targets: []Target{
|
|
NewTarget("v2.2.2"),
|
|
NewTarget("v1.2.3"),
|
|
NewTarget("v2.4.8", SecurityPatch(true)),
|
|
NewTarget("v1", SecurityPatch(true)),
|
|
},
|
|
notNewerThan: NewTarget("v1.3.5"),
|
|
newestCurrent: NewTarget("v1.2.3"),
|
|
newestSec: NewTarget("v1", SecurityPatch(true)),
|
|
desc: "not newer than",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tts {
|
|
visitor := Visitor{
|
|
Current: tt.current,
|
|
NotNewerThan: tt.notNewerThan,
|
|
}
|
|
|
|
for _, target := range tt.targets {
|
|
visitor.Visit(target)
|
|
}
|
|
|
|
require.Equal(t, tt.nextMajor, visitor.NextMajor(), tt.desc)
|
|
require.Equal(t, tt.newestCurrent, visitor.NewestCurrent(), tt.desc)
|
|
require.Equal(t, tt.newestSec, visitor.NewestSecurityPatch(), tt.desc)
|
|
}
|
|
}
|