summaryrefslogtreecommitdiffstats
path: root/plugins-scripts/t
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 11:48:22 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 11:48:22 +0000
commit7373ce3d6988706388f136e1c06afd20a3e8d5be (patch)
treee9ae5af7d102667e5706187646db45de8238e8c4 /plugins-scripts/t
parentInitial commit. (diff)
downloadmonitoring-plugins-7373ce3d6988706388f136e1c06afd20a3e8d5be.tar.xz
monitoring-plugins-7373ce3d6988706388f136e1c06afd20a3e8d5be.zip
Adding upstream version 2.3.5.upstream/2.3.5upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'plugins-scripts/t')
-rw-r--r--plugins-scripts/t/check_disk_smb.t96
-rw-r--r--plugins-scripts/t/check_file_age.t109
-rw-r--r--plugins-scripts/t/check_ifoperstatus.t93
-rw-r--r--plugins-scripts/t/check_ifstatus.t67
-rw-r--r--plugins-scripts/t/check_log.t82
-rw-r--r--plugins-scripts/t/check_rpc.t21
-rw-r--r--plugins-scripts/t/check_uptime.t135
-rw-r--r--plugins-scripts/t/utils.t51
8 files changed, 654 insertions, 0 deletions
diff --git a/plugins-scripts/t/check_disk_smb.t b/plugins-scripts/t/check_disk_smb.t
new file mode 100644
index 0000000..c2e8bbb
--- /dev/null
+++ b/plugins-scripts/t/check_disk_smb.t
@@ -0,0 +1,96 @@
+#! /usr/bin/perl -w -I ..
+#
+# test cases for check_disk_smb
+#
+
+use strict;
+use Test::More;
+use NPTest;
+
+my $tests = 14;
+plan tests => $tests;
+my $res;
+
+my $plugin = "check_disk_smb";
+SKIP: {
+ skip "$plugin is not created", $tests if ( ! -x $plugin );
+ my $auth = "";
+
+ my $host = getTestParameter("NP_HOST_SMB", "A host providing an SMB Service",
+ "localhost");
+
+ my $smb_share = getTestParameter("NP_SMB_SHARE",
+ "An SMB share name the host provides",
+ "public");
+
+ my $smb_share_spc = getTestParameter("NP_SMB_SHARE_SPC",
+ "An SMB share name containing one or more spaces the host provides",
+ "pub lic");
+
+ my $smb_share_deny = getTestParameter("NP_SMB_SHARE_DENY",
+ "An access denying SMB share name the host provides",
+ "private");
+
+ my $host_nonresponsive = getTestParameter( "NP_HOST_NONRESPONSIVE",
+ "The hostname of system not responsive to network requests", "10.0.0.1" );
+
+ my $hostname_invalid = getTestParameter( "NP_HOSTNAME_INVALID",
+ "An invalid (not known to DNS) hostname",
+ "nosuchhost" );
+ my $user = getTestParameter( "NP_SMB_VALID_USER", "A valid smb user", "" );
+ my $pass = getTestParameter( "NP_SMB_VALID_USER_PASS", "A valid password for valid smb user", "" );
+ $auth .= "-u $user " if ($user);
+ $auth .= "-p $pass " if ($pass);
+
+
+
+ $res = NPTest->testCmd( "./$plugin" );
+ is( $res->return_code, 3, "No arguments" );
+
+ $res = NPTest->testCmd( "./$plugin -H fakehostname" );
+ is( $res->return_code, 3, "No share specified" );
+
+ $res = NPTest->testCmd( "./$plugin -H fakehostname -s share -w 100G -c 101G" );
+ is( $res->return_code, 3, "warn is less than critical" );
+
+ SKIP: {
+ skip "no smb host defined", 10 if ( ! $host );
+
+ SKIP: {
+ skip "no share name defined", 2 if ( ! $smb_share );
+ $res = NPTest->testCmd( "./$plugin -H $host $auth -s $smb_share -w 2k -c 1k" );
+ cmp_ok( $res->return_code, '==', 0, "Exit OK if $smb_share has > 1k free space");
+ like($res->output, '/free/i', "String contains the word 'free'");
+
+ $res = NPTest->testCmd( "./$plugin -H $host $auth -s $smb_share -w 10001G -c 10000G" );
+ cmp_ok( $res->return_code, '==', 2, "Exit CRIT if $smb_share has < 10000G free space");
+ like($res->output, '/free/i', "String contains the word 'free'");
+
+ $res = NPTest->testCmd( "./$plugin -H $host $auth -s $smb_share -w 10000G -c 1k" );
+ cmp_ok( $res->return_code, '==', 1, "Exit WARN if $smb_share has > 10000G and <1k free space");
+ like($res->output, '/free/i', "String contains the word 'free'");
+ }
+
+ SKIP: {
+ skip "no share name containing spaces defined", 2 if ( ! $smb_share_spc );
+ $res = NPTest->testCmd( "./$plugin -H $host $auth -s '$smb_share_spc' -w 2k -c 1k" );
+ cmp_ok( $res->return_code, '==', 0, "Exit OK if '$smb_share_spc' has > 1k free space");
+ like($res->output, '/free/i', "String contains the word 'free'");
+
+ }
+ SKIP: {
+ skip "no share name without permissions ", 2 if ( ! $smb_share_deny );
+ $res = NPTest->testCmd( "./$plugin -H $host $auth -s $smb_share_deny -w 2k -c 1k" );
+ cmp_ok( $res->return_code, '==', 2, "Exit CRIT if $smb_share_deny has > 1k free space");
+ unlike($res->output, '/free/i', "String does not contain the word 'free'");
+
+ }
+ }
+
+ SKIP: {
+ skip "no non responsive host defined", 1 if ( ! $host_nonresponsive );
+ $res = NPTest->testCmd( "./$plugin -H $host_nonresponsive -s np_foobar ");
+ cmp_ok( $res->return_code, '>=', 2, "Exit CRITICAL/UNKNOWN with non responsive host" );
+ }
+
+}
diff --git a/plugins-scripts/t/check_file_age.t b/plugins-scripts/t/check_file_age.t
new file mode 100644
index 0000000..8b87670
--- /dev/null
+++ b/plugins-scripts/t/check_file_age.t
@@ -0,0 +1,109 @@
+#!/usr/bin/perl -w -I ..
+#
+# check_file_age tests
+#
+#
+
+use strict;
+use Test::More tests => 27;
+use NPTest;
+
+my $successOutput = '/^FILE_AGE OK: /';
+my $warningOutput = '/^FILE_AGE WARNING: /';
+my $criticalOutput = '/^FILE_AGE CRITICAL: /';
+my $unknownOutput = '/^FILE_AGE UNKNOWN: /';
+my $performanceOutput = '/ \| age=[0-9]+s;[0-9:]+;[0-9:]+ size=[0-9]+B;[0-9:]+;[0-9:]+;0$/';
+
+my $result;
+my $temp_file = "/tmp/check_file_age.tmp";
+my $temp_link = "/tmp/check_file_age.link.tmp";
+
+unlink $temp_file, $temp_link;
+
+$result = NPTest->testCmd("./check_file_age");
+cmp_ok( $result->return_code, '==', 3, "Missing parameters" );
+like ( $result->output, $unknownOutput, "Output for unknown correct" );
+
+$result = NPTest->testCmd("./check_file_age -f $temp_file");
+cmp_ok( $result->return_code, '==', 2, "File not exists" );
+like ( $result->output, $criticalOutput, "Output for file missing correct" );
+
+write_chars(100);
+$result = NPTest->testCmd("./check_file_age -f $temp_file");
+cmp_ok( $result->return_code, '==', 0, "File is new enough" );
+like ( $result->output, $successOutput, "Output for success correct" );
+
+sleep 2;
+
+$result = NPTest->testCmd("./check_file_age -f $temp_file -w 1");
+cmp_ok( $result->return_code, '==', 1, "Warning for file over 1 second old" );
+like ( $result->output, $warningOutput, "Output for warning correct" );
+
+$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1");
+cmp_ok( $result->return_code, '==', 2, "Critical for file over 1 second old" );
+like ( $result->output, $criticalOutput, "Output for critical correct" );
+
+$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -W 100");
+cmp_ok( $result->return_code, '==', 0, "Checking file size" );
+
+$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -W 100");
+like( $result->output, $performanceOutput, "Checking for performance Output" );
+
+$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -W 100");
+like( $result->output, $performanceOutput, "Checking for performance Output from range" );
+
+$result = NPTest->testCmd("./check_file_age -f /non/existent --ignore-missing");
+cmp_ok( $result->return_code, '==', 0, "Honours --ignore-missing" );
+
+$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -W 101");
+cmp_ok( $result->return_code, '==', 1, "One byte too short" );
+
+$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -C 101");
+cmp_ok( $result->return_code, '==', 2, "One byte too short - critical" );
+
+SKIP: {
+ eval 'use Monitoring::Plugin::Range';
+ skip "Monitoring::Plugin::Range module require", 9 if $@;
+
+ $result = NPTest->testCmd("./check_file_age -f $temp_file -w 0:1");
+ cmp_ok( $result->return_code, '==', 1, "Warning for file over 1 second old by range" );
+ like ( $result->output, $warningOutput, "Output for warning by range correct" );
+
+ $result = NPTest->testCmd("./check_file_age -f $temp_file -c 0:1");
+ cmp_ok( $result->return_code, '==', 2, "Critical for file over 1 second old by range" );
+ like ( $result->output, $criticalOutput, "Output for critical by range correct" );
+
+ $result = NPTest->testCmd("./check_file_age -f $temp_file -c 0:1000 -W 0:100");
+ cmp_ok( $result->return_code, '==', 0, "Checking file size by range" );
+
+ $result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -W 101:");
+ cmp_ok( $result->return_code, '==', 1, "One byte too short by range" );
+
+ $result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -W 0:99");
+ cmp_ok( $result->return_code, '==', 1, "One byte too long by range" );
+
+ $result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -C 101:");
+ cmp_ok( $result->return_code, '==', 2, "One byte too short by range - critical" );
+
+ $result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -C 0:99");
+ cmp_ok( $result->return_code, '==', 2, "One byte too long by range - critical" );
+};
+
+symlink $temp_file, $temp_link or die "Cannot create symlink";
+$result = NPTest->testCmd("./check_file_age -f $temp_link -c 10");
+cmp_ok( $result->return_code, '==', 0, "Works for symlinks" );
+unlink $temp_link;
+
+unlink $temp_file;
+mkdir $temp_file or die "Cannot create directory";
+$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1");
+cmp_ok( $result->return_code, '==', 0, "Works for directories" );
+rmdir $temp_file;
+
+
+sub write_chars {
+ my $size = shift;
+ open F, "> $temp_file" or die "Cannot write to $temp_file";
+ print F "A" x $size;
+ close F;
+}
diff --git a/plugins-scripts/t/check_ifoperstatus.t b/plugins-scripts/t/check_ifoperstatus.t
new file mode 100644
index 0000000..2feb364
--- /dev/null
+++ b/plugins-scripts/t/check_ifoperstatus.t
@@ -0,0 +1,93 @@
+#! /usr/bin/perl -w -I ..
+#
+# SNMP Test via check_ifoperstatus
+#
+#
+
+use strict;
+use Test::More;
+use NPTest;
+
+my $tests = 15;
+plan tests => $tests;
+my $res;
+
+my $plugin = "check_ifoperstatus";
+SKIP: {
+ skip "$plugin is not created", $tests if ( ! -x $plugin );
+
+ my $host_snmp = getTestParameter( "NP_HOST_SNMP", "A host providing an SNMP Service", "localhost");
+
+ my $snmp_community = getTestParameter( "NP_SNMP_COMMUNITY",
+ "The SNMP Community string for SNMP Testing",
+ "public");
+
+ my ($snmp_interface, $snmp_ifxtable);
+ if ($host_snmp) {
+ $snmp_interface = getTestParameter( "NP_SNMP_INTERFACE", "Name of an active network interface on SNMP server", "lo" );
+
+ $snmp_ifxtable = getTestParameter( "NP_SNMP_IFXTABLE",
+ "Is IFXTABLE activated in SNMP server (1: yes, 0: no)? snmpwalk -v1 -c $snmp_community $host_snmp ifxtable",
+ "1" );
+ }
+
+ my $host_nonresponsive = getTestParameter( "NP_HOST_NONRESPONSIVE",
+ "The hostname of system not responsive to network requests", "10.0.0.1" );
+
+ my $hostname_invalid = getTestParameter( "NP_HOSTNAME_INVALID",
+ "An invalid (not known to DNS) hostname",
+ "nosuchhost" );
+
+
+
+ $res = NPTest->testCmd( "./$plugin" );
+ is( $res->return_code, 3, "No arguments" );
+ like( $res->output, '/usage/', "Output contains usage" );
+
+ $res = NPTest->testCmd( "./$plugin -H fakehostname" );
+ is( $res->return_code, 3, "No key/descr specified" );
+ like( $res->output, '/Either a valid snmp key/', "Output contains 'Either a valid snmp key'" );
+
+ $res = NPTest->testCmd( "./$plugin -H fakehost -k 1 -v 3 --seclevel rubbish --secname foobar" );
+ is( $res->return_code, 3, "invalid seclevel" );
+ like( $res->output, "/Must define a valid security level/", "Output contains 'Must define a valid security level'" );
+
+ SKIP: {
+ skip "no snmp host defined", 6 if ( ! $host_snmp );
+
+ $res = NPTest->testCmd( "./$plugin -H $host_snmp -C $snmp_community -k 1");
+ cmp_ok( $res->return_code, '==', 0, "Exit OK for ifindex 1" );
+ like($res->output, '/^OK.*Interface.*is up/', "String contains OK Interface is up");
+
+ SKIP: {
+ skip "no snmp interface defined", 2 if ( ! $snmp_interface );
+ $res = NPTest->testCmd( "./$plugin -H $host_snmp -C $snmp_community -d $snmp_interface");
+ cmp_ok( $res->return_code, '==', 0, "Exit OK for ifdescr $snmp_interface" );
+ like($res->output, '/^OK.*Interface.*is up/', "String contains OK Interface is up");
+ }
+
+ SKIP: {
+ skip "ifxtable not available", 2 if ( ! $snmp_ifxtable );
+ $res = NPTest->testCmd( "./$plugin -H $host_snmp -C $snmp_community -k 1 -n rubbish");
+ cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN if interface name doesn't match" );
+ like($res->output, '/doesn\'t match snmp value/', "String contains 'doesn't match snmp value'");
+ }
+
+ }
+
+ # These checks need a complete command line. An invalid community is used so
+ # the tests can run on hosts w/o snmp host/community in NPTest.cache. Execution will fail anyway
+ SKIP: {
+ skip "no non responsive host defined", 1 if ( ! $host_nonresponsive );
+ $res = NPTest->testCmd( "./$plugin -H $host_nonresponsive -C np_foobar -k 1");
+ cmp_ok( $res->return_code, '==', 1, "Exit WARNING with non responsive host" );
+ }
+
+ SKIP: {
+ skip "no invalid host defined", 2 if ( ! $hostname_invalid );
+ $res = NPTest->testCmd( "./$plugin -H $hostname_invalid -C np_foobar -k 1");
+ cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with invalid host" );
+ like($res->output, "/Unable to resolve.*$hostname_invalid/", "String matches unable to resolve.*$hostname_invalid");
+ }
+
+}
diff --git a/plugins-scripts/t/check_ifstatus.t b/plugins-scripts/t/check_ifstatus.t
new file mode 100644
index 0000000..7d0220a
--- /dev/null
+++ b/plugins-scripts/t/check_ifstatus.t
@@ -0,0 +1,67 @@
+#! /usr/bin/perl -w -I ..
+#
+# SNMP Test via check_ifoperstatus
+#
+#
+
+use strict;
+use Test::More;
+use NPTest;
+
+my $tests = 9;
+plan tests => $tests;
+my $res;
+
+my $plugin = "check_ifstatus";
+SKIP: {
+ skip "$plugin is not created", $tests if ( ! -x $plugin );
+
+ my $host_snmp = getTestParameter( "NP_HOST_SNMP", "A host providing an SNMP Service", "localhost");
+
+ my $snmp_community = getTestParameter( "NP_SNMP_COMMUNITY",
+ "The SNMP Community string for SNMP Testing",
+ "public");
+
+ my $host_nonresponsive = getTestParameter( "NP_HOST_NONRESPONSIVE",
+ "The hostname of system not responsive to network requests", "10.0.0.1" );
+
+ my $hostname_invalid = getTestParameter( "NP_HOSTNAME_INVALID",
+ "An invalid (not known to DNS) hostname",
+ "nosuchhost" );
+
+
+ $res = NPTest->testCmd( "./$plugin" );
+ is( $res->return_code, 3, "No arguments" );
+ like( $res->output, '/usage/', "Output contains usage" );
+
+ $res = NPTest->testCmd( "./$plugin -H fakehost -v 3 --seclevel rubbish --secname foobar" );
+ is( $res->return_code, 3, "invalid seclevel" );
+ like( $res->output, "/Must define a valid security level/", "Output contains 'Must define a valid security level'" );
+
+ SKIP: {
+ skip "no snmp host defined", 2 if ( ! $host_snmp );
+
+ $res = NPTest->testCmd( "./$plugin -H $host_snmp -C $snmp_community ");
+ like($res->output, '/^.*host.*interfaces up/', "String contains host.*interfaces up");
+
+ $res = NPTest->testCmd( "./$plugin -H $host_snmp -C rubbish");
+ cmp_ok( $res->return_code, '==', 2, "Exit CRITICAL for community 'rubbish'" );
+
+ }
+
+ # These checks need a complete command line. An invalid community is used so
+ # the tests can run on hosts w/o snmp host/community in NPTest.cache. Execution will fail anyway
+ SKIP: {
+ skip "no non responsive host defined", 1 if ( ! $host_nonresponsive );
+ $res = NPTest->testCmd( "./$plugin -H $host_nonresponsive -C np_foobar");
+ cmp_ok( $res->return_code, '==', 2, "Exit CRITICAL with non responsive host" );
+ }
+
+ SKIP: {
+ skip "no invalid host defined", 2 if ( ! $hostname_invalid );
+ $res = NPTest->testCmd( "./$plugin -H $hostname_invalid -C np_foobar");
+ cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with invalid host" );
+ like($res->output, "/Unable to resolve.*$hostname_invalid/", "String matches unable to resolve.*$hostname_invalid");
+ }
+
+}
diff --git a/plugins-scripts/t/check_log.t b/plugins-scripts/t/check_log.t
new file mode 100644
index 0000000..b66e0fd
--- /dev/null
+++ b/plugins-scripts/t/check_log.t
@@ -0,0 +1,82 @@
+#!/usr/bin/perl -w -I ..
+#
+# check_log tests
+#
+#
+
+use strict;
+use Test::More;
+use NPTest;
+
+my $tests = 18;
+plan tests => $tests;
+
+my $firstTimeOutput ='/^Log check data initialized/';
+my $okOutput = '/^Log check ok - 0 pattern matches found/';
+my $criticalOutput = '/^\(\d+\) < /';
+my $multilineOutput = '/\(3\) <.*\n.*\n.*$/';
+my $unknownOutput = '/^Usage: /';
+my $unknownArgOutput = '/^Unknown argument: /';
+my $bothRegexOutput = '/^Can not use extended and perl regex/';
+
+my $result;
+my $temp_file = "/tmp/check_log.tmp";
+my $oldlog = "/tmp/oldlog.tmp";
+
+open(FH, '>', $temp_file) or die $!;
+close(FH);
+
+$result = NPTest->testCmd("./check_log");
+cmp_ok( $result->return_code, '==', 3, "Missing parameters" );
+like ( $result->output, $unknownOutput, "Output for unknown correct" );
+
+$result = NPTest->testCmd("./check_log -f");
+cmp_ok( $result->return_code, '==', 3, "Wrong parameters" );
+like ( $result->output, $unknownArgOutput, "Output for unknown correct" );
+
+$result = NPTest->testCmd("./check_log -F ".$temp_file." -O ".$oldlog." -q 'Simple match' -e -p");
+cmp_ok( $result->return_code, '==', 3, "Both regex parameters" );
+like ( $result->output, $bothRegexOutput, "Output for unknown correct" );
+
+$result = NPTest->testCmd("./check_log -F ".$temp_file." -O ".$oldlog." -q 'Simple match'");
+cmp_ok( $result->return_code, '==', 0, "First time executing" );
+like ( $result->output, $firstTimeOutput, "Output for first time executing correct" );
+
+open(FH, '>>', $temp_file) or die $!;
+print FH "This is some text, that should not match\n";
+close(FH);
+
+$result = NPTest->testCmd("./check_log -F ".$temp_file." -O ".$oldlog." -q 'No match'");
+cmp_ok( $result->return_code, '==', 0, "No match" );
+like ( $result->output, $okOutput, "Output for no match correct" );
+
+open(FH, '>>', $temp_file) or die $!;
+print FH "This text should match\n";
+close(FH);
+
+$result = NPTest->testCmd("./check_log -F ".$temp_file." -O ".$oldlog." -q 'should match'");
+cmp_ok( $result->return_code, '==', 2, "Pattern match" );
+like ( $result->output, $criticalOutput, "Output for match correct" );
+
+open(FH, '>>', $temp_file) or die $!;
+print FH "This text should not match, because it is excluded\n";
+close(FH);
+
+$result = NPTest->testCmd("./check_log -F ".$temp_file." -O ".$oldlog." -q 'match' --exclude 'because'");
+cmp_ok( $result->return_code, '==', 0, "Exclude a pattern" );
+like ( $result->output, $okOutput, "Output for no match correct" );
+
+open(FH, '>>', $temp_file) or die $!;
+print FH "Trying\nwith\nmultiline\nignore me\n";
+close(FH);
+
+$result = NPTest->testCmd("./check_log -F ".$temp_file." -O ".$oldlog." -q 'Trying\\|with\\|multiline\\|ignore' --exclude 'me' --all");
+cmp_ok( $result->return_code, '==', 2, "Multiline pattern match with --all" );
+like ( $result->output, $multilineOutput, "Output for multiline match correct" );
+
+$result = NPTest->testCmd("./check_log -F ".$temp_file." -O ".$oldlog." -q 'match' -a");
+cmp_ok( $result->return_code, '==', 0, "Non matching --all" );
+like ( $result->output, $okOutput, "Output for no match correct" );
+
+unlink($oldlog);
+unlink($temp_file);
diff --git a/plugins-scripts/t/check_rpc.t b/plugins-scripts/t/check_rpc.t
new file mode 100644
index 0000000..c58f7bf
--- /dev/null
+++ b/plugins-scripts/t/check_rpc.t
@@ -0,0 +1,21 @@
+#! /usr/bin/perl -w -I ..
+#
+# Remote Procedure Call (RPC) Tests via check_rpc
+#
+#
+
+use strict;
+use Test;
+use NPTest;
+
+use vars qw($tests);
+BEGIN {$tests = 2; plan tests => $tests}
+
+my $successOutput = '/^check_rpc/';
+
+my $t;
+
+$t += checkCmd( "./check_rpc -V", 3, $successOutput );
+
+exit(0) if defined($Test::Harness::VERSION);
+exit($tests - $t);
diff --git a/plugins-scripts/t/check_uptime.t b/plugins-scripts/t/check_uptime.t
new file mode 100644
index 0000000..6e81db3
--- /dev/null
+++ b/plugins-scripts/t/check_uptime.t
@@ -0,0 +1,135 @@
+#!/usr/bin/perl -w -I ..
+#
+# check_uptime tests
+#
+#
+
+use strict;
+use Test::More tests => 42;
+use NPTest;
+
+my $result;
+
+$result = NPTest->testCmd(
+ "./check_uptime"
+ );
+cmp_ok( $result->return_code, '==', 3, "Missing parameters" );
+like ( $result->output, '/^Usage: check_uptime -w/', "Output for missing parameters correct" );
+
+$result = NPTest->testCmd(
+ "./check_uptime --help"
+ );
+cmp_ok( $result->return_code, '==', 3, "Help output requested" );
+like ( $result->output, '/ABSOLUTELY NO WARRANTY/', "Output for help correct" );
+
+$result = NPTest->testCmd(
+ "./check_uptime -w 5 -c 2"
+ );
+cmp_ok( $result->return_code, '==', 3, "Warning greater than critical" );
+like ( $result->output, '/^Upper Warning .*cannot be greater than Critical/', "Output for warning greater than critical correct" );
+
+$result = NPTest->testCmd(
+ "./check_uptime -c 1000 -W 100 2>&1"
+ );
+like ( $result->output, '/^Unknown option: W/', "Output with wrong parameter is correct" );
+
+$result = NPTest->testCmd(
+ "./check_uptime -f -w 1 -c 2"
+ );
+cmp_ok( $result->return_code, '==', 2, "Uptime higher than 2 seconds" );
+like ( $result->output, '/Running for \d+/', "Output for the f parameter correct" );
+
+$result = NPTest->testCmd(
+ "./check_uptime -s -w 1 -c 2"
+ );
+cmp_ok( $result->return_code, '==', 2, "Uptime higher than 2 seconds" );
+like ( $result->output, '/Running since \d+/', "Output for the s parameter correct" );
+
+$result = NPTest->testCmd(
+ "./check_uptime -d -w 1 -c 2"
+ );
+cmp_ok( $result->return_code, '==', 2, "Uptime higher than 2 seconds" );
+like ( $result->output, '/CRITICAL: Uptime is \d+ days/', "Output for the d parameter correct" );
+
+$result = NPTest->testCmd(
+ "./check_uptime -w 1 -c 2"
+ );
+cmp_ok( $result->return_code, '==', 2, "Uptime higher than 2 seconds" );
+like ( $result->output, '/^CRITICAL: Uptime is \d+ seconds/', "Output for uptime higher than 2 seconds correct" );
+
+$result = NPTest->testCmd(
+ "./check_uptime -w 1 -c 9999w"
+ );
+cmp_ok( $result->return_code, '==', 1, "Uptime lower than 9999 weeks" );
+like ( $result->output, '/^WARNING: Uptime is \d+ seconds/', "Output for uptime lower than 9999 weeks correct" );
+
+$result = NPTest->testCmd(
+ "./check_uptime -w 9998w -c 9999w"
+ );
+cmp_ok( $result->return_code, '==', 0, "Uptime lower than 9998 weeks" );
+like ( $result->output, '/^OK: Uptime is \d+ seconds/', "Output for uptime lower than 9998 weeks correct" );
+like ( $result->output, '/\|uptime=[0-9]+s;6046790400;6047395200;/', "Checking for performance output" );
+
+$result = NPTest->testCmd(
+ "./check_uptime -w 111222d -c 222333d"
+ );
+cmp_ok( $result->return_code, '==', 0, "Uptime lower than 111222 days" );
+like ( $result->output, '/^OK: Uptime is \d+ seconds/', "Output for uptime lower than 111222 days correct" );
+like ( $result->output, '/\|uptime=[0-9]+s;9609580800;19209571200;/', "Checking for performance output" );
+
+# Same as before, hopefully uptime is higher than 2 seconds so no warning
+$result = NPTest->testCmd(
+ "./check_uptime -w 2:111222d -c 1:222333d"
+ );
+cmp_ok( $result->return_code, '==', 0, "Uptime lower than 111222 days, and higher 2 seconds" );
+like ( $result->output, '/^OK: Uptime is \d+ seconds/', "Output for uptime lower than 111222 days, and higher 2 seconds correct" );
+like ( $result->output, '/\|uptime=[0-9]+s;9609580800;19209571200;/', "Checking for performance output" );
+
+# Same as before, now the low warning should trigger
+$result = NPTest->testCmd(
+ "./check_uptime -w 111221d:111222d -c 1:222333d"
+ );
+cmp_ok( $result->return_code, '==', 1, "Uptime lower than 111221 days raises warning" );
+like ( $result->output, '/^WARNING: Uptime is \d+ seconds/', "Output for uptime lower than 111221 days correct" );
+like ( $result->output, '/Exceeds lower warn threshold/', "Exceeds text correct" );
+like ( $result->output, '/\|uptime=[0-9]+s;9609580800;19209571200;/', "Checking for performance output" );
+
+# Same as before, now the low critical should trigger
+$result = NPTest->testCmd(
+ "./check_uptime -w 111221d:111222d -c 111220d:222333d"
+ );
+cmp_ok( $result->return_code, '==', 2, "Uptime lower than 111220 days raises critical" );
+like ( $result->output, '/^CRITICAL: Uptime is \d+ seconds/', "Output for uptime lower than 111220 days correct" );
+like ( $result->output, '/Exceeds lower crit threshold/', "Exceeds text correct" );
+like ( $result->output, '/\|uptime=[0-9]+s;9609580800;19209571200;/', "Checking for performance output" );
+
+
+#
+# Range values using ":" without two parts ("a:b") is invalid
+# Strings without two parts are always considered as upper threshold
+#
+
+$result = NPTest->testCmd(
+ "./check_uptime -w 2: -c 1:4"
+ );
+cmp_ok( $result->return_code, '==', 3, "Wrong parameter format raises unknown" );
+like ( $result->output, '/^Upper warning .* is not numeric/', "Output for wrong parameter format correct" );
+
+$result = NPTest->testCmd(
+ "./check_uptime -w 2:3 -c 1:"
+ );
+cmp_ok( $result->return_code, '==', 3, "Wrong parameter format raises unknown" );
+like ( $result->output, '/^Upper critical .* is not numeric/', "Output for wrong parameter format correct" );
+
+$result = NPTest->testCmd(
+ "./check_uptime -w :3 -c 1:4"
+ );
+cmp_ok( $result->return_code, '==', 3, "Wrong parameter format raises unknown" );
+like ( $result->output, '/^Upper warning .* is not numeric/', "Output for wrong parameter format correct" );
+
+$result = NPTest->testCmd(
+ "./check_uptime -w 2:3 -c :4"
+ );
+cmp_ok( $result->return_code, '==', 3, "Wrong parameter format raises unknown" );
+like ( $result->output, '/^Upper critical .* is not numeric/', "Output for wrong parameter format correct" );
+
diff --git a/plugins-scripts/t/utils.t b/plugins-scripts/t/utils.t
new file mode 100644
index 0000000..5c23179
--- /dev/null
+++ b/plugins-scripts/t/utils.t
@@ -0,0 +1,51 @@
+#!/usr/bin/perl -w -I ..
+#
+# utils.pm tests
+#
+#
+# Run with perl t/utils.t
+
+use warnings;
+use strict;
+use Test::More;
+use NPTest;
+
+use lib ".";
+use lib "..";
+use utils;
+
+my $hostname_checks = {
+ "www.altinity.com" => 1,
+ "www.888.com" => 1,
+ "888.com" => 1,
+ "host-hyphened.com" => 1,
+ "rubbish" => 1,
+ "-start.com" => 0,
+ "nonfqdn-but-endsindot." => 1,
+ "fqdn.and.endsindot." => 1,
+ "lots.of.dots.dot.org" => 1,
+ "endingwithdoubledots.." => 0,
+ "toomany..dots" => 0,
+ ".start.with.dot" => 0,
+ "10.20.30.40" => 1,
+ "10.20.30.40.50" => 0,
+ "10.20.30" => 0,
+ "10.20.30.40." => 1, # This is considered a hostname because of trailing dot. It probably won't exist though...
+ "888." => 1, # This is because it could be a domain
+ "host.888." => 1,
+ "where.did.that.!.come.from." => 0,
+ "no.underscores_.com" => 0,
+ "a.somecompany.com" => 1,
+ "host.a.com" => 1,
+ };
+
+plan tests => ((scalar keys %$hostname_checks) + 4);
+
+foreach my $h (sort keys %$hostname_checks) {
+ is (utils::is_hostname($h), $hostname_checks->{$h}, "$h should return ".$hostname_checks->{$h});
+}
+
+is(utils::is_hostname(), 0, "No parameter errors");
+is(utils::is_hostname(""), 0, "Empty string errors");
+is(utils::is_hostname(0), 0, "0 also errors");
+is(utils::is_hostname(1), 0, "1 also errors");