Cybersecurity-Projects/PROJECTS/beginner/systemd-persistence-scanner/internal/config/config_test.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),
)
}
}