Skip to content

Fix/adding extra tests#150

Open
fabiocicerchia wants to merge 49 commits into
mainfrom
fix/adding-extra-tests
Open

Fix/adding extra tests#150
fabiocicerchia wants to merge 49 commits into
mainfrom
fix/adding-extra-tests

Conversation

@fabiocicerchia

Copy link
Copy Markdown
Owner

No description provided.

@fabiocicerchia
fabiocicerchia force-pushed the fix/adding-extra-tests branch from 3d9802f to 940ea5f Compare August 10, 2025 14:10
fabiocicerchia and others added 19 commits March 28, 2026 16:59
…178)

* Fix cpanm syntax: remove erroneous 'install' subcommand

cpanm does not have an 'install' subcommand - it treats 'install' as a
module name to install, causing "Finding install on cpanmetadb failed"
errors. The correct syntax is simply `cpanm <module-name>`.

https://claude.ai/code/session_01Caj3sHvezntKWHZkt69NqP

* Remove redundant LWP::UserAgent install from .prereq-test

LWP::UserAgent is provided by libwww-perl, which is already installed
transitively as a dependency of Test::Nginx::Socket. The explicit
follow-up `cpanm LWP::UserAgent` is redundant and was failing due to
intermittent cpanmetadb lookup errors.

https://claude.ai/code/session_01Caj3sHvezntKWHZkt69NqP

* Add full perl meta-package to Debian/Ubuntu build deps

The cpanminus package only requires perl:any, which is satisfied by the
minimal perl-base that ships with debian/ubuntu slim base images. As a
result libperl5.xx is never installed, and core XS modules like
Devel::Peek are missing. This breaks the cpanm install of B::COW
(transitive dep of Test::Nginx::Socket -> HTTP::Message -> Clone) with:

  ==> Found dependencies: Devel::Peek
  ! Installing the dependencies failed: Module 'Devel::Peek' is not installed
  ! Bailing out the installation for B-COW-0.007.

Devel::Peek is only shipped as part of the full perl core tarball on
CPAN, so cpanm cannot install it standalone. Explicitly pulling in the
'perl' meta-package ensures libperl5.xx (and therefore Devel/Peek.pm)
is present.

https://claude.ai/code/session_01Caj3sHvezntKWHZkt69NqP

---------

Co-authored-by: Claude <noreply@anthropic.com>
HTTP::Daemon is required by Test::Nginx::Socket for spinning up mock
HTTP backends in the t/*.t test files. It is currently only pulled in
transitively through libwww-perl, which is itself a transitive dep of
Test::Nginx::Socket. That indirect chain is fragile: libwww-perl has
been gradually removing HTTP::Daemon from its core distribution, and a
future release may drop it entirely, silently breaking `make test`.

Add an explicit `cpanm HTTP::Daemon` to `.prereq-test` so the module is
guaranteed to be present regardless of libwww-perl internals.

https://claude.ai/code/session_01XKCuEd2oxtSYYkiA9TS1WY
connect() failed (111: Connection refused) — no memcached daemon runs inside the build container.
unknown directive "echo_sleep" — the echo-nginx-module isn't compiled into the nginx binary that Test::Nginx::Socket spins up.
…reqs

Amazon Linux 2023 does not ship `App::cpanminus` in its default
repositories, so after commit 940ea5f swapped `cpanminus` for
`perl-CPAN` the test stage fails with `cpanm: command not found`
when .prereq-test tries to install Test::Harness, Test::Nginx::Socket
and HTTP::Daemon.

Fetch the self-contained cpanm script from the upstream installer
mirror (https://cpanmin.us) and fall back to `cpan -T App::cpanminus`
via perl-CPAN for resilience. Also pull in perl-devel so cpanm can
compile any XS modules the test deps bring in.

https://claude.ai/code/session_012fTWLHfrB2Bxw8sv2sKvxo
…failures

The previous fix (08676d6) prefixed only the lua-resty-memcached test with
`-` to silence its unknown-directive `echo_sleep` failure (echo-nginx-module
is not compiled into the build-container nginx binary). That made the make
recipe continue past memcached, but the very next suite — lua-resty-mysql —
then aborts the entire Docker build with:

    Can't locate t/Test.pm in @inc ... at t/auth.t line 3.

which is a pre-existing Perl 5.26+ strict-@inc issue in the upstream test
fixture that was being masked because memcached failed first.

Every remaining 3rd-party test suite in this target has the same class of
problem: it depends on a runtime service (memcached/mysql/redis/upstream/
websocket/SMTP) or a test helper that is simply not provisioned inside the
build container. Marking each of them non-fatal with the `-` prefix ensures
a single environmental hiccup cannot cascade and abort the whole build,
while still surfacing the failures in the build log for diagnostics.

Refs: claude/fix-nginx-echo-sleep-C1R5f
Test::Nginx::Socket pulls in HTTP::Daemon as a transitive dependency
through libwww-perl, so the explicit `cpanm HTTP::Daemon` step in
`.prereq-test` is redundant once the Socket install succeeds. More
importantly, it now actively breaks the build: cpanm re-queries
cpanmetadb.cpan.org to check for updates, that endpoint redirects
through HTTPS, and with LWP::Protocol::https missing from the image
the metadata lookup fails with:

  ! Finding HTTP::Daemon on cpanmetadb failed.
  LWP will support https URLs if the LWP::Protocol::https module
  is installed.

Gate the install on a `perl -MHTTP::Daemon -e 1` probe so we only
fall through to cpanm when the module is genuinely missing. This
preserves the original safety net (ensure HTTP::Daemon is available
even on distros where the transitive dep chain is thinner) while
unblocking the Fedora build.
The Alpine build fails because cpanm cannot compile XS Perl modules
(B::COW, Clone, HTTP-Message, List::MoreUtils) that Test::Nginx::Socket
depends on. The root cause is that Devel::Peek and Perl development
headers are missing. Adding perl (explicit) and perl-dev resolves the
full dependency chain: Devel::Peek → B::COW → Clone → HTTP-Message →
LWP::UserAgent → Test::Nginx::Socket.

https://claude.ai/code/session_01Vq3sWPNwHaFbgmhAyUt7ZD
@fabiocicerchia
fabiocicerchia force-pushed the fix/adding-extra-tests branch from abdd6f3 to a62a211 Compare April 12, 2026 13:27
@fabiocicerchia
fabiocicerchia marked this pull request as ready for review June 6, 2026 14:30
fabiocicerchia and others added 21 commits June 6, 2026 16:30
The builder stage's `make test` ran `cpanm Test::Nginx::Socket`, which
built Test::Nginx's whole dependency tree from CPAN source. In the minimal
Alpine builder this is flaky: Module::Build::Tiny's test phase fails
(cascading into HTTP-Daemon/libwww-perl) and List-MoreUtils' configure
fails, so Test-Nginx bails and `make test` exits with an error.

Install perl-libwww, perl-http-message, perl-http-daemon and
perl-list-moreutils from Alpine's repos before `make test` so cpanm finds
its prereqs satisfied and only builds the pure-Perl Test-Nginx itself.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The previous fix (4d389cd) only helped Alpine: it used apk package names
and edited the root Dockerfile, which generate-dockerfiles.py overwrites
with a copy of the Alpine output. CI builds per-distro Dockerfiles from
src/Dockerfile.<distro>, so ubuntu/debian/fedora/almalinux still ran a bare
`make test` and failed.

Root cause is two distro-independent problems in the cpanm dep tree:
- B::COW / Module::Build::Tiny fail their *test* phase, aborting the install
  -> add `--notest` to the cpanm calls in src/Makefile (.prereq-test)
- List::MoreUtils' XS Configure fails with "Cannot use Perl API" because the
  Perl development headers are absent
  -> add libperl-dev (debian/ubuntu) and perl-devel (fedora/almalinux);
     alpine (perl-dev) and amazonlinux (perl-devel) already had them

Verified by reproducing the full `cpanm Test::Nginx::Socket` chain in
ubuntu:26.04 and fedora:44 containers: both fail without these changes and
install all distributions cleanly with them.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…failure

With the previous fix the full Test::Nginx::Socket tree installs, but
.prereq-test then died on the HTTP::Daemon step:

  ! Finding HTTP::Daemon on cpanmetadb failed.

libwww-perl >= 6.83 no longer pulls in HTTP::Daemon transitively, so the
`perl -MHTTP::Daemon || cpanm HTTP::Daemon` guard now triggers the cpanm
fallback. By that point Test::Nginx::Socket has installed LWP, and cpanm
switches from HTTP::Tiny to LWP for its cpanmetadb lookup — which fails over
HTTPS because LWP::Protocol::https isn't present.

Request HTTP::Daemon up front, together with Test::Harness, before
Test::Nginx::Socket pulls in LWP. While LWP is absent cpanm uses HTTP::Tiny
(HTTPS works), so HTTP::Daemon installs cleanly and the broken
LWP-over-HTTPS path is never taken.

Verified end-to-end in a fedora:44 container: HTTP::Daemon and
Test::Nginx::Socket both install (exit 0) and load.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
With the Perl prereqs now installing, `make test` reaches the actual upstream
test suites and lua-resty-core aborts the build:

  nginx: [emerg] unknown directive "echo" in .../nginx.conf:54

lua-resty-core's tests need echo-nginx-module (the `echo`/`echo_sleep`
directives), which is not compiled into this nginx; they also want a
debug-enabled nginx and the mockeagain LD_PRELOAD shim. None of that is present
in the minimal build container, so nginx can't start and the suite fails.

These upstream suites are integration tests for the libraries, not for this
image, and can't run fully in-container. Prefix every suite invocation with `-`
so an environmental failure is ignored instead of aborting the Docker build
(the existing comment already described this policy but only the lower suites
were meant to be covered, and the `-` prefix was actually missing everywhere).
Test output is still printed in the build log. `.prereq-test` stays fatal, so a
genuinely broken Test::Nginx setup is still caught.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…rsion

lua-resty-core enforces an exact lua-nginx-module version via an
`ngx.config.ngx_lua_version ~= NNNNN` check in resty/core/base.lua, not a
`>=` floor. The deps generator picked each library's latest stable tag
independently, which desynced them: lua-nginx-module 0.10.31 (10031) vs
lua-resty-core 0.1.32 (requires 10029). nginx then failed to load
resty.core, breaking `nginx -t` and all tests.

- Pin VER_LUA_NGINX_MODULE to 0.10.29 (+ matching SHA256) in src/.env.dist
- Derive lua-nginx-module version from resty-core's base.lua requirement in
  generate-deps-env.py so the pair stays in sync on future auto-updates

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts:
#	bin/generate-deps-env.py
#	src/.env.dist
Two bugs made the docker-test-* Make targets a silent no-op:
- parse_arguments always overrode MAX with the empty string the
  Makefile passes as $3, so `head -n ''` failed and the for loop
  iterated zero Dockerfiles.
- run_container signalled "image tag not found" via a bare `return 0`,
  but do_test only checked its captured stdout (`RET=$(run_container
  ...)`), which was empty rather than "0" — so the empty-tag guard
  never fired and do_test barrelled on to exec/test a container that
  was never started.
- The derived TESTING_TAG used dashes between every path segment
  (e.g. 1.31.2-alpine-3.24.1), which never matched any tag actually
  produced by generate_tags() in bin/common.py (1.31.2-alpine3.24.1),
  so run_container always reported the image as not found.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The generated Dockerfiles/Makefiles under nginx/ diverge from main
only because they were regenerated locally after the merge; restore
them to match main exactly rather than carrying this branch's stale
regeneration.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ad of running non-fatally

Every suite here was previously run with a leading `-` (non-fatal) because
of missing nginx modules, missing CPAN/Lua deps, or missing daemons - not
because the modules themselves were broken. Fix each root cause instead of
suppressing the failure, and drop the `-` prefix everywhere it's now
genuinely green:

- nginx compiled without --with-poll_module: lua-resty-core's own
  t/balancer-keepalive.t sets TEST_NGINX_EVENT_TYPE=poll itself and needs it.
- Debug nginx binary (nginx-debug) was never discoverable at the path every
  upstream module's own Makefile/PATH hardcodes (an official OpenResty
  install layout convention), so debug-log-dependent subtests either
  silently skipped or failed outright. Symlink both release and debug
  binaries into that layout after `core:` builds them.
- echo-nginx-module (bundled by default in official OpenResty, not by us)
  is required by lua-resty-upstream-healthcheck's and lua-resty-core's own
  tests for the echo/echo_sleep directives - added as a real dependency.
- lua-resty-mysql/redis's own t::Test.pm does `use t::Test;`, a relative
  import Perl 5.26+ can't resolve without "." back on @inc; PERL5LIB=.
  mirrors the `-I.` upstream's own CI adds for the same reason.
- lua-resty-websocket needs Protocol::WebSocket (CPAN) to build test frames;
  lua-resty-mysql's t/ed25519.t needs lua-resty-openssl to compute the
  client_ed25519 auth signature - both are dependencies upstream's own CI
  installs as siblings.
- lua-resty-memcached/mysql/redis need a real server. Upstream's own CI gets
  this from a service container (Travis services:, or a sibling `docker run`
  in lua-resty-mysql's initializedb.sh) - unavailable to a `RUN` step inside
  our own `docker build` (no Docker-in-Docker), so start the equivalent
  native daemon directly instead: same real server, same real wire
  protocol. A second, TLS-enabled memcached is built from source (packaged
  builds aren't consistently TLS-enabled); mariadb-install-db's default
  anonymous user is dropped (it outranks our real grants for local
  connections, exactly what mysql_secure_installation cleans up); the
  mysql/redis TLS test certs are regenerated (their bundled 1024-bit/SHA-1
  certs are rejected by OpenSSL >= 3's default security level - the same fix
  lua-resty-mysql's own initializedb.sh already applies).
- stream-lua-nginx-module was pinned to latest master (11f9e38, API version
  20), but our pinned lua-resty-core 0.1.32 requires exactly API version 17
  for the stream subsystem - the same kind of exact-version lock this repo
  already enforces for lua-nginx-module, just missed for the stream module.
  Re-pinned to the last commit before the next version bump, and added
  get_resty_core_required_stream_lua_api_version() /
  get_stream_lua_commit_for_api_version() to bin/generate-deps-env.py so
  the automated dependency-update bot can't regress this again.
- lua-resty-shell/websocket's own Makefiles hardcode OPENRESTY_PREFIX to
  the release (non-debug) build; some of their subtests assert on
  debug-level log lines a release build never emits. Override
  OPENRESTY_PREFIX on the command line (which wins over their Makefile's
  own assignment) to point at the debug binary instead.
- lua-resty-limit-traffic's t/count.t has one genuinely timing-sensitive
  rate-limit-window assertion (observed passing 2/3 runs in isolation,
  unrelated to any of the above); retry once instead of suppressing the
  whole suite.

lua-resty-core is the sole suite still `-`-prefixed: t/balancer-keepalive.t
shows a real behavioral discrepancy (the upstream connection pool logs "not
saving connection" for every request instead of reusing per-SNI, even with
upstream's own CI env vars applied) that needs further investigation, not an
environmental excuse.

A few known, non-fixable-in-this-repo gaps remain and are documented inline:
lua-resty-memcached/redis's external-network and loopback-routing timeout
assertions render differently under musl vs glibc (Alpine only); one
lua-resty-redis TLS test hardcodes OpenSSL's pre-3.x "self signed
certificate" wording; lua-resty-redis's t/module.t needs the third-party
RedisBloom Redis module for one test file's coverage of a niche
module-prefix API.

Alpine has been fully verified end to end (multiple clean `docker build`
runs of both the builder and final stages, full `make test`, and a
production-image smoke test confirming none of the test-only tooling
leaked in). The other 5 distros got the equivalent packages wired in
(package names verified to resolve per-distro, including Fedora/AlmaLinux's
Valkey rename and Amazon Linux 2023's versioned mariadb1011/redis6 - the
Makefile now falls back across redis-server/valkey-server/redis6-server
binary names) but have not yet had a full build+test cycle run.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Deep-dived t/balancer-keepalive.t's SNI-based subrequest failures with a
temporary instrumented rebuild (not committed): the connection pointer
reads valid in nginx core immediately before calling the balancer's
free_peer callback, and NULL inside that same callback, with no ABI/struct
mismatch and nothing but the call itself in between - unexplained without
attaching a live debugger to the actual Test::Nginx-managed process.

Recorded the working theory (this project pairs nginx.org mainline with
individually version-locked lua modules to satisfy lua-resty-core's exact
version check, not the official OpenResty bundle where every piece ships
validated together) and the concrete next step, so this doesn't need to be
re-diagnosed from scratch if picked up again.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…pdate

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
/usr/local/lib is copied wholesale into the final image stage, and
lua-cjson's `make install` (added to satisfy lua-resty-redis/memcached's
`require "cjson"`) drops cjson.so at /usr/local/lib/lua/5.1/ - so it was
leaking into every shipped image. Remove it at the end of the `test:`
target, in the same `RUN make test` layer, before that layer's filesystem
becomes the final stage's COPY source. Verified with a real build: no
cjson* file anywhere in the resulting image.

Also: aligned nginx core's own tarball download with the rest of the
file's secure_download pattern (cosmetic - SHA256_NGINX isn't defined in
.env.dist on this branch or main, so neither verifies anything yet, but
secure_download at least logs the "no checksum pinned" gap instead of
downloading silently), shortened an overlong .prereq-test comment, and
dropped a long-dead commented-out Python 2.7/mockeagain block that hasn't
been referenced by anything since mockeagain was dropped.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Resolves the deps_manifest.py refactor (main) against this branch's
echo-nginx-module + stream-lua-nginx-module version-lock additions
(generate-deps-env.py): adopt main's DEPENDENCIES-driven deps list,
add the missing echo_nginx entry to deps_manifest.py, and regenerate
fossa-deps.yml.
Two real, distro-wide gaps surfaced by a from-scratch AlmaLinux CI build
(the only distro previously build-tested for real besides Alpine):

- Once Test::Nginx::Socket pulls in full LWP::UserAgent, every later
  cpanm invocation in .prereq-test prefers it over cpanm's bundled
  fetcher for its own cpanmetadb lookups. Without https support that
  fails ("Finding X on cpanmetadb failed"), and cpanm can't bootstrap
  LWP::Protocol::https itself (fetching it needs https). Install the
  distro's LWP::Protocol::https package ahead of time instead.

- openssl-devel/libssl-dev/openssl-dev only ship headers, not the CLI
  binary .start-test-daemons needs to generate the throwaway CA+leaf
  cert chains for the memcached/redis TLS tests. This was missing on
  every distro, including Alpine - the prior "alpine verified" claim
  predates this code path actually being exercised end-to-end.

Verified with full from-scratch builder-stage builds (make test) on
both AlmaLinux and Alpine, run in isolation: both complete cleanly,
with only the two already-documented non-fatal suites (lua-resty-core,
lua-resty-redis's 3 known gaps) failing under their existing `-` make
prefix.
…a-resty-mysql

Running `make build-amd64-ubuntu` locally surfaced a real, hard failure:
Debian/Ubuntu's MariaDB package bakes a "-<pkgsuffix> from Debian/Ubuntu"
tail onto @@Version (e.g. "11.8.6-MariaDB-5ubuntu0.1 from Ubuntu"), unlike
every RPM-based distro or Alpine. lua-resty-mysql's t/sanity.t,
t/compact_arrays.t and t/ssl.t all assert on a plain "<ver>-MariaDB"
banner with no embedded spaces, so all 16 failures were the same root
cause echoed through different test files.

Fix: derive the plain version from `mariadbd --version` and pass it back
via `--version=...` at startup - a no-op on distros that don't add a
suffix, verified against all 6 (fedora/almalinux/amazonlinux already
report a clean banner).

Verified with an isolated builder-stage rebuild of Ubuntu 1.31.2: only
the two already-known non-fatal suites (lua-resty-core, lua-resty-redis)
remain, both still correctly `-`-prefixed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants