You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Guillaume Nodet (Jira)" <ji...@apache.org> on 2026/05/06 06:26:00 UTC
[jira] [Created] (CAMEL-23431) Migrate AS2 and other component tests from AvailablePortFinder to port-0 ServerSocket binding
Guillaume Nodet created CAMEL-23431:
---------------------------------------
Summary: Migrate AS2 and other component tests from AvailablePortFinder to port-0 ServerSocket binding
Key: CAMEL-23431
URL: https://issues.apache.org/jira/browse/CAMEL-23431
Project: Camel
Issue Type: Improvement
Components: tests
Reporter: Guillaume Nodet
h3. Background
While fixing CAMEL-22525 (flaky AS2 tests with BindException), we identified that {{AvailablePortFinder}} has an inherent TOCTOU (time-of-check-to-time-of-use) race condition: it probes a port by opening/closing a {{ServerSocket}}, then the component creates its own {{ServerSocket}} later. Between the probe close and the actual bind, another process can steal the port.
The fix for CAMEL-22525 (PR #22981) demonstrated the proper pattern: bind to port 0 (OS assigns atomically), then read the actual port via {{getLocalPort()}}.
h3. Investigation Results
A survey of all 261 test files using {{AvailablePortFinder}} across the codebase found:
||Category||Files||Feasibility||Description||
|A: Port passed to server object|231 (88.5%)|High|Port assigned via {{setPort()}}, {{setListenPort()}}, constructor params. Server can support port 0 + {{getLocalPort()}}|
|B: Port in route URI string|15 (5.7%)|Medium|Port concatenated into {{from("jetty:http://localhost:" + port + "/...")}}. Requires route refactoring or property-based port injection|
|D: Other patterns|15 (5.7%)|Varies|Test utilities, property configurations|
h4. Top components by file count (Category A)
* camel-platform-http-vertx (27 files)
* camel-mllp (21 files)
* camel-grpc (14 files)
* camel-jetty (12 files)
* camel-cxf (11 files)
* camel-cometd (10 files)
* camel-syslog (9 files)
* camel-thrift (9 files)
* camel-netty (8 files)
h3. Proposed Approach
For each component with Category A tests:
# Add {{getLocalPort()}} to the server/connection class (if not already present)
# Change tests to bind to port 0 and read the actual port back
# Remove {{AvailablePortFinder}} usage for that port
Category B tests (port in URI strings) require more thought — either property-based port injection or restructuring the test lifecycle so the server starts before routes are defined.
{{AvailablePortFinder}} remains useful as a fallback when port 0 is not feasible, but port 0 should be the default choice whenever possible.
h3. Related
* CAMEL-22525 — Fix flaky AS2 tests (the specific fix that motivated this investigation)
* CAMEL-23214 — Migrate AvailablePortFinder in camel-as2 tests (prior migration that used AvailablePortFinder)
* CAMEL-19635 — AS2 tests identified as flaky risk
--
This message was sent by Atlassian Jira
(v8.20.10#820010)