121 lines
2.6 KiB
Go
121 lines
2.6 KiB
Go
package scanners_test
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/qsfera/server/services/antivirus/pkg/scanners"
|
|
)
|
|
|
|
func newUnixListener(t testing.TB, lc net.ListenConfig, v ...string) net.Listener {
|
|
d, err := os.MkdirTemp("", "")
|
|
assert.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
require.NoError(t, os.RemoveAll(d))
|
|
})
|
|
|
|
nl, err := lc.Listen(context.Background(), "unix", filepath.Join(d, "sock"))
|
|
require.NoError(t, err)
|
|
|
|
go func() {
|
|
i := 0
|
|
for {
|
|
if len(v) == i {
|
|
break
|
|
}
|
|
|
|
conn, err := nl.Accept()
|
|
require.NoError(t, err)
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
_, err = conn.Write([]byte(v[i]))
|
|
require.NoError(t, err)
|
|
require.NoError(t, conn.Close())
|
|
i++
|
|
}
|
|
}()
|
|
|
|
return nl
|
|
}
|
|
|
|
func TestNewClamAV(t *testing.T) {
|
|
t.Run("returns a scanner", func(t *testing.T) {
|
|
ul := newUnixListener(t, net.ListenConfig{}, "PONG\n")
|
|
defer func() {
|
|
assert.NoError(t, ul.Close())
|
|
}()
|
|
|
|
done := make(chan bool, 1)
|
|
|
|
go func() {
|
|
_, err := scanners.NewClamAV(ul.Addr().String(), 10*time.Second)
|
|
assert.NoError(t, err)
|
|
done <- true
|
|
}()
|
|
|
|
assert.True(t, <-done)
|
|
})
|
|
|
|
t.Run("fails if scanner is not pingable", func(t *testing.T) {
|
|
_, err := scanners.NewClamAV("", 0)
|
|
assert.ErrorIs(t, err, scanners.ErrScannerNotReachable)
|
|
})
|
|
}
|
|
|
|
func TestNewClamAV_Scan(t *testing.T) {
|
|
t.Run("returns a result", func(t *testing.T) {
|
|
ul := newUnixListener(t, net.ListenConfig{}, "PONG\n", "stream: Win.Test.EICAR_HDB-1 FOUND\n")
|
|
defer func() {
|
|
assert.NoError(t, ul.Close())
|
|
}()
|
|
|
|
done := make(chan bool, 1)
|
|
|
|
go func() {
|
|
scanner, err := scanners.NewClamAV(ul.Addr().String(), 10*time.Second)
|
|
assert.NoError(t, err)
|
|
|
|
result, err := scanner.Scan(scanners.Input{Body: strings.NewReader("DATA")})
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, result.Description, "Win.Test.EICAR_HDB-1")
|
|
assert.True(t, result.Infected)
|
|
done <- true
|
|
}()
|
|
|
|
assert.True(t, <-done)
|
|
})
|
|
|
|
t.Run("aborts after a certain time", func(t *testing.T) {
|
|
ul := newUnixListener(t, net.ListenConfig{}, "PONG\n", "stream: Win.Test.EICAR_HDB-1 FOUND\n")
|
|
defer func() {
|
|
assert.NoError(t, ul.Close())
|
|
}()
|
|
|
|
done := make(chan bool, 1)
|
|
|
|
go func() {
|
|
scanner, err := scanners.NewClamAV(ul.Addr().String(), 10*time.Second)
|
|
assert.NoError(t, err)
|
|
|
|
result, err := scanner.Scan(scanners.Input{Body: strings.NewReader("DATA")})
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, result.Description, "Win.Test.EICAR_HDB-1")
|
|
assert.True(t, result.Infected)
|
|
done <- true
|
|
}()
|
|
|
|
assert.True(t, <-done)
|
|
})
|
|
}
|