|
|
@ -17,6 +17,7 @@ limitations under the License.
|
|
|
|
package registry // import "helm.sh/helm/v4/pkg/registry"
|
|
|
|
package registry // import "helm.sh/helm/v4/pkg/registry"
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
import (
|
|
|
|
|
|
|
|
"fmt"
|
|
|
|
"reflect"
|
|
|
|
"reflect"
|
|
|
|
"testing"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
"time"
|
|
|
@ -277,16 +278,57 @@ func TestGenerateOCICreatedAnnotations(t *testing.T) {
|
|
|
|
|
|
|
|
|
|
|
|
func TestIsOCI(t *testing.T) {
|
|
|
|
func TestIsOCI(t *testing.T) {
|
|
|
|
|
|
|
|
|
|
|
|
assert.True(t, IsOCI("oci://example.com/myregistry:1.2.3"), "OCI URL marked as invalid")
|
|
|
|
tests := []struct {
|
|
|
|
assert.False(t, IsOCI("noci://example.com/myregistry:1.2.3"), "Invalid OCI URL marked as valid")
|
|
|
|
name string
|
|
|
|
assert.False(t, IsOCI("ocin://example.com/myregistry:1.2.3"), "Invalid OCI URL marked as valid")
|
|
|
|
url string
|
|
|
|
|
|
|
|
isValid bool
|
|
|
|
|
|
|
|
}{
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "Valid url",
|
|
|
|
|
|
|
|
url: "oci://example.com/myregistry:1.2.3",
|
|
|
|
|
|
|
|
isValid: true,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "Invalid URL prefix (boundary test 1)",
|
|
|
|
|
|
|
|
url: "noci://example.com/myregistry:1.2.3",
|
|
|
|
|
|
|
|
isValid: false,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "Invalid URL prefix (boundary test 2)",
|
|
|
|
|
|
|
|
url: "ocin://example.com/myregistry:1.2.3",
|
|
|
|
|
|
|
|
isValid: false,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
|
|
|
|
assert.Equal(t, tt.isValid, IsOCI(tt.url), tt.name)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func TestContainsTag(t *testing.T) {
|
|
|
|
func TestContainsTag(t *testing.T) {
|
|
|
|
|
|
|
|
|
|
|
|
tagList := []string{"1.0.0", "1.0.1", "2.0.0", "2.1.0"}
|
|
|
|
tagList := []string{"1.0.0", "1.0.1", "2.0.0", "2.1.0"}
|
|
|
|
assert.True(t, ContainsTag(tagList, "1.0.1"), "The tag 1.0.1 is in the list")
|
|
|
|
|
|
|
|
assert.False(t, ContainsTag(tagList, "1.0.2"), "the tag 1.0.2 is not in the list")
|
|
|
|
tests := []struct {
|
|
|
|
|
|
|
|
name string
|
|
|
|
|
|
|
|
tag string
|
|
|
|
|
|
|
|
present bool
|
|
|
|
|
|
|
|
}{
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "tag present",
|
|
|
|
|
|
|
|
tag: "1.0.1",
|
|
|
|
|
|
|
|
present: true,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "tag not present",
|
|
|
|
|
|
|
|
tag: "1.0.2",
|
|
|
|
|
|
|
|
present: false,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
|
|
|
|
assert.Equal(t, tt.present, ContainsTag(tagList, tt.tag), tt.name)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func TestGetTagMatchingVersionOrConstraint(t *testing.T) {
|
|
|
|
func TestGetTagMatchingVersionOrConstraint(t *testing.T) {
|
|
|
@ -314,145 +356,201 @@ func TestGetTagMatchingVersionOrConstraint(t *testing.T) {
|
|
|
|
"0.0.1",
|
|
|
|
"0.0.1",
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Explicit verion
|
|
|
|
tests := []struct {
|
|
|
|
version, err := GetTagMatchingVersionOrConstraint(tagList, "1.10.0")
|
|
|
|
name string
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
versionConstraint string
|
|
|
|
assert.Equal(t, "1.10.0", version, "The expected matching version is 1.10.0")
|
|
|
|
expectErr bool
|
|
|
|
|
|
|
|
expectVersion string
|
|
|
|
// Implicit wildcard default from empty string
|
|
|
|
}{
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "")
|
|
|
|
{
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
name: "Explicit version",
|
|
|
|
assert.Equal(t, "10.0.1", version, "The expected matching version is 10.0.1")
|
|
|
|
versionConstraint: "1.10.0",
|
|
|
|
|
|
|
|
expectErr: false,
|
|
|
|
// No versions within wildcard constraint
|
|
|
|
expectVersion: "1.10.0",
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "50.*")
|
|
|
|
},
|
|
|
|
assert.Error(t, err, "An invalid version constraint (no valid version found) should produce an error")
|
|
|
|
{
|
|
|
|
assert.Equal(t, "", version, "An invalid version constraint (no valid version found) should return an empty string as the version")
|
|
|
|
name: "Implicit wildcard default from empty string",
|
|
|
|
|
|
|
|
versionConstraint: "",
|
|
|
|
// Invalid version constraint
|
|
|
|
expectErr: false,
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "<>!=20")
|
|
|
|
expectVersion: "10.0.1",
|
|
|
|
assert.Error(t, err, "An invalid version constraint (non-parsable constraint) should produce an error")
|
|
|
|
},
|
|
|
|
assert.Equal(t, "", version, "An invalid version constraint (non-parseable constraint) should return an empty string as the version")
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "No versions within wildcard constraint",
|
|
|
|
// Explicit wildcard
|
|
|
|
versionConstraint: "50.*",
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "*")
|
|
|
|
expectErr: true,
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
expectVersion: "",
|
|
|
|
assert.Equal(t, "10.0.1", version, "The expected matching version is 10.0.1")
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
// Major version wildcard selection
|
|
|
|
name: "Invalid version constraint",
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "2.*")
|
|
|
|
versionConstraint: "<>!=20",
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
expectErr: true,
|
|
|
|
assert.Equal(t, "2.0.11", version, "The expected matching version is 2.0.11")
|
|
|
|
expectVersion: "",
|
|
|
|
|
|
|
|
},
|
|
|
|
// Minor version wildcard selection
|
|
|
|
{
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "3.1.*")
|
|
|
|
name: "Explicit wildcard",
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
versionConstraint: "*",
|
|
|
|
assert.Equal(t, "3.1.0", version, "The expected matching version is 3.1.0")
|
|
|
|
expectErr: false,
|
|
|
|
|
|
|
|
expectVersion: "10.0.1",
|
|
|
|
// ~ major
|
|
|
|
},
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "~1")
|
|
|
|
{
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
name: "Major version wildcard selection",
|
|
|
|
assert.Equal(t, "1.10.0", version, "The expected matching version is 1.10.0")
|
|
|
|
versionConstraint: "2.*",
|
|
|
|
|
|
|
|
expectErr: false,
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "~1.x")
|
|
|
|
expectVersion: "2.0.11",
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
},
|
|
|
|
assert.Equal(t, "1.10.0", version, "The expected matching version is 1.10.0")
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "Minor version wildcard selection",
|
|
|
|
// ~ specific version
|
|
|
|
versionConstraint: "3.1.*",
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "~1.9.0")
|
|
|
|
expectErr: false,
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
expectVersion: "3.1.0",
|
|
|
|
assert.Equal(t, "1.9.1", version, "The expected matching version is 1.9.1")
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
// ~ minor version
|
|
|
|
name: "~ major version",
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "~1.9")
|
|
|
|
versionConstraint: "~1",
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
expectErr: false,
|
|
|
|
assert.Equal(t, "1.9.1", version, "The expected matching version is 1.9.1")
|
|
|
|
expectVersion: "1.10.0",
|
|
|
|
|
|
|
|
},
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "~1.9.x")
|
|
|
|
{
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
name: "~ major version plus x",
|
|
|
|
assert.Equal(t, "1.9.1", version, "The expected matching version is 1.9.1")
|
|
|
|
versionConstraint: "~1.x",
|
|
|
|
|
|
|
|
expectErr: false,
|
|
|
|
// ^ specific version
|
|
|
|
expectVersion: "1.10.0",
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "^1.9.0")
|
|
|
|
},
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
{
|
|
|
|
assert.Equal(t, "1.10.0", version, "The expected matching version is 1.10.0")
|
|
|
|
name: "~ specific version",
|
|
|
|
|
|
|
|
versionConstraint: "~1.9.0",
|
|
|
|
// ^ major version >= 1
|
|
|
|
expectErr: false,
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "^1.9.x")
|
|
|
|
expectVersion: "1.9.1",
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
},
|
|
|
|
assert.Equal(t, "1.10.0", version, "The expected matching version is 1.10.0")
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "~ minor version",
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "^1.9")
|
|
|
|
versionConstraint: "~1.9",
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
expectErr: false,
|
|
|
|
assert.Equal(t, "1.10.0", version, "The expected matching version is 1.10.0")
|
|
|
|
expectVersion: "1.9.1",
|
|
|
|
|
|
|
|
},
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "^1.x")
|
|
|
|
{
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
name: "~ minor version plus x",
|
|
|
|
assert.Equal(t, "1.10.0", version, "The expected matching version is 1.10.0")
|
|
|
|
versionConstraint: "~1.9.x",
|
|
|
|
|
|
|
|
expectErr: false,
|
|
|
|
// ^ minor version < 1
|
|
|
|
expectVersion: "1.9.1",
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "^0.2.1")
|
|
|
|
},
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
{
|
|
|
|
assert.Equal(t, "0.2.2", version, "The expected matching version is 0.2.2")
|
|
|
|
name: "^ specific version",
|
|
|
|
|
|
|
|
versionConstraint: "^1.9.0",
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "^0.2")
|
|
|
|
expectErr: false,
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
expectVersion: "1.10.0",
|
|
|
|
assert.Equal(t, "0.2.2", version, "The expected matching version is 0.2.2")
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
// ^ patch version
|
|
|
|
name: "^ minor version version >=1",
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "^0.0.2")
|
|
|
|
versionConstraint: "^1.9",
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
expectErr: false,
|
|
|
|
assert.Equal(t, "0.0.2", version, "The expected matching version is 0.0.2")
|
|
|
|
expectVersion: "1.10.0",
|
|
|
|
|
|
|
|
},
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "^0.0")
|
|
|
|
{
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
name: "^ minor version plus x >=1",
|
|
|
|
assert.Equal(t, "0.0.3", version, "The expected matching version is 0.0.3")
|
|
|
|
versionConstraint: "^1.9.x",
|
|
|
|
|
|
|
|
expectErr: false,
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "^0")
|
|
|
|
expectVersion: "1.10.0",
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
},
|
|
|
|
assert.Equal(t, "0.3.0", version, "The expected matching version is 0.3.0")
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "^ major version plus x >=1",
|
|
|
|
// =
|
|
|
|
versionConstraint: "^1.x",
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "=1.9.0")
|
|
|
|
expectErr: false,
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
expectVersion: "1.10.0",
|
|
|
|
assert.Equal(t, "1.9.0", version, "The expected matching version is 1.9.0")
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
// !=
|
|
|
|
name: "^ full version <1",
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "!=1.9.0")
|
|
|
|
versionConstraint: "^0.2.1",
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
expectErr: false,
|
|
|
|
assert.Equal(t, "10.0.1", version, "The expected matching version is 10.0.1")
|
|
|
|
expectVersion: "0.2.2",
|
|
|
|
|
|
|
|
},
|
|
|
|
// >
|
|
|
|
{
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, ">1.9.0")
|
|
|
|
name: "^ minor version <1",
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
versionConstraint: "^0.2",
|
|
|
|
assert.Equal(t, "10.0.1", version, "The expected matching version is 10.0.1")
|
|
|
|
expectErr: false,
|
|
|
|
|
|
|
|
expectVersion: "0.2.2",
|
|
|
|
// <
|
|
|
|
},
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "<1.9.0")
|
|
|
|
{
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
name: "^ patch version < 0.1",
|
|
|
|
assert.Equal(t, "1.0.0", version, "The expected matching version is 1.0.0")
|
|
|
|
versionConstraint: "^0.0.2",
|
|
|
|
|
|
|
|
expectErr: false,
|
|
|
|
// >=
|
|
|
|
expectVersion: "0.0.2",
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, ">=1.9.0")
|
|
|
|
},
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
{
|
|
|
|
assert.Equal(t, "10.0.1", version, "The expected matching version is 10.0.1")
|
|
|
|
name: "^ with 0.0",
|
|
|
|
|
|
|
|
versionConstraint: "^0.0",
|
|
|
|
// <=
|
|
|
|
expectErr: false,
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, "<=1.9.0")
|
|
|
|
expectVersion: "0.0.3",
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
},
|
|
|
|
assert.Equal(t, "1.9.0", version, "The expected matching version is 1.9.0")
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "^ with 0",
|
|
|
|
// , separation
|
|
|
|
versionConstraint: "^0",
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, ">=1.9.0, <1.10.0")
|
|
|
|
expectErr: false,
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
expectVersion: "0.3.0",
|
|
|
|
assert.Equal(t, "1.9.1", version, "The expected matching version is 1.9.1")
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, ">=1.9.0, <=1.10.0, !=1.10.0")
|
|
|
|
name: "= operator",
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
versionConstraint: "=1.9.0",
|
|
|
|
assert.Equal(t, "1.9.1", version, "The expected matching version is 1.9.1")
|
|
|
|
expectErr: false,
|
|
|
|
|
|
|
|
expectVersion: "1.9.0",
|
|
|
|
// ||
|
|
|
|
},
|
|
|
|
version, err = GetTagMatchingVersionOrConstraint(tagList, ">=1.1.0, <=1.10.0 || >=2.0.0, <3.0.0")
|
|
|
|
{
|
|
|
|
assert.Nil(t, err, "Valid tag constraint query should not produce an error")
|
|
|
|
name: "!= operator",
|
|
|
|
assert.Equal(t, "2.0.11", version, "The expected matching version is 2.0.11")
|
|
|
|
versionConstraint: "!=1.9.0",
|
|
|
|
|
|
|
|
expectErr: false,
|
|
|
|
|
|
|
|
expectVersion: "10.0.1",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "> operator",
|
|
|
|
|
|
|
|
versionConstraint: ">1.9.0",
|
|
|
|
|
|
|
|
expectErr: false,
|
|
|
|
|
|
|
|
expectVersion: "10.0.1",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "< operator",
|
|
|
|
|
|
|
|
versionConstraint: "<1.9.0",
|
|
|
|
|
|
|
|
expectErr: false,
|
|
|
|
|
|
|
|
expectVersion: "1.0.0",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
name: ">= operator",
|
|
|
|
|
|
|
|
versionConstraint: ">=1.9.0",
|
|
|
|
|
|
|
|
expectErr: false,
|
|
|
|
|
|
|
|
expectVersion: "10.0.1",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "<= operator",
|
|
|
|
|
|
|
|
versionConstraint: "<=1.9.0",
|
|
|
|
|
|
|
|
expectErr: false,
|
|
|
|
|
|
|
|
expectVersion: "1.9.0",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "gte and less than combination",
|
|
|
|
|
|
|
|
versionConstraint: ">=1.9.0, <1.10.0",
|
|
|
|
|
|
|
|
expectErr: false,
|
|
|
|
|
|
|
|
expectVersion: "1.9.1",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "gte and lte with a negation combination",
|
|
|
|
|
|
|
|
versionConstraint: ">=1.9.0, <=1.10.0, !=1.10.0",
|
|
|
|
|
|
|
|
expectErr: false,
|
|
|
|
|
|
|
|
expectVersion: "1.9.1",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "multiple ranges separated by ||",
|
|
|
|
|
|
|
|
versionConstraint: ">=1.1.0, <=1.10.0 || >=2.0.0, <3.0.0",
|
|
|
|
|
|
|
|
expectErr: false,
|
|
|
|
|
|
|
|
expectVersion: "2.0.11",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
|
|
|
|
version, err := GetTagMatchingVersionOrConstraint(tagList, tt.versionConstraint)
|
|
|
|
|
|
|
|
if tt.expectErr {
|
|
|
|
|
|
|
|
assert.Error(t, err, fmt.Sprintf("Should produce an error (%s)", tt.name))
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert.Nil(t, err, fmt.Sprintf("Error should be nil (%s)", tt.name))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.Equal(t, tt.expectVersion, version, fmt.Sprintf("The expected matching version is %s (%s)", tt.expectVersion, tt.name))
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|