---
name: "Net::Daemon::Test"
section: "3pm"
platform: "linux"
package: "libnet-daemon-perl"
version: "0.49-3"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Net::Daemon::Test"
---

# Net::Daemon::Test(3pm)

support functions for testing Net::Daemon servers

## 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;
    our @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

**Net::Daemon**(3), **Test::Harness**(3)
