consul/envoyextensions/xdscommon/proxysupport_test.go
Michael Zalimeni 40ca4ad6d0
[NET-5622] build: consolidate Envoy version management (#21245)
* build: consolidate Envoy version management

Simplify Envoy version management by consolidating all runtime, build,
and CI sources of Envoy versions into a single plaintext file.

The goal of this change is to avoid common mistakes missing an update of
some Envoy versions (both in general and due to release branch
inconsistency), and enable automated Envoy version updates in the
future.

* ci: add missing ref argument for get-go-version

Supports nightly tests.
2024-07-05 14:19:23 -05:00

85 lines
2.6 KiB
Go

// 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]
}