You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
boundary/version/feature_manager_test.go

167 lines
3.9 KiB

package version
import (
"testing"
gvers "github.com/hashicorp/go-version"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestHasFeature(t *testing.T) {
DeprecatedFeature := Feature(999)
HCPOnlyFeature := Feature(998)
deprecatedFeatureConstraint, _ := gvers.NewConstraint(">= 0.10.0, < 0.10.1")
featureMap[DeprecatedFeature] = MetadataConstraint{
MetaInfo: []Metadata{OSS, HCP},
Constraints: deprecatedFeatureConstraint,
}
hcpOnlyFeature, _ := gvers.NewConstraint(">= 0.12.0+hcp")
featureMap[HCPOnlyFeature] = MetadataConstraint{
MetaInfo: []Metadata{HCP},
Constraints: hcpOnlyFeature,
}
tests := []struct {
name string
version string
feature Feature
wantResult bool
}{
{
name: "does-not-have-multihop-ENT",
version: "0.11.1+hcp",
feature: HCPOnlyFeature,
wantResult: false,
},
{
name: "has-multihop-ENT",
version: "0.12.0+hcp",
feature: HCPOnlyFeature,
wantResult: true,
},
{
name: "has-multihop-worker-ENT",
version: "0.12.0+hcp.int",
feature: HCPOnlyFeature,
wantResult: true,
},
{
name: "does-not-have-multihop-OSS",
version: "0.12.0",
feature: HCPOnlyFeature,
wantResult: false,
},
{
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)
})
}
delete(featureMap, DeprecatedFeature)
_, ok := featureMap[DeprecatedFeature]
require.False(t, ok)
delete(featureMap, HCPOnlyFeature)
_, ok = featureMap[HCPOnlyFeature]
require.False(t, ok)
}
func TestEnableFeatureOnVersionForTest(t *testing.T) {
FutureFeature := Feature(997)
futureVersionFeature, _ := gvers.NewConstraint(">= 99.99.99+hcp")
featureMap[FutureFeature] = MetadataConstraint{
MetaInfo: []Metadata{HCP},
Constraints: futureVersionFeature,
}
tests := []struct {
name string
version string
feature Feature
wantResult bool
wantErr bool
}{
{
name: "has-future-feature",
version: "0.11.1+hcp",
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)
})
}
delete(featureMap, FutureFeature)
_, ok := featureMap[FutureFeature]
require.False(t, ok)
}
func TestEnableFeatureForTest(t *testing.T) {
FutureFeature := Feature(997)
futureVersionFeature, _ := gvers.NewConstraint(">= 99.99.99+hcp")
featureMap[FutureFeature] = MetadataConstraint{
MetaInfo: []Metadata{HCP},
Constraints: futureVersionFeature,
}
// modify the globals that set which version the current binary is
prevVer := Version
prevMd := VersionMetadata
defer func() {
Version = prevVer
VersionMetadata = prevMd
}()
Version = "0.11.0"
VersionMetadata = "hcp"
EnableFeatureForTest(t, FutureFeature)
semVer, err := gvers.NewVersion("0.11.0+hcp")
require.NoError(t, err)
assert.True(t, SupportsFeature(semVer, FutureFeature))
delete(featureMap, FutureFeature)
_, ok := featureMap[FutureFeature]
require.False(t, ok)
}