blob: daa966e5bf5befdfc6db02bb5d2400b7bf0d3847 [file] [log] [blame]
// Copyright 2024 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.
package priority
import (
"testing"
"github.com/google/go-cmp/cmp"
"golang.org/x/vulndb/internal/report"
)
var (
notGo1 = &report.Report{
Excluded: "NOT_GO_CODE",
}
reviewed1 = &report.Report{
ReviewStatus: report.Reviewed,
}
reviewed2 = &report.Report{
ReviewStatus: report.Reviewed,
}
unreviewed1 = &report.Report{
ReviewStatus: report.Unreviewed,
}
binary1 = &report.Report{
Excluded: "NOT_IMPORTABLE",
}
binary2 = &report.Report{
Excluded: "EFFECTIVELY_PRIVATE",
}
binary3 = &report.Report{
Excluded: "LEGACY_FALSE_POSITIVE",
}
notAVuln1 = &report.Report{
Excluded: "NOT_A_VULNERABILITY",
}
dependent1 = &report.Report{
Excluded: "DEPENDENT_VULNERABILITY",
}
)
func TestAnalyze(t *testing.T) {
for _, tc := range []struct {
name string
module string
reportsForModule []*report.Report
modulesToImports map[string]int
want *Result
}{
{
name: "unknown priority",
module: "example.com/module",
modulesToImports: map[string]int{},
want: &Result{
Priority: Unknown,
Reason: "module example.com/module not found",
},
},
{
name: "low priority",
module: "example.com/module",
reportsForModule: []*report.Report{},
modulesToImports: map[string]int{"example.com/module": 99},
want: &Result{
Priority: Low,
Reason: "example.com/module has 99 importers (< 100)",
},
},
{
name: "high priority",
module: "example.com/module",
reportsForModule: []*report.Report{},
modulesToImports: map[string]int{"example.com/module": 100},
want: &Result{
Priority: High,
Reason: "example.com/module has 100 importers (>= 100) and as many reviewed (0) as likely-binary excluded reports (0)",
},
},
{
name: "high priority more reviewed",
module: "example.com/module",
reportsForModule: []*report.Report{reviewed1, reviewed2, binary1},
modulesToImports: map[string]int{"example.com/module": 101},
want: &Result{
Priority: High,
Reason: "example.com/module has 101 importers (>= 100) and more reviewed (2) than likely-binary excluded reports (1)",
},
},
{
name: "low priority more binaries",
module: "example.com/module",
reportsForModule: []*report.Report{
reviewed1,
binary1, binary2, binary3,
unreviewed1, notAVuln1, dependent1, // ignored
},
modulesToImports: map[string]int{"example.com/module": 101},
want: &Result{
Priority: Low,
Reason: "example.com/module has 101 importers (>= 100) but fewer reviewed (1) than likely-binary excluded reports (3)",
},
},
{
name: "low priority and not Go",
module: "example.com/module",
reportsForModule: []*report.Report{notGo1, reviewed1, binary1, unreviewed1},
modulesToImports: map[string]int{"example.com/module": 99},
want: &Result{
Priority: Low,
Reason: "example.com/module has 99 importers (< 100)",
NotGo: true,
NotGoReason: "more than 20 percent of reports (1 of 4) with this module are NOT_GO_CODE",
},
},
} {
t.Run(tc.name, func(t *testing.T) {
got := Analyze(tc.module, tc.reportsForModule, tc.modulesToImports)
want := tc.want
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("mismatch (-want, +got):\n%s", diff)
}
})
}
}