145 lines
2.6 KiB
Go
145 lines
2.6 KiB
Go
/*
|
|
©AngelaMos | 2026
|
|
config_test.go
|
|
*/
|
|
|
|
package config
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/CarterPerez-dev/sentinel/pkg/types"
|
|
)
|
|
|
|
func TestParseIgnoreFile(t *testing.T) {
|
|
data := []byte(`# Sentinel ignore file
|
|
ignore:
|
|
- path: /etc/systemd/system/docker.service
|
|
- scanner: kernel
|
|
title: Kernel module loaded at boot
|
|
- path: /etc/cron.d/certbot
|
|
`)
|
|
|
|
list, err := parseIgnoreFile(data)
|
|
if err != nil {
|
|
t.Fatalf("parseIgnoreFile: %v", err)
|
|
}
|
|
|
|
if len(list.Rules) != 3 {
|
|
t.Fatalf(
|
|
"rules count = %d, want 3",
|
|
len(list.Rules),
|
|
)
|
|
}
|
|
|
|
if list.Rules[0].Path != "/etc/systemd/system/docker.service" {
|
|
t.Errorf(
|
|
"rule[0].Path = %q",
|
|
list.Rules[0].Path,
|
|
)
|
|
}
|
|
|
|
if list.Rules[1].Scanner != "kernel" ||
|
|
list.Rules[1].Title != "Kernel module loaded at boot" {
|
|
t.Errorf(
|
|
"rule[1] = %+v",
|
|
list.Rules[1],
|
|
)
|
|
}
|
|
|
|
if list.Rules[2].Path != "/etc/cron.d/certbot" {
|
|
t.Errorf(
|
|
"rule[2].Path = %q",
|
|
list.Rules[2].Path,
|
|
)
|
|
}
|
|
}
|
|
|
|
func TestFilter_ByPath(t *testing.T) {
|
|
list := IgnoreList{
|
|
Rules: []IgnoreRule{
|
|
{Path: "/etc/systemd/system/docker.service"},
|
|
},
|
|
}
|
|
|
|
findings := []types.Finding{
|
|
{
|
|
Scanner: "systemd",
|
|
Path: "/etc/systemd/system/docker.service",
|
|
Title: "some finding",
|
|
},
|
|
{
|
|
Scanner: "systemd",
|
|
Path: "/etc/systemd/system/evil.service",
|
|
Title: "another finding",
|
|
},
|
|
}
|
|
|
|
filtered := list.Filter(findings)
|
|
if len(filtered) != 1 {
|
|
t.Fatalf(
|
|
"filtered count = %d, want 1",
|
|
len(filtered),
|
|
)
|
|
}
|
|
if filtered[0].Path != "/etc/systemd/system/evil.service" {
|
|
t.Errorf(
|
|
"remaining finding path = %q",
|
|
filtered[0].Path,
|
|
)
|
|
}
|
|
}
|
|
|
|
func TestFilter_ByScannerAndTitle(t *testing.T) {
|
|
list := IgnoreList{
|
|
Rules: []IgnoreRule{
|
|
{
|
|
Scanner: "kernel",
|
|
Title: "Kernel module loaded at boot",
|
|
},
|
|
},
|
|
}
|
|
|
|
findings := []types.Finding{
|
|
{
|
|
Scanner: "kernel",
|
|
Title: "Kernel module loaded at boot",
|
|
Path: "/etc/modules-load.d/loop.conf",
|
|
},
|
|
{
|
|
Scanner: "kernel",
|
|
Title: "Module install hook runs shell command",
|
|
Path: "/etc/modprobe.d/evil.conf",
|
|
},
|
|
}
|
|
|
|
filtered := list.Filter(findings)
|
|
if len(filtered) != 1 {
|
|
t.Fatalf(
|
|
"filtered count = %d, want 1",
|
|
len(filtered),
|
|
)
|
|
}
|
|
if filtered[0].Title != "Module install hook runs shell command" {
|
|
t.Errorf(
|
|
"remaining finding title = %q",
|
|
filtered[0].Title,
|
|
)
|
|
}
|
|
}
|
|
|
|
func TestFilter_EmptyList(t *testing.T) {
|
|
list := IgnoreList{}
|
|
findings := []types.Finding{
|
|
{Scanner: "cron", Title: "test"},
|
|
}
|
|
|
|
filtered := list.Filter(findings)
|
|
if len(filtered) != 1 {
|
|
t.Fatalf(
|
|
"empty ignore list should not filter: got %d",
|
|
len(filtered),
|
|
)
|
|
}
|
|
}
|