* fix (bug) : using ScanResults refs #1019 * feat(gost): WIP change priority of CVE Info in Debian * feat(report): change priority of CVE Info in Debian * refactor: move RemoveRaspbianPackFromResult * style: remove comment * fix: lint error * style: change coding style * feat(report): support reporting with gost alone * fix: merge error * refactor(debian): change code to be simple
416 lines
8.6 KiB
Go
416 lines
8.6 KiB
Go
package models
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/future-architect/vuls/config"
|
|
"github.com/future-architect/vuls/constant"
|
|
)
|
|
|
|
func TestIsDisplayUpdatableNum(t *testing.T) {
|
|
var tests = []struct {
|
|
mode []byte
|
|
family string
|
|
expected bool
|
|
}{
|
|
{
|
|
mode: []byte{config.Offline},
|
|
expected: false,
|
|
},
|
|
{
|
|
mode: []byte{config.FastRoot},
|
|
expected: true,
|
|
},
|
|
{
|
|
mode: []byte{config.Deep},
|
|
expected: true,
|
|
},
|
|
{
|
|
mode: []byte{config.Fast},
|
|
family: constant.RedHat,
|
|
expected: false,
|
|
},
|
|
{
|
|
mode: []byte{config.Fast},
|
|
family: constant.Oracle,
|
|
expected: false,
|
|
},
|
|
{
|
|
mode: []byte{config.Fast},
|
|
family: constant.Debian,
|
|
expected: false,
|
|
},
|
|
{
|
|
mode: []byte{config.Fast},
|
|
family: constant.Ubuntu,
|
|
expected: false,
|
|
},
|
|
{
|
|
mode: []byte{config.Fast},
|
|
family: constant.Raspbian,
|
|
expected: false,
|
|
},
|
|
{
|
|
mode: []byte{config.Fast},
|
|
family: constant.CentOS,
|
|
expected: true,
|
|
},
|
|
{
|
|
mode: []byte{config.Fast},
|
|
family: constant.Amazon,
|
|
expected: true,
|
|
},
|
|
{
|
|
mode: []byte{config.Fast},
|
|
family: constant.FreeBSD,
|
|
expected: false,
|
|
},
|
|
{
|
|
mode: []byte{config.Fast},
|
|
family: constant.OpenSUSE,
|
|
expected: true,
|
|
},
|
|
{
|
|
mode: []byte{config.Fast},
|
|
family: constant.Alpine,
|
|
expected: true,
|
|
},
|
|
}
|
|
|
|
for i, tt := range tests {
|
|
mode := config.ScanMode{}
|
|
for _, m := range tt.mode {
|
|
mode.Set(m)
|
|
}
|
|
r := ScanResult{
|
|
ServerName: "name",
|
|
Family: tt.family,
|
|
}
|
|
act := r.isDisplayUpdatableNum(mode)
|
|
if tt.expected != act {
|
|
t.Errorf("[%d] expected %#v, actual %#v", i, tt.expected, act)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestRemoveRaspbianPackFromResult(t *testing.T) {
|
|
var tests = []struct {
|
|
in ScanResult
|
|
expected ScanResult
|
|
}{
|
|
{
|
|
in: ScanResult{
|
|
Family: constant.Raspbian,
|
|
Packages: Packages{
|
|
"apt": Package{Name: "apt", Version: "1.8.2.1"},
|
|
"libraspberrypi-dev": Package{Name: "libraspberrypi-dev", Version: "1.20200811-1"},
|
|
},
|
|
SrcPackages: SrcPackages{},
|
|
},
|
|
expected: ScanResult{
|
|
Family: constant.Raspbian,
|
|
Packages: Packages{
|
|
"apt": Package{Name: "apt", Version: "1.8.2.1"},
|
|
},
|
|
SrcPackages: SrcPackages{},
|
|
},
|
|
},
|
|
{
|
|
in: ScanResult{
|
|
Family: constant.Debian,
|
|
Packages: Packages{
|
|
"apt": Package{Name: "apt", Version: "1.8.2.1"},
|
|
},
|
|
SrcPackages: SrcPackages{},
|
|
},
|
|
expected: ScanResult{
|
|
Family: constant.Debian,
|
|
Packages: Packages{
|
|
"apt": Package{Name: "apt", Version: "1.8.2.1"},
|
|
},
|
|
SrcPackages: SrcPackages{},
|
|
},
|
|
},
|
|
}
|
|
|
|
for i, tt := range tests {
|
|
r := tt.in
|
|
r = *r.RemoveRaspbianPackFromResult()
|
|
if !reflect.DeepEqual(r, tt.expected) {
|
|
t.Errorf("[%d] expected %+v, actual %+v", i, tt.expected, r)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestScanResult_Sort(t *testing.T) {
|
|
type fields struct {
|
|
Packages Packages
|
|
ScannedCves VulnInfos
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
fields fields
|
|
expected fields
|
|
}{
|
|
{
|
|
name: "already asc",
|
|
fields: fields{
|
|
Packages: map[string]Package{
|
|
"pkgA": {
|
|
Name: "pkgA",
|
|
AffectedProcs: []AffectedProcess{
|
|
{PID: "1", Name: "procB"},
|
|
{PID: "2", Name: "procA"},
|
|
},
|
|
NeedRestartProcs: []NeedRestartProcess{
|
|
{PID: "1"},
|
|
{PID: "2"},
|
|
},
|
|
},
|
|
},
|
|
ScannedCves: VulnInfos{
|
|
"CVE-2014-3591": VulnInfo{
|
|
AffectedPackages: PackageFixStatuses{
|
|
PackageFixStatus{Name: "pkgA"},
|
|
PackageFixStatus{Name: "pkgB"},
|
|
},
|
|
DistroAdvisories: []DistroAdvisory{
|
|
{AdvisoryID: "adv-1"},
|
|
{AdvisoryID: "adv-2"},
|
|
},
|
|
Exploits: []Exploit{
|
|
{URL: "a"},
|
|
{URL: "b"},
|
|
},
|
|
Metasploits: []Metasploit{
|
|
{Name: "a"},
|
|
{Name: "b"},
|
|
},
|
|
CveContents: CveContents{
|
|
"nvd": CveContent{
|
|
References: References{
|
|
Reference{Link: "a"},
|
|
Reference{Link: "b"},
|
|
},
|
|
},
|
|
"jvn": CveContent{
|
|
References: References{
|
|
Reference{Link: "a"},
|
|
Reference{Link: "b"},
|
|
},
|
|
},
|
|
},
|
|
AlertDict: AlertDict{
|
|
En: []Alert{
|
|
{Title: "a"},
|
|
{Title: "b"},
|
|
},
|
|
Ja: []Alert{
|
|
{Title: "a"},
|
|
{Title: "b"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expected: fields{
|
|
Packages: map[string]Package{
|
|
"pkgA": {
|
|
Name: "pkgA",
|
|
AffectedProcs: []AffectedProcess{
|
|
{PID: "1", Name: "procB"},
|
|
{PID: "2", Name: "procA"},
|
|
},
|
|
NeedRestartProcs: []NeedRestartProcess{
|
|
{PID: "1"},
|
|
{PID: "2"},
|
|
},
|
|
},
|
|
},
|
|
ScannedCves: VulnInfos{
|
|
"CVE-2014-3591": VulnInfo{
|
|
AffectedPackages: PackageFixStatuses{
|
|
PackageFixStatus{Name: "pkgA"},
|
|
PackageFixStatus{Name: "pkgB"},
|
|
},
|
|
DistroAdvisories: []DistroAdvisory{
|
|
{AdvisoryID: "adv-1"},
|
|
{AdvisoryID: "adv-2"},
|
|
},
|
|
Exploits: []Exploit{
|
|
{URL: "a"},
|
|
{URL: "b"},
|
|
},
|
|
Metasploits: []Metasploit{
|
|
{Name: "a"},
|
|
{Name: "b"},
|
|
},
|
|
CveContents: CveContents{
|
|
"nvd": CveContent{
|
|
References: References{
|
|
Reference{Link: "a"},
|
|
Reference{Link: "b"},
|
|
},
|
|
},
|
|
"jvn": CveContent{
|
|
References: References{
|
|
Reference{Link: "a"},
|
|
Reference{Link: "b"},
|
|
},
|
|
},
|
|
},
|
|
AlertDict: AlertDict{
|
|
En: []Alert{
|
|
{Title: "a"},
|
|
{Title: "b"},
|
|
},
|
|
Ja: []Alert{
|
|
{Title: "a"},
|
|
{Title: "b"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "sort",
|
|
fields: fields{
|
|
Packages: map[string]Package{
|
|
"pkgA": {
|
|
Name: "pkgA",
|
|
AffectedProcs: []AffectedProcess{
|
|
{PID: "2", Name: "procA"},
|
|
{PID: "1", Name: "procB"},
|
|
},
|
|
NeedRestartProcs: []NeedRestartProcess{
|
|
{PID: "91"},
|
|
{PID: "90"},
|
|
},
|
|
},
|
|
},
|
|
ScannedCves: VulnInfos{
|
|
"CVE-2014-3591": VulnInfo{
|
|
AffectedPackages: PackageFixStatuses{
|
|
PackageFixStatus{Name: "pkgB"},
|
|
PackageFixStatus{Name: "pkgA"},
|
|
},
|
|
DistroAdvisories: []DistroAdvisory{
|
|
{AdvisoryID: "adv-2"},
|
|
{AdvisoryID: "adv-1"},
|
|
},
|
|
Exploits: []Exploit{
|
|
{URL: "b"},
|
|
{URL: "a"},
|
|
},
|
|
Metasploits: []Metasploit{
|
|
{Name: "b"},
|
|
{Name: "a"},
|
|
},
|
|
CveContents: CveContents{
|
|
"nvd": CveContent{
|
|
References: References{
|
|
Reference{Link: "b"},
|
|
Reference{Link: "a"},
|
|
},
|
|
},
|
|
"jvn": CveContent{
|
|
References: References{
|
|
Reference{Link: "b"},
|
|
Reference{Link: "a"},
|
|
},
|
|
},
|
|
},
|
|
AlertDict: AlertDict{
|
|
En: []Alert{
|
|
{Title: "b"},
|
|
{Title: "a"},
|
|
},
|
|
Ja: []Alert{
|
|
{Title: "b"},
|
|
{Title: "a"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expected: fields{
|
|
Packages: map[string]Package{
|
|
"pkgA": {
|
|
Name: "pkgA",
|
|
AffectedProcs: []AffectedProcess{
|
|
{PID: "1", Name: "procB"},
|
|
{PID: "2", Name: "procA"},
|
|
},
|
|
NeedRestartProcs: []NeedRestartProcess{
|
|
{PID: "90"},
|
|
{PID: "91"},
|
|
},
|
|
},
|
|
},
|
|
ScannedCves: VulnInfos{
|
|
"CVE-2014-3591": VulnInfo{
|
|
AffectedPackages: PackageFixStatuses{
|
|
PackageFixStatus{Name: "pkgA"},
|
|
PackageFixStatus{Name: "pkgB"},
|
|
},
|
|
DistroAdvisories: []DistroAdvisory{
|
|
{AdvisoryID: "adv-1"},
|
|
{AdvisoryID: "adv-2"},
|
|
},
|
|
Exploits: []Exploit{
|
|
{URL: "a"},
|
|
{URL: "b"},
|
|
},
|
|
Metasploits: []Metasploit{
|
|
{Name: "a"},
|
|
{Name: "b"},
|
|
},
|
|
CveContents: CveContents{
|
|
"nvd": CveContent{
|
|
References: References{
|
|
Reference{Link: "a"},
|
|
Reference{Link: "b"},
|
|
},
|
|
},
|
|
"jvn": CveContent{
|
|
References: References{
|
|
Reference{Link: "a"},
|
|
Reference{Link: "b"},
|
|
},
|
|
},
|
|
},
|
|
AlertDict: AlertDict{
|
|
En: []Alert{
|
|
{Title: "a"},
|
|
{Title: "b"},
|
|
},
|
|
Ja: []Alert{
|
|
{Title: "a"},
|
|
{Title: "b"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
r := &ScanResult{
|
|
Packages: tt.fields.Packages,
|
|
ScannedCves: tt.fields.ScannedCves,
|
|
}
|
|
r.SortForJSONOutput()
|
|
if !reflect.DeepEqual(r.Packages, tt.expected.Packages) {
|
|
t.Errorf("act %+v, want %+v", r.Packages, tt.expected.Packages)
|
|
}
|
|
|
|
if !reflect.DeepEqual(r.ScannedCves, tt.expected.ScannedCves) {
|
|
t.Errorf("act %+v, want %+v", r.ScannedCves, tt.expected.ScannedCves)
|
|
}
|
|
})
|
|
}
|
|
}
|