Skip to content

Commit

Permalink
tfversion: Finish prerelease version semantic equality handling (#317)
Browse files Browse the repository at this point in the history
Reference: #303
Reference: #308
Reference: #316

These changes fully update the rest of the `tfversion` built-in checks for treating prereleases as semantically equal to the patch version. It also includes a fix for `RequireBelow` to handle the exactly equal condition. Previously, `RequireBelow` when given 1.8.0 would still run on 1.8.0 (and prereleases variants).

Prior to logic changes:

```
=== RUN   Test_RequireAbove
--- PASS: Test_RequireAbove (3.01s)
=== RUN   Test_RequireAbove_Error
--- PASS: Test_RequireAbove_Error (3.24s)
=== RUN   Test_RequireAbove_Prerelease_EqualCoreVersion
    require_above_test.go:77: expected Terraform CLI version above 1.8.0 but detected version is 1.8.0-rc1
--- FAIL: Test_RequireAbove_Prerelease_EqualCoreVersion (3.97s)
=== RUN   Test_RequireAbove_Prerelease_HigherCoreVersion
--- PASS: Test_RequireAbove_Prerelease_HigherCoreVersion (3.17s)
=== RUN   Test_RequireAbove_Prerelease_HigherPrerelease
--- PASS: Test_RequireAbove_Prerelease_HigherPrerelease (3.03s)
=== RUN   Test_RequireAbove_Prerelease_LowerCoreVersion
--- PASS: Test_RequireAbove_Prerelease_LowerCoreVersion (3.13s)
=== RUN   Test_RequireAbove_Prerelease_LowerPrerelease
--- PASS: Test_RequireAbove_Prerelease_LowerPrerelease (3.14s)

=== RUN   Test_RequireBelow
--- PASS: Test_RequireBelow (2.94s)
=== RUN   Test_RequireBelow_Error
--- PASS: Test_RequireBelow_Error (2.59s)
=== RUN   Test_RequireBelow_Prerelease_EqualCoreVersion
    require_below_test.go:80: expected t.Fatal(), got none
--- FAIL: Test_RequireBelow_Prerelease_EqualCoreVersion (3.29s)
=== RUN   Test_RequireBelow_Prerelease_HigherCoreVersion
--- PASS: Test_RequireBelow_Prerelease_HigherCoreVersion (3.04s)
=== RUN   Test_RequireBelow_Prerelease_HigherPrerelease
--- PASS: Test_RequireBelow_Prerelease_HigherPrerelease (3.22s)
=== RUN   Test_RequireBelow_Prerelease_LowerCoreVersion
--- PASS: Test_RequireBelow_Prerelease_LowerCoreVersion (2.74s)
=== RUN   Test_RequireBelow_Prerelease_LowerPrerelease
--- PASS: Test_RequireBelow_Prerelease_LowerPrerelease (2.80s)

=== RUN   Test_RequireBetween
--- PASS: Test_RequireBetween (2.69s)
=== RUN   Test_RequireBetween_Error_BelowMin
--- PASS: Test_RequireBetween_Error_BelowMin (2.57s)
=== RUN   Test_RequireBetween_Error_EqToMax
--- PASS: Test_RequireBetween_Error_EqToMax (2.29s)
=== RUN   Test_RequireBetween_Prerelease_MaxEqualCoreVersion
    require_between_test.go:114: expected t.Fatal(), got none
--- FAIL: Test_RequireBetween_Prerelease_MaxEqualCoreVersion (3.24s)
=== RUN   Test_RequireBetween_Prerelease_MinEqualCoreVersion
    require_between_test.go:141: expected Terraform CLI version between 1.8.0 and 1.9.0 but detected version is 1.8.0-rc1
--- FAIL: Test_RequireBetween_Prerelease_MinEqualCoreVersion (2.83s)
=== RUN   Test_RequireBetween_Prerelease_MaxHigherCoreVersion
--- PASS: Test_RequireBetween_Prerelease_MaxHigherCoreVersion (3.17s)
=== RUN   Test_RequireBetween_Prerelease_MinHigherCoreVersion
--- PASS: Test_RequireBetween_Prerelease_MinHigherCoreVersion (3.09s)
=== RUN   Test_RequireBetween_Prerelease_MaxHigherPrerelease
--- PASS: Test_RequireBetween_Prerelease_MaxHigherPrerelease (3.84s)
=== RUN   Test_RequireBetween_Prerelease_MinHigherPrerelease
--- PASS: Test_RequireBetween_Prerelease_MinHigherPrerelease (3.02s)
=== RUN   Test_RequireBetween_Prerelease_MaxLowerCoreVersion
--- PASS: Test_RequireBetween_Prerelease_MaxLowerCoreVersion (2.84s)
=== RUN   Test_RequireBetween_Prerelease_MinLowerCoreVersion
--- PASS: Test_RequireBetween_Prerelease_MinLowerCoreVersion (4.07s)
=== RUN   Test_RequireBetween_Prerelease_MaxLowerPrerelease
--- PASS: Test_RequireBetween_Prerelease_MaxLowerPrerelease (2.79s)
=== RUN   Test_RequireBetween_Prerelease_MinLowerPrerelease
--- PASS: Test_RequireBetween_Prerelease_MinLowerPrerelease (3.25s)

=== RUN   Test_RequireNot
--- PASS: Test_RequireNot (3.70s)
=== RUN   Test_RequireNot_Error
--- PASS: Test_RequireNot_Error (2.76s)
=== RUN   Test_RequireNot_Prerelease_EqualCoreVersion
    require_not_test.go:73: expected t.Fatal(), got none
--- FAIL: Test_RequireNot_Prerelease_EqualCoreVersion (3.06s)
=== RUN   Test_RequireNot_Prerelease_HigherCoreVersion
--- PASS: Test_RequireNot_Prerelease_HigherCoreVersion (3.19s)
=== RUN   Test_RequireNot_Prerelease_HigherPrerelease
--- PASS: Test_RequireNot_Prerelease_HigherPrerelease (3.25s)
=== RUN   Test_RequireNot_Prerelease_LowerCoreVersion
--- PASS: Test_RequireNot_Prerelease_LowerCoreVersion (5.37s)
=== RUN   Test_RequireNot_Prerelease_LowerPrerelease
--- PASS: Test_RequireNot_Prerelease_LowerPrerelease (3.13s)

=== RUN   Test_SkipAbove_SkipTest
    skip_above_test.go:22: Terraform CLI version 1.3.0 is above maximum version 1.2.9: skipping test
--- SKIP: Test_SkipAbove_SkipTest (2.34s)
=== RUN   Test_SkipAbove_RunTest
--- PASS: Test_SkipAbove_RunTest (2.51s)
=== RUN   Test_SkipAbove_Prerelease_EqualCoreVersion
--- PASS: Test_SkipAbove_Prerelease_EqualCoreVersion (2.96s)
=== RUN   Test_SkipAbove_Prerelease_HigherCoreVersion
--- PASS: Test_SkipAbove_Prerelease_HigherCoreVersion (3.22s)
=== RUN   Test_SkipAbove_Prerelease_HigherPrerelease
--- PASS: Test_SkipAbove_Prerelease_HigherPrerelease (3.29s)
=== RUN   Test_SkipAbove_Prerelease_LowerCoreVersion
    skip_above_test.go:145: Terraform CLI version 1.8.0-rc1 is above maximum version 1.7.0: skipping test
--- SKIP: Test_SkipAbove_Prerelease_LowerCoreVersion (2.68s)
=== RUN   Test_SkipAbove_Prerelease_LowerPrerelease
    skip_above_test.go:166: Terraform CLI version 1.8.0-rc1 is above maximum version 1.8.0-beta1: skipping test
--- SKIP: Test_SkipAbove_Prerelease_LowerPrerelease (2.62s)

=== RUN   Test_SkipBetween_SkipTest
    skip_between_test.go:24: Terraform CLI version 1.2.0 is between 1.2.0 and 1.3.0: skipping test.
--- SKIP: Test_SkipBetween_SkipTest (2.70s)
=== RUN   Test_SkipBetween_RunTest_AboveMax
--- PASS: Test_SkipBetween_RunTest_AboveMax (2.71s)
=== RUN   Test_SkipBetween_RunTest_EqToMin
--- PASS: Test_SkipBetween_RunTest_EqToMin (2.76s)
=== RUN   Test_SkipBetween_Prerelease_MaxEqualCoreVersion
    skip_between_test.go:106: Terraform CLI version 1.8.0-rc1 is between 1.7.0 and 1.8.0: skipping test.
--- SKIP: Test_SkipBetween_Prerelease_MaxEqualCoreVersion (3.04s)
=== RUN   Test_SkipBetween_Prerelease_MinEqualCoreVersion
--- PASS: Test_SkipBetween_Prerelease_MinEqualCoreVersion (3.36s)
=== RUN   Test_SkipBetween_Prerelease_MaxHigherCoreVersion
    skip_between_test.go:154: Terraform CLI version 1.7.0-rc1 is between 1.6.0 and 1.8.0: skipping test.
--- SKIP: Test_SkipBetween_Prerelease_MaxHigherCoreVersion (2.82s)
=== RUN   Test_SkipBetween_Prerelease_MinHigherCoreVersion
--- PASS: Test_SkipBetween_Prerelease_MinHigherCoreVersion (3.81s)
=== RUN   Test_SkipBetween_Prerelease_MaxHigherPrerelease
    skip_between_test.go:198: Terraform CLI version 1.7.0-rc1 is between 1.6.0 and 1.7.0-rc2: skipping test.
--- SKIP: Test_SkipBetween_Prerelease_MaxHigherPrerelease (3.37s)
=== RUN   Test_SkipBetween_Prerelease_MinHigherPrerelease
--- PASS: Test_SkipBetween_Prerelease_MinHigherPrerelease (4.33s)
=== RUN   Test_SkipBetween_Prerelease_MaxLowerCoreVersion
--- PASS: Test_SkipBetween_Prerelease_MaxLowerCoreVersion (3.33s)
=== RUN   Test_SkipBetween_Prerelease_MinLowerCoreVersion
    skip_between_test.go:261: Terraform CLI version 1.8.0-rc1 is between 1.7.0 and 1.9.0: skipping test.
--- SKIP: Test_SkipBetween_Prerelease_MinLowerCoreVersion (3.12s)
=== RUN   Test_SkipBetween_Prerelease_MaxLowerPrerelease
--- PASS: Test_SkipBetween_Prerelease_MaxLowerPrerelease (3.08s)
=== RUN   Test_SkipBetween_Prerelease_MinLowerPrerelease
    skip_between_test.go:303: Terraform CLI version 1.8.0-rc1 is between 1.8.0-beta1 and 1.9.0: skipping test.
--- SKIP: Test_SkipBetween_Prerelease_MinLowerPrerelease (2.86s)

=== RUN   Test_SkipIf_SkipTest
    skip_if_test.go:24: Terraform CLI version is 1.4.3: skipping test.
--- SKIP: Test_SkipIf_SkipTest (2.52s)
=== RUN   Test_SkipIf_RunTest
--- PASS: Test_SkipIf_RunTest (3.15s)
=== RUN   Test_SkipIf_Prerelease_EqualCoreVersion
--- PASS: Test_SkipIf_Prerelease_EqualCoreVersion (4.58s)
=== RUN   Test_SkipIf_Prerelease_HigherCoreVersion
--- PASS: Test_SkipIf_Prerelease_HigherCoreVersion (3.46s)
=== RUN   Test_SkipIf_Prerelease_HigherPrerelease
--- PASS: Test_SkipIf_Prerelease_HigherPrerelease (3.28s)
=== RUN   Test_SkipIf_Prerelease_LowerCoreVersion
--- PASS: Test_SkipIf_Prerelease_LowerCoreVersion (3.10s)
=== RUN   Test_SkipIf_Prerelease_LowerPrerelease
--- PASS: Test_SkipIf_Prerelease_LowerPrerelease (3.06s)
```

Now (only showing skip testing as require testing will fail if incorrect):

```
=== RUN   Test_SkipAbove_SkipTest
    skip_above_test.go:22: Terraform CLI version 1.3.0 is above maximum version 1.2.9: skipping test
--- SKIP: Test_SkipAbove_SkipTest (2.87s)
=== RUN   Test_SkipAbove_RunTest
--- PASS: Test_SkipAbove_RunTest (2.66s)
=== RUN   Test_SkipAbove_Prerelease_EqualCoreVersion
--- PASS: Test_SkipAbove_Prerelease_EqualCoreVersion (2.98s)
=== RUN   Test_SkipAbove_Prerelease_HigherCoreVersion
--- PASS: Test_SkipAbove_Prerelease_HigherCoreVersion (3.19s)
=== RUN   Test_SkipAbove_Prerelease_HigherPrerelease
--- PASS: Test_SkipAbove_Prerelease_HigherPrerelease (3.29s)
=== RUN   Test_SkipAbove_Prerelease_LowerCoreVersion
    skip_above_test.go:145: Terraform CLI version 1.8.0-rc1 is above maximum version 1.7.0: skipping test
--- SKIP: Test_SkipAbove_Prerelease_LowerCoreVersion (3.32s)
=== RUN   Test_SkipAbove_Prerelease_LowerPrerelease
    skip_above_test.go:166: Terraform CLI version 1.8.0-rc1 is above maximum version 1.8.0-beta1: skipping test
--- SKIP: Test_SkipAbove_Prerelease_LowerPrerelease (2.72s)

=== RUN   Test_SkipBetween_SkipTest
    skip_between_test.go:24: Terraform CLI version 1.2.0 is between 1.2.0 and 1.3.0: skipping test.
--- SKIP: Test_SkipBetween_SkipTest (2.97s)
=== RUN   Test_SkipBetween_RunTest_AboveMax
--- PASS: Test_SkipBetween_RunTest_AboveMax (2.69s)
=== RUN   Test_SkipBetween_RunTest_EqToMin
--- PASS: Test_SkipBetween_RunTest_EqToMin (2.47s)
=== RUN   Test_SkipBetween_Prerelease_MaxEqualCoreVersion
--- PASS: Test_SkipBetween_Prerelease_MaxEqualCoreVersion (3.65s)
=== RUN   Test_SkipBetween_Prerelease_MinEqualCoreVersion
    skip_between_test.go:131: Terraform CLI version 1.8.0-rc1 is between 1.8.0 and 1.9.0: skipping test.
--- SKIP: Test_SkipBetween_Prerelease_MinEqualCoreVersion (3.10s)
=== RUN   Test_SkipBetween_Prerelease_MaxHigherCoreVersion
    skip_between_test.go:154: Terraform CLI version 1.7.0-rc1 is between 1.6.0 and 1.8.0: skipping test.
--- SKIP: Test_SkipBetween_Prerelease_MaxHigherCoreVersion (2.86s)
=== RUN   Test_SkipBetween_Prerelease_MinHigherCoreVersion
--- PASS: Test_SkipBetween_Prerelease_MinHigherCoreVersion (3.46s)
=== RUN   Test_SkipBetween_Prerelease_MaxHigherPrerelease
    skip_between_test.go:198: Terraform CLI version 1.7.0-rc1 is between 1.6.0 and 1.7.0-rc2: skipping test.
--- SKIP: Test_SkipBetween_Prerelease_MaxHigherPrerelease (3.04s)
=== RUN   Test_SkipBetween_Prerelease_MinHigherPrerelease
--- PASS: Test_SkipBetween_Prerelease_MinHigherPrerelease (3.39s)
=== RUN   Test_SkipBetween_Prerelease_MaxLowerCoreVersion
--- PASS: Test_SkipBetween_Prerelease_MaxLowerCoreVersion (3.01s)
=== RUN   Test_SkipBetween_Prerelease_MinLowerCoreVersion
    skip_between_test.go:261: Terraform CLI version 1.8.0-rc1 is between 1.7.0 and 1.9.0: skipping test.
--- SKIP: Test_SkipBetween_Prerelease_MinLowerCoreVersion (2.66s)
=== RUN   Test_SkipBetween_Prerelease_MaxLowerPrerelease
--- PASS: Test_SkipBetween_Prerelease_MaxLowerPrerelease (3.24s)
=== RUN   Test_SkipBetween_Prerelease_MinLowerPrerelease
    skip_between_test.go:303: Terraform CLI version 1.8.0-rc1 is between 1.8.0-beta1 and 1.9.0: skipping test.
--- SKIP: Test_SkipBetween_Prerelease_MinLowerPrerelease (2.91s)

=== RUN   Test_SkipIf_SkipTest
    skip_if_test.go:24: Terraform CLI version is 1.4.3: skipping test.
--- SKIP: Test_SkipIf_SkipTest (2.51s)
=== RUN   Test_SkipIf_RunTest
--- PASS: Test_SkipIf_RunTest (3.12s)
=== RUN   Test_SkipIf_Prerelease_EqualCoreVersion
    skip_if_test.go:70: Terraform CLI version is 1.8.0: skipping test.
--- SKIP: Test_SkipIf_Prerelease_EqualCoreVersion (2.51s)
=== RUN   Test_SkipIf_Prerelease_HigherCoreVersion
--- PASS: Test_SkipIf_Prerelease_HigherCoreVersion (3.22s)
=== RUN   Test_SkipIf_Prerelease_HigherPrerelease
--- PASS: Test_SkipIf_Prerelease_HigherPrerelease (3.27s)
=== RUN   Test_SkipIf_Prerelease_LowerCoreVersion
--- PASS: Test_SkipIf_Prerelease_LowerCoreVersion (3.03s)
=== RUN   Test_SkipIf_Prerelease_LowerPrerelease
--- PASS: Test_SkipIf_Prerelease_LowerPrerelease (3.15s)
```
  • Loading branch information
bflad authored Mar 29, 2024
1 parent a8247f6 commit 9ccb128
Show file tree
Hide file tree
Showing 19 changed files with 1,375 additions and 38 deletions.
5 changes: 5 additions & 0 deletions .changes/unreleased/BUG FIXES-20240328-180800.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
kind: BUG FIXES
body: 'tfversion: Fixed `RequireBelow` ignoring equal versioning to fail a test'
time: 2024-03-28T18:08:00.236612-04:00
custom:
Issue: "303"
5 changes: 3 additions & 2 deletions .changes/unreleased/ENHANCEMENTS-20240327-171628.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
kind: ENHANCEMENTS
body: 'tfversion: Ensured semantically equivalent Terraform CLI prerelease versions
are considered equal to patch versions in `SkipBelow`'
body: 'tfversion: Ensured Terraform CLI prerelease versions are considered
semantically equal to patch versions in built-in checks to match the Terraform CLI
versioning policy'
time: 2024-03-27T17:16:28.49466-04:00
custom:
Issue: "303"
27 changes: 23 additions & 4 deletions tfversion/require_above.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,19 @@ import (
)

// RequireAbove will fail the test if the Terraform CLI
// version is below the given version. For example, if given
// version.Must(version.NewVersion("0.15.0")), then 0.14.x or
// any other prior minor versions will fail the test.
// version is exclusively below the given version. For example, if given
// version.Must(version.NewVersion("1.8.0")), then 1.7.x or
// any other prior versions will fail the test.
//
// Prereleases of Terraform CLI (whether alpha, beta, or rc) are considered
// equal to a given patch version. For example, if given
// version.Must(version.NewVersion("1.8.0")), then 1.8.0-rc1 will run, not fail,
// the test. Terraform prereleases are considered as potential candidates for
// the upcoming version and therefore are treated as semantically equal for
// testing. If failing prereleases of the same patch release is desired, give a
// higher prerelease version. For example, if given
// version.Must(version.NewVersion("1.8.0-rc2")), then 1.8.0-rc1 will fail the
// test.
func RequireAbove(minimumVersion *version.Version) TerraformVersionCheck {
return requireAboveCheck{
minimumVersion: minimumVersion,
Expand All @@ -27,8 +37,17 @@ type requireAboveCheck struct {

// CheckTerraformVersion satisfies the TerraformVersionCheck interface.
func (r requireAboveCheck) CheckTerraformVersion(ctx context.Context, req CheckTerraformVersionRequest, resp *CheckTerraformVersionResponse) {
var terraformVersion *version.Version

if req.TerraformVersion.LessThan(r.minimumVersion) {
// If given a prerelease version, check the Terraform CLI version directly,
// otherwise use the core version so that prereleases are treated as equal.
if r.minimumVersion.Prerelease() != "" {
terraformVersion = req.TerraformVersion
} else {
terraformVersion = req.TerraformVersion.Core()
}

if terraformVersion.LessThan(r.minimumVersion) {
resp.Error = fmt.Errorf("expected Terraform CLI version above %s but detected version is %s",
r.minimumVersion, req.TerraformVersion)
}
Expand Down
161 changes: 159 additions & 2 deletions tfversion/require_above_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (
testinginterface "github.com/mitchellh/go-testing-interface"
)

func Test_RequireAbove(t *testing.T) { //nolint:paralleltest
func Test_RequireAbove_Equal(t *testing.T) { //nolint:paralleltest
t.Setenv("TF_ACC_TERRAFORM_PATH", "")
t.Setenv("TF_ACC_TERRAFORM_VERSION", "1.1.0")

Expand All @@ -41,7 +41,30 @@ func Test_RequireAbove(t *testing.T) { //nolint:paralleltest
})
}

func Test_RequireAbove_Error(t *testing.T) { //nolint:paralleltest
func Test_RequireAbove_Higher(t *testing.T) { //nolint:paralleltest
t.Setenv("TF_ACC_TERRAFORM_PATH", "")
t.Setenv("TF_ACC_TERRAFORM_VERSION", "1.1.1")

r.UnitTest(t, r.TestCase{
ProtoV6ProviderFactories: map[string]func() (tfprotov6.ProviderServer, error){
"test": providerserver.NewProviderServer(testprovider.Provider{}),
},
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
tfversion.RequireAbove(version.Must(version.NewVersion("1.1.0"))),
},
Steps: []r.TestStep{
{
//nullable argument only available in TF v1.1.0+
Config: `variable "a" {
nullable = true
default = "hello"
}`,
},
},
})
}

func Test_RequireAbove_Lower(t *testing.T) { //nolint:paralleltest
t.Setenv("TF_ACC_TERRAFORM_PATH", "")
t.Setenv("TF_ACC_TERRAFORM_VERSION", "1.0.7")

Expand All @@ -63,3 +86,137 @@ func Test_RequireAbove_Error(t *testing.T) { //nolint:paralleltest
})
})
}

func Test_RequireAbove_Prerelease_EqualCoreVersion(t *testing.T) { //nolint:paralleltest
t.Setenv("TF_ACC_TERRAFORM_PATH", "")
t.Setenv("TF_ACC_TERRAFORM_VERSION", "1.8.0-rc1")

// Pragmatic compromise that 1.8.0-rc1 prerelease is considered to
// be equivalent to the 1.8.0 core version. This enables developers
// to assert that prerelease versions are ran with upcoming
// core versions.
//
// Reference: https://github.com/hashicorp/terraform-plugin-testing/issues/303
r.UnitTest(t, r.TestCase{
ProtoV6ProviderFactories: map[string]func() (tfprotov6.ProviderServer, error){
"test": providerserver.NewProviderServer(testprovider.Provider{}),
},
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
tfversion.RequireAbove(version.Must(version.NewVersion("1.8.0"))),
},
Steps: []r.TestStep{
{
Config: `//non-empty config`,
},
},
})
}

func Test_RequireAbove_Prerelease_EqualPrerelease(t *testing.T) { //nolint:paralleltest
t.Setenv("TF_ACC_TERRAFORM_PATH", "")
t.Setenv("TF_ACC_TERRAFORM_VERSION", "1.8.0-rc1")

r.UnitTest(t, r.TestCase{
ProtoV6ProviderFactories: map[string]func() (tfprotov6.ProviderServer, error){
"test": providerserver.NewProviderServer(testprovider.Provider{}),
},
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
tfversion.RequireAbove(version.Must(version.NewVersion("1.8.0-rc1"))),
},
Steps: []r.TestStep{
{
Config: `//non-empty config`,
},
},
})
}

func Test_RequireAbove_Prerelease_HigherCoreVersion(t *testing.T) { //nolint:paralleltest
t.Setenv("TF_ACC_TERRAFORM_PATH", "")
t.Setenv("TF_ACC_TERRAFORM_VERSION", "1.7.0-rc1")

// The 1.7.0-rc1 prerelease should always be considered to be below the
// 1.8.0 core version. This intentionally verifies that the logic does not
// ignore the core version of the prerelease version when compared against
// the core version of the check.
plugintest.TestExpectTFatal(t, func() {
r.UnitTest(&testinginterface.RuntimeT{}, r.TestCase{
ProtoV6ProviderFactories: map[string]func() (tfprotov6.ProviderServer, error){
"test": providerserver.NewProviderServer(testprovider.Provider{}),
},
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
tfversion.RequireAbove(version.Must(version.NewVersion("1.8.0"))),
},
Steps: []r.TestStep{
{
Config: `//non-empty config`,
},
},
})
})
}

func Test_RequireAbove_Prerelease_HigherPrerelease(t *testing.T) { //nolint:paralleltest
t.Setenv("TF_ACC_TERRAFORM_PATH", "")
t.Setenv("TF_ACC_TERRAFORM_VERSION", "1.7.0-rc1")

// The 1.7.0-rc1 prerelease should always be considered to be
// below the 1.7.0-rc2 prerelease.
plugintest.TestExpectTFatal(t, func() {
r.UnitTest(&testinginterface.RuntimeT{}, r.TestCase{
ProtoV6ProviderFactories: map[string]func() (tfprotov6.ProviderServer, error){
"test": providerserver.NewProviderServer(testprovider.Provider{}),
},
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
tfversion.RequireAbove(version.Must(version.NewVersion("1.7.0-rc2"))),
},
Steps: []r.TestStep{
{
Config: `//non-empty config`,
},
},
})
})
}

func Test_RequireAbove_Prerelease_LowerCoreVersion(t *testing.T) { //nolint:paralleltest
t.Setenv("TF_ACC_TERRAFORM_PATH", "")
t.Setenv("TF_ACC_TERRAFORM_VERSION", "1.8.0-rc1")

// The 1.8.0-rc1 prerelease should always be considered to be
// above the 1.7.0 core version.
r.UnitTest(t, r.TestCase{
ProtoV6ProviderFactories: map[string]func() (tfprotov6.ProviderServer, error){
"test": providerserver.NewProviderServer(testprovider.Provider{}),
},
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
tfversion.RequireAbove(version.Must(version.NewVersion("1.7.0"))),
},
Steps: []r.TestStep{
{
Config: `//non-empty config`,
},
},
})
}

func Test_RequireAbove_Prerelease_LowerPrerelease(t *testing.T) { //nolint:paralleltest
t.Setenv("TF_ACC_TERRAFORM_PATH", "")
t.Setenv("TF_ACC_TERRAFORM_VERSION", "1.8.0-rc1")

// The 1.8.0-rc1 prerelease should always be considered to be
// above the 1.8.0-beta1 prerelease.
r.UnitTest(t, r.TestCase{
ProtoV6ProviderFactories: map[string]func() (tfprotov6.ProviderServer, error){
"test": providerserver.NewProviderServer(testprovider.Provider{}),
},
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
tfversion.RequireAbove(version.Must(version.NewVersion("1.8.0-beta1"))),
},
Steps: []r.TestStep{
{
Config: `//non-empty config`,
},
},
})
}
25 changes: 22 additions & 3 deletions tfversion/require_below.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,19 @@ import (
)

// RequireBelow will fail the test if the Terraform CLI
// version is above the given version. For example, if given
// version.Must(version.NewVersion("0.15.0")), then versions 0.15.x and
// version is inclusively above the given version. For example, if given
// version.Must(version.NewVersion("1.8.0")), then versions 1.8.x and
// above will fail the test.
//
// Prereleases of Terraform CLI (whether alpha, beta, or rc) are considered
// equal to a given patch version. For example, if given
// version.Must(version.NewVersion("1.8.0")), then 1.8.0-rc1 will fail, not run,
// the test. Terraform prereleases are considered as potential candidates for
// the upcoming version and therefore are treated as semantically equal for
// testing purposes. If failing prereleases of the same patch release is
// desired, give a lower prerelease version. For example, if given
// version.Must(version.NewVersion("1.8.0-rc1")), then 1.8.0-rc2 will fail the
// test.
func RequireBelow(maximumVersion *version.Version) TerraformVersionCheck {
return requireBelowCheck{
maximumVersion: maximumVersion,
Expand All @@ -27,8 +37,17 @@ type requireBelowCheck struct {

// CheckTerraformVersion satisfies the TerraformVersionCheck interface.
func (s requireBelowCheck) CheckTerraformVersion(ctx context.Context, req CheckTerraformVersionRequest, resp *CheckTerraformVersionResponse) {
var terraformVersion *version.Version

if req.TerraformVersion.GreaterThan(s.maximumVersion) {
// If given a prerelease version, check the Terraform CLI version directly,
// otherwise use the core version so that prereleases are treated as equal.
if s.maximumVersion.Prerelease() != "" {
terraformVersion = req.TerraformVersion
} else {
terraformVersion = req.TerraformVersion.Core()
}

if terraformVersion.GreaterThanOrEqual(s.maximumVersion) {
resp.Error = fmt.Errorf("expected Terraform CLI version below %s but detected version is %s",
s.maximumVersion, req.TerraformVersion)
}
Expand Down
Loading

0 comments on commit 9ccb128

Please sign in to comment.