mirror of
https://github.com/aquasecurity/trivy.git
synced 2025-12-12 15:50:15 -08:00
test: add integration plugin tests (#7299)
This commit is contained in:
111
integration/plugin_test.go
Normal file
111
integration/plugin_test.go
Normal file
@@ -0,0 +1,111 @@
|
||||
//go:build 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: "count@v0.2.0",
|
||||
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
|
||||
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)
|
||||
}
|
||||
5
integration/testdata/count-0.1.0-plugin-with-before-flag.txt.golden
vendored
Normal file
5
integration/testdata/count-0.1.0-plugin-with-before-flag.txt.golden
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
Installed Plugins:
|
||||
Name: count
|
||||
Version: 0.1.0
|
||||
|
||||
Number of vulnerabilities: 1
|
||||
5
integration/testdata/count-0.2.0-plugin.txt.golden
vendored
Normal file
5
integration/testdata/count-0.2.0-plugin.txt.golden
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
Installed Plugins:
|
||||
Name: count
|
||||
Version: 0.2.0
|
||||
|
||||
Number of vulnerabilities: 2
|
||||
Reference in New Issue
Block a user