blob: 3a113944894dc7851b052039a79bc185b7dce2ef [file] [log] [blame] [edit]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package arguments
import (
"github.com/hashicorp/terraform/internal/configs"
"github.com/hashicorp/terraform/internal/tfdiags"
)
// Test represents the command-line arguments for the test command.
type Test struct {
// CloudRunSource specifies the remote private module that this test run
// should execute against in a remote HCP Terraform run.
CloudRunSource string
// Filter contains a list of test files to execute. If empty, all test files
// will be executed.
Filter []string
// OperationParallelism is the limit Terraform places on total parallel operations
// during the plan or apply command within a single test run.
OperationParallelism int
// TestDirectory allows the user to override the directory that the test
// command will use to discover test files, defaults to "tests". Regardless
// of the value here, test files within the configuration directory will
// always be discovered.
TestDirectory string
// ViewType specifies which output format to use: human or JSON.
ViewType ViewType
// JUnitXMLFile specifies an optional filename to write a JUnit XML test
// result report to, in addition to the information written to the selected
// view type.
JUnitXMLFile string
// You can specify common variables for all tests from the command line.
Vars *Vars
// Verbose tells the test command to print out the plan either in
// human-readable format or JSON for each run step depending on the
// ViewType.
Verbose bool
}
func ParseTest(args []string) (*Test, tfdiags.Diagnostics) {
var diags tfdiags.Diagnostics
test := Test{
Vars: new(Vars),
}
var jsonOutput bool
cmdFlags := extendedFlagSet("test", nil, nil, test.Vars)
cmdFlags.Var((*FlagStringSlice)(&test.Filter), "filter", "filter")
cmdFlags.StringVar(&test.TestDirectory, "test-directory", configs.DefaultTestDirectory, "test-directory")
cmdFlags.BoolVar(&jsonOutput, "json", false, "json")
cmdFlags.StringVar(&test.JUnitXMLFile, "junit-xml", "", "junit-xml")
cmdFlags.BoolVar(&test.Verbose, "verbose", false, "verbose")
cmdFlags.IntVar(&test.OperationParallelism, "parallelism", DefaultParallelism, "parallelism")
// TODO: Finalise the name of this flag.
cmdFlags.StringVar(&test.CloudRunSource, "cloud-run", "", "cloud-run")
if err := cmdFlags.Parse(args); err != nil {
diags = diags.Append(tfdiags.Sourceless(
tfdiags.Error,
"Failed to parse command-line flags",
err.Error()))
}
if len(test.JUnitXMLFile) > 0 && len(test.CloudRunSource) > 0 {
diags = diags.Append(tfdiags.Sourceless(
tfdiags.Error,
"Incompatible command-line flags",
"The -junit-xml option is currently not compatible with remote test execution via the -cloud-run flag. If you are interested in JUnit XML output for remotely-executed tests please open an issue in GitHub."))
}
// Only set the default parallelism if this is not a cloud-run test.
// A cloud-run test will eventually run its own local test, and if the
// user still hasn't set the parallelism, that run will use the default.
if test.OperationParallelism < 1 && len(test.CloudRunSource) == 0 {
test.OperationParallelism = DefaultParallelism
}
switch {
case jsonOutput:
test.ViewType = ViewJSON
default:
test.ViewType = ViewHuman
}
return &test, diags
}