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 &note;
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