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

use Test::More;

# BEGIN { use_ok('POE::Component::SNMP::Session') };

use POE;

use lib qw(t);
use TestPCS;

my $CONF = do "config.cache";

if ( $CONF->{skip_all_tests} or not keys %$CONF ) {
    $poe_kernel->run(); # quiets POE::Kernel warning
    plan skip_all => 'No SNMP data specified.';
} else {
    plan tests => 13;
    require POE::Component::SNMP::Session;
}


POE::Session->create
( inline_states =>
  {
    _start      => \&snmp_get_tests,
    _stop       => \&stop_session,
    snmp_get_cb => \&snmp_get_cb,
  },
);

$poe_kernel->run;

ok 1; # clean exit
exit 0;


sub snmp_get_tests {
    my ($kernel, $heap) = @_[KERNEL, HEAP];

    POE::Component::SNMP::Session->create(
                                          alias     => 'snmp',
                                          hostname  => $CONF->{'hostname'},
                                          Community => $CONF->{'community'},
                                          debug     => $CONF->{debug},
                                          # timeout => 5,
                                          Version => 2,
                                          # UseNumeric => 1
                                         );

    my $vars = new SNMP::VarList ( # ['sysUpTime'],
                                  ['ifNumber'], # NON-repeaters
                                  # ['ifSpeed'],
                                  ['ifDescr'],
                                   # ['.1.3.6.1.2.1.1'], # system.*
                                   # ['.1.3.6.1.2.1.1.9'], # system.sysORUpTime
                                   # [ 'sysORUpTime' ],

                                 ); # Repeated variables.

    # $vars = new SNMP::VarList ( ['sysUpTime'], ['ifNumber'], # NON-repeaters
    #                                ['system']); # Repeated variables.

    $kernel->post(
        snmp => 'bulkwalk',
        'snmp_get_cb',
                  # 2, 3,
                  1, 8,
                  $vars

                  # '.1.3.6.1.2.1.1',
    );

    get_sent($heap);
}

# store results for future processing
sub snmp_get_cb {
    my ($kernel, $heap, $aref) = @_[KERNEL, HEAP, ARG1];
    ok get_seen($heap), 'ced axo'; # received request

    ok ref $aref eq 'ARRAY', ref $aref;

    # use YAML; print Dump { axl => $_[ARG0], axo => $_[ARG1]};

    # my $session = shift @$aref;

    my $href = $aref->[0];

    ok ref $href, ref $href;

    ok ref $href eq 'ARRAY', 'data type is sane'; # no error

    # foreach my $k (keys %$href) {
    foreach my $varlist (@$href) {
	ok ref $varlist eq 'SNMP::VarList', ref ($varlist) . ' is SNMP::VarList';
        # if ref $varlist = 'SNMP::VarList'
        for my $var ( @$varlist ) {
            # ok ref $var eq 'SNMP::Varbind', ref ($var) . ' is SNMP::Varbind';
            # varbinds are just array refs

            push @{$heap->{results}{$var->[0]}}, $var->[2]; # got a result
        }
    }

    if (check_done($heap)) {
	$kernel->post( snmp => 'finish' );
	ok check_done($heap);
    }
}

sub stop_session {
   my $r = $_[HEAP]->{results};

   # use YAML; print Dump($r);

   ok 1, "stopped cleanly"; # got here!

   ok exists $r->{ifNumber};
   ok exists $r->{ifDescr};
   ok ref $r->{ifNumber} eq 'ARRAY' &&   $r->{ifNumber}[0]   >  0;
   ok ref $r->{ifDescr}  eq 'ARRAY' && @{$r->{ifDescr}}     ==  $r->{ifNumber}[0];

}