Hi,

trying to pick your brains here.
I hope to be able to explain decently what I'm trying to achieve.

This is about the test suite of Net::Statsd::Server, a perl port
of the javascript statsd daemon, and in particular the
t/integration-tests/*.t cases.

Integration here means that the *.t files, through a
Test::Statsd class, bring up a Net::Statsd::Server server
on a fixed port, f.ex. 40001.

This "bringing up" happens by fork and exec of a given binary
(bin/statsd in the same dist). I chose this path because I can
run my unmodified test suite against the javascript statsd
and test that the js and perl versions behave exactly the same.

Now, problem.

I'd like to use port 0 to bring up the daemon, so that the test suite
can be run in parallel without port clashes. With port == 0 the TCP/UDP
bind will happen on a random free port.

When the fork + exec'd daemon chooses a random port, I need to be able
to know which port it has bound itself to, and here lies the problem.

How would you communicate this information back to the parent process
that spawns the daemon binary?

The solution I found so far works but it's totally unsatisfactory to me.

Basically I set an ENV variable such as $ENV{STATSD_PORT_FILE} with a
temporary random file name.

In the daemon startup code, if $ENV{HARNESS_ACTIVE} and
$ENV{STATSD_PORT_FILE} are both there (since the daemon is spawned by
the *.t script), then the port number is saved into the file name
indicated by $ENV{STATSD_PORT_FILE}.

I don't like this mess.

-- 
Cosimo

Reply via email to