-
Notifications
You must be signed in to change notification settings - Fork 2.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
test: add integration plugin tests #7299
Changes from 4 commits
24c7959
a06bb75
60cf5a4
eeda1c8
33cf9d5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -126,6 +126,27 @@ jobs: | |
shell: bash | ||
run: | | ||
mage test:module | ||
plugin-test: | ||
name: Plugin Integration Test | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: Checkout | ||
uses: actions/[email protected] | ||
|
||
- name: Set up Go | ||
uses: actions/setup-go@v5 | ||
with: | ||
go-version: ${{ env.GO_VERSION }} | ||
|
||
- name: Install tools | ||
uses: aquaproj/[email protected] | ||
with: | ||
aqua_version: v1.25.0 | ||
|
||
- name: Run plugin integration tests | ||
shell: bash | ||
run: | | ||
mage test:plugin | ||
|
||
vm-test: | ||
name: VM Integration Test | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,111 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||
//go:build plugin_integration | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
package integration | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
import ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
"io" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"os" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"path/filepath" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"testing" | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/stretchr/testify/require" | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/aquasecurity/trivy/pkg/utils/fsutils" | ||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
func TestPlugin(t *testing.T) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
tests := []struct { | ||||||||||||||||||||||||||||||||||||||||||||||||||
name string | ||||||||||||||||||||||||||||||||||||||||||||||||||
plugin string | ||||||||||||||||||||||||||||||||||||||||||||||||||
pluginArgs string | ||||||||||||||||||||||||||||||||||||||||||||||||||
golden string | ||||||||||||||||||||||||||||||||||||||||||||||||||
}{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
name: "count plugin installed from `index`", | ||||||||||||||||||||||||||||||||||||||||||||||||||
plugin: "[email protected]", | ||||||||||||||||||||||||||||||||||||||||||||||||||
golden: "testdata/count-0.2.0-plugin.txt.golden", | ||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
name: "count plugin installed from github archive", | ||||||||||||||||||||||||||||||||||||||||||||||||||
plugin: "https://github.com/aquasecurity/trivy-plugin-count/archive/refs/tags/v0.1.0.zip", | ||||||||||||||||||||||||||||||||||||||||||||||||||
pluginArgs: "--published-before=2020-01-01", | ||||||||||||||||||||||||||||||||||||||||||||||||||
golden: "testdata/count-0.1.0-plugin-with-before-flag.txt.golden", | ||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
// Set up testing DB | ||||||||||||||||||||||||||||||||||||||||||||||||||
cacheDir := initDB(t) | ||||||||||||||||||||||||||||||||||||||||||||||||||
tempStdOut := setTempStdout(t) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
for _, tt := range tests { | ||||||||||||||||||||||||||||||||||||||||||||||||||
t.Run(tt.name, func(t *testing.T) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
// We can overwrite stdout for `_default_Manager` only once. | ||||||||||||||||||||||||||||||||||||||||||||||||||
// So we need to clear the temporary stdout file before each test case. | ||||||||||||||||||||||||||||||||||||||||||||||||||
clearFile(t, tempStdOut) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
t.Setenv("XDG_DATA_HOME", t.TempDir()) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
// Install plugin | ||||||||||||||||||||||||||||||||||||||||||||||||||
err := execute([]string{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
"plugin", | ||||||||||||||||||||||||||||||||||||||||||||||||||
"install", | ||||||||||||||||||||||||||||||||||||||||||||||||||
tt.plugin, | ||||||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||||||
require.NoError(t, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
// Get list of plugins | ||||||||||||||||||||||||||||||||||||||||||||||||||
err = execute([]string{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
"plugin", | ||||||||||||||||||||||||||||||||||||||||||||||||||
"list", | ||||||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||||||
require.NoError(t, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
// Run Trivy with plugin as output | ||||||||||||||||||||||||||||||||||||||||||||||||||
args := []string{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
"--cache-dir", | ||||||||||||||||||||||||||||||||||||||||||||||||||
cacheDir, | ||||||||||||||||||||||||||||||||||||||||||||||||||
"fs", | ||||||||||||||||||||||||||||||||||||||||||||||||||
"-f", | ||||||||||||||||||||||||||||||||||||||||||||||||||
"json", | ||||||||||||||||||||||||||||||||||||||||||||||||||
"-o", | ||||||||||||||||||||||||||||||||||||||||||||||||||
"plugin=count", | ||||||||||||||||||||||||||||||||||||||||||||||||||
"testdata/fixtures/repo/pip", | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
if tt.pluginArgs != "" { | ||||||||||||||||||||||||||||||||||||||||||||||||||
args = append(args, "--output-plugin-arg", tt.pluginArgs) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
err = execute(args) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
if *update { | ||||||||||||||||||||||||||||||||||||||||||||||||||
fsutils.CopyFile(tempStdOut.Name(), tt.golden) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
compareRawFiles(t, tt.golden, tempStdOut.Name()) | ||||||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
func setTempStdout(t *testing.T) *os.File { | ||||||||||||||||||||||||||||||||||||||||||||||||||
tmpFile := filepath.Join(t.TempDir(), "output.txt") | ||||||||||||||||||||||||||||||||||||||||||||||||||
f, err := os.Create(tmpFile) | ||||||||||||||||||||||||||||||||||||||||||||||||||
require.NoError(t, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
// Overwrite Stdout to get output of plugin | ||||||||||||||||||||||||||||||||||||||||||||||||||
defaultStdout := os.Stdout | ||||||||||||||||||||||||||||||||||||||||||||||||||
os.Stdout = f | ||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What if passing io.Writer here? trivy/integration/integration_test.go Line 284 in 88ba460
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I mean
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I tried to use your idea. I used NewManager instead of defaultManager in Lines 511 to 533 in 0c6687d
i am not sure that we need to do that now. But if you want to do it - tell me and I will continue the research There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. OK, we can improve it later. |
||||||||||||||||||||||||||||||||||||||||||||||||||
t.Cleanup(func() { | ||||||||||||||||||||||||||||||||||||||||||||||||||
os.Stdout = defaultStdout | ||||||||||||||||||||||||||||||||||||||||||||||||||
f.Close() | ||||||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||||||
return f | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
func clearFile(t *testing.T, file *os.File) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
_, err := file.Seek(0, io.SeekStart) | ||||||||||||||||||||||||||||||||||||||||||||||||||
require.NoError(t, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
_, err = file.Write([]byte{}) | ||||||||||||||||||||||||||||||||||||||||||||||||||
require.NoError(t, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
Installed Plugins: | ||
Name: count | ||
Version: 0.1.0 | ||
|
||
Number of vulnerabilities: 1 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
Installed Plugins: | ||
Name: count | ||
Version: 0.2.0 | ||
|
||
Number of vulnerabilities: 2 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The VM, module, and K8s tests take longer to run and require a special setup. That's why they are separated. I think the plugin test can be part of the normal integration tests.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
updated in 33cf9d5