The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

RPC::ExtDirect::Server::Util - Ext.Direct server utility functions

SYNOPSIS

Using in test scripts

    use Test::More tests => n;
    use RPC::ExtDirect::Server::Util;
    
    my ($host, $port) = maybe_start_server();
    ok $port, "Got host: $host and port: $port";
    
    ...
    
    # Optional, will be called automatically
    stop_server()

Running test scripts

Run with no command line options to fork a child process, instantiate a new server and run the tests against the child process (normal mode):

    perl t/01_test.t
    
    1..x
    
    ...

Debugging test scripts

In one terminal session, run a script in debugging mode:

    perl t/01_test.t -fet 1
    
    1..x
    RPC::ExtDirect::Server is listening on 127.0.0.1:31302

    Loading DB routines from perl5db.pl version 1.33
    Editor support available.
    
    DB<1>

In another terminal session, run the same script against the process started above by specifying the port it listens on:

    perl t/01_test.t -p 31302
    
    1..x
    ...

DESCRIPTION

This package contains utility functions for starting and stopping RPC::ExtDirect::Server instances. It is most commonly used in test scripts, both for running the tests and debugging the code when test failures happen.

EXPORTED SUBROUTINES

This package exports the following functions:

start_server

Start a new instance of RPC::ExtDirect::Server or derived class, wait for it to bind to a port and return the actual host and port number values. If an instance has already been started, return its host and port.

The server instance by default will be started in background (forked process), or optionally in foreground. See "foreground" parameter below.

If a port to listen to was not specified in arguments, a random value between 30,000 and 40,000 will be generated. If the server instance is unable to bind to the generated port, a new random value will be generated and a new attempt to bind to that port will be made, until an unused port is found.

If a port value was provided in arguments, but the server is unable to bind to that port, no attempts will be made to bind to another port; start_server will die with an error.

This function returns ($host, $port) values in list context, or "$host:$port" string in scalar context.

The following arguments are accepted by name in a hash:

server_class

Name of the class to use instead of RPC::ExtDirect::Server when instantiating a new server object. This should be a subclass of RPC::ExtDirect::Server.

timeout

Interval in seconds to wait for the server to bind to a port; after that the child process will be killed and start_server will die with an error.

This parameter defaults to 30 seconds and is only meaningful when server is started in background.

foreground

If set to a truthy value the server instance will be instantiated and executed in the current process, instead of forking a child process.

enbugger

If set to a truthy value, an attempt will be made to require the Enbugger module.

set_timer

Interval in seconds to wait before dropping to debugger prompt by calling Enbugger->stop(). This is useful to set breakpoints after the server has been initialized and bound to a port. Usually 1 second is enough for this, but starting up may take longer when heavyweight modules like Moose are used in your code.

other

Any other arguments are passed to the "server_class" constructor. See "new" in RPC::ExtDirect::Server for more information.

maybe_start_server

This function will process command line options from @ARGV and optionally start a new server instance by calling "start_server".

If the "-p" option was given, the host and port will be returned immediately instead of attempting to start a server. This allows using the the same function both to debug test scripts and run them normally; see examples in "SYNOPSIS".

This function accepts named arguments in a hash; all arguments will be passed to "start_server" except when modified by command line options described below:

-h

Host name or IP address to use either when starting a server process, or connecting to a separately started process. Defaults to 127.0.0.1.

See "host" in "start_server".

-p

Port number that should be used to connect to a separately started server process. Specifying this option will cause "maybe_start_server" to return the host and port immediately instead of trying to start a new server instance.

-l

Port number to bind to when starting a new process. If no port number is given, a random port will be generated.

See "port" in "start_server".

-s

Directory to use as the static content root; the value will be passed to the server constructor as static_dir parameter. See "new" in RPC::ExtDirect::Server.

-f

Run the server instance in foreground instead of in a forked process.

See "foreground" parameter in "start_server".

-e

Require the Enbugger module.

See "enbugger" parameter in "start_server".

-t

Interval in seconds to wait before dropping into debugger prompt.

See "set_timer" parameter in "start_server".

stop_server

Stop the server instance in a forked child process, if it has been started already. This function accepts an optional process id number of the child process.

This function will be called automatically in an END block to ensure that the server instance has been stopped when the script finishes. This automatic cleanup can be prevented; see "no_shutdown".

This function is not exported:

no_shutdown

Pass a truthy value to this function to prevent automatic server instance cleanup:

    RPC::ExtDirect::Server::Util::no_shutdown(1);

SEE ALSO

This module and its functions are used heavily in Test::ExtDirect.