func()

in internal/testrunner/runners/system/runner.go [146:276]


func (r *runner) GetTests(ctx context.Context) ([]testrunner.Tester, error) {
	var folders []testrunner.TestFolder
	manifest, err := packages.ReadPackageManifestFromPackageRoot(r.packageRootPath)
	if err != nil {
		return nil, fmt.Errorf("reading package manifest failed (path: %s): %w", r.packageRootPath, err)
	}

	hasDataStreams, err := testrunner.PackageHasDataStreams(manifest)
	if err != nil {
		return nil, fmt.Errorf("cannot determine if package has data streams: %w", err)
	}

	if r.runSetup || r.runTearDown || r.runTestsOnly {
		_, err := os.Stat(r.serviceStateFilePath)
		logger.Debugf("Service state data exists in %s: %v", r.serviceStateFilePath, !os.IsNotExist(err))
		if r.runSetup && !os.IsNotExist(err) {
			return nil, fmt.Errorf("failed to run --setup, required to tear down previous setup")
		}
		if r.runTestsOnly && os.IsNotExist(err) {
			return nil, fmt.Errorf("failed to run tests with --no-provision, setup first with --setup")
		}
		if r.runTearDown && os.IsNotExist(err) {
			return nil, fmt.Errorf("failed to run --tear-down, setup not found")
		}
	} else {
		if _, err = os.Stat(r.serviceStateFilePath); !os.IsNotExist(err) {
			return nil, fmt.Errorf("failed to run tests, required to tear down previous state run (path: %s)", r.serviceStateFilePath)
		}
	}

	var serviceState ServiceState
	if r.runTearDown || r.runTestsOnly {
		serviceState, err = readServiceStateData(r.serviceStateFilePath)
		if err != nil {
			return nil, fmt.Errorf("failed to read service state: %w", err)
		}
	}

	if hasDataStreams {
		var dataStreams []string
		if r.runSetup || r.runTearDown || r.runTestsOnly {
			configFilePath := r.configFilePath
			if r.runTearDown || r.runTestsOnly {
				configFilePath = serviceState.ConfigFilePath
			}
			dataStream := testrunner.ExtractDataStreamFromPath(configFilePath, r.packageRootPath)
			dataStreams = append(dataStreams, dataStream)
		} else if len(r.dataStreams) > 0 {
			dataStreams = r.dataStreams
		}

		folders, err = testrunner.FindTestFolders(r.packageRootPath, dataStreams, r.Type())
		if err != nil {
			return nil, fmt.Errorf("unable to determine test folder paths: %w", err)
		}

		if r.failOnMissingTests && len(folders) == 0 {
			if len(dataStreams) > 0 {
				return nil, fmt.Errorf("no %s tests found for %s data stream(s)", r.Type(), strings.Join(dataStreams, ","))
			}
			return nil, fmt.Errorf("no %s tests found", r.Type())
		}
	} else {
		folders, err = testrunner.FindTestFolders(r.packageRootPath, nil, r.Type())
		if err != nil {
			return nil, fmt.Errorf("unable to determine test folder paths: %w", err)
		}
		if r.failOnMissingTests && len(folders) == 0 {
			return nil, fmt.Errorf("no %s tests found", r.Type())
		}
	}

	if r.runSetup || r.runTearDown || r.runTestsOnly {
		// variant flag is not checked here since there are packages that do not have variants
		if len(folders) != 1 {
			return nil, fmt.Errorf("wrong number of test folders (expected 1): %d", len(folders))
		}
	}

	var testers []testrunner.Tester
	for _, t := range folders {
		var variants []string
		var cfgFiles []string

		if r.runTestsOnly || r.runTearDown {
			variants = []string{serviceState.VariantName}
			cfgFiles = []string{filepath.Base(serviceState.ConfigFilePath)}
		} else {
			variants, err = r.getAllVariants(t)
			if err != nil {
				return nil, fmt.Errorf("failed to retrieve variants from %s: %w", t.Path, err)
			}

			cfgFiles, err = r.getAllConfigFiles(t)
			if err != nil {
				return nil, fmt.Errorf("failed to retrieve config files from %s: %w", t.Path, err)
			}
		}

		for _, variant := range variants {
			for _, config := range cfgFiles {
				logger.Debugf("System runner: data stream %q config file %q variant %q", t.DataStream, config, variant)
				tester, err := NewSystemTester(SystemTesterOptions{
					Profile:            r.profile,
					PackageRootPath:    r.packageRootPath,
					KibanaClient:       r.kibanaClient,
					API:                r.esAPI,
					ESClient:           r.esClient,
					TestFolder:         t,
					ServiceVariant:     variant,
					GenerateTestResult: r.generateTestResult,
					DeferCleanup:       r.deferCleanup,
					RunSetup:           r.runSetup,
					RunTestsOnly:       r.runTestsOnly,
					RunTearDown:        r.runTearDown,
					ConfigFileName:     config,
					GlobalTestConfig:   r.globalTestConfig,
					WithCoverage:       r.withCoverage,
					CoverageType:       r.coverageType,
				})
				if err != nil {
					return nil, fmt.Errorf(
						"failed to create system runner for sdata stream %q variant %q config file %q: %w",
						t.DataStream, variant, config, err)
				}
				testers = append(testers, tester)
			}
		}
	}
	return testers, nil
}