Files
rspamd-cgp/cgp/internal_test.go
T

75 lines
2.1 KiB
Go

package cgp
import (
"bufio"
"bytes"
"strings"
"testing"
)
func TestGetHeader_Folding(t *testing.T) {
// Проверяем корректность сборки многострочных заголовков (RFC folding)
raw := "Subject: This is a very long\n\t subject line\nNext-Header: value\n"
rd := bufio.NewReader(strings.NewReader(raw))
buf := new(bytes.Buffer)
err := getHeader(rd, buf)
if err != nil {
t.Fatalf("getHeader failed: %v", err)
}
got := buf.String()
// Должен захватить обе строки, так как вторая начинается с табуляции
if !strings.Contains(got, "subject line") {
t.Errorf("Header folding failed. Got: %q", got)
}
if strings.Contains(got, "Next-Header") {
t.Error("getHeader read too far into the next header")
}
}
func TestGetHelo_Variants(t *testing.T) {
tests := []struct {
name string
hdr string
want string
}{
{"Standard verified", "Received: from mail.domain.name ([1.2.3.4] verified)\n", "mail.domain.name"},
{"HELO in brackets", "Received: from [1.2.3.4] (HELO poseidonms.com)\n", "poseidonms.com"},
{"Account and HELO", "Received: from [10.19.5.40] (account test@domain.name HELO test.domain.name)\n", "test.domain.name"},
{"Malformed", "Received: from broken (", ""},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := getHelo([]byte(tt.hdr)); got != tt.want {
t.Errorf("getHelo() = %q, want %q", got, tt.want)
}
})
}
}
func TestReplaceSpecCharsBuf(t *testing.T) {
buf := new(bytes.Buffer)
input := "Path\\To\nFile\t\"Name\"\r"
// \ -> \\, \n -> \e, \t -> \t, " -> \", \r -> skip
expected := "Path\\\\To\\eFile\\t\\\"Name\\\""
replaceSpecCharsBuf(buf, input)
if buf.String() != expected {
t.Errorf("replaceSpecCharsBuf failed.\nGot: %q\nWant: %q", buf.String(), expected)
}
}
func TestIsHeaderEnd(t *testing.T) {
if !isHeaderEnd([]byte("\n")) {
t.Error("Failed to detect LF as header end")
}
if !isHeaderEnd([]byte("\r\n")) {
t.Error("Failed to detect CRLF as header end")
}
if isHeaderEnd([]byte("Subject: \n")) {
t.Error("False positive for header end")
}
}