1#!perl -T 2use strict; 3use File::Spec; 4use Test::More; 5use Net::Pcap; 6use lib 't'; 7use Utils; 8 9my(%name2val,%val2name,%val2descr); 10plan skip_all => "extended datalink related functions are not available" 11 unless is_available('pcap_datalink_name_to_val'); 12 13%name2val = ( 14 undef => -1, 15 LTalk => DLT_LTALK, 16 raw => DLT_RAW, 17 PPP_serial => DLT_PPP_SERIAL, 18 SLIP => DLT_SLIP, 19 ieee802_11 => DLT_IEEE802_11, 20); 21%val2name = ( 22 0 => 'NULL', 23 DLT_LTALK() => 'LTALK', 24 DLT_RAW() => 'RAW', 25 DLT_PPP_SERIAL() => 'PPP_SERIAL', 26 DLT_SLIP() => 'SLIP', 27 DLT_IEEE802_11() => 'IEEE802_11', 28); 29%val2descr = ( 30 0 => 'BSD loopback', 31 DLT_NULL() => 'BSD loopback', 32 DLT_LTALK() => 'Localtalk', 33 DLT_RAW() => 'Raw IP', 34 DLT_PPP_SERIAL() => 'PPP over serial', 35 DLT_SLIP() => 'SLIP', 36 DLT_IEEE802_11() => '802.11', 37); 38 39plan tests => keys(%name2val) * 2 + keys(%val2name) * 2 + keys(%val2descr) * 2 + 23; 40 41my $has_test_exception = eval "use Test::Exception; 1"; 42 43my($dev,$pcap,$datalink,$r,$err) = ('','','','',''); 44 45# Testing error messages 46SKIP: { 47 skip "Test::Exception not available", 7 unless $has_test_exception; 48 49 # datalink() errors 50 throws_ok(sub { 51 Net::Pcap::datalink() 52 }, '/^Usage: Net::Pcap::datalink\(p\)/', 53 "calling datalink() with no argument"); 54 55 throws_ok(sub { 56 Net::Pcap::datalink(0) 57 }, '/^p is not of type pcap_tPtr/', 58 "calling datalink() with incorrect argument type"); 59 60 # set_datalink() errors 61 throws_ok(sub { 62 Net::Pcap::set_datalink() 63 }, '/^Usage: Net::Pcap::set_datalink\(p, linktype\)/', 64 "calling set_datalink() with no argument"); 65 66 throws_ok(sub { 67 Net::Pcap::set_datalink(0, 0) 68 }, '/^p is not of type pcap_tPtr/', 69 "calling set_datalink() with incorrect argument type"); 70 71 # datalink_name_to_val() errors 72 throws_ok(sub { 73 Net::Pcap::datalink_name_to_val() 74 }, '/^Usage: Net::Pcap::datalink_name_to_val\(name\)/', 75 "calling datalink_name_to_val() with no argument"); 76 77 # datalink_val_to_name() errors 78 throws_ok(sub { 79 Net::Pcap::datalink_val_to_name() 80 }, '/^Usage: Net::Pcap::datalink_val_to_name\(linktype\)/', 81 "calling datalink_val_to_name() with no argument"); 82 83 # datalink_val_to_descr() errors 84 throws_ok(sub { 85 Net::Pcap::datalink_val_to_description() 86 }, '/^Usage: Net::Pcap::datalink_val_to_description\(linktype\)/', 87 "calling datalink_val_to_description() with no argument"); 88 89} 90 91SKIP: { 92 skip "must be run as root", 5 unless is_allowed_to_use_pcap(); 93 skip "no network device available", 5 unless find_network_device(); 94 95 # Find a device and open it 96 $dev = find_network_device(); 97 $pcap = Net::Pcap::open_live($dev, 1024, 1, 100, \$err); 98 isa_ok( $pcap, 'pcap_tPtr', "\$pcap" ); 99 100 # Testing datalink() 101 $datalink = ''; 102 eval { $datalink = Net::Pcap::datalink($pcap) }; 103 is( $@, '', "datalink() on a live connection" ); 104 like( $datalink , '/^\d+$/', " - datalink is an integer" ); 105 106 # Testing set_datalink() 107 eval { $r = Net::Pcap::set_datalink($pcap, DLT_LTALK) }; # Apple LocalTalk 108 is( $@, '', "set_datalink() on a live connection" ); 109 is( $r , -1, " - returned -1 (expected failure)" ); 110 111 Net::Pcap::close($pcap); 112} 113 114# Open a sample save file 115$pcap = Net::Pcap::open_offline(File::Spec->catfile(qw(t samples ping-ietf-20pk-be.dmp)), \$err); 116isa_ok( $pcap, 'pcap_tPtr', "\$pcap" ); 117 118# Testing datalink() 119$datalink = ''; 120eval { $datalink = Net::Pcap::datalink($pcap) }; 121is( $@, '', "datalink() on a save file" ); 122like( $datalink , '/^\d+$/', " - datalink is an integer" ); 123is( $datalink , DLT_EN10MB, " - datalink is DLT_EN10MB (Ethernet)" ); 124 125# Testing set_datalink() 126eval { $r = Net::Pcap::set_datalink($pcap, DLT_LTALK) }; # Apple LocalTalk 127is( $@, '', "set_datalink() on a save file" ); 128is( $r , -1, " - returned -1 (expected failure)" ); 129 130Net::Pcap::close($pcap); 131 132 133# Open a dead pcap descriptor 134$pcap = Net::Pcap::open_dead(DLT_IP_OVER_FC, 1024); 135isa_ok( $pcap, 'pcap_tPtr', "\$pcap" ); 136 137# Testing datalink() 138$datalink = ''; 139eval { $datalink = Net::Pcap::datalink($pcap) }; 140is( $@, '', "datalink() on a dead descriptor" ); 141is( $datalink , DLT_IP_OVER_FC, " - datalink is an integer" ); 142 143# Testing set_datalink() 144# the migration of the century: from IP-over-Fibre Channel to Apple LocalTalk! 145eval { $r = Net::Pcap::set_datalink($pcap, DLT_LTALK) }; 146is( $@, '', "set_datalink() on a dead descriptor" ); 147is( $r , -1, " - returned -1 (expected failure)" ); 148# The following tests don't work, but maybe they're just incorrect. 149#isnt( $r , -1, " - should not returned -1" ); 150#$datalink = Net::Pcap::datalink($pcap); 151#is( $datalink, DLT_LTALK, " - new link type was correctly stored" ); 152 153 154# Testing datalink_name_to_val() 155for my $name (keys %name2val) { 156 $datalink = ''; 157 eval { $datalink = Net::Pcap::datalink_name_to_val($name) }; 158 is( $@, '', "datalink_name_to_val($name)" ); 159 is( $datalink, $name2val{$name}, " - checking expected value" ); 160} 161 162# Testing datalink_val_to_name() 163for my $val (keys %val2name) { 164 my $name = ''; 165 eval { $name = Net::Pcap::datalink_val_to_name($val) }; 166 is( $@, '', "datalink_val_to_name($val)" ); 167 is( $name, $val2name{$val}, " - checking expected value" ); 168} 169 170# Testing datalink_val_to_description() 171for my $val (keys %val2descr) { 172 my $descr = ''; 173 eval { $descr = Net::Pcap::datalink_val_to_description($val) }; 174 is( $@, '', "datalink_val_to_description($val)" ); 175 is( $descr, $val2descr{$val}, " - checking expected value" ); 176} 177 178