Skip to content

Commit

Permalink
Instantiate runners directly on test commands (#1888)
Browse files Browse the repository at this point in the history
Trigger each test runner from the command with its own
constructor and options. Cleaning up all references to runner
registry in testrunner package.
  • Loading branch information
mrodm authored Jun 6, 2024
1 parent 858808b commit c18a9ce
Show file tree
Hide file tree
Showing 10 changed files with 429 additions and 342 deletions.
94 changes: 39 additions & 55 deletions cmd/testrunner.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@ import (
"github.com/elastic/elastic-package/internal/testrunner"
"github.com/elastic/elastic-package/internal/testrunner/reporters/formats"
"github.com/elastic/elastic-package/internal/testrunner/reporters/outputs"
_ "github.com/elastic/elastic-package/internal/testrunner/runners" // register all test runners
"github.com/elastic/elastic-package/internal/testrunner/runners/asset"
"github.com/elastic/elastic-package/internal/testrunner/runners/pipeline"
"github.com/elastic/elastic-package/internal/testrunner/runners/policy"
"github.com/elastic/elastic-package/internal/testrunner/runners/static"
"github.com/elastic/elastic-package/internal/testrunner/runners/system"
)

const testLongDescription = `Use this command to run tests on a package. Currently, the following types of tests are available:
Expand Down Expand Up @@ -164,16 +168,13 @@ func testRunnerAssetCommandAction(cmd *cobra.Command, args []string) error {

_, pkg := filepath.Split(packageRootPath)

results, err := testrunner.Run(ctx, testType, testrunner.TestOptions{
Profile: profile,
TestFolder: testrunner.TestFolder{Package: pkg},
PackageRootPath: packageRootPath,
WithCoverage: testCoverage,
CoverageType: testCoverageFormat,
KibanaClient: kibanaClient,
RunIndependentElasticAgent: false,
runner := asset.NewAssetRunner(asset.AssetRunnerOptions{
TestFolder: testrunner.TestFolder{Package: pkg},
PackageRootPath: packageRootPath,
KibanaClient: kibanaClient,
})

results, err := testrunner.Run(ctx, runner)
if err != nil {
return fmt.Errorf("error running package %s tests: %w", testType, err)
}
Expand All @@ -200,11 +201,6 @@ func testRunnerStaticCommandAction(cmd *cobra.Command, args []string) error {
cmd.Printf("Run static tests for the package\n")
testType := testrunner.TestType("static")

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)
Expand Down Expand Up @@ -295,20 +291,15 @@ func testRunnerStaticCommandAction(cmd *cobra.Command, args []string) error {

var results []testrunner.TestResult
for _, folder := range testFolders {
r, err := testrunner.Run(ctx, testType, testrunner.TestOptions{
Profile: profile,
TestFolder: folder,
PackageRootPath: packageRootPath,
RunIndependentElasticAgent: false,
runner := static.NewStaticRunner(static.StaticRunnerOptions{
TestFolder: folder,
PackageRootPath: packageRootPath,
})

// Results must be appended even if there is an error, since there could be
// tests (e.g. system tests) that return both error and results.
results = append(results, r...)

r, err := testrunner.Run(ctx, runner)
if err != nil {
return fmt.Errorf("error running package %s tests: %w", testType, err)
}
results = append(results, r...)
}

return processResults(results, testType, reportFormat, reportOutput, packageRootPath, manifest.Name, manifest.Type, testCoverageFormat, testCoverage)
Expand Down Expand Up @@ -449,25 +440,25 @@ func testRunnerPipelineCommandAction(cmd *cobra.Command, args []string) error {

var results []testrunner.TestResult
for _, folder := range testFolders {
r, err := testrunner.Run(ctx, testType, testrunner.TestOptions{
Profile: profile,
TestFolder: folder,
PackageRootPath: packageRootPath,
GenerateTestResult: generateTestResult,
API: esClient.API,
WithCoverage: testCoverage,
CoverageType: testCoverageFormat,
DeferCleanup: deferCleanup,
RunIndependentElasticAgent: false,
runner, err := pipeline.NewPipelineRunner(pipeline.PipelineRunnerOptions{
Profile: profile,
TestFolder: folder,
PackageRootPath: packageRootPath,
GenerateTestResult: generateTestResult,
API: esClient.API,
WithCoverage: testCoverage,
CoverageType: testCoverageFormat,
DeferCleanup: deferCleanup,
})
if err != nil {
return fmt.Errorf("failed to create pipeline runner: %w", err)
}

// Results must be appended even if there is an error, since there could be
// tests (e.g. system tests) that return both error and results.
results = append(results, r...)

r, err := testrunner.Run(ctx, runner)
if err != nil {
return fmt.Errorf("error running package %s tests: %w", testType, err)
}
results = append(results, r...)
}

return processResults(results, testType, reportFormat, reportOutput, packageRootPath, manifest.Name, manifest.Type, testCoverageFormat, testCoverage)
Expand Down Expand Up @@ -691,7 +682,7 @@ func testRunnerSystemCommandAction(cmd *cobra.Command, args []string) error {

var results []testrunner.TestResult
for _, folder := range testFolders {
r, err := testrunner.Run(ctx, testType, testrunner.TestOptions{
runner := system.NewSystemRunner(system.SystemRunnerOptions{
Profile: profile,
TestFolder: folder,
PackageRootPath: packageRootPath,
Expand All @@ -707,13 +698,11 @@ func testRunnerSystemCommandAction(cmd *cobra.Command, args []string) error {
RunIndependentElasticAgent: false,
})

// Results must be appended even if there is an error, since there could be
// tests (e.g. system tests) that return both error and results.
results = append(results, r...)

r, err := testrunner.Run(ctx, runner)
if err != nil {
return fmt.Errorf("error running package %s tests: %w", testType, err)
}
results = append(results, r...)
}

return processResults(results, testType, reportFormat, reportOutput, packageRootPath, manifest.Name, manifest.Type, testCoverageFormat, testCoverage)
Expand Down Expand Up @@ -845,22 +834,17 @@ func testRunnerPolicyCommandAction(cmd *cobra.Command, args []string) error {

var results []testrunner.TestResult
for _, folder := range testFolders {
r, err := testrunner.Run(ctx, testType, testrunner.TestOptions{
Profile: profile,
TestFolder: folder,
PackageRootPath: packageRootPath,
GenerateTestResult: generateTestResult,
KibanaClient: kibanaClient,
RunIndependentElasticAgent: false,
runner := policy.NewPolicyRunner(policy.PolicyRunnerOptions{
TestFolder: folder,
PackageRootPath: packageRootPath,
GenerateTestResult: generateTestResult,
KibanaClient: kibanaClient,
})

// Results must be appended even if there is an error, since there could be
// tests (e.g. system tests) that return both error and results.
results = append(results, r...)

r, err := testrunner.Run(ctx, runner)
if err != nil {
return fmt.Errorf("error running package %s tests: %w", testType, err)
}
results = append(results, r...)
}

return processResults(results, testType, reportFormat, reportOutput, packageRootPath, manifest.Name, manifest.Type, testCoverageFormat, testCoverage)
Expand Down
34 changes: 21 additions & 13 deletions internal/testrunner/runners/asset/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,6 @@ import (
"github.com/elastic/elastic-package/internal/testrunner"
)

func init() {
testrunner.RegisterRunner(&runner{})
}

const (
// TestType defining asset loading tests
TestType testrunner.TestType = "asset"
Expand All @@ -33,6 +29,26 @@ type runner struct {
resourcesManager *resources.Manager
}

type AssetRunnerOptions struct {
TestFolder testrunner.TestFolder
PackageRootPath string
KibanaClient *kibana.Client
}

func NewAssetRunner(options AssetRunnerOptions) *runner {
runner := runner{
testFolder: options.TestFolder,
packageRootPath: options.PackageRootPath,
kibanaClient: options.KibanaClient,
}

manager := resources.NewManager()
manager.RegisterProvider(resources.DefaultKibanaProviderName, &resources.KibanaProvider{Client: options.KibanaClient})
runner.resourcesManager = manager

return &runner
}

// Ensures that runner implements testrunner.TestRunner interface
var _ testrunner.TestRunner = new(runner)

Expand All @@ -47,15 +63,7 @@ func (r runner) String() string {
}

// Run runs the asset loading tests
func (r *runner) Run(ctx context.Context, options testrunner.TestOptions) ([]testrunner.TestResult, error) {
r.testFolder = options.TestFolder
r.packageRootPath = options.PackageRootPath
r.kibanaClient = options.KibanaClient

manager := resources.NewManager()
manager.RegisterProvider(resources.DefaultKibanaProviderName, &resources.KibanaProvider{Client: r.kibanaClient})
r.resourcesManager = manager

func (r *runner) Run(ctx context.Context) ([]testrunner.TestResult, error) {
return r.run(ctx)
}

Expand Down
4 changes: 2 additions & 2 deletions internal/testrunner/runners/pipeline/coverage.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ import (
"github.com/elastic/elastic-package/internal/testrunner"
)

// GetPipelineCoverage returns a coverage report for the provided set of ingest pipelines.
func GetPipelineCoverage(options testrunner.TestOptions, pipelines []ingest.Pipeline) (testrunner.CoverageReport, error) {
// getPipelineCoverage returns a coverage report for the provided set of ingest pipelines.
func getPipelineCoverage(options PipelineRunnerOptions, pipelines []ingest.Pipeline) (testrunner.CoverageReport, error) {
dataStreamPath, found, err := packages.FindDataStreamRootForPath(options.TestFolder.Path)
if err != nil {
return nil, fmt.Errorf("locating data_stream root failed: %w", err)
Expand Down
Loading

0 comments on commit c18a9ce

Please sign in to comment.