diff options
Diffstat (limited to 'test/functional/lib')
-rw-r--r-- | test/functional/lib/rspamd.py | 113 | ||||
-rw-r--r-- | test/functional/lib/rspamd.robot | 41 | ||||
-rw-r--r-- | test/functional/lib/vars.py | 6 |
3 files changed, 27 insertions, 133 deletions
diff --git a/test/functional/lib/rspamd.py b/test/functional/lib/rspamd.py index 295484f9e..b8bc6ac03 100644 --- a/test/functional/lib/rspamd.py +++ b/test/functional/lib/rspamd.py @@ -1,32 +1,24 @@ +from urllib.request import urlopen +import glob import grp +import http.client import os import os.path import psutil -import glob import pwd import shutil import signal import socket +import stat import sys import tempfile -import json -import stat -from robot.libraries.BuiltIn import BuiltIn -from robot.api import logger -if sys.version_info > (3,): - long = int -try: - from urllib.request import urlopen -except: - from urllib2 import urlopen -try: - import http.client as httplib -except: - import httplib +from robot.api import logger +from robot.libraries.BuiltIn import BuiltIn +import demjson def Check_JSON(j): - d = json.loads(j, strict=True) + d = demjson.decode(j, strict=True) logger.debug('got json %s' % d) assert len(d) > 0 assert 'error' not in d @@ -99,7 +91,7 @@ def get_rspamadm(): return dname + "/src/rspamadm/rspamadm" def HTTP(method, host, port, path, data=None, headers={}): - c = httplib.HTTPConnection("%s:%s" % (host, port)) + c = http.client.HTTPConnection("%s:%s" % (host, port)) c.request(method, path, data, headers) r = c.getresponse() t = r.read() @@ -107,6 +99,9 @@ def HTTP(method, host, port, path, data=None, headers={}): c.close() return [s, t] +def hard_link(src, dst): + os.link(src, dst) + def make_temporary_directory(): """Creates and returns a unique temporary directory @@ -131,14 +126,6 @@ def path_splitter(path): basename = os.path.basename(path) return [dirname, basename] -def read_log_from_position(filename, offset): - offset = long(offset) - with open(filename, 'rb') as f: - f.seek(offset) - goo = f.read() - size = len(goo) - return [goo, size+offset] - def rspamc(addr, port, filename): mboxgoo = b"From MAILER-DAEMON Fri May 13 19:17:40 2016\r\n" goo = open(filename, 'rb').read() @@ -251,13 +238,15 @@ def shutdown_process_with_children(pid): pass def write_to_stdin(process_handle, text): + if not isinstance(text, bytes): + text = bytes(text, 'utf-8') lib = BuiltIn().get_library_instance('Process') obj = lib.get_process_object() - obj.stdin.write(text + "\n") + obj.stdin.write(text + b"\n") obj.stdin.flush() obj.stdin.close() out = obj.stdout.read(4096) - return out + return out.decode('utf-8') def get_file_if_exists(file_path): if os.path.exists(file_path): @@ -265,72 +254,6 @@ def get_file_if_exists(file_path): return myfile.read() return None -# copy-paste from -# https://hg.python.org/cpython/file/6860263c05b3/Lib/shutil.py#l1068 -# As soon as we move to Python 3, this should be removed in favor of shutil.which() -def python3_which(cmd, mode=os.F_OK | os.X_OK, path=None): - """Given a command, mode, and a PATH string, return the path which - conforms to the given mode on the PATH, or None if there is no such - file. - - `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result - of os.environ.get("PATH"), or can be overridden with a custom search - path. - """ - - # Check that a given file can be accessed with the correct mode. - # Additionally check that `file` is not a directory, as on Windows - # directories pass the os.access check. - def _access_check(fn, mode): - return (os.path.exists(fn) and os.access(fn, mode) - and not os.path.isdir(fn)) - - # If we're given a path with a directory part, look it up directly rather - # than referring to PATH directories. This includes checking relative to the - # current directory, e.g. ./script - if os.path.dirname(cmd): - if _access_check(cmd, mode): - return cmd - return None - - if path is None: - path = os.environ.get("PATH", os.defpath) - if not path: - return None - path = path.split(os.pathsep) - - if sys.platform == "win32": - # The current directory takes precedence on Windows. - if not os.curdir in path: - path.insert(0, os.curdir) - - # PATHEXT is necessary to check on Windows. - pathext = os.environ.get("PATHEXT", "").split(os.pathsep) - # See if the given file matches any of the expected path extensions. - # This will allow us to short circuit when given "python.exe". - # If it does match, only test that one, otherwise we have to try - # others. - if any(cmd.lower().endswith(ext.lower()) for ext in pathext): - files = [cmd] - else: - files = [cmd + ext for ext in pathext] - else: - # On other platforms you don't have things like PATHEXT to tell you - # what file suffixes are executable, so just pass on cmd as-is. - files = [cmd] - - seen = set() - for dir in path: - normdir = os.path.normcase(dir) - if not normdir in seen: - seen.add(normdir) - for thefile in files: - name = os.path.join(dir, thefile) - if _access_check(name, mode): - return name - return None - - def _merge_luacov_stats(statsfile, coverage): """ Reads a coverage stats file written by luacov and merges coverage data to @@ -339,7 +262,7 @@ def _merge_luacov_stats(statsfile, coverage): Format of the file defined in: https://github.com/keplerproject/luacov/blob/master/src/luacov/stats.lua """ - with open(statsfile, 'rb') as fh: + with open(statsfile, 'r') as fh: while True: # max_line:filename line = fh.readline().rstrip() @@ -369,7 +292,7 @@ def _dump_luacov_stats(statsfile, coverage): """ src_files = sorted(coverage) - with open(statsfile, 'wb') as fh: + with open(statsfile, 'w') as fh: for src in src_files: stats = " ".join(str(n) for n in coverage[src]) fh.write("%s:%s\n%s\n" % (len(coverage[src]), src, stats)) diff --git a/test/functional/lib/rspamd.robot b/test/functional/lib/rspamd.robot index 03abc86c1..cd68b1d86 100644 --- a/test/functional/lib/rspamd.robot +++ b/test/functional/lib/rspamd.robot @@ -17,7 +17,6 @@ Check Pidfile Check Rspamc [Arguments] ${result} @{args} &{kwargs} - Follow Rspamd Log Run Keyword If ${result.rc} != 0 Log ${result.stderr} ${has_rc} = Evaluate 'rc' in $kwargs ${inverse} = Evaluate 'inverse' in $kwargs @@ -45,19 +44,6 @@ Check Rspamc Match String Run Keyword If ${inverse} == False Should Contain ${subject} ${str} ... ELSE Should Not Contain ${subject} ${str} -Custom Follow Rspamd Log - [Arguments] ${logfile} ${logpos} ${logpos_var} ${scope} - ${logpos} = Log Logs ${logfile} ${logpos} - Run Keyword If '${scope}' == 'Test' Set Test Variable ${${logpos_var}} ${logpos} - ... ELSE IF '${scope}' == 'Suite' Set Suite Variable ${${logpos_var}} ${logpos} - ... ELSE Fail 'scope must be Test or Suite' - -Follow Rspamd Log - ${RSPAMD_LOGPOS} = Log Logs ${TMPDIR}/rspamd.log ${RSPAMD_LOGPOS} - Run Keyword If '${RSPAMD_SCOPE}' == 'Test' Set Test Variable ${RSPAMD_LOGPOS} - ... ELSE IF '${RSPAMD_SCOPE}' == 'Suite' Set Suite Variable ${RSPAMD_LOGPOS} - ... ELSE Fail 'RSPAMD_SCOPE must be Test or Suite' - Generic Setup [Arguments] @{vargs} &{kwargs} &{d} = Run Rspamd @{vargs} &{kwargs} @@ -69,7 +55,6 @@ Generic Setup END Generic Teardown - [Arguments] @{ports} Run Keyword If '${CONTROLLER_ERRORS}' == 'True' Check Controller Errors Shutdown Process With Children ${RSPAMD_PID} Log does not contain segfault record @@ -78,20 +63,11 @@ Generic Teardown Cleanup Temporary Directory ${TMPDIR} Log does not contain segfault record - ${log} = Get File ${TMPDIR}/rspamd.log + ${log} = Get File ${TMPDIR}/rspamd.log encoding_errors=ignore Should not contain ${log} Segmentation fault: msg=Segmentation fault detected -Log Logs - [Arguments] ${logfile} ${position} - ${the_log} ${position} = Read Log From Position ${logfile} ${position} - Log ${the_log} - [Return] ${position} - Normal Teardown - ${port_normal} = Create List ${SOCK_STREAM} ${LOCAL_ADDR} ${PORT_NORMAL} - ${port_controller} = Create List ${SOCK_STREAM} ${LOCAL_ADDR} ${PORT_CONTROLLER} - ${ports} = Create List ${port_normal} ${port_controller} - Generic Teardown @{ports} + Generic Teardown Redis HSET [Arguments] ${hash} ${key} ${value} @@ -169,24 +145,21 @@ Run Rspamd ${result} = Run Process ${RSPAMD} -u ${RSPAMD_USER} -g ${RSPAMD_GROUP} ... -c ${tmpdir}/rspamd.conf env:TMPDIR=${tmpdir} env:DBDIR=${tmpdir} env:LD_LIBRARY_PATH=${TESTDIR}/../../contrib/aho-corasick Run Keyword If ${result.rc} != 0 Log ${result.stderr} - ${rspamd_logpos} = Log Logs ${tmpdir}/rspamd.log 0 Should Be Equal As Integers ${result.rc} 0 Wait Until Keyword Succeeds 10x 1 sec Check Pidfile ${tmpdir}/rspamd.pid timeout=0.5s Wait Until Keyword Succeeds 5x 1 sec Ping Rspamd ${LOCAL_ADDR} ${PORT_NORMAL} ${rspamd_pid} = Get File ${tmpdir}/rspamd.pid - Set To Dictionary ${d} RSPAMD_LOGPOS=${rspamd_logpos} RSPAMD_PID=${rspamd_pid} TMPDIR=${tmpdir} + Set To Dictionary ${d} RSPAMD_PID=${rspamd_pid} TMPDIR=${tmpdir} [Return] &{d} +Simple Teardown + Generic Teardown + Scan Message With Rspamc [Arguments] ${msg_file} @{vargs} ${result} = Run Rspamc -p -h ${LOCAL_ADDR}:${PORT_NORMAL} @{vargs} ${msg_file} [Return] ${result} -Simple Teardown - ${port_normal} = Create List ${SOCK_STREAM} ${LOCAL_ADDR} ${PORT_NORMAL} - ${ports} = Create List ${port_normal} - Generic Teardown @{ports} - Sync Fuzzy Storage [Arguments] @{vargs} ${len} = Get Length ${vargs} @@ -195,6 +168,4 @@ Sync Fuzzy Storage ... ELSE Run Process ${RSPAMADM} control -s ${vargs}[0]/rspamd.sock ... fuzzy_sync Log ${result.stdout} - Run Keyword If $len == 0 Follow Rspamd Log - ... ELSE Custom Follow Rspamd Log ${vargs}[0]/rspamd.log ${vargs}[1] ${vargs}[2] ${vargs}[3] Sleep 0.1s Try give fuzzy storage time to sync diff --git a/test/functional/lib/vars.py b/test/functional/lib/vars.py index d29c31c7b..3cec9767a 100644 --- a/test/functional/lib/vars.py +++ b/test/functional/lib/vars.py @@ -3,7 +3,7 @@ import socket CONTROLLER_ERRORS = True KEY_PVT1 = 'ekd3x36tfa5gd76t6pa8hqif3ott7n1siuux68exbkk7ukscte9y' KEY_PUB1 = 'm8kneubpcjsb8sbsoj7jy7azj9fdd3xmj63txni86a8ye9ncomny' -LOCAL_ADDR = u'127.0.0.1' +LOCAL_ADDR = '127.0.0.1' MAP_WATCH_INTERVAL = '1min' PORT_CONTROLLER = 56790 PORT_CONTROLLER_SLAVE = 56793 @@ -17,9 +17,9 @@ PORT_FPROT = 56797 PORT_FPROT2_DUPLICATE = 56798 PORT_AVAST = 56799 P0F_SOCKET = '/tmp/p0f.sock' -REDIS_ADDR = u'127.0.0.1' +REDIS_ADDR = '127.0.0.1' REDIS_PORT = 56379 -NGINX_ADDR = u'127.0.0.1' +NGINX_ADDR = '127.0.0.1' NGINX_PORT = 56380 RSPAMD_GROUP = 'nogroup' RSPAMD_USER = 'nobody' |