[ 
https://issues.apache.org/jira/browse/THRIFT-6189?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jens Geyer updated THRIFT-6189:
-------------------------------
    Description: 
No CI job builds or tests the Lua binding.

.github/workflows/build.yml has jobs for php, go, java-kotlin, netstd, haxe, 
rust, python, nodejs, cpp and ruby, but none for Lua, and both build.yml (line 
32) and sca.yml (line 29) pass --without-lua in their shared 
CONFIG_ARGS_FOR_LIBS. The docker.yml workflow only builds and validates the 
official images; it runs no language test suite. So a change to lib/lua gets no 
automated coverage at all.

lib/lua ships enabled by default -- configure.ac line 276 has 
AX_THRIFT_LIB(lua, [Lua], yes) and lib/Makefile.am line 88 has SUBDIRS += lua 
-- so this is code that reaches users with no regression coverage behind it.

h3. The historical reason for --without-lua no longer applies

The three ubuntu Dockerfiles carry the comment "need to update our luasocket 
code, lua doesn't have luaL_openlib any more". That update happened: 
THRIFT-4386 (eb684d348, 2024-07-28) added the version switch, so the C sources 
now call luaL_setfuncs on Lua >= 5.2 and luaL_register only below it. The 
comment and the --without-lua flags are stale and should go with this change.

h3. Verified in the thrift:jammy image before filing

* All six C sources under lib/lua/src compile clean against Lua 5.4.4.
* ./configure --with-lua reports "Building Lua Library ......... : yes", using 
/usr/bin/lua, Lua 5.4.4.
* make -C lib/lua builds all four shared libraries (libluasocket, 
liblualongnumber, libluabpack, libluabitwise) without warnings.
* lib/lua/test/test_recursion_depth.lua reports 30 passed, 0 failed, after 
generating its stubs.
* test/lua/test_basic_server.lua and test_basic_client.lua run against each 
other successfully (client exits 0) over the default buffered/binary 
combination.

h3. Most of what a job needs already exists

* build/docker/ubuntu-{jammy,noble}/Dockerfile install lua5.4 and 
liblua5.4-dev; ubuntu-focal installs lua5.2 and lua5.2-dev. configure requires 
>= 5.2, so all three are usable, and /usr/bin/lua exists as an alternative (the 
launchpad bug referenced in the Dockerfile comment affected 5.3, not 5.4).
* configure.ac already locates the interpreter, headers and libraries via 
AX_PROG_LUA, AX_LUA_HEADERS and AX_LUA_LIBS.
* test/tests.json already carries a complete lua entry -- client, server, 
transports (buffered, framed, http) and protocols (binary, compact, json) -- so 
the cross-test wiring exists and has simply never been exercised. Its "TODO: 
Add dll to LUA_CPATH" note is also stale; the built libraries load from 
../../lib/lua/.libs without further work.

h3. One prerequisite, the same shape as THRIFT-6172 for Dart

lib/lua/Makefile.am defines no check target. "make -C lib/lua check" answers 
"Nothing to be done for 'check-am'", which means 
lib/lua/test/test_recursion_depth.lua has never been executed by any build 
since it was added. A check-local that generates the stubs with $(THRIFT) and 
runs the test should land before, or with, the job -- otherwise the job goes 
green without running the one test the binding has.

For the same reason the job should assert that configure actually enabled the 
binding, for instance by grepping the configure summary for "Building Lua 
Library ......... : yes". configure silently falls back to disabled when it 
cannot find Lua, so a job that only runs "make check" would pass while testing 
nothing.

h3. Worth knowing when writing the job

The Lua server socket's default timeout is 1000, and lib/lua/src/usocket.c 
treats it as milliseconds (socket_wait computes timeout/1000 seconds). So 
test_basic_server.lua exits with "Timeout" roughly one second after start if 
nothing connects. The cross-test runner is fine with this because 
test/crossrunner/run.py polls the port every 0.1 s and starts the client as 
soon as it is open, using the tests.json "delay" only as an upper bound -- but 
a fixed sleep before the client would kill the server first.

Compare THRIFT-6002 (netstd), THRIFT-6003 (haxe), THRIFT-6170 (D), THRIFT-6171 
(Erlang) and THRIFT-6172 (Dart), which are the same gap in other bindings.

_Drafted with AI assistance (Claude Opus 5); reviewed and filed by Jens Geyer._

  was:
No CI job builds or tests the Lua binding.

.github/workflows/build.yml has jobs for php, go, java-kotlin, netstd, haxe, 
rust, python, nodejs, cpp and ruby, but none for Lua, and both build.yml (line 
32) and sca.yml (line 29) pass --without-lua in their shared 
CONFIG_ARGS_FOR_LIBS. The docker.yml workflow only builds and validates the 
official images; it runs no language test suite. So a change to lib/lua gets no 
automated coverage at all.

lib/lua ships enabled by default -- configure.ac line 276 has 
AX_THRIFT_LIB(lua, [Lua], yes) and lib/Makefile.am line 88 has SUBDIRS += lua 
-- so this is code that reaches users with no regression coverage behind it.

h3. The historical reason for --without-lua no longer applies

The three ubuntu Dockerfiles carry the comment "need to update our luasocket 
code, lua doesn't have luaL_openlib any more". That update happened: 
THRIFT-4386 (eb684d348, 2024-07-28) added the version switch, so the C sources 
now call luaL_setfuncs on Lua >= 5.2 and luaL_register only below it. The 
comment and the --without-lua flags are stale and should go with this change.

h3. Verified in the thrift:jammy image before filing

* All six C sources under lib/lua/src compile clean against Lua 5.4.4.
* ./configure --with-lua reports "Building Lua Library ......... : yes", using 
/usr/bin/lua, Lua 5.4.4.
* make -C lib/lua builds all four shared libraries (libluasocket, 
liblualongnumber, libluabpack, libluabitwise) without warnings.
* lib/lua/test/test_recursion_depth.lua reports 30 passed, 0 failed, after 
generating its stubs.
* test/lua/test_basic_server.lua and test_basic_client.lua run against each 
other successfully (client exits 0) over the default buffered/binary 
combination.

h3. Most of what a job needs already exists

* build/docker/ubuntu-{jammy,noble}/Dockerfile install lua5.4 and 
liblua5.4-dev; ubuntu-focal installs lua5.2 and lua5.2-dev. configure requires 
>= 5.2, so all three are usable, and /usr/bin/lua exists as an alternative (the 
launchpad bug referenced in the Dockerfile comment affected 5.3, not 5.4).
* configure.ac already locates the interpreter, headers and libraries via 
AX_PROG_LUA, AX_LUA_HEADERS and AX_LUA_LIBS.
* test/tests.json already carries a complete lua entry -- client, server, 
transports (buffered, framed, http) and protocols (binary, compact, json) -- so 
the cross-test wiring exists and has simply never been exercised. Its "TODO: 
Add dll to LUA_CPATH" note is also stale; the built libraries load from 
../../lib/lua/.libs without further work.

h3. One prerequisite, the same shape as THRIFT-6172 for Dart

lib/lua/Makefile.am defines no check target. "make -C lib/lua check" answers 
"Nothing to be done for 'check-am'", which means 
lib/lua/test/test_recursion_depth.lua has never been executed by any build 
since it was added. A check-local that generates the stubs with $(THRIFT) and 
runs the test should land before, or with, the job -- otherwise the job goes 
green without running the one test the binding has.

For the same reason the job should assert that configure actually enabled the 
binding, for instance by grepping the configure summary for "Building Lua 
Library ......... : yes". configure silently falls back to disabled when it 
cannot find Lua, so a job that only runs "make check" would pass while testing 
nothing.

h3. Worth knowing when writing the job

The Lua server socket's default timeout is 1000, and lib/lua/src/usocket.c 
treats it as milliseconds (socket_wait computes timeout/1000 seconds). So 
test_basic_server.lua exits with "Timeout" roughly one second after start if 
nothing connects. The cross-test runner is fine with this because 
test/crossrunner/run.py polls the port every 0.1 s and starts the client as 
soon as it is open, using the tests.json "delay" only as an upper bound -- but 
a fixed sleep before the client would kill the server first.

Compare THRIFT-6002 (netstd), THRIFT-6003 (haxe), THRIFT-6170 (D), THRIFT-6171 
(Erlang) and THRIFT-6172 (Dart), which are the same gap in other bindings.


> Add a GitHub Actions CI job for the Lua library
> -----------------------------------------------
>
>                 Key: THRIFT-6189
>                 URL: https://issues.apache.org/jira/browse/THRIFT-6189
>             Project: Thrift
>          Issue Type: New Feature
>          Components: Build Process, Lua - Library
>            Reporter: Jens Geyer
>            Priority: Major
>
> No CI job builds or tests the Lua binding.
> .github/workflows/build.yml has jobs for php, go, java-kotlin, netstd, haxe, 
> rust, python, nodejs, cpp and ruby, but none for Lua, and both build.yml 
> (line 32) and sca.yml (line 29) pass --without-lua in their shared 
> CONFIG_ARGS_FOR_LIBS. The docker.yml workflow only builds and validates the 
> official images; it runs no language test suite. So a change to lib/lua gets 
> no automated coverage at all.
> lib/lua ships enabled by default -- configure.ac line 276 has 
> AX_THRIFT_LIB(lua, [Lua], yes) and lib/Makefile.am line 88 has SUBDIRS += lua 
> -- so this is code that reaches users with no regression coverage behind it.
> h3. The historical reason for --without-lua no longer applies
> The three ubuntu Dockerfiles carry the comment "need to update our luasocket 
> code, lua doesn't have luaL_openlib any more". That update happened: 
> THRIFT-4386 (eb684d348, 2024-07-28) added the version switch, so the C 
> sources now call luaL_setfuncs on Lua >= 5.2 and luaL_register only below it. 
> The comment and the --without-lua flags are stale and should go with this 
> change.
> h3. Verified in the thrift:jammy image before filing
> * All six C sources under lib/lua/src compile clean against Lua 5.4.4.
> * ./configure --with-lua reports "Building Lua Library ......... : yes", 
> using /usr/bin/lua, Lua 5.4.4.
> * make -C lib/lua builds all four shared libraries (libluasocket, 
> liblualongnumber, libluabpack, libluabitwise) without warnings.
> * lib/lua/test/test_recursion_depth.lua reports 30 passed, 0 failed, after 
> generating its stubs.
> * test/lua/test_basic_server.lua and test_basic_client.lua run against each 
> other successfully (client exits 0) over the default buffered/binary 
> combination.
> h3. Most of what a job needs already exists
> * build/docker/ubuntu-{jammy,noble}/Dockerfile install lua5.4 and 
> liblua5.4-dev; ubuntu-focal installs lua5.2 and lua5.2-dev. configure 
> requires >= 5.2, so all three are usable, and /usr/bin/lua exists as an 
> alternative (the launchpad bug referenced in the Dockerfile comment affected 
> 5.3, not 5.4).
> * configure.ac already locates the interpreter, headers and libraries via 
> AX_PROG_LUA, AX_LUA_HEADERS and AX_LUA_LIBS.
> * test/tests.json already carries a complete lua entry -- client, server, 
> transports (buffered, framed, http) and protocols (binary, compact, json) -- 
> so the cross-test wiring exists and has simply never been exercised. Its 
> "TODO: Add dll to LUA_CPATH" note is also stale; the built libraries load 
> from ../../lib/lua/.libs without further work.
> h3. One prerequisite, the same shape as THRIFT-6172 for Dart
> lib/lua/Makefile.am defines no check target. "make -C lib/lua check" answers 
> "Nothing to be done for 'check-am'", which means 
> lib/lua/test/test_recursion_depth.lua has never been executed by any build 
> since it was added. A check-local that generates the stubs with $(THRIFT) and 
> runs the test should land before, or with, the job -- otherwise the job goes 
> green without running the one test the binding has.
> For the same reason the job should assert that configure actually enabled the 
> binding, for instance by grepping the configure summary for "Building Lua 
> Library ......... : yes". configure silently falls back to disabled when it 
> cannot find Lua, so a job that only runs "make check" would pass while 
> testing nothing.
> h3. Worth knowing when writing the job
> The Lua server socket's default timeout is 1000, and lib/lua/src/usocket.c 
> treats it as milliseconds (socket_wait computes timeout/1000 seconds). So 
> test_basic_server.lua exits with "Timeout" roughly one second after start if 
> nothing connects. The cross-test runner is fine with this because 
> test/crossrunner/run.py polls the port every 0.1 s and starts the client as 
> soon as it is open, using the tests.json "delay" only as an upper bound -- 
> but a fixed sleep before the client would kill the server first.
> Compare THRIFT-6002 (netstd), THRIFT-6003 (haxe), THRIFT-6170 (D), 
> THRIFT-6171 (Erlang) and THRIFT-6172 (Dart), which are the same gap in other 
> bindings.
> _Drafted with AI assistance (Claude Opus 5); reviewed and filed by Jens 
> Geyer._



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to