blob: 6fc10692b0837828ef65fc3a692388d6eb90077b [file] [log] [blame]
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Tests for the govulncheck_compare binary
package main
import (
"bytes"
"path/filepath"
"runtime"
"testing"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"golang.org/x/pkgsite-metrics/internal/buildtest"
"golang.org/x/pkgsite-metrics/internal/govulncheck"
"golang.org/x/pkgsite-metrics/internal/govulncheckapi"
)
func Test(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("cannot run on Windows")
}
if testing.Short() {
t.Skip("skipping test that uses internet in short mode")
}
govulncheckPath, err := buildtest.BuildGovulncheck(t.TempDir())
if err != nil {
t.Fatal(err)
}
testData := "../../internal/testdata"
// govulncheck binary requires a full path to the vuln db. Otherwise, one
// gets "[file://testdata/vulndb], opts): file URL specifies non-local host."
vulndb, err := filepath.Abs(filepath.Join(testData, "vulndb"))
if err != nil {
t.Fatal(err)
}
t.Run("basicComparison", func(t *testing.T) {
resp, err := runTest([]string{govulncheckPath, filepath.Join(testData, "module"), vulndb})
if err != nil {
t.Fatal(err)
}
compareSameFindings(t, resp)
})
t.Run("multipleComparison", func(t *testing.T) {
resp, err := runTest([]string{govulncheckPath, filepath.Join(testData, "multipleBinModule"), vulndb})
if err != nil {
t.Fatal(err)
}
compareSameFindings(t, resp)
})
}
func compareSameFindings(t *testing.T, resp *govulncheck.CompareResponse) {
for path, pair := range resp.FindingsForMod {
diff := cmp.Diff(pair.BinaryResults.Findings, pair.SourceResults.Findings, cmpopts.SortSlices(
func(x, y *govulncheckapi.Finding) bool {
return x.OSV < y.OSV
}),
cmpopts.IgnoreFields(govulncheckapi.Finding{}, "Trace"),
)
if diff != "" {
t.Errorf("mismatch for %s (-Binary, +Source): %s", path, diff)
}
}
}
func runTest(args []string) (*govulncheck.CompareResponse, error) {
var buf bytes.Buffer
run(&buf, args)
return govulncheck.UnmarshalCompareResponse(buf.Bytes())
}