// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package xdscommon
import (
"slices"
"sort"
"testing"
"github.com/hashicorp/go-version"
"github.com/stretchr/testify/assert"
)
// TestProxySupportOrder tests that the values in EnvoyVersions are valid (X.Y.Z), contiguous by "major" (X.Y) version,
// and sorted in descending order.
func TestProxySupportOrder ( t * testing . T ) {
versions := make ( [ ] * version . Version , len ( EnvoyVersions ) )
beforeSort := make ( [ ] * version . Version , len ( EnvoyVersions ) )
for i , raw := range EnvoyVersions {
v , _ := version . NewVersion ( raw )
if v . Segments ( ) [ 0 ] != 1 {
// If this fails, we need to add support for a new semver-major (x in x.y.z) version of Envoy
t . Fatalf ( "Expected major version to be 1, got: %v" , v . Segments ( ) [ 0 ] )
}
versions [ i ] = v
beforeSort [ i ] = v
}
// After this, the versions are properly sorted
// go-version has a collection container, but it only allows for sorting in ascending order
sort . Slice ( versions , func ( i , j int ) bool {
return versions [ j ] . LessThan ( versions [ i ] )
} )
// Check that we already have a sorted list
for i := range EnvoyVersions {
assert . True ( t , versions [ i ] . Equal ( beforeSort [ i ] ) )
}
// Check that we have a continues set of versions
for i := 1 ; i < len ( versions ) ; i ++ {
previousMajorVersion := getMajorVersion ( versions [ i - 1 ] )
majorVersion := getMajorVersion ( versions [ i ] )
assert . True ( t , majorVersion == previousMajorVersion - 1 ,
"Expected Envoy major version following %d.%d to be %d.%d, got %d.%d" ,
versions [ i - 1 ] . Segments ( ) [ 0 ] ,
previousMajorVersion ,
versions [ i - 1 ] . Segments ( ) [ 0 ] ,
previousMajorVersion - 1 ,
versions [ i ] . Segments ( ) [ 0 ] ,
majorVersion )
}
}
func TestParseEnvoyVersions ( t * testing . T ) {
// Test with valid versions, comments, and blank lines
raw := "# Comment\n1.29.4\n\n# More\n# comments\n1.28.3\n\n1.27.5\n1.26.8\n\n"
expected := [ ] string { "1.29.4" , "1.28.3" , "1.27.5" , "1.26.8" }
versions , err := parseEnvoyVersions ( raw )
assert . NoError ( t , err )
if ! slices . Equal ( versions , expected ) {
t . Fatalf ( "Expected %v, got: %v" , expected , versions )
}
// Test with invalid version
raw = "1.29.4\n1.26.8\nfoo"
_ , err = parseEnvoyVersions ( raw )
assert . EqualError ( t , err , "invalid version in ENVOY_VERSIONS: foo" )
// Test with out-of-order values
raw = "1.29.4\n1.26.8\n1.27.5"
_ , err = parseEnvoyVersions ( raw )
assert . EqualError ( t , err , "ENVOY_VERSIONS must be sorted in descending order" )
}
// getMajorVersion returns the "major" (Y in X.Y.Z) version of the given Envoy version.
func getMajorVersion ( version * version . Version ) int {
return version . Segments ( ) [ 1 ]
}