aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2017-03-06 15:20:58 +0000
committerGitHub <noreply@github.com>2017-03-06 15:20:58 +0000
commit8a2a0c4d09e6e2cc147d5c51eb698ef26f848091 (patch)
tree96ac4e436a082000436220774e6d2e4a0821b695
parent30d96d31a6b78a4e2bdd9f0b5a1cceef9813c3b1 (diff)
parentb88b679dd797b92ad7cfaa365c130ebd8b2b0dd2 (diff)
downloadrspamd-8a2a0c4d09e6e2cc147d5c51eb698ef26f848091.tar.gz
rspamd-8a2a0c4d09e6e2cc147d5c51eb698ef26f848091.zip
Merge pull request #1487 from fatalbanana/avt
Some tests for antivirus module
-rw-r--r--circle.yml4
-rw-r--r--test/functional/cases/160_antivirus.robot80
-rw-r--r--test/functional/configs/antivirus.conf20
-rw-r--r--test/functional/lib/rspamd.py2
-rw-r--r--test/functional/lib/vars.py2
-rwxr-xr-xtest/functional/util/dummy_clam.py45
-rwxr-xr-xtest/functional/util/dummy_fprot.py45
7 files changed, 195 insertions, 3 deletions
diff --git a/circle.yml b/circle.yml
index f43e3b0f0..e50ac346b 100644
--- a/circle.yml
+++ b/circle.yml
@@ -4,14 +4,14 @@ dependencies:
- sudo apt-get install -qq cmake gcc lcov libevent-dev libglib2.0-dev libgmime-2.6-dev libluajit-5.1-dev liblua5.1-0-dev libmagic-dev libpcre3-dev libsqlite3-dev libssl-dev luarocks make python-dev ragel redis-server libgd-dev libfann-dev
- gem install coveralls-lcov
- sudo pip install demjson ipaddress psutil robotframework
- - cd .. && wget http://download.redis.io/redis-stable.tar.gz && tar xvzf redis-stable.tar.gz && cd redis-stable && make && sudo cp src/redis-cli /usr/bin/
+ - cd .. && wget http://download.redis.io/redis-stable.tar.gz && tar xvzf redis-stable.tar.gz && cd redis-stable && make -j`nproc` && sudo cp src/redis-cli /usr/bin/
- sudo luarocks install luacheck
test:
override:
- mkdir ../build ; mkdir ../install ; cd ../build
- cmake ../rspamd -DDBDIR=/nana -DENABLE_COVERAGE=ON -DCMAKE_INSTALL_PREFIX=../install -DENABLE_HIREDIS=ON
- - make install
+ - make install -j`nproc`
- RSPAMADM=../install/bin/rspamadm RSPAMC=../install/bin/rspamc RSPAMD=../install/bin/rspamd sudo -E robot -x xunit.xml --exclude isbroken ../rspamd/test/functional/cases
- lcov --no-external -b ../rspamd -d ../rspamd -c --output-file coverage.info
- if [ ! -z $COVERALLS_REPO_TOKEN ]; then coveralls-lcov -t ${COVERALLS_REPO_TOKEN} coverage.info; fi
diff --git a/test/functional/cases/160_antivirus.robot b/test/functional/cases/160_antivirus.robot
new file mode 100644
index 000000000..f3604b2fe
--- /dev/null
+++ b/test/functional/cases/160_antivirus.robot
@@ -0,0 +1,80 @@
+*** Settings ***
+Suite Setup Antivirus Setup
+Suite Teardown Antivirus Teardown
+Library Process
+Library ${TESTDIR}/lib/rspamd.py
+Resource ${TESTDIR}/lib/rspamd.robot
+Variables ${TESTDIR}/lib/vars.py
+
+*** Variables ***
+${CONFIG} ${TESTDIR}/configs/plugins.conf
+${MESSAGE} ${TESTDIR}/messages/spam_message.eml
+${MESSAGE2} ${TESTDIR}/messages/freemail.eml
+${REDIS_SCOPE} Suite
+${RSPAMD_SCOPE} Suite
+${URL_TLD} ${TESTDIR}/../lua/unit/test_tld.dat
+
+*** Test Cases ***
+CLAMAV MISS
+ Run Dummy Clam ${PORT_CLAM}
+ ${result} = Scan Message With Rspamc ${MESSAGE}
+ Check Rspamc ${result} CLAM_VIRUS inverse=1
+
+CLAMAV HIT
+ Run Dummy Clam ${PORT_CLAM} 1
+ ${result} = Scan Message With Rspamc ${MESSAGE2}
+ Check Rspamc ${result} CLAM_VIRUS (1.00)[Eicar-Test-Signature]
+ Should Not Contain ${result.stdout} FPROT_
+
+CLAMAV CACHE HIT
+ ${result} = Scan Message With Rspamc ${MESSAGE2}
+ Check Rspamc ${result} CLAM_VIRUS (1.00)[Eicar-Test-Signature]
+ Should Not Contain ${result.stdout} FPROT_
+
+CLAMAV CACHE MISS
+ ${result} = Scan Message With Rspamc ${MESSAGE}
+ Check Rspamc ${result} CLAM_VIRUS inverse=1
+ Should Not Contain ${result.stdout} FPROT_
+
+FPROT MISS
+ Run Dummy Fprot ${PORT_FPROT}
+ ${result} = Scan Message With Rspamc ${MESSAGE2}
+ Check Rspamc ${result} FPROT_VIRUS inverse=1
+ Should Not Contain ${result.stdout} FPROT_EICAR
+
+FPROT HIT - PATTERN
+ Run Dummy Fprot ${PORT_FPROT} 1
+ ${result} = Scan Message With Rspamc ${MESSAGE}
+ Check Rspamc ${result} FPROT_EICAR (1.00)[EICAR_Test_File]
+ Should Not Contain ${result.stdout} CLAMAV_VIRUS
+
+FPROT CACHE HIT
+ ${result} = Scan Message With Rspamc ${MESSAGE}
+ Check Rspamc ${result} FPROT_EICAR (1.00)[EICAR_Test_File]
+ Should Not Contain ${result.stdout} CLAMAV_VIRUS
+
+FPROT CACHE MISS
+ ${result} = Scan Message With Rspamc ${MESSAGE2}
+ Check Rspamc ${result} FPROT_ inverse=1
+
+*** Keywords ***
+Antivirus Setup
+ ${PLUGIN_CONFIG} = Get File ${TESTDIR}/configs/antivirus.conf
+ Set Suite Variable ${PLUGIN_CONFIG}
+ Generic Setup PLUGIN_CONFIG
+ Run Redis
+
+Antivirus Teardown
+ Normal Teardown
+ Shutdown Process With Children ${REDIS_PID}
+ Wait For Port ${SOCK_STREAM} ${LOCAL_ADDR} ${REDIS_PORT}
+
+Run Dummy Clam
+ [Arguments] ${port} ${found}=
+ Wait For Port ${SOCK_STREAM} ${LOCAL_ADDR} ${port}
+ ${result} = Start Process ${TESTDIR}/util/dummy_clam.py ${port} ${found}
+
+Run Dummy Fprot
+ [Arguments] ${port} ${found}=
+ Wait For Port ${SOCK_STREAM} ${LOCAL_ADDR} ${port}
+ ${result} = Start Process ${TESTDIR}/util/dummy_fprot.py ${port} ${found}
diff --git a/test/functional/configs/antivirus.conf b/test/functional/configs/antivirus.conf
new file mode 100644
index 000000000..a4b0739aa
--- /dev/null
+++ b/test/functional/configs/antivirus.conf
@@ -0,0 +1,20 @@
+redis {
+ servers = "${REDIS_ADDR}:${REDIS_PORT}";
+}
+antivirus {
+ clam {
+ attachments_only = false;
+ symbol = "CLAM_VIRUS";
+ type = "clamav";
+ servers = "127.0.0.1:${PORT_CLAM}";
+ }
+ fprot {
+ attachments_only = false;
+ symbol = "FPROT_VIRUS";
+ type = "fprot";
+ servers = "127.0.0.1:${PORT_FPROT}";
+ patterns {
+ FPROT_EICAR = "^EICAR_Test_File$";
+ }
+ }
+}
diff --git a/test/functional/lib/rspamd.py b/test/functional/lib/rspamd.py
index bfad7d61d..a2be23e87 100644
--- a/test/functional/lib/rspamd.py
+++ b/test/functional/lib/rspamd.py
@@ -177,5 +177,5 @@ def wait_for_port(proto, addr, num):
break
except:
pass
- time.sleep(0.1)
+ time.sleep(0.01)
s.close()
diff --git a/test/functional/lib/vars.py b/test/functional/lib/vars.py
index a9d5e89f9..d76c3c0c5 100644
--- a/test/functional/lib/vars.py
+++ b/test/functional/lib/vars.py
@@ -11,6 +11,8 @@ PORT_FUZZY_SLAVE = 56792
PORT_NORMAL = 56789
PORT_NORMAL_SLAVE = 56794
PORT_PROXY = 56795
+PORT_CLAM = 56796
+PORT_FPROT = 56797
REDIS_ADDR = u'127.0.0.1'
REDIS_PORT = 56379
RSPAMD_GROUP = 'nogroup'
diff --git a/test/functional/util/dummy_clam.py b/test/functional/util/dummy_clam.py
new file mode 100755
index 000000000..8c68889a9
--- /dev/null
+++ b/test/functional/util/dummy_clam.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+
+import os
+import sys
+try:
+ import SocketServer as socketserver
+except:
+ import socketserver
+
+class MyTCPHandler(socketserver.BaseRequestHandler):
+
+ def handle(self):
+ self.data = self.request.recv(1024).strip()
+ if self.server.foundvirus:
+ self.request.sendall(b"stream: Eicar-Test-Signature FOUND\0")
+ else:
+ self.request.sendall(b"stream: OK\0")
+ self.request.close()
+
+if __name__ == "__main__":
+ pid = os.fork()
+ if pid > 0:
+ sys.exit(0)
+
+ HOST = "localhost"
+
+ alen = len(sys.argv)
+ if alen > 1:
+ port = int(sys.argv[1])
+ if alen >= 3:
+ foundvirus = bool(sys.argv[2])
+ else:
+ foundvirus = False
+ else:
+ port = 3310
+ foundvirus = False
+
+ server = socketserver.TCPServer((HOST, port), MyTCPHandler, bind_and_activate=False)
+ server.allow_reuse_address = True
+ server.foundvirus = foundvirus
+ server.server_bind()
+ server.server_activate()
+ server.handle_request()
+ server.server_close()
+ os.exit(0)
diff --git a/test/functional/util/dummy_fprot.py b/test/functional/util/dummy_fprot.py
new file mode 100755
index 000000000..01e7e578b
--- /dev/null
+++ b/test/functional/util/dummy_fprot.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+
+import os
+import sys
+try:
+ import SocketServer as socketserver
+except:
+ import socketserver
+
+class MyTCPHandler(socketserver.BaseRequestHandler):
+
+ def handle(self):
+ self.data = self.request.recv(1024).strip()
+ if self.server.foundvirus:
+ self.request.sendall(b"1 <infected: EICAR_Test_File> FOO\n")
+ else:
+ self.request.sendall(b"0 <clean> FOO\n")
+ self.request.close()
+
+if __name__ == "__main__":
+ pid = os.fork()
+ if pid > 0:
+ sys.exit(0)
+
+ HOST = "localhost"
+
+ alen = len(sys.argv)
+ if alen > 1:
+ port = int(sys.argv[1])
+ if alen >= 3:
+ foundvirus = bool(sys.argv[2])
+ else:
+ foundvirus = False
+ else:
+ port = 10200
+ foundvirus = False
+
+ server = socketserver.TCPServer((HOST, port), MyTCPHandler, bind_and_activate=False)
+ server.allow_reuse_address = True
+ server.foundvirus = foundvirus
+ server.server_bind()
+ server.server_activate()
+ server.handle_request()
+ server.server_close()
+ os.exit(0)