[
https://issues.apache.org/jira/browse/CAMEL-23431?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Guillaume Nodet reassigned CAMEL-23431:
---------------------------------------
Assignee: Guillaume Nodet
> 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
> Assignee: Guillaume Nodet
> Priority: Minor
> Labels: test-stability
>
> 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)