in cmd/testrunner.go [437:594]
func testRunnerSystemCommandAction(cmd *cobra.Command, args []string) error {
cmd.Printf("Run system tests for the package\n")
profile, err := cobraext.GetProfileFlag(cmd)
if err != nil {
return err
}
failOnMissing, err := cmd.Flags().GetBool(cobraext.FailOnMissingFlagName)
if err != nil {
return cobraext.FlagParsingError(err, cobraext.FailOnMissingFlagName)
}
generateTestResult, err := cmd.Flags().GetBool(cobraext.GenerateTestResultFlagName)
if err != nil {
return cobraext.FlagParsingError(err, cobraext.GenerateTestResultFlagName)
}
reportFormat, err := cmd.Flags().GetString(cobraext.ReportFormatFlagName)
if err != nil {
return cobraext.FlagParsingError(err, cobraext.ReportFormatFlagName)
}
reportOutput, err := cmd.Flags().GetString(cobraext.ReportOutputFlagName)
if err != nil {
return cobraext.FlagParsingError(err, cobraext.ReportOutputFlagName)
}
testCoverage, err := cmd.Flags().GetBool(cobraext.TestCoverageFlagName)
if err != nil {
return cobraext.FlagParsingError(err, cobraext.TestCoverageFlagName)
}
testCoverageFormat, err := cmd.Flags().GetString(cobraext.TestCoverageFormatFlagName)
if err != nil {
return cobraext.FlagParsingError(err, cobraext.TestCoverageFormatFlagName)
}
if !slices.Contains(testrunner.CoverageFormatsList(), testCoverageFormat) {
return cobraext.FlagParsingError(fmt.Errorf("coverage format not available: %s", testCoverageFormat), cobraext.TestCoverageFormatFlagName)
}
deferCleanup, err := cmd.Flags().GetDuration(cobraext.DeferCleanupFlagName)
if err != nil {
return cobraext.FlagParsingError(err, cobraext.DeferCleanupFlagName)
}
variantFlag, err := cmd.Flags().GetString(cobraext.VariantFlagName)
if err != nil {
return cobraext.FlagParsingError(err, cobraext.VariantFlagName)
}
packageRootPath, found, err := packages.FindPackageRoot()
if !found {
return errors.New("package root not found")
}
if err != nil {
return fmt.Errorf("locating package root failed: %w", err)
}
runSetup, err := cmd.Flags().GetBool(cobraext.SetupFlagName)
if err != nil {
return cobraext.FlagParsingError(err, cobraext.SetupFlagName)
}
runTearDown, err := cmd.Flags().GetBool(cobraext.TearDownFlagName)
if err != nil {
return cobraext.FlagParsingError(err, cobraext.TearDownFlagName)
}
runTestsOnly, err := cmd.Flags().GetBool(cobraext.NoProvisionFlagName)
if err != nil {
return cobraext.FlagParsingError(err, cobraext.NoProvisionFlagName)
}
configFileFlag, err := cmd.Flags().GetString(cobraext.ConfigFileFlagName)
if err != nil {
return cobraext.FlagParsingError(err, cobraext.ConfigFileFlagName)
}
if configFileFlag != "" {
absPath, err := filepath.Abs(configFileFlag)
if err != nil {
return fmt.Errorf("cannot obtain the absolute path for config file path: %s", configFileFlag)
}
if _, err := os.Stat(absPath); err != nil {
return fmt.Errorf("can't find config file %s: %w", configFileFlag, err)
}
configFileFlag = absPath
}
dataStreams, err := getDataStreamsFlag(cmd, packageRootPath)
if err != nil {
return err
}
ctx, stop := signal.Enable(cmd.Context(), logger.Info)
defer stop()
kibanaClient, err := stack.NewKibanaClientFromProfile(profile)
if err != nil {
return fmt.Errorf("can't create Kibana client: %w", err)
}
esClient, err := stack.NewElasticsearchClientFromProfile(profile)
if err != nil {
return fmt.Errorf("can't create Elasticsearch client: %w", err)
}
err = esClient.CheckHealth(ctx)
if err != nil {
return err
}
if runTearDown || runTestsOnly {
if variantFlag != "" {
return fmt.Errorf("variant flag cannot be set with --tear-down or --no-provision")
}
}
manifest, err := packages.ReadPackageManifestFromPackageRoot(packageRootPath)
if err != nil {
return fmt.Errorf("reading package manifest failed (path: %s): %w", packageRootPath, err)
}
globalTestConfig, err := testrunner.ReadGlobalTestConfig(packageRootPath)
if err != nil {
return fmt.Errorf("failed to read global config: %w", err)
}
runner := system.NewSystemTestRunner(system.SystemTestRunnerOptions{
Profile: profile,
PackageRootPath: packageRootPath,
KibanaClient: kibanaClient,
API: esClient.API,
ESClient: esClient,
ConfigFilePath: configFileFlag,
RunSetup: runSetup,
RunTearDown: runTearDown,
RunTestsOnly: runTestsOnly,
DataStreams: dataStreams,
ServiceVariant: variantFlag,
FailOnMissingTests: failOnMissing,
GenerateTestResult: generateTestResult,
DeferCleanup: deferCleanup,
GlobalTestConfig: globalTestConfig.System,
WithCoverage: testCoverage,
CoverageType: testCoverageFormat,
})
logger.Debugf("Running suite...")
results, err := testrunner.RunSuite(ctx, runner)
if err != nil {
return err
}
err = processResults(results, runner.Type(), reportFormat, reportOutput, packageRootPath, manifest.Name, manifest.Type, testCoverageFormat, testCoverage)
if err != nil {
return fmt.Errorf("failed to process results: %w", err)
}
return nil
}