The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use IPTables::IPv4;

BEGIN { $| = 1; print "1..45\n"; }
$testiter = 1;

my $table = IPTables::IPv4::init('filter');
unless ($table) {
	print "not ok 1\n";
	exit(1);
}
print "ok ", $testiter++, "\n";

$table->create_chain("foo") || print "# $!\nnot ";
print "ok ", $testiter++, "\n";
$table->create_chain("foo") && print "not ";
print "ok ", $testiter++, "\n";

$table->delete_chain("foo") || print "# $!\nnot ";
print "ok ", $testiter++, "\n";
$table->delete_chain("foo") && print "not ";
print "ok ", $testiter++, "\n";

my @builtins = (qw/INPUT FORWARD OUTPUT DROP ACCEPT RETURN QUEUE/);

foreach my $builtin (@builtins) {
	$table->delete_chain($builtin) && print "not ";
	print "ok ", $testiter++, "\n";
}

foreach my $builtin (@builtins) {
	$table->create_chain($builtin) && print "not ";
	print "ok ", $testiter++, "\n";
}

$table->create_chain("foo") || print "# $!\nnot ";
print "ok ", $testiter++, "\n";
$table->append_entry("foo", {}) || print "# $!\nnot ";
print "ok ", $testiter++, "\n";
$table->delete_chain("foo") && print "not ";
print "ok ", $testiter++, "\n";
$table->delete_entry("foo", {}) || print "# $!\nnot ";
print "ok ", $testiter++, "\n";
$table->append_entry("foo", {}) || print "# $!\nnot ";
print "ok ", $testiter++, "\n";
$table->delete_num_entry("foo", 0) || print "# $!\nnot ";
print "ok ", $testiter++, "\n";
$table->delete_chain("foo") || print "# $!\nnot ";
print "ok ", $testiter++, "\n";

$table->create_chain("foo") || print "# $!\nnot ";
print "ok ", $testiter++, "\n";
$table->create_chain("foo2") || print "# $!\nnot ";
print "ok ", $testiter++, "\n";
$table->append_entry("foo", {jump => "foo2"}) || print "# $!\nnot ";
print "ok ", $testiter++, "\n";
$table->delete_chain("foo2") && print "not ";
print "ok ", $testiter++, "\n";
$table->append_entry("foo2", {}) || print "# $!\nnot ";
print "ok ", $testiter++, "\n";
$table->delete_chain("foo2") && print "not ";
print "ok ", $testiter++, "\n";
$table->delete_num_entry("foo", 0) || print "# $!\nnot ";
print "ok ", $testiter++, "\n";
$table->delete_chain("foo2") && print "not ";
print "ok ", $testiter++, "\n";
$table->delete_num_entry("foo2", 0) || print "# $!\nnot ";
print "ok ", $testiter++, "\n";
$table->delete_chain("foo2") || print "# $!\nnot ";
print "ok ", $testiter++, "\n";

$table->create_chain("foo2") || print "# $!\nnot ";
print "ok ", $testiter++, "\n";

my $rv = 1;
foreach my $chain ($table->list_chains()) {
	unless ($table->builtin($chain)) {
		($rv = 0) unless $table->delete_chain($chain);
	}
}

print(($rv ? "" : "# $!\nnot "), "ok ", $testiter++, "\n");

$table->create_chain("foo") || print "# $!\nnot ";
print "ok ", $testiter++, "\n";
$table->create_chain("foo2") || print "# $!\nnot ";
print "ok ", $testiter++, "\n";

$rv = 1;
foreach my $chain ($table->list_chains()) {
	($rv = 0) unless $table->flush_entries($chain);
}
print(($rv ? "" : "# $!\nnot "), "ok ", $testiter++, "\n");

$rv = 1;
foreach my $chain ($table->list_chains()) {
	unless ($table->builtin($chain)) {
		($rv = 0) unless $table->delete_chain($chain);
	}
}
print(($rv ? "" : "# $!\nnot "), "ok ", $testiter++, "\n");

$table->append_entry("FORWARD", {jump => "QUEUE"}) || print "# $!\nnot ";
print "ok ", $testiter++, "\n";

my @rules = $table->list_rules("FORWARD");
if (scalar(@rules) != 1) {
	print "# $!\nnot ";
}
print "ok ", $testiter++, "\n";

my @keylist = keys(%{$rules[0]});
if(scalar(@keylist) != 3 || $rules[0]->{'jump'} ne "QUEUE") {
	print "# $!\nnot ";
}
print "ok ", $testiter++, "\n";

foreach my $chain ($table->list_chains()) {
	$table->flush_entries($chain);
}

foreach my $chain ($table->list_chains()) {
	unless ($table->builtin($chain)) {
		$table->delete_chain($chain);
	}
}

exit(0);
# vim: ts=4