The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More tests => 32;

use Rex::Commands::Iptables;

my @iptables_list_1 = (
  "# Generated by iptables-save v1.4.12 on Fri Nov 16 22:20:13 2012",
  "*nat",
  ":PREROUTING ACCEPT [831648:47063372]",
  ":INPUT ACCEPT [71162:4082850]",
  ":OUTPUT ACCEPT [159345:9708626]",
  ":POSTROUTING ACCEPT [263463:17336449]",
  "-A PREROUTING -d 1.2.3.4/32 -p tcp -m tcp --dport 25 -j DNAT --to-destination 4.3.2.1:25",
  "COMMIT",
  "*foo",
  "-A syn_flood -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 25/sec --limit-burst 50 -j RETURN",
);

my $rules = Rex::Commands::Iptables::_iptables_list(@iptables_list_1);

ok( exists $rules->{nat}, "found nat tables" );
is( $rules->{nat}->[0]->[0],  "A",          "first is append" );
is( $rules->{nat}->[0]->[1],  "PREROUTING", "append to prerouting" );
is( $rules->{nat}->[0]->[2],  "d",          "should be destination" );
is( $rules->{nat}->[0]->[3],  "1.2.3.4/32", "to destination 1.2.3.4" );
is( $rules->{nat}->[0]->[4],  "p",          "should be proto" );
is( $rules->{nat}->[0]->[5],  "tcp",        "tcp" );
is( $rules->{nat}->[0]->[6],  "m",          "in module" );
is( $rules->{nat}->[0]->[7],  "tcp",        "tcp" );
is( $rules->{nat}->[0]->[8],  "dport",      "should be destination port" );
is( $rules->{nat}->[0]->[9],  "25",         "dport 25" );
is( $rules->{nat}->[0]->[10], "j",          "jump to" );
is( $rules->{nat}->[0]->[11], "DNAT",       "dnating" );
is( $rules->{nat}->[0]->[12],
  "to-destination", "should be forwarded to destination" );
is( $rules->{nat}->[0]->[13], "4.3.2.1:25", "4.3.2.1:25" );

ok( exists $rules->{foo}, "found foo table" );
is( $rules->{foo}->[0]->[0],  "A",                   "frist is append" );
is( $rules->{foo}->[0]->[1],  "syn_flood",           "append to sys_flood" );
is( $rules->{foo}->[0]->[2],  "p",                   "should use protocol" );
is( $rules->{foo}->[0]->[3],  "tcp",                 "proto tcp" );
is( $rules->{foo}->[0]->[4],  "m",                   "in module" );
is( $rules->{foo}->[0]->[5],  "tcp",                 "tcp module" );
is( $rules->{foo}->[0]->[6],  "tcp-flags",           "should match tcp flags" );
is( $rules->{foo}->[0]->[7],  "FIN,SYN,RST,ACK SYN", "only these flags" );
is( $rules->{foo}->[0]->[8],  "m",                   "should use module" );
is( $rules->{foo}->[0]->[9],  "limit",               "limit module" );
is( $rules->{foo}->[0]->[10], "limit",               "limit the bandwidth" );
is( $rules->{foo}->[0]->[11], "25/sec",              "to 25 req per second" );
is( $rules->{foo}->[0]->[12], "limit-burst",         "use burst" );
is( $rules->{foo}->[0]->[13], "50",                  "up to 50" );
is( $rules->{foo}->[0]->[14], "j",                   "jump to" );
is( $rules->{foo}->[0]->[15], "RETURN",              "RETURN" );