commit f478531: [Test] Use Robot-native process management

Andrew Lewis nerf at judo.za.org
Mon Jul 29 17:53:07 UTC 2024


Author: Andrew Lewis
Date: 2024-02-29 12:42:37 +0200
URL: https://github.com/rspamd/rspamd/commit/f47853130d6dacc227934ec0ee196422a9528ff8 (refs/pull/4834/head)

[Test] Use Robot-native process management
 - Partially unbreak functional tests in Github Actions

---
 .../cases/001_merged/160_antivirus.robot           | 62 +++++++++-------------
 test/functional/cases/001_merged/310_udp.robot     |  9 ++--
 test/functional/cases/001_merged/__init__.robot    |  5 +-
 test/functional/cases/140_proxy.robot              | 10 ++--
 test/functional/cases/151_rspamadm_async.robot     |  2 +
 test/functional/configs/composites.conf            |  1 +
 test/functional/configs/redis-server.conf          |  2 +-
 test/functional/lib/rspamd.py                      |  7 +++
 test/functional/lib/rspamd.robot                   | 58 +++++++-------------
 9 files changed, 66 insertions(+), 90 deletions(-)

diff --git a/test/functional/cases/001_merged/160_antivirus.robot b/test/functional/cases/001_merged/160_antivirus.robot
index 0870ba6a8..16eeeb08e 100644
--- a/test/functional/cases/001_merged/160_antivirus.robot
+++ b/test/functional/cases/001_merged/160_antivirus.robot
@@ -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}
diff --git a/test/functional/cases/001_merged/310_udp.robot b/test/functional/cases/001_merged/310_udp.robot
index e94ed60e1..70f9b5626 100644
--- a/test/functional/cases/001_merged/310_udp.robot
+++ b/test/functional/cases/001_merged/310_udp.robot
@@ -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}
diff --git a/test/functional/cases/001_merged/__init__.robot b/test/functional/cases/001_merged/__init__.robot
index 7ac640d73..909d0417a 100644
--- a/test/functional/cases/001_merged/__init__.robot
+++ b/test/functional/cases/001_merged/__init__.robot
@@ -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
diff --git a/test/functional/cases/140_proxy.robot b/test/functional/cases/140_proxy.robot
index d43cfa43c..a2b872f51 100644
--- a/test/functional/cases/140_proxy.robot
+++ b/test/functional/cases/140_proxy.robot
@@ -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
diff --git a/test/functional/cases/151_rspamadm_async.robot b/test/functional/cases/151_rspamadm_async.robot
index 6aff67a2d..999215978 100644
--- a/test/functional/cases/151_rspamadm_async.robot
+++ b/test/functional/cases/151_rspamadm_async.robot
@@ -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 ***
diff --git a/test/functional/configs/composites.conf b/test/functional/configs/composites.conf
index 28b645e60..b3a28013a 100644
--- a/test/functional/configs/composites.conf
+++ b/test/functional/configs/composites.conf
@@ -1,5 +1,6 @@
 options = {
     pidfile = "{= env.TMPDIR =}/rspamd.pid"
+    url_tld = "{= env.TESTDIR =}/../lua/unit/test_tld.dat"
 }
 logging = {
     type = "file",
diff --git a/test/functional/configs/redis-server.conf b/test/functional/configs/redis-server.conf
index 094302575..0659aa8d3 100644
--- a/test/functional/configs/redis-server.conf
+++ b/test/functional/configs/redis-server.conf
@@ -1,5 +1,5 @@
 bind ${RSPAMD_REDIS_ADDR}
-daemonize yes
+daemonize no
 loglevel debug
 logfile ${RSPAMD_TMPDIR}/redis.log
 pidfile ${RSPAMD_TMPDIR}/redis.pid
diff --git a/test/functional/lib/rspamd.py b/test/functional/lib/rspamd.py
index 76132ad5a..57f179123 100644
--- a/test/functional/lib/rspamd.py
+++ b/test/functional/lib/rspamd.py
@@ -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())
 
diff --git a/test/functional/lib/rspamd.robot b/test/functional/lib/rspamd.robot
index 696b5f97d..a5f897365 100644
--- a/test/functional/lib/rspamd.robot
+++ b/test/functional/lib/rspamd.robot
@@ -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}


More information about the Commits mailing list