diff --git a/tfexec/destroy_test.go b/tfexec/destroy_test.go index 93daf356..eb28f58a 100644 --- a/tfexec/destroy_test.go +++ b/tfexec/destroy_test.go @@ -10,7 +10,7 @@ import ( func TestDestroyCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest012)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/fmt_test.go b/tfexec/fmt_test.go index 0403067d..bdc5b6f3 100644 --- a/tfexec/fmt_test.go +++ b/tfexec/fmt_test.go @@ -3,10 +3,15 @@ package tfexec import ( "context" "errors" + "runtime" "testing" ) func TestFormat(t *testing.T) { + if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" { + t.Skip("Terraform for darwin/arm64 is not available until v1") + } + td := t.TempDir() tf, err := NewTerraform(td, tfVersion(t, "0.7.6")) diff --git a/tfexec/get_test.go b/tfexec/get_test.go index 2e2aa6ef..32cfbe0c 100644 --- a/tfexec/get_test.go +++ b/tfexec/get_test.go @@ -10,7 +10,7 @@ import ( func TestGetCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest012)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/graph_test.go b/tfexec/graph_test.go index 02c683e3..628fe2d4 100644 --- a/tfexec/graph_test.go +++ b/tfexec/graph_test.go @@ -2,12 +2,17 @@ package tfexec import ( "context" + "runtime" "testing" "github.com/hashicorp/terraform-exec/tfexec/internal/testutil" ) -func TestGraphCmd(t *testing.T) { +func TestGraphCmd_v013(t *testing.T) { + if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" { + t.Skip("Terraform for darwin/arm64 is not available until v1") + } + td := t.TempDir() tf, err := NewTerraform(td, tfVersion(t, testutil.Latest013)) @@ -41,10 +46,10 @@ func TestGraphCmd(t *testing.T) { }) } -func TestGraphCmd15(t *testing.T) { +func TestGraphCmd_v1(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest015)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/import_test.go b/tfexec/import_test.go index 2a9d0af6..e1d5d6d7 100644 --- a/tfexec/import_test.go +++ b/tfexec/import_test.go @@ -10,7 +10,7 @@ import ( func TestImportCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest012)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/init_test.go b/tfexec/init_test.go index cafa5db1..850f36f8 100644 --- a/tfexec/init_test.go +++ b/tfexec/init_test.go @@ -2,12 +2,17 @@ package tfexec import ( "context" + "runtime" "testing" "github.com/hashicorp/terraform-exec/tfexec/internal/testutil" ) -func TestInitCmd(t *testing.T) { +func TestInitCmd_v012(t *testing.T) { + if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" { + t.Skip("Terraform for darwin/arm64 is not available until v1") + } + td := t.TempDir() tf, err := NewTerraform(td, tfVersion(t, testutil.Latest012)) @@ -68,3 +73,57 @@ func TestInitCmd(t *testing.T) { }, nil, initCmd) }) } + +func TestInitCmd_v1(t *testing.T) { + td := t.TempDir() + + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) + if err != nil { + t.Fatal(err) + } + + // empty env, to avoid environ mismatch in testing + tf.SetEnv(map[string]string{}) + + t.Run("defaults", func(t *testing.T) { + // defaults + initCmd, err := tf.initCmd(context.Background()) + if err != nil { + t.Fatal(err) + } + + assertCmd(t, []string{ + "init", + "-no-color", + "-force-copy", + "-input=false", + "-backend=true", + "-get=true", + "-upgrade=false", + }, nil, initCmd) + }) + + t.Run("override all defaults", func(t *testing.T) { + initCmd, err := tf.initCmd(context.Background(), Backend(false), BackendConfig("confpath1"), BackendConfig("confpath2"), FromModule("testsource"), Get(false), PluginDir("testdir1"), PluginDir("testdir2"), Reconfigure(true), Upgrade(true), Dir("initdir")) + if err != nil { + t.Fatal(err) + } + + assertCmd(t, []string{ + "init", + "-no-color", + "-force-copy", + "-input=false", + "-from-module=testsource", + "-backend=false", + "-get=false", + "-upgrade=true", + "-reconfigure", + "-backend-config=confpath1", + "-backend-config=confpath2", + "-plugin-dir=testdir1", + "-plugin-dir=testdir2", + "initdir", + }, nil, initCmd) + }) +} diff --git a/tfexec/internal/e2etest/testdata/bigint/main.tf b/tfexec/internal/e2etest/testdata/bigint/main.tf index 26ab3b77..8245396e 100644 --- a/tfexec/internal/e2etest/testdata/bigint/main.tf +++ b/tfexec/internal/e2etest/testdata/bigint/main.tf @@ -1,7 +1,7 @@ terraform { required_providers { random = { - version = "3.0.1" + version = "3.1.3" } } } diff --git a/tfexec/internal/e2etest/util_test.go b/tfexec/internal/e2etest/util_test.go index 106cf9c2..2474cd75 100644 --- a/tfexec/internal/e2etest/util_test.go +++ b/tfexec/internal/e2etest/util_test.go @@ -8,6 +8,7 @@ import ( "io/ioutil" "os" "path/filepath" + "runtime" "strings" "testing" @@ -50,6 +51,16 @@ func runTestVersions(t *testing.T, versions []string, fixtureName string, cb fun alreadyRunVersions := map[string]bool{} for _, tfv := range versions { t.Run(fmt.Sprintf("%s-%s", fixtureName, tfv), func(t *testing.T) { + if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" { + v, err := version.NewVersion(tfv) + if err != nil { + t.Fatal(err) + } + if v.LessThan(version.Must(version.NewVersion("1.0.2"))) { + t.Skipf("Terraform not available for darwin/arm64 < 1.0.2 (%s)", v) + } + } + if alreadyRunVersions[tfv] { t.Skipf("already run version %q", tfv) } diff --git a/tfexec/output_test.go b/tfexec/output_test.go index 6a7d5305..1df7a58c 100644 --- a/tfexec/output_test.go +++ b/tfexec/output_test.go @@ -10,7 +10,7 @@ import ( func TestOutputCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest012)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/providers_lock_test.go b/tfexec/providers_lock_test.go index f8e2591c..82e1d8e7 100644 --- a/tfexec/providers_lock_test.go +++ b/tfexec/providers_lock_test.go @@ -10,7 +10,7 @@ import ( func TestProvidersLockCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest012)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/providers_schema_test.go b/tfexec/providers_schema_test.go index b84cf733..33cff78c 100644 --- a/tfexec/providers_schema_test.go +++ b/tfexec/providers_schema_test.go @@ -10,7 +10,7 @@ import ( func TestProvidersSchemaCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest012)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/refresh_test.go b/tfexec/refresh_test.go index b06901cb..bd4a94c4 100644 --- a/tfexec/refresh_test.go +++ b/tfexec/refresh_test.go @@ -10,7 +10,7 @@ import ( func TestRefreshCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest013)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/show_test.go b/tfexec/show_test.go index 3cc46362..0cace759 100644 --- a/tfexec/show_test.go +++ b/tfexec/show_test.go @@ -10,7 +10,7 @@ import ( func TestShowCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest012)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } @@ -31,7 +31,7 @@ func TestShowCmd(t *testing.T) { func TestShowStateFileCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest012)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } @@ -52,7 +52,7 @@ func TestShowStateFileCmd(t *testing.T) { func TestShowPlanFileCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest012)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } @@ -73,7 +73,7 @@ func TestShowPlanFileCmd(t *testing.T) { func TestShowPlanFileRawCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest012)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/state_mv_test.go b/tfexec/state_mv_test.go index 775756d2..47597693 100644 --- a/tfexec/state_mv_test.go +++ b/tfexec/state_mv_test.go @@ -10,7 +10,7 @@ import ( func TestStateMvCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest013)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/state_rm_test.go b/tfexec/state_rm_test.go index a1904a6d..0a7843bd 100644 --- a/tfexec/state_rm_test.go +++ b/tfexec/state_rm_test.go @@ -10,7 +10,7 @@ import ( func TestStateRmCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest013)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/taint_test.go b/tfexec/taint_test.go index 67f1d5ef..ed0ec695 100644 --- a/tfexec/taint_test.go +++ b/tfexec/taint_test.go @@ -10,7 +10,7 @@ import ( func TestTaintCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest013)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/terraform_test.go b/tfexec/terraform_test.go index d6521b4c..32b7da3d 100644 --- a/tfexec/terraform_test.go +++ b/tfexec/terraform_test.go @@ -32,7 +32,7 @@ func TestMain(m *testing.M) { func TestSetEnv(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest012)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } @@ -272,7 +272,11 @@ func TestSetLogPath(t *testing.T) { }) } -func TestCheckpointDisablePropagation(t *testing.T) { +func TestCheckpointDisablePropagation_v012(t *testing.T) { + if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" { + t.Skip("Terraform for darwin/arm64 is not available until v1") + } + td := t.TempDir() tf, err := NewTerraform(td, tfVersion(t, testutil.Latest012)) @@ -351,6 +355,77 @@ func TestCheckpointDisablePropagation(t *testing.T) { }) } +func TestCheckpointDisablePropagation_v1(t *testing.T) { + td := t.TempDir() + + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) + if err != nil { + t.Fatal(err) + } + + err = os.Setenv("CHECKPOINT_DISABLE", "1") + if err != nil { + t.Fatal(err) + } + defer os.Unsetenv("CHECKPOINT_DISABLE") + + t.Run("case 1: env var is set in environment and not overridden", func(t *testing.T) { + + err = tf.SetEnv(map[string]string{ + "FOOBAR": "1", + }) + if err != nil { + t.Fatal(err) + } + + initCmd, err := tf.initCmd(context.Background()) + if err != nil { + t.Fatal(err) + } + + assertCmd(t, []string{ + "init", + "-no-color", + "-force-copy", + "-input=false", + "-backend=true", + "-get=true", + "-upgrade=false", + }, map[string]string{ + "CHECKPOINT_DISABLE": "1", + "FOOBAR": "1", + }, initCmd) + }) + + t.Run("case 2: env var is set in environment and overridden with SetEnv", func(t *testing.T) { + err = tf.SetEnv(map[string]string{ + "CHECKPOINT_DISABLE": "", + "FOOBAR": "2", + }) + if err != nil { + t.Fatal(err) + } + + initCmd, err := tf.initCmd(context.Background()) + if err != nil { + t.Fatal(err) + } + + assertCmd(t, []string{ + "init", + "-no-color", + "-force-copy", + "-input=false", + "-backend=true", + "-get=true", + "-upgrade=false", + }, map[string]string{ + "CHECKPOINT_DISABLE": "", + "FOOBAR": "2", + }, initCmd) + }) +} + // test that a suitable error is returned if NewTerraform is called without a valid // executable path func TestNoTerraformBinary(t *testing.T) { diff --git a/tfexec/untaint_test.go b/tfexec/untaint_test.go index 99075f45..cfe9085f 100644 --- a/tfexec/untaint_test.go +++ b/tfexec/untaint_test.go @@ -10,7 +10,7 @@ import ( func TestUntaintCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest013)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/upgrade012_test.go b/tfexec/upgrade012_test.go index db61bd78..71fc606e 100644 --- a/tfexec/upgrade012_test.go +++ b/tfexec/upgrade012_test.go @@ -4,12 +4,17 @@ import ( "context" "errors" "fmt" + "runtime" "testing" "github.com/hashicorp/terraform-exec/tfexec/internal/testutil" ) func TestUpgrade012(t *testing.T) { + if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" { + t.Skip("Terraform for darwin/arm64 is not available until v1") + } + td := t.TempDir() t.Run("defaults", func(t *testing.T) { diff --git a/tfexec/upgrade013_test.go b/tfexec/upgrade013_test.go index 1ab79b41..5704f274 100644 --- a/tfexec/upgrade013_test.go +++ b/tfexec/upgrade013_test.go @@ -4,12 +4,17 @@ import ( "context" "errors" "fmt" + "runtime" "testing" "github.com/hashicorp/terraform-exec/tfexec/internal/testutil" ) func TestUpgrade013(t *testing.T) { + if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" { + t.Skip("Terraform for darwin/arm64 is not available until v1") + } + td := t.TempDir() t.Run("defaults", func(t *testing.T) { diff --git a/tfexec/version_test.go b/tfexec/version_test.go index cc0c9160..b0b6af84 100644 --- a/tfexec/version_test.go +++ b/tfexec/version_test.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "path/filepath" + "runtime" "testing" "github.com/google/go-cmp/cmp" @@ -207,6 +208,10 @@ func TestVersionInRange(t *testing.T) { } func TestCompatible(t *testing.T) { + if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" { + t.Skip("Terraform for darwin/arm64 is not available until v1") + } + ev := &releases.ExactVersion{ Product: product.Terraform, Version: version.Must(version.NewVersion("0.12.26")), diff --git a/tfexec/workspace_delete_test.go b/tfexec/workspace_delete_test.go index 1afa8199..60c363eb 100644 --- a/tfexec/workspace_delete_test.go +++ b/tfexec/workspace_delete_test.go @@ -8,7 +8,7 @@ import ( ) func TestWorkspaceDeleteCmd(t *testing.T) { - tf, err := NewTerraform(t.TempDir(), tfVersion(t, testutil.Latest013)) + tf, err := NewTerraform(t.TempDir(), tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/workspace_new_test.go b/tfexec/workspace_new_test.go index 5831e87c..63471376 100644 --- a/tfexec/workspace_new_test.go +++ b/tfexec/workspace_new_test.go @@ -11,7 +11,7 @@ import ( func TestWorkspaceNewCmd(t *testing.T) { td := t.TempDir() - tf, err := NewTerraform(td, tfVersion(t, testutil.Latest013)) + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) if err != nil { t.Fatal(err) } diff --git a/tfexec/workspace_show_test.go b/tfexec/workspace_show_test.go index 5c21a000..411ee6bc 100644 --- a/tfexec/workspace_show_test.go +++ b/tfexec/workspace_show_test.go @@ -3,10 +3,17 @@ package tfexec import ( "context" "errors" + "runtime" "testing" + + "github.com/hashicorp/terraform-exec/tfexec/internal/testutil" ) -func TestWorkspaceShowCmd(t *testing.T) { +func TestWorkspaceShowCmd_v012(t *testing.T) { + if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" { + t.Skip("Terraform for darwin/arm64 is not available until v1") + } + td := t.TempDir() tf, err := NewTerraform(td, tfVersion(t, "0.9.11")) @@ -17,15 +24,37 @@ func TestWorkspaceShowCmd(t *testing.T) { // empty env, to avoid environ mismatch in testing tf.SetEnv(map[string]string{}) - t.Run("too old version", func(t *testing.T) { - _, err := tf.workspaceShowCmd(context.Background()) - if err == nil { - t.Fatal("expected old version to fail") - } - - var expectedErr *ErrVersionMismatch - if !errors.As(err, &expectedErr) { - t.Fatalf("error doesn't match: %#v", err) - } - }) + _, err = tf.workspaceShowCmd(context.Background()) + if err == nil { + t.Fatal("expected old version to fail") + } + + var expectedErr *ErrVersionMismatch + if !errors.As(err, &expectedErr) { + t.Fatalf("error doesn't match: %#v", err) + } + +} + +func TestWorkspaceShowCmd_v1(t *testing.T) { + td := t.TempDir() + + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1)) + if err != nil { + t.Fatal(err) + } + + // empty env, to avoid environ mismatch in testing + tf.SetEnv(map[string]string{}) + + cmd, err := tf.workspaceShowCmd(context.Background()) + if err != nil { + t.Fatal(err) + } + + assertCmd(t, []string{ + "workspace", + "show", + "-no-color", + }, map[string]string{}, cmd) }