From: Vsevolod Stakhov Date: Fri, 5 Dec 2025 16:18:20 +0000 (+0000) Subject: [Test] Support cffi-lua as FFI fallback for Lua 5.4 X-Git-Tag: 3.14.2~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b93dd3cb4a7c23a1ccc2a528511c21c23fdb8d92;p=thirdparty%2Frspamd.git [Test] Support cffi-lua as FFI fallback for Lua 5.4 Unit tests now try LuaJIT's ffi first, falling back to cffi-lua for standard Lua 5.4. CI installs cffi-lua via luarocks for Fedora builds. --- diff --git a/.github/workflows/ci_rspamd.yml b/.github/workflows/ci_rspamd.yml index 4fc2a69d60..87bd6a0a35 100644 --- a/.github/workflows/ci_rspamd.yml +++ b/.github/workflows/ci_rspamd.yml @@ -41,6 +41,11 @@ jobs: if: runner.arch == 'ARM64' run: echo "HYPERSCAN_ALTROOT=-DHYPERSCAN_ROOT_DIR=/vectorscan" >> "$GITHUB_ENV" + - name: Install Lua FFI for non-LuaJIT builds + if: inputs.enable_luajit == 'OFF' + run: | + sudo luarocks install cffi-lua + - name: Run cmake run: | mkdir ${GITHUB_WORKSPACE}/build diff --git a/test/lua/rspamd_test_helper.lua b/test/lua/rspamd_test_helper.lua index 5373448319..f96564f074 100644 --- a/test/lua/rspamd_test_helper.lua +++ b/test/lua/rspamd_test_helper.lua @@ -1,10 +1,16 @@ -local ffi = require "ffi" +-- Load FFI: try LuaJIT's built-in ffi first, then cffi-lua for standard Lua +local ok, ffi = pcall(require, "ffi") +if not ok then + ffi = require("cffi") +end local cfg = rspamd_config ffi.cdef[[ void rspamd_url_init (const char *tld_file); ]] local exports = {} +-- Export ffi so tests can use it without their own require +exports.ffi = ffi local function default_tld_file() local test_dir = string.gsub(debug.getinfo(1).source, "^@(.+/)[^/]+$", "%1") diff --git a/test/lua/unit/addr.lua b/test/lua/unit/addr.lua index 6da72d316b..89cc02b0b5 100644 --- a/test/lua/unit/addr.lua +++ b/test/lua/unit/addr.lua @@ -1,7 +1,10 @@ -- inet addr tests context("Inet addr check functions", function() - local ffi = require("ffi") + local ok, ffi = pcall(require, "ffi") + if not ok then + ffi = require("cffi") + end ffi.cdef[[ typedef struct rspamd_inet_addr_s rspamd_inet_addr_t; diff --git a/test/lua/unit/base32.lua b/test/lua/unit/base32.lua index eb582f5ed1..550c1cfb86 100644 --- a/test/lua/unit/base32.lua +++ b/test/lua/unit/base32.lua @@ -1,7 +1,10 @@ -- Test zbase32 encoding/decoding context("Base32 encodning", function() - local ffi = require("ffi") + local ok, ffi = pcall(require, "ffi") + if not ok then + ffi = require("cffi") + end ffi.cdef[[ void ottery_rand_bytes(void *buf, size_t n); unsigned ottery_rand_unsigned(void); diff --git a/test/lua/unit/base64.lua b/test/lua/unit/base64.lua index 02948e2d97..a48c23ce24 100644 --- a/test/lua/unit/base64.lua +++ b/test/lua/unit/base64.lua @@ -1,5 +1,8 @@ context("Base64 encoding", function() - local ffi = require("ffi") + local ok, ffi = pcall(require, "ffi") + if not ok then + ffi = require("cffi") + end local util = require("rspamd_util") local logger = require "rspamd_logger" ffi.cdef[[ diff --git a/test/lua/unit/fpconv.lua b/test/lua/unit/fpconv.lua index e64626f646..6858b192a8 100644 --- a/test/lua/unit/fpconv.lua +++ b/test/lua/unit/fpconv.lua @@ -1,7 +1,10 @@ -- fpconv tests context("Fpconv printf functions", function() - local ffi = require("ffi") + local ok, ffi = pcall(require, "ffi") + if not ok then + ffi = require("cffi") + end local niter_fuzz = 100000 local function small_double() return math.random() diff --git a/test/lua/unit/rfc2047.lua b/test/lua/unit/rfc2047.lua index 658f2020e4..7f341fa363 100644 --- a/test/lua/unit/rfc2047.lua +++ b/test/lua/unit/rfc2047.lua @@ -25,7 +25,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]]-- context("RFC2047 decoding", function() - local ffi = require("ffi") + local ok, ffi = pcall(require, "ffi") + if not ok then + ffi = require("cffi") + end ffi.cdef[[ const char * rspamd_mime_header_decode (void *pool, const char *in, size_t inlen); diff --git a/test/lua/unit/rspamd_util.lua b/test/lua/unit/rspamd_util.lua index 56f13d6da3..db7a0af3f1 100644 --- a/test/lua/unit/rspamd_util.lua +++ b/test/lua/unit/rspamd_util.lua @@ -90,7 +90,10 @@ context("Rspamd util for lua - check generic functions", function() end) context("Rspamd string utility", function() - local ffi = require 'ffi' + local ok, ffi = pcall(require, "ffi") + if not ok then + ffi = require("cffi") + end ffi.cdef[[ char ** rspamd_string_len_split (const char *in, size_t len, diff --git a/test/lua/unit/selectors.negative.lua b/test/lua/unit/selectors.negative.lua index 4262400667..84f95c0c4f 100644 --- a/test/lua/unit/selectors.negative.lua +++ b/test/lua/unit/selectors.negative.lua @@ -3,7 +3,10 @@ context("Selectors test", function() local rspamd_task = require "rspamd_task" local logger = require "rspamd_logger" local lua_selectors = require "lua_selectors" - local ffi = require "ffi" + local ok, ffi = pcall(require, "ffi") + if not ok then + ffi = require("cffi") + end local cfg = rspamd_config local task diff --git a/test/lua/unit/smtp_addr.lua b/test/lua/unit/smtp_addr.lua index 16f59d07cb..afccd0a750 100644 --- a/test/lua/unit/smtp_addr.lua +++ b/test/lua/unit/smtp_addr.lua @@ -2,7 +2,10 @@ context("SMTP address check functions", function() local logger = require("rspamd_logger") - local ffi = require("ffi") + local ok, ffi = pcall(require, "ffi") + if not ok then + ffi = require("cffi") + end local util = require("rspamd_util") local fun = require "fun" ffi.cdef [[ diff --git a/test/lua/unit/url.lua b/test/lua/unit/url.lua index e25005eca7..d5c3ad42df 100644 --- a/test/lua/unit/url.lua +++ b/test/lua/unit/url.lua @@ -7,7 +7,10 @@ context("URL check functions", function() local lua_util = require("lua_util") local logger = require("rspamd_logger") local test_helper = require("rspamd_test_helper") - local ffi = require("ffi") + local ok, ffi = pcall(require, "ffi") + if not ok then + ffi = require("cffi") + end ffi.cdef [[ void rspamd_normalize_path_inplace(char *path, size_t len, size_t *nlen); diff --git a/test/lua/unit/utf.lua b/test/lua/unit/utf.lua index 799a330141..a4ea451b56 100644 --- a/test/lua/unit/utf.lua +++ b/test/lua/unit/utf.lua @@ -1,7 +1,10 @@ -- Test utf routines context("UTF8 check functions", function() - local ffi = require("ffi") + local ok, ffi = pcall(require, "ffi") + if not ok then + ffi = require("cffi") + end ffi.cdef [[ unsigned int rspamd_str_lc_utf8 (char *str, unsigned int size); unsigned int rspamd_str_lc (char *str, unsigned int size);