Files
trivy/e2e/e2e_test.go

94 lines
2.3 KiB
Go

//go:build e2e
package e2e
import (
"flag"
"fmt"
"os"
"os/exec"
"path/filepath"
"runtime"
"testing"
"github.com/rogpeppe/go-internal/testscript"
)
var update = flag.Bool("update", false, "update golden files")
func TestE2E(t *testing.T) {
testscript.Run(t, testscript.Params{
Dir: "testdata",
Setup: func(env *testscript.Env) error {
return setupTestEnvironment(t, env)
},
UpdateScripts: *update,
})
}
func buildTrivy(t *testing.T) string {
t.Helper()
tmp := t.TempDir() // Test-specific directory
exe := filepath.Join(tmp, "trivy")
if runtime.GOOS == "windows" {
exe += ".exe"
}
cmd := exec.Command("go", "build",
"-o", exe,
"../cmd/trivy",
)
// Prevent environment pollution
cmd.Env = append(os.Environ(), "CGO_ENABLED=0")
out, err := cmd.CombinedOutput()
if err != nil {
t.Fatalf("Trivy build failed: %v\n%s", err, out)
}
return exe
}
func setupTestEnvironment(t *testing.T, env *testscript.Env) error {
// Validate Docker availability - fail if not available
if err := validateDockerAvailability(); err != nil {
return fmt.Errorf("Docker validation failed: %v", err)
}
// Build Trivy once and cache it
trivyExe := buildTrivy(t)
// Add directory containing trivy to PATH
env.Setenv("PATH", filepath.Dir(trivyExe)+string(os.PathListSeparator)+env.Getenv("PATH"))
// Set environment variables for test scripts
env.Setenv("TRIVY_DB_DIGEST", "sha256:b4d3718a89a78d4a6b02250953e92fcd87776de4774e64e818c1d0e01c928025")
// Disable VEX notice in test environment
env.Setenv("TRIVY_DISABLE_VEX_NOTICE", "true")
// Define test image
testImage := "alpine@sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e1ad6b"
env.Setenv("TEST_IMAGE", testImage)
// Pre-pull the test image to Docker daemon
t.Logf("Pre-pulling test image: %s", testImage)
cmd := exec.Command("docker", "pull", testImage)
if output, err := cmd.CombinedOutput(); err != nil {
return fmt.Errorf("failed to pull test image: %v\nOutput: %s", err, output)
}
// Pass through DOCKER_HOST if set
if dockerHost := os.Getenv("DOCKER_HOST"); dockerHost != "" {
env.Setenv("DOCKER_HOST", dockerHost)
}
return nil
}
func validateDockerAvailability() error {
cmd := exec.Command("docker", "version")
if err := cmd.Run(); err != nil {
return fmt.Errorf("Docker is not available or not running: %v", err)
}
return nil
}