2026-04-06 15:48:37 +05:30
|
|
|
// Copyright IBM Corp. 2020, 2026
|
2022-11-28 15:10:36 -08:00
|
|
|
// SPDX-License-Identifier: BUSL-1.1
|
2023-02-02 17:15:17 -08:00
|
|
|
|
2022-11-28 09:33:38 -05:00
|
|
|
package version
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
gvers "github.com/hashicorp/go-version"
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
)
|
|
|
|
|
|
2023-03-02 10:04:24 -08:00
|
|
|
func TestHasFeature_AllMetaData(t *testing.T) {
|
2022-11-28 09:33:38 -05:00
|
|
|
DeprecatedFeature := Feature(999)
|
2023-03-02 10:04:24 -08:00
|
|
|
ActiveFeature := Feature(998)
|
2022-11-28 09:33:38 -05:00
|
|
|
|
|
|
|
|
deprecatedFeatureConstraint, _ := gvers.NewConstraint(">= 0.10.0, < 0.10.1")
|
|
|
|
|
featureMap[DeprecatedFeature] = MetadataConstraint{
|
|
|
|
|
Constraints: deprecatedFeatureConstraint,
|
|
|
|
|
}
|
2023-03-02 10:04:24 -08:00
|
|
|
activeFeatureConstraint, _ := gvers.NewConstraint("> 0.10.0")
|
|
|
|
|
featureMap[ActiveFeature] = MetadataConstraint{
|
|
|
|
|
Constraints: activeFeatureConstraint,
|
2022-11-28 09:33:38 -05:00
|
|
|
}
|
2023-03-02 10:04:24 -08:00
|
|
|
t.Cleanup(func() {
|
|
|
|
|
delete(featureMap, DeprecatedFeature)
|
|
|
|
|
_, ok := featureMap[DeprecatedFeature]
|
|
|
|
|
require.False(t, ok)
|
|
|
|
|
|
|
|
|
|
delete(featureMap, ActiveFeature)
|
|
|
|
|
_, ok = featureMap[ActiveFeature]
|
|
|
|
|
require.False(t, ok)
|
|
|
|
|
})
|
2022-11-28 09:33:38 -05:00
|
|
|
|
|
|
|
|
tests := []struct {
|
|
|
|
|
name string
|
|
|
|
|
version string
|
|
|
|
|
feature Feature
|
|
|
|
|
wantResult bool
|
|
|
|
|
}{
|
|
|
|
|
{
|
2023-03-02 10:04:24 -08:00
|
|
|
name: "active-feature-before-active",
|
|
|
|
|
version: "0.10.0",
|
|
|
|
|
feature: ActiveFeature,
|
2022-11-28 09:33:38 -05:00
|
|
|
wantResult: false,
|
|
|
|
|
},
|
|
|
|
|
{
|
2023-03-02 10:04:24 -08:00
|
|
|
name: "active-feature-after-active",
|
2022-11-28 09:33:38 -05:00
|
|
|
version: "0.12.0",
|
2023-03-02 10:04:24 -08:00
|
|
|
feature: ActiveFeature,
|
|
|
|
|
wantResult: true,
|
2022-11-28 09:33:38 -05:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "deprecated-feature-before-deprecation",
|
|
|
|
|
version: "0.10.0",
|
|
|
|
|
feature: DeprecatedFeature,
|
|
|
|
|
wantResult: true,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "deprecated-feature-after-deprecation",
|
|
|
|
|
version: "0.12.0",
|
|
|
|
|
feature: DeprecatedFeature,
|
|
|
|
|
wantResult: false,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "bogus-feature",
|
|
|
|
|
version: "0.12.0",
|
|
|
|
|
feature: Feature(-1),
|
|
|
|
|
wantResult: false,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
|
assert, require := assert.New(t), require.New(t)
|
|
|
|
|
testVersion, err := gvers.NewVersion(tt.version)
|
|
|
|
|
assert.NoError(err)
|
|
|
|
|
got := SupportsFeature(testVersion, tt.feature)
|
|
|
|
|
require.Equal(tt.wantResult, got)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-02 10:04:24 -08:00
|
|
|
func TestEnableFeatureOnVersionForTest_AllMetaData(t *testing.T) {
|
2022-11-28 09:33:38 -05:00
|
|
|
FutureFeature := Feature(997)
|
|
|
|
|
|
2023-03-02 10:04:24 -08:00
|
|
|
futureVersionFeature, _ := gvers.NewConstraint(">= 99.99.99")
|
2022-11-28 09:33:38 -05:00
|
|
|
featureMap[FutureFeature] = MetadataConstraint{
|
|
|
|
|
Constraints: futureVersionFeature,
|
|
|
|
|
}
|
2023-03-02 10:04:24 -08:00
|
|
|
t.Cleanup(func() {
|
|
|
|
|
delete(featureMap, FutureFeature)
|
|
|
|
|
_, ok := featureMap[FutureFeature]
|
|
|
|
|
require.False(t, ok)
|
|
|
|
|
})
|
2022-11-28 09:33:38 -05:00
|
|
|
|
|
|
|
|
tests := []struct {
|
|
|
|
|
name string
|
|
|
|
|
version string
|
|
|
|
|
feature Feature
|
|
|
|
|
wantResult bool
|
|
|
|
|
wantErr bool
|
|
|
|
|
}{
|
|
|
|
|
{
|
|
|
|
|
name: "has-future-feature",
|
2023-03-02 10:04:24 -08:00
|
|
|
version: "0.11.1",
|
2022-11-28 09:33:38 -05:00
|
|
|
feature: FutureFeature,
|
|
|
|
|
wantResult: true,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
|
assert, require := assert.New(t), require.New(t)
|
|
|
|
|
testVersion, err := gvers.NewVersion(tt.version)
|
|
|
|
|
assert.NoError(err)
|
|
|
|
|
|
|
|
|
|
testFunc := func() bool {
|
|
|
|
|
EnableFeatureOnVersionForTest(t, testVersion, tt.feature)
|
|
|
|
|
got := SupportsFeature(testVersion, tt.feature)
|
|
|
|
|
return got
|
|
|
|
|
}
|
|
|
|
|
// Test that the feature was enabled
|
|
|
|
|
got := testFunc()
|
|
|
|
|
require.Equal(tt.wantResult, got)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-11-28 15:10:36 -08:00
|
|
|
|
2023-03-02 10:04:24 -08:00
|
|
|
func TestEnableFeatureForTest_AllMetaData(t *testing.T) {
|
2022-11-28 15:10:36 -08:00
|
|
|
FutureFeature := Feature(997)
|
|
|
|
|
|
2023-03-02 10:04:24 -08:00
|
|
|
futureVersionFeature, _ := gvers.NewConstraint(">= 99.99.99")
|
2022-11-28 15:10:36 -08:00
|
|
|
featureMap[FutureFeature] = MetadataConstraint{
|
|
|
|
|
Constraints: futureVersionFeature,
|
|
|
|
|
}
|
2023-03-02 10:04:24 -08:00
|
|
|
t.Cleanup(func() {
|
|
|
|
|
delete(featureMap, FutureFeature)
|
|
|
|
|
_, ok := featureMap[FutureFeature]
|
|
|
|
|
require.False(t, ok)
|
|
|
|
|
})
|
2022-11-28 15:10:36 -08:00
|
|
|
|
|
|
|
|
// modify the globals that set which version the current binary is
|
|
|
|
|
prevVer := Version
|
|
|
|
|
defer func() {
|
|
|
|
|
Version = prevVer
|
|
|
|
|
}()
|
|
|
|
|
Version = "0.11.0"
|
|
|
|
|
|
|
|
|
|
EnableFeatureForTest(t, FutureFeature)
|
|
|
|
|
|
2023-03-02 10:04:24 -08:00
|
|
|
semVer, err := gvers.NewVersion("0.11.0")
|
2022-11-28 15:10:36 -08:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
assert.True(t, SupportsFeature(semVer, FutureFeature))
|
|
|
|
|
}
|