# Net::Daemon::Test - support functions for testing Net::Daemon servers

- NAME
- SYNOPSIS
- DESCRIPTION
- AVAILABLE METHODS

- Server part
- Client part

- AUTHOR AND COPYRIGHT
- SEE ALSO

# NAME

Net::Daemon::Test - support functions for testing Net::Daemon servers

# SYNOPSIS

        # This is the server, stored in the file "servertask".
        #
        # Create a subclass of Net::Daemon::Test, which in turn is
        # a subclass of Net::Daemon
        use Net::Daemon::Test ();
        package MyDaemon;
        @MyDaemon::ISA = qw(Net::Daemon::Test);

        sub Run {
            # Overwrite this and other methods, as you like.
        }

        my $self = Net::Daemon->new(\%attr, \@options);
        eval { $self->Bind() };
        if ($@) {
            die "Server cannot bind: $!";
        }
        eval { $self->Run() };
        if ($@) {
            die "Unexpected server termination: $@";
        }

        # This is the client, the real test script, note we call the
        # "servertask" file below:
        #
        # Call the Child method to spawn a child. Don't forget to use
        # the timeout option.
        use Net::Daemon::Test ();

        my($handle, $port) = eval {
            Net::Daemon::Test->Child(5, # Number of subtests
                                     'servertask', '--timeout', '20')
        };
        if ($@) {
            print "not ok 1 $@\n";
            exit 0;
        }
        print "ok 1\n";

        # Real tests following here
        ...

        # Terminate the server
        $handle->Terminate();

# DESCRIPTION

This module is a frame for creating test scripts of Net::Daemon based server packages, preferrably using Test::Harness, but that's your choice.

A test consists of two parts: The client part and the server part. The test is executed by the child part which invokes the server part, by spawning a child process and invoking an external Perl script. (Of course we woultn't need this external file with `fork()`, but that's the best possibility to make the test scripts portable to Windows without requiring threads in the test script.)

The server part is a usual Net::Daemon application, for example a script like dbiproxy. The only difference is that it derives from Net::Daemon::Test and not from Net::Daemon, the main difference is that the Bind method attempts to allocate a port automatically. Once a port is allocated, the number is stored in the file "ndtest.prt".

After spawning the server process, the child will wait ten seconds (hopefully sufficient) for the creation of ndtest.prt.

# AVAILABLE METHODS

## Server part

Options

  Adds an option --timeout to Net::Daemon: The server's Run method will die after at most 20 seconds.

Bind

  (Instance method) This is mainly the default Bind method, but it attempts to find and allocate a free port in two ways: First of all, it tries to call Bind with port 0, most systems will automatically choose a port in that case. If that seems to fail, ports 30000-30049 are tried. We hope, one of these will succeed. :-)

Run

  (Instance method) Overwrites the Net::Daemon's method by adding a timeout.

sub Run ($) { my $self = shift; $self->`Run()`; }

## Client part

Child

  (Class method) Attempts to spawn a server process. The server process is expected to create the file 'ndtest.prt' with the port number.

  The method returns a process handle and a port number. The process handle offers a method Terminate that may later be used to stop the server process.

# AUTHOR AND COPYRIGHT

      Net::Daemon is Copyright (C) 1998, Jochen Wiedmann
                                         Am Eisteich 9
                                         72555 Metzingen
                                         Germany

                                         Phone: +49 7123 14887
                                         Email: joe@ispsoft.de

      All rights reserved.

You may distribute under the terms of either the GNU General Public License or the Artistic License, as specified in the Perl README file.

# SEE ALSO

the Net::Daemon(3) manpage, the Test::Harness(3) manpage