diff --git a/pkg/testing/integration/program.go b/pkg/testing/integration/program.go index d6e28d44a..64f00af6b 100644 --- a/pkg/testing/integration/program.go +++ b/pkg/testing/integration/program.go @@ -304,17 +304,18 @@ func testLifeCycleInitAndDestroy( return errors.Wrap(err, "Couldn't copy test to temporary directory") } + // Keep the temporary test directory around for debugging unless + // the test completes successfully. + keepTestDir := true defer func() { - if t.Failed() { - // Test failed -- keep temporary files around for debugging. - // Maybe also copy to "failed tests" directory. + if keepTestDir { + // Maybe copy to "failed tests" directory. failedTestsDir := os.Getenv("PULUMI_FAILED_TESTS_DIR") if failedTestsDir != "" { dest := filepath.Join(failedTestsDir, t.Name()+uniqueSuffix()) contract.IgnoreError(fsutil.CopyFile(dest, dir, nil)) } } else { - // Test passed -- delete temporary files. contract.IgnoreError(os.RemoveAll(dir)) } }() @@ -332,7 +333,13 @@ func testLifeCycleInitAndDestroy( } }() - return between(t, opts, dir) + err = between(t, opts, dir) + if err != nil { + return err + } + + keepTestDir = false + return nil } func testLifeCycleInitialize(t *testing.T, opts *ProgramTestOptions, dir string) error { @@ -644,11 +651,11 @@ func performExtraRuntimeValidation( } // CopyTestToTemporaryDirectory creates a temporary directory to run the test in and copies the test to it. -func CopyTestToTemporaryDirectory(t *testing.T, opts *ProgramTestOptions) (dir string, err error) { +func CopyTestToTemporaryDirectory(t *testing.T, opts *ProgramTestOptions) (string, error) { // Ensure the required programs are present. if opts.Bin == "" { var pulumi string - pulumi, err = exec.LookPath("pulumi") + pulumi, err := exec.LookPath("pulumi") if err != nil { return "", errors.Wrapf(err, "Expected to find `pulumi` binary on $PATH") } @@ -656,7 +663,7 @@ func CopyTestToTemporaryDirectory(t *testing.T, opts *ProgramTestOptions) (dir s } if opts.YarnBin == "" { var yarn string - yarn, err = exec.LookPath("yarn") + yarn, err := exec.LookPath("yarn") if err != nil { return "", errors.Wrapf(err, "Expected to find `yarn` binary on $PATH") } @@ -683,7 +690,7 @@ func CopyTestToTemporaryDirectory(t *testing.T, opts *ProgramTestOptions) (dir s opts.Stderr = stderr } - pioutil.MustFprintf(opts.Stdout, "sample: %v\n", dir) + pioutil.MustFprintf(opts.Stdout, "sample: %v\n", sourceDir) pioutil.MustFprintf(opts.Stdout, "pulumi: %v\n", opts.Bin) pioutil.MustFprintf(opts.Stdout, "yarn: %v\n", opts.YarnBin) @@ -694,23 +701,25 @@ func CopyTestToTemporaryDirectory(t *testing.T, opts *ProgramTestOptions) (dir s } // Clean up the temporary directory on failure + deleteTargetDir := true defer func() { - if err != nil { + if deleteTargetDir { contract.IgnoreError(os.RemoveAll(targetDir)) } }() // Copy the source project - if copyerr := fsutil.CopyFile(targetDir, sourceDir, nil); copyerr != nil { - return "", copyerr + if err = fsutil.CopyFile(targetDir, sourceDir, nil); err != nil { + return "", err } err = prepareProject(t, opts, targetDir) if err != nil { - return "", errors.Wrapf(err, "Failed to prepare %v", dir) + return "", errors.Wrapf(err, "Failed to prepare %v", targetDir) } pioutil.MustFprintf(stdout, "projdir: %v\n", targetDir) + deleteTargetDir = false return targetDir, nil }