71 lines
1.6 KiB
Go
71 lines
1.6 KiB
Go
package clamav
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"testing"
|
|
|
|
"lambdamail/protocols/internal/application/port"
|
|
"lambdamail/protocols/internal/domain/valueobject"
|
|
)
|
|
|
|
func TestClamAVAdapter_Scan_CleanAndVirus(t *testing.T) {
|
|
// Clean mock server
|
|
cleanLn, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatalf("listen clean server: %v", err)
|
|
}
|
|
defer cleanLn.Close()
|
|
|
|
go func() {
|
|
conn, err := cleanLn.Accept()
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer conn.Close()
|
|
buf := make([]byte, 4096)
|
|
for {
|
|
_, err := conn.Read(buf)
|
|
if err != nil {
|
|
break
|
|
}
|
|
}
|
|
conn.Write([]byte("stream: OK\x00"))
|
|
}()
|
|
|
|
adapter := NewClamAVAdapter(cleanLn.Addr().String())
|
|
res, err := adapter.Scan(context.Background(), port.ScanInput{Payload: []byte("clean content")})
|
|
if err != nil || res.Verdict != valueobject.ScanVerdictClean {
|
|
t.Fatalf("expected clean scan, got res=%+v, err=%v", res, err)
|
|
}
|
|
|
|
// Virus mock server
|
|
virusLn, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatalf("listen virus server: %v", err)
|
|
}
|
|
defer virusLn.Close()
|
|
|
|
go func() {
|
|
conn, err := virusLn.Accept()
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer conn.Close()
|
|
buf := make([]byte, 4096)
|
|
for {
|
|
_, err := conn.Read(buf)
|
|
if err != nil {
|
|
break
|
|
}
|
|
}
|
|
conn.Write([]byte("stream: EICAR-Test-Signature FOUND\x00"))
|
|
}()
|
|
|
|
virusAdapter := NewClamAVAdapter(virusLn.Addr().String())
|
|
res, err = virusAdapter.Scan(context.Background(), port.ScanInput{Payload: []byte("virus content")})
|
|
if err != nil || res.Verdict != valueobject.ScanVerdictVirusReject || res.VirusName != "EICAR-Test-Signature" {
|
|
t.Fatalf("expected virus scan, got res=%+v, err=%v", res, err)
|
|
}
|
|
}
|