ApacheDS's TcpTransport allows for a zero port, selecting any available port at startup. It does not correctly propagate that port up through the object graph, though.
For example, giving a TcpTransport a port of zero:
server = new LdapServer();
TcpTransport transport = new TcpTransport(port);
server.setTransports(transport);
server.start();
will result in a server that is listening on a random port, but server.getPort() still returns 0.
Because ApacheDS has not had a GA release in many years, it's unlikely that this enhancement will get applied to the ApacheDS project.
Still, it would be nice if ApacheDSContainer could accept 0 as a port value. One immediate benefit from this is reducing the likelihood of a port collision when multiple LDAP servers are started up simultaneously.
For this to happen, the following test would need to pass:
ApacheDSContainer container = new ApacheDSContainer("dc=springframework,dc=org",
"classpath:test-server.ldif");
container.setPort(0);
container.afterPropertiesSet();
assertNotEquals(container.getPort(), 0);
assertNotEquals(container.server.getPort(), 0);
assertNotEquals(container.server.getPortSSL(), 0);
It may be possible to post-process the server instance in ApacheDSContainer#afterPropertiesSet into a state where the selected port is correctly returned.
Note that UnboundIdContainerTests has a test that would likely be good to port over into ApacheDSContainerTests for testing this feature.
Comment From: rwinch
Perhaps we can add another accessor on 'ApacheDsContsiner' that would be be used for getting the local port vs configured port?
Comment From: jzheaux
That could be nice, yes. I think it should be getConfiguredPort so that the same pattern can be applied to UnboundIdContainer which already supports a zero port.
Comment From: evgeniycheban
I can take this task.
Comment From: jzheaux
Thanks, @evgeniycheban! It's yours.
Comment From: rwinch
Marking as duplicate of the PR