# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'

#########################

# change 'tests => 1' to 'tests => last_test_to_print';

use Test;
BEGIN { plan tests => 5 };

$^W++;

my %IfCfgCmd = ('freebsd' => '/sbin/ifconfig -a',
                'solaris' => '/sbin/ifconfig -a',
                'openbsd' => '/sbin/ifconfig -A',
                'linux'   => '/sbin/ifconfig -a',
               );

print 'Loading Net::Ifconfig::Wrapper........';

use Net::Ifconfig::Wrapper;

ok(1); # If we made it this far, we're ok.


print 'Geting information about interfaces...';

my $Info = Net::Ifconfig::Wrapper::Ifconfig('list')
	or die $@;

ok(2);

if ($IfCfgCmd{$^O})
	{
	print "\n== '".$IfCfgCmd{$^O}. "' command output ==\n";
	system($IfCfgCmd{$^O});
	print "======================================\n";
	};

print "\n== Net\:\:Ifconfig\:\:Wrapper info output ==\n";
foreach (sort(keys(%{$Info})))
	{ print IfaceInfo($Info, $_); };
print "======================================\n";

print "Is Net\:\:Ifconfig\:\:Wrapper info output correct? Y/N:";

while (<STDIN>)
	{
	$_ =~ m/\A\s*y(es)?\s*\n?\Z/i
		and last;
	$_ =~ m/\A\s*n(o)?\s*\n?\Z/i
		and die "Net\:\:Ifconfig\:\:Wrapper info is incorrect!";
	print "Is Net\:\:Ifconfig\:\:Wrapper info output correct? Y/N:";
	};

print 'Information displayed correctly.......';

ok(3);

print "Please choose the interface for add/remove alias function test\n";

my @Ifaces = ('skip test');

push(@Ifaces, sort(keys(%{$Info})));

my $DefIface = '';

for (my $RI = 0; defined($Ifaces[$RI]); $RI++)
	{
	(($Ifaces[$RI] =~ m/\Alo/i) && !length($DefIface))
		and $DefIface = $RI;
	print "$RI:\t".$Ifaces[$RI]."\n";
	};

print "($DefIface):";

while (<STDIN>)
	{
	if    (($_ =~ m/\A\s*\n?\Z/i) && length($DefIface))
		{ last; }
	elsif (($_ =~ m/\A\s*(\d+)\s*\n?\Z/i) && defined($Ifaces[$1]))
		{
		$DefIface = $1;
		last;
		};
	print "Please choose the interface for add/remove alias function tests\n";
	for (my $RI = 0; defined($Ifaces[$RI]); $RI++)
		{ print "$RI:\t".$Ifaces[$RI]."\n"; };
	print "($DefIface):";
	};

if (!$DefIface)
	{
	print "add/remove alias function tests (4,5) skipped";
	exit 0;
	};

my $Addr = '192.168.192.168';
my $Mask = '255.255.255.0';

print "Please choose address and mask for test alias\n($Addr:$Mask):";

while (<STDIN>)
	{
	$_ =~ m/\A\s*\n?\Z/i
		and last;
	if ($_ =~ m/\A\s*(\d{1,3}(?:\.\d{1,3}){3})\s*\:?\s*(\d{1,3}(?:\.\d{1,3}){3})\s*\n?\Z/i)
		{
		$Addr = $1;
		$Mask = $2;
		last;
		};
	print "Please choose address and mask for test alias\n($Addr:$Mask):";
	};

print "Adding   alias '$Addr:$Mask' to   interface ".$Ifaces[$DefIface]."...";

Net::Ifconfig::Wrapper::Ifconfig('+alias', $Ifaces[$DefIface], $Addr, $Mask)
	or die $@;

$Info = Net::Ifconfig::Wrapper::Ifconfig('list')
	or die $@;

defined($Info->{$Ifaces[$DefIface]}->{'inet'}->{$Addr}) &&
	($Info->{$Ifaces[$DefIface]}->{'inet'}->{$Addr} eq $Mask)
	or die "Can not find recently added address '$Addr:$Mask' on interface ".$Ifaces[$DefIface];

ok(4);

print "Removing alias '$Addr:$Mask' from interface ".$Ifaces[$DefIface]."...";

Net::Ifconfig::Wrapper::Ifconfig('-alias', $Ifaces[$DefIface], $Addr, '')
	or die $@;

$Info = Net::Ifconfig::Wrapper::Ifconfig('list')
	or die $@;

defined($Info->{$Ifaces[$DefIface]}->{'inet'}->{$Addr})
	and die "Can not remove recently added address '$Addr:$Mask' from interface ".$Ifaces[$DefIface];

ok(5);

exit 0;

sub IfaceInfo
	{
	my ($Info, $Iface) = @_;

	my $Res = "$Iface:\t".($Info->{$Iface}->{'status'} ? 'UP' : 'DOWN')."\n";

	while (my ($Addr, $Mask) = each(%{$Info->{$Iface}->{'inet'}}))
		{ $Res .= sprintf("\tinet %-15s mask $Mask\n", $Addr); };
	
	$Info->{$Iface}->{'ether'}
		and $Res .= "\tether ".$Info->{$Iface}->{'ether'}."\n";

	$Info->{$Iface}->{'descr'}
		and $Res .= "\tdescr '".$Info->{$Iface}->{'descr'}."'\n";
	
	return $Res;
	};