summaryrefslogtreecommitdiff
path: root/testing/fulltests/support/NetSNMPTest.pm
diff options
context:
space:
mode:
Diffstat (limited to 'testing/fulltests/support/NetSNMPTest.pm')
-rw-r--r--testing/fulltests/support/NetSNMPTest.pm172
1 files changed, 172 insertions, 0 deletions
diff --git a/testing/fulltests/support/NetSNMPTest.pm b/testing/fulltests/support/NetSNMPTest.pm
new file mode 100644
index 0000000..e4ac040
--- /dev/null
+++ b/testing/fulltests/support/NetSNMPTest.pm
@@ -0,0 +1,172 @@
+package NetSNMPTest;
+
+use File::Temp qw(tempfile tempdir);
+use IO::File;
+use Data::Dumper;
+use strict;
+
+sub new {
+ my $type = shift;
+ my ($class) = ref($type) || $type;
+ my $self = {};
+ %$self = @_;
+ bless($self, $class);
+ $self->init();
+ return $self;
+}
+
+sub init {
+ my ($self) = @_;
+ $self->{'dir'} = tempdir();
+ print "# using tempdir $self->{dir}\n";
+
+ foreach my $suffix (qw(conf pid log out)) {
+ $self->{"snmpd.$suffix"} ||= $self->{'dir'} . "/snmpd.$suffix";
+ }
+ $self->{'snmp.conf'} ||= $self->{'dir'} . "/snmp.conf";
+
+ $self->{'confdir'} ||= $self->{'dir'};
+ $self->{'persistentdir'} ||= $self->{'dir'} . "/persistent";
+}
+
+sub config_file {
+ my ($self, $file, $string) = @_;
+ my $fh = new IO::File (">> $file");
+ $fh->print($string);
+ if ($string !~ /\n$/) {
+ $fh->print("\n");
+ }
+ $fh->close();
+}
+
+sub config_agent {
+ my ($self, $string) = @_;
+ $self->config_file($self->{'snmpd.conf'}, $string);
+}
+
+sub config_app {
+ my ($self, $string) = @_;
+ $self->config_file($self->{'snmp.conf'}, $string);
+}
+
+sub require_feature {
+ my ($self, $feature) = @_;
+ my $srcdir = $ENV{'srcdir'} || "..";
+ my $fh = new IO::File("$srcdir/include/net-snmp/net-snmp-config.h");
+ while (<$fh>) {
+ if (/#define $feature 1/) {
+ $fh->close();
+ return 1;
+ }
+ }
+ print "1..0 # SKIP missing $feature\n";
+ exit;
+}
+
+sub start_agent {
+ my ($self, $flags) = @_;
+
+ $flags ||= $self->{'snmpdflags'};
+
+ $ENV{'SNMPCONFPATH'} = $self->{'confdir'};
+ $ENV{'SNMP_PERSISTENT_DIR'} = $self->{'peristentdir'};
+
+ my $cmd = "snmpd $flags -r -U -p $self->{'snmpd.pid'} -Lf $self->{'snmpd.log'} $self->{'agentaddress'} > $self->{'snmpd.out'} 2>&1";
+ System("$cmd &");
+
+ sleep(1);
+
+ return $self->wait_for($self->{'snmpd.log'}, "NET-SNMP version");
+}
+
+sub stop_agent {
+ my ($self) = @_;
+ my $pidfile = new IO::File "$self->{'snmpd.pid'}";
+ my $pid = <$pidfile>;
+ kill("TERM", $pid);
+ $self->wait_for($self->{'snmpd.log'}, 'shutting down');
+}
+
+# returns 1 on success, 0 on failure
+sub wait_for {
+ my ($self, $filename, $regexp, $maxtime) = @_;
+ my $fh = new IO::File "$filename";
+ return 0 if (!$fh);
+
+ $maxtime = 10 if (!defined($maxtime));
+
+ my $timecount = 0;
+ # print "# reading from: $filename\n";
+ while (1) {
+ my $line = <$fh>;
+ # print "# line: $line\n";
+ if ($line eq "") {
+ if ($timecount == $maxtime) {
+ return 0;
+ }
+ sleep(1);
+ print "# sleeping ...\n";
+ $fh->clearerr();
+ $timecount++;
+ } else {
+ chomp($line);
+ if ($line =~ /$regexp/) {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+sub Debug {
+ print "# " . join(" ",@_);
+}
+
+sub System {
+ my ($cmd) = @_;
+ Debug("running: ", $cmd, "\n");
+ system($cmd);
+}
+
+sub DIE {
+ my $self = shift;
+ $self->stop_agent();
+ die @_;
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+NetSNMPTest - simple testing module for testing perl tests
+
+=head1 USAGE
+
+use NetSNMPTest;
+use Test;
+use SNMP;
+
+my $destination = "udp:localhost:9876";
+
+my $test = new NetSNMPTest(agentaddress => $destination);
+
+$test->require_feature("SOME_IFDEF_FROM_NET_SNMP_CONFIG_H");
+
+$test->config_agent("rocommunity public");
+$test->config_agent("syscontact testvalue");
+$test->DIE("failed to start the agent") if (!$test->start_agent());
+
+my $session = new SNMP::Session(DestHost => $destination,
+ Version => '2c',
+ Community => 'public');
+
+my $value = $session->get('sysContact.0');
+plan(tests => 1);
+ok($value, 'testvalue');
+
+$test->stop_agent();
+
+=cut
+