1#!perl -Tw 2use strict; 3use Test::More; 4use Net::Pcap; 5use lib 't'; 6use Utils; 7 8 9BEGIN { 10 *note = sub { print "# @_\n" } unless defined ¬e; 11} 12 13# first check that AnyEvent is available 14plan skip_all => "AnyEvent is not available" unless eval "use AnyEvent; 1"; 15 16# then check that AnyEvent::Pcap is available 17eval "use AnyEvent::Pcap"; 18my $error = $@; 19plan skip_all => "AnyEvent::Pcap is not available" 20 if $error =~ /^Can't locate/; 21 22plan tests => 18; 23is $error, "", "use AnyEvent::Pcap"; 24 25my $dev = find_network_device(); 26 27SKIP: { 28 skip "must be run as root", 17 unless is_allowed_to_use_pcap(); 29 skip "no network device available", 17 unless $dev; 30 31 my $ae_pcap; 32 my $cv = AnyEvent->condvar; 33 34 note "\$ae_pcap = AnyEvent::Pcap->new(device => $dev, ...)"; 35 $ae_pcap = AnyEvent::Pcap->new( 36 device => $dev, 37 packet_handler => sub { 38 process_packet(@_); 39 $cv->send; 40 }, 41 ); 42 43 note '$ae_pcap->run'; 44 $ae_pcap->run; 45 46 note '$cv->recv'; 47 $cv->recv; 48} 49 50sub process_packet { 51 note "> process_packet"; 52 my ($header, $packet) = @_; 53 54 ok( defined $header, " - header is defined" ); 55 isa_ok( $header, 'HASH', " - header" ); 56 57 for my $field (qw(len caplen tv_sec tv_usec)) { 58 ok( exists $header->{$field}, " - field '$field' is present" ); 59 ok( defined $header->{$field}, " - field '$field' is defined" ); 60 like( $header->{$field}, '/^\d+$/', " - field '$field' is a number" ); 61 } 62 63 ok( $header->{caplen} <= $header->{len}, 64 " - coherency check: packet length (caplen <= len)" ); 65 66 ok( defined $packet, " - packet is defined" ); 67 is( length $packet, $header->{caplen}, " - packet has the advertised size" ); 68} 69 70