Help us shape the future of Go! Take the 2026 Go Developer Survey

test

package
v1.20.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 28, 2026 License: Apache-2.0 Imports: 6 Imported by: 0

README

Tests

The scanner has three levels of tests. Run every command from the repository root.

Level Location What runs Command
Unit *_test.go files next to the code Go packages, in-process go test $(go list ./... | grep -v /e2e) -count=1
In-process end-to-end test/e2e/ Full scans through the scan package go test ./test/e2e -count=1 (about 30 s)
Binary end-to-end e2e/ (see its README) The built bin/datadog-iac-scanner make test-e2e

The unit command is the one CI runs. It excludes both end-to-end packages.

This directory

  • helpers.go holds helpers shared by tests in other packages. ChangeCurrentDir finds the repository root by walking up to a directory named datadog-iac-scanner. Keep that name for your checkout or worktree, otherwise the tests that use it fail.
  • fixtures/ holds input files for unit tests across packages, such as pkg/runner, pkg/analyzer and pkg/parser.
  • assets/ holds sample inputs and expected results, for example for remediation and Kubernetes tests.
  • e2e/ holds the in-process end-to-end tests: inline exclusions, OpenTofu files, the Terraform plan flag, the offline bundle and v1.4 rule configs.
    • Most of them load their rules from e2e/testdata/rules/, but still fetch the Rego libraries from the Datadog API, so they need network access.
    • Test_E2EOfflineBundle runs without network access.
  • modules/ holds legacy rule fixtures. No test references them any more.

Make targets

make test-short, make test-unit, make test-cover, make test-race and make test-coverage-report all run go mod tidy and go generate first, so they can change go.mod and go.sum. CI calls go test directly.

CI

Workflow What it runs
.github/workflows/go-ci.yml Unit tests on Linux, Windows and macOS
.github/workflows/test-gate.yml A selected set of packages in short mode, including ./test/...
.github/workflows/go-e2e.yaml Binary end-to-end tests. The job does not fail on test failures.
.github/workflows/test-rules.yml test-rules: the rule tests stored in the backend, run against the built engine

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ComplexSummaryMock = model.Summary{
	Counters: model.Counters{
		ScannedFiles:           2,
		ParsedFiles:            2,
		FailedToScanFiles:      0,
		TotalQueries:           3,
		FailedToExecuteQueries: 0,
	},
	Queries: []model.QueryResult{
		queryHigh,
		queryMedium,
		queryHighCWE,
		queryCriticalCLI,
	},
	SeveritySummary: model.SeveritySummary{
		ScanID: "console",
		SeverityCounters: map[model.Severity]int{
			model.SeverityInfo:     0,
			model.SeverityLow:      0,
			model.SeverityMedium:   1,
			model.SeverityHigh:     2,
			model.SeverityCritical: 2,
		},
		TotalCounter: 5,
	},
}

ComplexSummaryMock a summary with more results to be used without running a scan

View Source
var ComplexSummaryMockWithExperimental = model.Summary{
	Counters: model.Counters{
		ScannedFiles:           2,
		ParsedFiles:            2,
		FailedToScanFiles:      0,
		TotalQueries:           2,
		FailedToExecuteQueries: 0,
	},
	Queries: []model.QueryResult{
		queryHighExperimental,
		queryMedium,
	},
	SeveritySummary: model.SeveritySummary{
		ScanID: "console",
		SeverityCounters: map[model.Severity]int{
			model.SeverityInfo:     0,
			model.SeverityLow:      0,
			model.SeverityMedium:   1,
			model.SeverityHigh:     2,
			model.SeverityCritical: 0,
		},
		TotalCounter: 3,
	},
}
View Source
var ExampleSummaryMock = model.Summary{
	Counters: model.Counters{
		ScannedFiles:           2,
		ParsedFiles:            2,
		FailedToScanFiles:      0,
		TotalQueries:           2,
		FailedToExecuteQueries: 0,
	},
	Queries: []model.QueryResult{
		queryInfo,
		queryMedium2,
	},
	SeveritySummary: model.SeveritySummary{
		ScanID: "console",
		SeverityCounters: map[model.Severity]int{
			model.SeverityInfo:     2,
			model.SeverityLow:      0,
			model.SeverityMedium:   1,
			model.SeverityHigh:     0,
			model.SeverityCritical: 0,
		},
		TotalCounter: 3,
	},
	ScannedPaths: []string{
		"./",
	},
}

ExampleSummaryMock a summary with specific results to CycloneDX report tests

View Source
var ExampleSummaryMockCWE = model.Summary{
	Counters: model.Counters{
		ScannedFiles:           1,
		ParsedFiles:            1,
		FailedToScanFiles:      0,
		TotalQueries:           1,
		FailedToExecuteQueries: 0,
	},
	Queries: []model.QueryResult{
		queryMediumCycloneCWE,
	},
	SeveritySummary: model.SeveritySummary{
		ScanID: "console",
		SeverityCounters: map[model.Severity]int{
			model.SeverityInfo:   0,
			model.SeverityLow:    0,
			model.SeverityMedium: 1,
			model.SeverityHigh:   0,
		},
		TotalCounter: 1,
	},
	ScannedPaths: []string{
		"./",
	},
}

ExampleSummaryMockCWE a summary with specific results to CycloneDX report tests with cwe field complete

View Source
var ExampleSummaryMockWithCloudProviderCommon = model.Summary{
	Counters: model.Counters{
		ScannedFiles:           1,
		ParsedFiles:            1,
		FailedToScanFiles:      0,
		TotalQueries:           1,
		FailedToExecuteQueries: 0,
	},
	Queries: []model.QueryResult{
		queryLowCICDCloudProvider,
	},
	SeveritySummary: model.SeveritySummary{
		ScanID: "console",
		SeverityCounters: map[model.Severity]int{
			model.SeverityInfo:     0,
			model.SeverityLow:      1,
			model.SeverityMedium:   0,
			model.SeverityHigh:     0,
			model.SeverityCritical: 0,
		},
		TotalCounter: 1,
	},
	ScannedPaths: []string{
		"./",
	},
}

ExampleSummaryMockWithCloudProviderCommon a summary with "common" as cloud provider to console tests

View Source
var ExampleSummaryMockWithPasswordsAndSecretsCommonQuery = model.Summary{
	Counters: model.Counters{
		ScannedFiles:           1,
		ParsedFiles:            1,
		FailedToScanFiles:      0,
		TotalQueries:           1,
		FailedToExecuteQueries: 0,
	},
	Queries: []model.QueryResult{
		queryHighPasswordsAndSecrets,
	},
	SeveritySummary: model.SeveritySummary{
		ScanID: "console",
		SeverityCounters: map[model.Severity]int{
			model.SeverityInfo:     0,
			model.SeverityLow:      0,
			model.SeverityMedium:   0,
			model.SeverityHigh:     1,
			model.SeverityCritical: 0,
		},
		TotalCounter: 1,
	},
	ScannedPaths: []string{
		"./",
	},
}

ExampleSummaryMockWithPasswordsAndSecretsCommonQuery a summary using the "Passwords And Secrets" common query that contains multiple Ids

View Source
var SimpleSummaryMock = model.Summary{
	Counters: model.Counters{
		ScannedFiles:           1,
		ParsedFiles:            1,
		FailedToScanFiles:      0,
		TotalQueries:           1,
		FailedToExecuteQueries: 0,
	},
	Queries: []model.QueryResult{
		queryMedium,
	},
	SeveritySummary: model.SeveritySummary{
		ScanID: "console",
		SeverityCounters: map[model.Severity]int{
			model.SeverityInfo:     0,
			model.SeverityLow:      0,
			model.SeverityMedium:   1,
			model.SeverityHigh:     0,
			model.SeverityCritical: 0,
		},
		TotalCounter: 1,
	},
	ScannedPaths: []string{
		"./",
	},
}

SimpleSummaryMock a summary with specific results to ASFF report tests

View Source
var SimpleSummaryMockAsff = model.Summary{
	Counters: model.Counters{
		ScannedFiles:           1,
		ParsedFiles:            1,
		FailedToScanFiles:      0,
		TotalQueries:           1,
		FailedToExecuteQueries: 0,
	},
	Queries: []model.QueryResult{
		queryMediumCWE,
	},
	SeveritySummary: model.SeveritySummary{
		ScanID: "console",
		SeverityCounters: map[model.Severity]int{
			model.SeverityInfo:     0,
			model.SeverityLow:      0,
			model.SeverityMedium:   1,
			model.SeverityHigh:     2,
			model.SeverityCritical: 0,
		},
		TotalCounter: 1,
	},
}

SimpleSummaryMockAsff a simple summary to be used with cwe field complete

View Source
var SummaryMock = model.Summary{
	Counters: model.Counters{
		ScannedFiles:           1,
		ParsedFiles:            1,
		FailedToScanFiles:      0,
		TotalQueries:           1,
		FailedToExecuteQueries: 0,
	},
	Queries: []model.QueryResult{
		queryHigh,
	},
	SeveritySummary: model.SeveritySummary{
		ScanID: "console",
		SeverityCounters: map[model.Severity]int{
			model.SeverityInfo:     0,
			model.SeverityLow:      0,
			model.SeverityMedium:   0,
			model.SeverityHigh:     2,
			model.SeverityCritical: 0,
		},
		TotalCounter: 2,
	},
	ScannedPaths: []string{
		"./",
	},
}

SummaryMock a summary to be used without running a scan

View Source
var SummaryMockCWE = model.Summary{
	Counters: model.Counters{
		ScannedFiles:           1,
		ParsedFiles:            1,
		FailedToScanFiles:      0,
		TotalQueries:           1,
		FailedToExecuteQueries: 0,
	},
	Queries: []model.QueryResult{
		queryHighCWE,
	},
	SeveritySummary: model.SeveritySummary{
		ScanID: "console",
		SeverityCounters: map[model.Severity]int{
			model.SeverityInfo:     0,
			model.SeverityLow:      0,
			model.SeverityMedium:   0,
			model.SeverityHigh:     2,
			model.SeverityCritical: 0,
		},
		TotalCounter: 2,
	},
	ScannedPaths: []string{
		"./",
	},
}

SummaryMockCWE a summary to be used with cwe field complete

View Source
var SummaryMockCritical = model.Summary{
	Counters: model.Counters{
		ScannedFiles:           2,
		ParsedFiles:            2,
		FailedToScanFiles:      0,
		TotalQueries:           1,
		FailedToExecuteQueries: 0,
	},
	Queries: []model.QueryResult{
		queryCritical,
	},
	SeveritySummary: model.SeveritySummary{
		ScanID: "console",
		SeverityCounters: map[model.Severity]int{
			model.SeverityInfo:     0,
			model.SeverityLow:      0,
			model.SeverityMedium:   0,
			model.SeverityHigh:     0,
			model.SeverityCritical: 1,
		},
		TotalCounter: 1,
	},
	ScannedPaths: []string{
		"./",
	},
}
View Source
var SummaryMockCriticalFullPathASFF = model.Summary{
	Counters: model.Counters{
		ScannedFiles:           2,
		ParsedFiles:            2,
		FailedToScanFiles:      0,
		TotalQueries:           1,
		FailedToExecuteQueries: 0,
	},
	Queries: []model.QueryResult{
		queryCriticalASFF,
	},
	SeveritySummary: model.SeveritySummary{
		ScanID: "console",
		SeverityCounters: map[model.Severity]int{
			model.SeverityInfo:     0,
			model.SeverityLow:      0,
			model.SeverityMedium:   0,
			model.SeverityHigh:     0,
			model.SeverityCritical: 1,
		},
		TotalCounter: 1,
	},
	ScannedPaths: []string{
		"./",
	},
}
View Source
var SummaryMockCriticalSonar = model.Summary{
	Counters: model.Counters{
		ScannedFiles:           2,
		ParsedFiles:            2,
		FailedToScanFiles:      0,
		TotalQueries:           1,
		FailedToExecuteQueries: 0,
	},
	Queries: []model.QueryResult{
		queryCriticalSonar,
	},
	SeveritySummary: model.SeveritySummary{
		ScanID: "console",
		SeverityCounters: map[model.Severity]int{
			model.SeverityInfo:     0,
			model.SeverityLow:      0,
			model.SeverityMedium:   0,
			model.SeverityHigh:     0,
			model.SeverityCritical: 1,
		},
		TotalCounter: 1,
	},
	ScannedPaths: []string{
		"./",
	},
}

Functions

func ChangeCurrentDir

func ChangeCurrentDir(desiredDir string) error

ChangeCurrentDir gets current working directory and changes to its parent until finds the desired directory or fail

func GetCurrentDirName

func GetCurrentDirName(path string) string

GetCurrentDirName returns current working directory

func MapToStringSlice

func MapToStringSlice(stringKeyMap map[string]string) []string

MapToStringSlice extract slice of keys from a map[string]string

func StringifyStruct

func StringifyStruct(v interface{}) (string, error)

StringifyStruct stringify struct for pretty print

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL