| package e2etest |
| |
| import ( |
| "os" |
| "path/filepath" |
| "sort" |
| "testing" |
| |
| "github.com/google/go-cmp/cmp" |
| "github.com/hashicorp/terraform/internal/e2e" |
| ) |
| |
| // The tests in this file are for the "terraform providers mirror" command, |
| // which is tested in an e2etest mode rather than a unit test mode because it |
| // interacts directly with Terraform Registry and the full details of that are |
| // tricky to mock. Such a mock is _possible_, but we're using e2etest as a |
| // compromise for now to keep these tests relatively simple. |
| |
| func TestTerraformProvidersMirror(t *testing.T) { |
| testTerraformProvidersMirror(t, "terraform-providers-mirror") |
| } |
| |
| func TestTerraformProvidersMirrorWithLockFile(t *testing.T) { |
| testTerraformProvidersMirror(t, "terraform-providers-mirror-with-lock-file") |
| } |
| |
| func testTerraformProvidersMirror(t *testing.T, fixture string) { |
| // This test reaches out to releases.hashicorp.com to download the |
| // template and null providers, so it can only run if network access is |
| // allowed. |
| skipIfCannotAccessNetwork(t) |
| |
| outputDir := t.TempDir() |
| t.Logf("creating mirror directory in %s", outputDir) |
| |
| fixturePath := filepath.Join("testdata", fixture) |
| tf := e2e.NewBinary(t, terraformBin, fixturePath) |
| |
| stdout, stderr, err := tf.Run("providers", "mirror", "-platform=linux_amd64", "-platform=windows_386", outputDir) |
| if err != nil { |
| t.Fatalf("unexpected error: %s\nstdout:\n%s\nstderr:\n%s", err, stdout, stderr) |
| } |
| |
| // The test fixture includes exact version constraints for the two |
| // providers it depends on so that the following should remain stable. |
| // In the (unlikely) event that these particular versions of these |
| // providers are removed from the registry, this test will start to fail. |
| want := []string{ |
| "registry.terraform.io/hashicorp/null/2.1.0.json", |
| "registry.terraform.io/hashicorp/null/index.json", |
| "registry.terraform.io/hashicorp/null/terraform-provider-null_2.1.0_linux_amd64.zip", |
| "registry.terraform.io/hashicorp/null/terraform-provider-null_2.1.0_windows_386.zip", |
| "registry.terraform.io/hashicorp/template/2.1.1.json", |
| "registry.terraform.io/hashicorp/template/index.json", |
| "registry.terraform.io/hashicorp/template/terraform-provider-template_2.1.1_linux_amd64.zip", |
| "registry.terraform.io/hashicorp/template/terraform-provider-template_2.1.1_windows_386.zip", |
| } |
| var got []string |
| walkErr := filepath.Walk(outputDir, func(path string, info os.FileInfo, err error) error { |
| if err != nil { |
| return err |
| } |
| if info.IsDir() { |
| return nil // we only care about leaf files for this test |
| } |
| relPath, err := filepath.Rel(outputDir, path) |
| if err != nil { |
| return err |
| } |
| got = append(got, filepath.ToSlash(relPath)) |
| return nil |
| }) |
| if walkErr != nil { |
| t.Fatal(walkErr) |
| } |
| sort.Strings(got) |
| |
| if diff := cmp.Diff(want, got); diff != "" { |
| t.Errorf("unexpected files in result\n%s", diff) |
| } |
| } |