Scroll to navigation

Test::TCP(3pm) User Contributed Perl Documentation Test::TCP(3pm)
 

NAME

Test::TCP - testing TCP program

SYNOPSIS

    use Test::TCP;
    my $server = Test::TCP->new(
        code => sub {
            my $port = shift;
            ...
        },
    );
    my $client = MyClient->new(host => '127.0.0.1', port => $server->port);
    undef $server; # kill child process on DESTROY
Using memcached:
    use Test::TCP;
    my $memcached = Test::TCP->new(
        code => sub {
            my $port = shift;
            exec $bin, '-p' => $port;
            die "cannot execute $bin: $!";
        },
    );
    my $memd = Cache::Memcached->new({servers => ['127.0.0.1:' . $memcached->port]});
    ...
And functional interface is available:
    use Test::TCP;
    test_tcp(
        client => sub {
            my ($port, $server_pid) = @_;
            # send request to the server
        },
        server => sub {
            my $port = shift;
            # run server
        },
    );

DESCRIPTION

Test::TCP is test utilities for TCP/IP programs.

METHODS

test_tcp
Functional interface.
    test_tcp(
        client => sub {
            my $port = shift;
            # send request to the server
        },
        server => sub {
            my $port = shift;
            # run server
        },
        # optional
        port => 8080,
        max_wait => 3, # seconds
    );
    
wait_port
    wait_port(8080);
    
Waits for a particular port is available for connect.

OO-ish interface

my $server = Test::TCP->new(%args);
Create new instance of Test::TCP.
Arguments are following:
$args{auto_start}: Boolean
Call "$server->start()" after create instance.
Default: true
$args{code}: CodeRef
The callback function. Argument for callback function is: "$code->($pid)".
This parameter is required.
$args{max_wait} : Number
Will wait for at most $max_wait seconds before checking port.
See also Net::EmptyPort.
Default: 10
$server->start()
Start the server process. Normally, you don't need to call this method.
$server->stop()
Stop the server process.
my $pid = $server->pid();
Get the pid of child process.
my $port = $server->port();
Get the port number of child process.

FAQ

How to invoke two servers?
You can call test_tcp() twice!
    test_tcp(
        client => sub {
            my $port1 = shift;
            test_tcp(
                client => sub {
                    my $port2 = shift;
                    # some client code here
                },
                server => sub {
                    my $port2 = shift;
                    # some server2 code here
                },
            );
        },
        server => sub {
            my $port1 = shift;
            # some server1 code here
        },
    );
    
Or use OO-ish interface instead.
    my $server1 = Test::TCP->new(code => sub {
        my $port1 = shift;
        ...
    });
    my $server2 = Test::TCP->new(code => sub {
        my $port2 = shift;
        ...
    });
    # your client code here.
    ...
    
How do you test server program written in other languages like memcached?
You can use "exec()" in child process.
    use strict;
    use warnings;
    use utf8;
    use Test::More;
    use Test::TCP 1.08;
    use File::Which;
    my $bin = scalar which 'memcached';
    plan skip_all => 'memcached binary is not found' unless defined $bin;
    my $memcached = Test::TCP->new(
        code => sub {
            my $port = shift;
            exec $bin, '-p' => $port;
            die "cannot execute $bin: $!";
        },
    );
    use Cache::Memcached;
    my $memd = Cache::Memcached->new({servers => ['127.0.0.1:' . $memcached->port]});
    $memd->set(foo => 'bar');
    is $memd->get('foo'), 'bar';
    done_testing;
    

AUTHOR

Tokuhiro Matsuno <tokuhirom@gmail.com>

THANKS TO

kazuhooku
dragon3
charsbar
Tatsuhiko Miyagawa
lestrrat

SEE ALSO

LICENSE

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
2014-07-01 perl v5.18.2