The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -T
use strict;
use Test::More;
use Net::Pcap;
use lib 't';
use Utils;

plan skip_all => "pcap_createsrcstr() is not available" unless is_available('pcap_createsrcstr');
plan tests => 18;

my $has_test_exception = eval "use Test::Exception; 1";

my($src,$r,$err) = ('',0,'');
my($type,$host,$port,$name) = ('rpcap', 'fangorn', 12345, 'eth0');

# Testing error messages
SKIP: {
    skip "Test::Exception not available", 9 unless $has_test_exception;

    # createsrcstr() errors
    throws_ok(sub {
        Net::Pcap::createsrcstr()
    }, '/^Usage: Net::Pcap::createsrcstr\(source, type, host, port, name, err\)/', 
       "calling createsrcstr() with no argument");

    throws_ok(sub {
        Net::Pcap::createsrcstr(0, 0, 0, 0, 0, 0)
    }, '/^arg1 not a reference/', 
       "calling createsrcstr() with incorrect argument type for arg1");

    throws_ok(sub {
        Net::Pcap::createsrcstr(\$src, 0, 0, 0, 0, 0)
    }, '/^arg6 not a hash ref/', 
       "calling createsrcstr() with incorrect argument type for arg6");

    # parsesrcstr() errors
    throws_ok(sub {
        Net::Pcap::parsesrcstr()
    }, '/^Usage: Net::Pcap::parsesrcstr\(source, type, host, port, name, err\)/', 
       "calling parsesrcstr() with no argument");

    throws_ok(sub {
        Net::Pcap::parsesrcstr(0, 0, 0, 0, 0, 0)
    }, '/^arg2 not a reference/', 
       "calling parsesrcstr() with incorrect argument type for arg2");

    throws_ok(sub {
        Net::Pcap::parsesrcstr(0, \$type, 0, 0, 0, 0)
    }, '/^arg3 not a reference/', 
       "calling parsesrcstr() with incorrect argument type for arg3");

    throws_ok(sub {
        Net::Pcap::parsesrcstr(0, \$type, \$host, 0, 0, 0)
    }, '/^arg4 not a reference/', 
       "calling parsesrcstr() with incorrect argument type for arg4");

    throws_ok(sub {
        Net::Pcap::parsesrcstr(0, \$type, \$host, \$port, 0, 0)
    }, '/^arg5 not a reference/', 
       "calling parsesrcstr() with incorrect argument type for arg5");

    throws_ok(sub {
        Net::Pcap::parsesrcstr(0, \$type, \$host, \$port, \$name, 0)
    }, '/^arg6 not a reference/', 
       "calling parsesrcstr() with incorrect argument type for arg6");

}

$r = eval { createsrcstr(\$src, $type, $host, $port, $name, \$err) };
is( $@, '', "createsrcstr() " );
is( $r, 0, " - should return zero: $r" );
is( $src, "$type\://$host\:$port/$name", " - checking created source string" );

my($parsed_type,$parsed_host,$parsed_port,$parsed_name) = ('','','','');
$r = eval { parsesrcstr($src, \$parsed_type, \$parsed_host, \$parsed_port, \$parsed_name, \$err) };
is( $@, '', "parsesrcstr() " );
is( $r, 0, " - should return zero: $r" );
is( $parsed_type, $type, " - checking parsed type" );
is( $parsed_host, $host, " - checking parsed host" );
is( $parsed_port, $port, " - checking parsed port" );
is( $parsed_name, $name, " - checking parsed name" );