]> source.dussan.org Git - rspamd.git/commitdiff
[Test] Use Robot-native process management
authorAndrew Lewis <nerf@judo.za.org>
Thu, 29 Feb 2024 10:42:37 +0000 (12:42 +0200)
committerAndrew Lewis <nerf@judo.za.org>
Thu, 21 Mar 2024 23:21:34 +0000 (01:21 +0200)
 - Partially unbreak functional tests in Github Actions

test/functional/cases/001_merged/160_antivirus.robot
test/functional/cases/001_merged/310_udp.robot
test/functional/cases/001_merged/__init__.robot
test/functional/cases/140_proxy.robot
test/functional/cases/151_rspamadm_async.robot
test/functional/configs/composites.conf
test/functional/configs/redis-server.conf
test/functional/lib/rspamd.py
test/functional/lib/rspamd.robot

index 0870ba6a8ac0ca4dc7107f8fa2863d3f6da7e7ef..16eeeb08e96a434c6b7b18f69164fb2df066797e 100644 (file)
@@ -1,5 +1,4 @@
 *** Settings ***
-Suite Teardown  Antivirus Teardown
 Library         Process
 Library         ${RSPAMD_TESTDIR}/lib/rspamd.py
 Resource        ${RSPAMD_TESTDIR}/lib/rspamd.robot
@@ -14,19 +13,19 @@ ${SETTINGS_FPROT}   {symbols_enabled = [FPROT_VIRUS, FPROT2_VIRUS_DUPLICATE_DEFA
 
 *** Test Cases ***
 CLAMAV MISS
-  Run Dummy Clam  ${RSPAMD_PORT_CLAM}
+  ${process} =  Run Dummy Clam  ${RSPAMD_PORT_CLAM}
   Scan File  ${MESSAGE}
   ...  Settings=${SETTINGS_CLAM}
   Do Not Expect Symbol  CLAM_VIRUS
-  Shutdown clamav
+  [Teardown]  Terminate Process  ${process}
 
 CLAMAV HIT
-  Run Dummy Clam  ${RSPAMD_PORT_CLAM}  1
+  ${process} =  Run Dummy Clam  ${RSPAMD_PORT_CLAM}  1
   Scan File  ${MESSAGE2}
   ...  Settings=${SETTINGS_CLAM}
   Expect Symbol  CLAM_VIRUS
   Do Not Expect Symbol  CLAMAV_VIRUS_FAIL
-  Shutdown clamav
+  [Teardown]  Terminate Process  ${process}
 
 CLAMAV CACHE HIT
   Scan File  ${MESSAGE2}
@@ -41,16 +40,16 @@ CLAMAV CACHE MISS
   Do Not Expect Symbol  CLAMAV_VIRUS_FAIL
 
 FPROT MISS
-  Run Dummy Fprot  ${RSPAMD_PORT_FPROT}
+  ${process} =  Run Dummy Fprot  ${RSPAMD_PORT_FPROT}
   Scan File  ${MESSAGE2}
   ...  Settings=${SETTINGS_FPROT}
   Do Not Expect Symbol  FPROT_VIRUS
   Do Not Expect Symbol  FPROT_EICAR
-  Shutdown fport
+  [Teardown]  Terminate Process  ${process}
 
 FPROT HIT - PATTERN
-  Run Dummy Fprot  ${RSPAMD_PORT_FPROT}  1
-  Run Dummy Fprot  ${RSPAMD_PORT_FPROT2_DUPLICATE}  1  /tmp/dummy_fprot_dupe.pid
+  ${process1} =  Run Dummy Fprot  ${RSPAMD_PORT_FPROT}  1
+  ${process2} =  Run Dummy Fprot  ${RSPAMD_PORT_FPROT2_DUPLICATE}  1  /tmp/dummy_fprot_dupe.pid
   Scan File  ${MESSAGE}
   ...  Settings=${SETTINGS_FPROT}
   Expect Symbol  FPROT_EICAR
@@ -58,8 +57,7 @@ FPROT HIT - PATTERN
   Expect Symbol  FPROT2_VIRUS_DUPLICATE_PATTERN
   Do Not Expect Symbol  FPROT2_VIRUS_DUPLICATE_DEFAULT
   Do Not Expect Symbol  FPROT2_VIRUS_DUPLICATE_NOPE
-  Shutdown fport
-  Shutdown fport duplicate
+  [Teardown]  Double FProt Teardown  ${process1}  ${process2}
 
 FPROT CACHE HIT
   Scan File  ${MESSAGE}
@@ -76,19 +74,19 @@ FPROT CACHE MISS
   Do Not Expect Symbol  FPROT_VIRUS
 
 AVAST MISS
-  Run Dummy Avast  ${RSPAMD_PORT_AVAST}
+  ${process} =  Run Dummy Avast  ${RSPAMD_PORT_AVAST}
   Scan File  ${MESSAGE}
   ...  Settings=${SETTINGS_AVAST}
   Do Not Expect Symbol  AVAST_VIRUS
-  Shutdown avast
+  [Teardown]  Terminate Process  ${process}
 
 AVAST HIT
-  Run Dummy Avast  ${RSPAMD_PORT_AVAST}  1
+  ${process} =  Run Dummy Avast  ${RSPAMD_PORT_AVAST}  1
   Scan File  ${MESSAGE2}
   ...  Settings=${SETTINGS_AVAST}
   Expect Symbol  AVAST_VIRUS
   Do Not Expect Symbol  AVAST_VIRUS_FAIL
-  Shutdown avast
+  [Teardown]  Terminate Process  ${process}
 
 AVAST CACHE HIT
   Scan File  ${MESSAGE2}
@@ -103,26 +101,10 @@ AVAST CACHE MISS
   Do Not Expect Symbol  AVAST_VIRUS_FAIL
 
 *** Keywords ***
-Antivirus Teardown
-  Shutdown clamav
-  Shutdown fport
-  Shutdown avast
-
-Shutdown clamav
-  ${clamav_pid} =  Get File if exists  /tmp/dummy_clamav.pid
-  Run Keyword if  ${clamav_pid}  Shutdown Process With Children  ${clamav_pid}
-
-Shutdown fport
-  ${fport_pid} =  Get File if exists  /tmp/dummy_fprot.pid
-  Run Keyword if  ${fport_pid}  Shutdown Process With Children  ${fport_pid}
-
-Shutdown fport duplicate
-  ${fport_pid} =  Get File if exists  /tmp/dummy_fprot_dupe.pid
-  Run Keyword if  ${fport_pid}  Shutdown Process With Children  ${fport_pid}
-
-Shutdown avast
-  ${avast_pid} =  Get File if exists  /tmp/dummy_avast.pid
-  Run Keyword if  ${avast_pid}  Shutdown Process With Children  ${avast_pid}
+Double FProt Teardown
+  [Arguments]  ${process1}  ${process2}
+  Terminate Process  ${process1}
+  Terminate Process  ${process2}
 
 Run Dummy
   [Arguments]  @{varargs}
@@ -137,15 +119,19 @@ Run Dummy
   Log To Console  ${res.stdout}
   Log To Console  ${res.stderr}
   Fail  Dummy server failed to start
+  [Return]  ${process}
 
 Run Dummy Clam
   [Arguments]  ${port}  ${found}=  ${pid}=/tmp/dummy_clamav.pid
-  Run Dummy  ${RSPAMD_TESTDIR}/util/dummy_clam.py  ${port}  ${found}  ${pid}
+  ${process} =  Run Dummy  ${RSPAMD_TESTDIR}/util/dummy_clam.py  ${port}  ${found}  ${pid}
+  [Return]  ${process}
 
 Run Dummy Fprot
   [Arguments]  ${port}  ${found}=  ${pid}=/tmp/dummy_fprot.pid
-  Run Dummy  ${RSPAMD_TESTDIR}/util/dummy_fprot.py  ${port}  ${found}  ${pid}
+  ${process} =  Run Dummy  ${RSPAMD_TESTDIR}/util/dummy_fprot.py  ${port}  ${found}  ${pid}
+  [Return]  ${process}
 
 Run Dummy Avast
   [Arguments]  ${port}  ${found}=  ${pid}=/tmp/dummy_avast.pid
-  Run Dummy  ${RSPAMD_TESTDIR}/util/dummy_avast.py  ${port}  ${found}  ${pid}
+  ${process} =  Run Dummy  ${RSPAMD_TESTDIR}/util/dummy_avast.py  ${port}  ${found}  ${pid}
+  [Return]  ${process}
index e94ed60e1e1c5e5082ac1252e5fe50b5c83536ca..70f9b562662aefd4a58322cf5038df409a822e11 100644 (file)
@@ -1,6 +1,6 @@
 *** Settings ***
-Test Setup      UDP Setup
-Test Teardown   UDP Teardown
+Suite Setup      UDP Setup
+Suite Teardown   UDP Teardown
 Library         Process
 Library         ${RSPAMD_TESTDIR}/lib/rspamd.py
 Resource        ${RSPAMD_TESTDIR}/lib/rspamd.robot
@@ -31,10 +31,11 @@ UDP Setup
   Run Dummy UDP
 
 UDP Teardown
-  ${udp_pid} =  Get File  /tmp/dummy_udp.pid
-  Shutdown Process With Children  ${udp_pid}
+  Terminate Process  ${DUMMY_UDP_PROC}
+  Wait For Process  ${DUMMY_UDP_PROC}
 
 Run Dummy UDP
   [Arguments]
   ${result} =  Start Process  ${RSPAMD_TESTDIR}/util/dummy_udp.py  5005
   Wait Until Created  /tmp/dummy_udp.pid
+  Set Suite Variable  ${DUMMY_UDP_PROC}  ${result}
index 7ac640d7316b426f2a74ebbc1be055b5792fb11e..909d0417a9c19b15d63f8a93e98b2b6e32f3f00e 100644 (file)
@@ -1,6 +1,6 @@
 *** Settings ***
 Suite Setup     Multi Setup
-Suite Teardown  Rspamd Redis Teardown
+Suite Teardown  Multi Teardown
 Library         ${RSPAMD_TESTDIR}/lib/rspamd.py
 Resource        ${RSPAMD_TESTDIR}/lib/rspamd.robot
 Variables       ${RSPAMD_TESTDIR}/lib/vars.py
@@ -25,4 +25,5 @@ Multi Teardown
   Rspamd Teardown
   Dummy Http Teardown
   Dummy Https Teardown
-  Redis Teardown
\ No newline at end of file
+  Redis Teardown
+  Try Reap Zombies
index d43cfa43c921311cba5e5977606c5ef77540b0d3..a2b872f51ef629360d1e3baed840458a6d46e668 100644 (file)
@@ -30,21 +30,21 @@ Proxy Setup
   # Run slave & copy variables
   Set Suite Variable  ${CONFIG}  ${RSPAMD_TESTDIR}/configs/lua_test.conf
   Rspamd Setup
-  Set Suite Variable  ${SLAVE_PID}  ${RSPAMD_PID}
+  Set Suite Variable  ${SLAVE_PROCESS}  ${RSPAMD_PROCESS}
   Set Suite Variable  ${SLAVE_TMPDIR}  ${RSPAMD_TMPDIR}
 
   # Run proxy & copy variables
   Set Suite Variable  ${CONFIG}  ${RSPAMD_TESTDIR}/configs/proxy.conf
-  Rspamd Setup
-  Set Suite Variable  ${PROXY_PID}  ${RSPAMD_PID}
+  Rspamd Setup  check_port=${RSPAMD_PORT_PROXY}
+  Set Suite Variable  ${PROXY_PROCESS}  ${RSPAMD_PROCESS}
   Set Suite Variable  ${PROXY_TMPDIR}  ${RSPAMD_TMPDIR}
 
 Proxy Teardown
   # Restore variables & run normal teardown
-  Set Suite Variable  ${RSPAMD_PID}  ${PROXY_PID}
+  Set Suite Variable  ${RSPAMD_PROCESS}  ${PROXY_PROCESS}
   Set Suite Variable  ${RSPAMD_TMPDIR}  ${PROXY_TMPDIR}
   Rspamd Teardown
   # Do it again for slave
-  Set Suite Variable  ${RSPAMD_PID}  ${SLAVE_PID}
+  Set Suite Variable  ${RSPAMD_PROCESS}  ${SLAVE_PROCESS}
   Set Suite Variable  ${RSPAMD_TMPDIR}  ${SLAVE_TMPDIR}
   Rspamd Teardown
index 6aff67a2dc56c4e31724e7f2a5da895aa84ae477..999215978800d2883f5c0b1895926faae6606e73 100644 (file)
@@ -9,6 +9,8 @@ Variables       ${RSPAMD_TESTDIR}/lib/vars.py
 *** Variables ***
 ${CONFIG}          ${RSPAMD_TESTDIR}/configs/plugins.conf
 ${REDIS_SCOPE}     Test
+# For dummy http
+${RSPAMD_SCOPE}    Test
 ${RSPAMD_URL_TLD}  ${RSPAMD_TESTDIR}/../lua/unit/test_tld.dat
 
 *** Test Cases ***
index 28b645e60d84e664c074069e7091f0b4c3736932..b3a28013ae21be52ab9369dd161e8fb259c708cf 100644 (file)
@@ -1,5 +1,6 @@
 options = {
     pidfile = "{= env.TMPDIR =}/rspamd.pid"
+    url_tld = "{= env.TESTDIR =}/../lua/unit/test_tld.dat"
 }
 logging = {
     type = "file",
index 0943025753f0527de743ff71d8d7db0b9edaacd0..0659aa8d32faecc7fa11de6bb1824a5ba6b4c7ec 100644 (file)
@@ -1,5 +1,5 @@
 bind ${RSPAMD_REDIS_ADDR}
-daemonize yes
+daemonize no
 loglevel debug
 logfile ${RSPAMD_TMPDIR}/redis.log
 pidfile ${RSPAMD_TMPDIR}/redis.pid
index 76132ad5a9fd062b7ff326545cda8174f483b0ef..57f1791233f5bbad9783f5fa206e2131fd07b7f9 100644 (file)
@@ -244,6 +244,13 @@ def TCP_Connect(addr, port):
     s.close()
 
 
+def try_reap_zombies():
+    try:
+        os.waitpid(-1, os.WNOHANG)
+    except ChildProcessError:
+        pass
+
+
 def ping_rspamd(addr, port):
     return str(urlopen("http://%s:%s/ping" % (addr, port)).read())
 
index 696b5f97d95b7b16bbd5c359ee7e2257c41db6fc..a5f8973659bc454c8067ab9f07991a8998e06a75 100644 (file)
@@ -204,11 +204,12 @@ Redis SET
   Should Be Equal As Integers  ${result.rc}  0
 
 Redis Teardown
-  ${redis_pid} =  Get Variable Value  ${REDIS_PID}
-  Shutdown Process With Children  ${redis_pid}
+  Terminate Process  ${REDIS_PROCESS}
+  Wait For Process  ${REDIS_PROCESS}
   Cleanup Temporary Directory  ${REDIS_TMPDIR}
 
 Rspamd Setup
+  [Arguments]  ${check_port}=${RSPAMD_PORT_NORMAL}
   # Create and chown temporary directory
   ${RSPAMD_TMPDIR} =  Make Temporary Directory
   Set Directory Ownership  ${RSPAMD_TMPDIR}  ${RSPAMD_USER}  ${RSPAMD_GROUP}
@@ -216,7 +217,7 @@ Rspamd Setup
   # Export ${RSPAMD_TMPDIR} to appropriate scope according to ${RSPAMD_SCOPE}
   Export Scoped Variables  ${RSPAMD_SCOPE}  RSPAMD_TMPDIR=${RSPAMD_TMPDIR}
 
-  Run Rspamd
+  Run Rspamd  check_port=${check_port}
 
 Rspamd Redis Setup
   Run Redis
@@ -226,7 +227,8 @@ Rspamd Teardown
   IF  '${CONTROLLER_ERRORS}' == 'True'
     Run Keyword And Warn On Failure  Check Controller Errors
   END
-  Shutdown Process With Children  ${RSPAMD_PID}
+  Terminate Process  ${RSPAMD_PROCESS}
+  Wait For Process  ${RSPAMD_PROCESS}
   Save Run Results  ${RSPAMD_TMPDIR}  configdump.stdout configdump.stderr rspamd.stderr rspamd.stdout rspamd.conf rspamd.log redis.log clickhouse-config.xml
   Log does not contain segfault record
   Collect Lua Coverage
@@ -242,20 +244,17 @@ Run Redis
   ${config} =  Replace Variables  ${template}
   Create File  ${RSPAMD_TMPDIR}/redis-server.conf  ${config}
   Log  ${config}
-  ${result} =  Run Process  redis-server  ${RSPAMD_TMPDIR}/redis-server.conf
-  IF  ${result.rc} != 0
-    Log  ${result.stderr}
-  END
-  Should Be Equal As Integers  ${result.rc}  0
+  ${result} =  Start Process  redis-server  ${RSPAMD_TMPDIR}/redis-server.conf
   Wait Until Keyword Succeeds  5x  1 sec  Check Pidfile  ${RSPAMD_TMPDIR}/redis.pid  timeout=0.5s
   Wait Until Keyword Succeeds  5x  1 sec  Redis Check  ${RSPAMD_REDIS_ADDR}  ${RSPAMD_REDIS_PORT}
   ${REDIS_PID} =  Get File  ${RSPAMD_TMPDIR}/redis.pid
   ${REDIS_PID} =  Convert To Number  ${REDIS_PID}
-  Export Scoped Variables  ${REDIS_SCOPE}  REDIS_PID=${REDIS_PID}  REDIS_TMPDIR=${RSPAMD_TMPDIR}
+  Export Scoped Variables  ${REDIS_SCOPE}  REDIS_PID=${REDIS_PID}  REDIS_PROCESS=${result}  REDIS_TMPDIR=${RSPAMD_TMPDIR}
   ${redis_log} =  Get File  ${RSPAMD_TMPDIR}/redis.log
   Log  ${redis_log}
 
 Run Rspamd
+  [Arguments]  ${check_port}=${RSPAMD_PORT_NORMAL}
   Export Rspamd Variables To Environment
 
   # Dump templated config or errors to log
@@ -284,7 +283,7 @@ Run Rspamd
   Set Directory Ownership  ${RSPAMD_TMPDIR}  ${RSPAMD_USER}  ${RSPAMD_GROUP}
 
   # Run Rspamd
-  ${result} =  Run Process  ${RSPAMD}  -u  ${RSPAMD_USER}  -g  ${RSPAMD_GROUP}
+  ${result} =  Start Process  ${RSPAMD}  -f  -u  ${RSPAMD_USER}  -g  ${RSPAMD_GROUP}
   ...  -c  ${CONFIG}
   ...  --var\=TMPDIR\=${RSPAMD_TMPDIR}
   ...  --var\=DBDIR\=${RSPAMD_TMPDIR}
@@ -298,24 +297,11 @@ Run Rspamd
   ...  env:ASAN_OPTIONS=quarantine_size_mb=2048:malloc_context_size=20:fast_unwind_on_malloc=0:log_path=${RSPAMD_TMPDIR}/rspamd-asan
   ...  stdout=${RSPAMD_TMPDIR}/rspamd.stdout  stderr=${RSPAMD_TMPDIR}/rspamd.stderr
 
-  # Log stdout/stderr
-  ${rspamd_stdout} =  Get File  ${RSPAMD_TMPDIR}/rspamd.stdout  encoding_errors=ignore
-  ${rspamd_stderror} =  Get File  ${RSPAMD_TMPDIR}/rspamd.stderr  encoding_errors=ignore
-  Log  ${rspamd_stdout}
-  Log  ${rspamd_stderror}
-
-  # Abort if it failed
-  Should Be Equal As Integers  ${result.rc}  0
-
-  # Wait for pid file to be written
-  Wait Until Keyword Succeeds  10x  1 sec  Check Pidfile  ${RSPAMD_TMPDIR}/rspamd.pid  timeout=0.5s
+  Export Scoped Variables  ${RSPAMD_SCOPE}  RSPAMD_PROCESS=${result}
 
   # Confirm worker is reachable
-  Wait Until Keyword Succeeds  5x  1 sec  Ping Rspamd  ${RSPAMD_LOCAL_ADDR}  ${RSPAMD_PORT_NORMAL}
+  Wait Until Keyword Succeeds  15x  1 sec  Ping Rspamd  ${RSPAMD_LOCAL_ADDR}  ${check_port}
 
-  # Read PID from PIDfile and export it to appropriate scope as ${RSPAMD_PID}
-  ${RSPAMD_PID} =  Get File  ${RSPAMD_TMPDIR}/rspamd.pid
-  Export Scoped Variables  ${RSPAMD_SCOPE}  RSPAMD_PID=${RSPAMD_PID}
 
 Run Nginx
   ${template} =  Get File  ${RSPAMD_TESTDIR}/configs/nginx.conf
@@ -370,29 +356,21 @@ Sync Fuzzy Storage
   Sleep  0.1s  Try give fuzzy storage time to sync
 
 Run Dummy Http
-  ${fileExists} =  File Exists  /tmp/dummy_http.pid
-  IF  ${fileExists} is True
-    ${http_pid} =  Get File  /tmp/dummy_http.pid
-    Shutdown Process With Children  ${http_pid}
-  END
   ${result} =  Start Process  ${RSPAMD_TESTDIR}/util/dummy_http.py  -pf  /tmp/dummy_http.pid
   Wait Until Created  /tmp/dummy_http.pid  timeout=2 second
+  Export Scoped Variables  ${RSPAMD_SCOPE}  DUMMY_HTTP_PROC=${result}
 
 Run Dummy Https
-  ${fileExists} =  File Exists  /tmp/dummy_https.pid
-  IF  ${fileExists} is True
-    ${http_pid} =  Get File  /tmp/dummy_https.pid
-    Shutdown Process With Children  ${http_pid}
-  END
   ${result} =  Start Process  ${RSPAMD_TESTDIR}/util/dummy_http.py
   ...  -c  ${RSPAMD_TESTDIR}/util/server.pem  -k  ${RSPAMD_TESTDIR}/util/server.pem
   ...  -pf  /tmp/dummy_https.pid  -p  18081
   Wait Until Created  /tmp/dummy_https.pid  timeout=2 second
+  Export Scoped Variables  ${RSPAMD_SCOPE}  DUMMY_HTTPS_PROC=${result}
 
 Dummy Http Teardown
-  ${http_pid} =  Get File  /tmp/dummy_http.pid
-  Shutdown Process With Children  ${http_pid}
+  Terminate Process  ${DUMMY_HTTP_PROC}
+  Wait For Process  ${DUMMY_HTTP_PROC}
 
 Dummy Https Teardown
-  ${https_pid} =  Get File  /tmp/dummy_https.pid
-  Shutdown Process With Children  ${https_pid}
+  Terminate Process  ${DUMMY_HTTPS_PROC}
+  Wait For Process  ${DUMMY_HTTPS_PROC}