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
-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")
-- 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;
-- 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);
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[[
-- 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()
]]--
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);
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,
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
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 [[
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);
-- 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);