[monitoring-plugins] Move np extractvar from library to ntp_peer ...

GitHub git at monitoring-plugins.org
Wed Sep 16 16:50:15 CEST 2026


    Module: monitoring-plugins
    Branch: master
    Commit: 3afb69a70f837b2a486502294cbea01397fc85d2
    Author: Lorenz Kästle <12514511+RincewindsHat at users.noreply.github.com>
 Committer: GitHub <noreply at github.com>
      Date: Wed Sep 16 16:45:35 2026 +0200
       URL: https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=3afb69a7

Move np extractvar from library to ntp_peer plugin (#2347)

* move np_extractvar to where it is used
* rename extract var functions
* Fix tests

---------

Co-authored-by: Lorenz Kästle <lorenz.kaestle+gitub-mopl at mailbox.org>

---

 .gitignore                                       |  3 +
 NPTest.pm                                        |  2 +-
 configure.ac                                     |  3 +-
 lib/tests/test_utils.c                           | 80 +--------------------
 lib/utils_base.c                                 | 70 ------------------
 lib/utils_base.h                                 | 16 +----
 plugins/Makefile.am                              |  6 ++
 plugins/check_ntp_peer.c                         | 24 ++++---
 plugins/check_ntp_peer.d/check_ntp_peer_helper.c | 80 +++++++++++++++++++++
 plugins/check_ntp_peer.d/check_ntp_peer_helper.h | 13 ++++
 plugins/tests/test_check_ntp_peer.c              | 91 ++++++++++++++++++++++++
 plugins/tests/test_check_ntp_peer.t              | 12 ++++
 12 files changed, 222 insertions(+), 178 deletions(-)

diff --git a/.gitignore b/.gitignore
index 9e19ffa6..1b4d0d10 100644
--- a/.gitignore
+++ b/.gitignore
@@ -185,6 +185,8 @@ plugins/check_disk.d/.dirstamp
 /plugins/check_nntp
 /plugins/check_nntps
 /plugins/check_ntp_peer
+/plugins/check_ntp_peer.d/.deps
+/plugins/check_ntp_peer.d/.dirstamp
 /plugins/check_ntp_time
 /plugins/check_pgsql
 /plugins/check_ping
@@ -234,6 +236,7 @@ plugins/check_disk.d/.dirstamp
 /plugins/tests/test_sslutils
 /plugins/tests/test_utils
 /plugins/tests/test_check_disk
+/plugins/tests/test_check_ntp_peer
 /plugins/tests/test_check_swap
 /plugins/tests/test_check_snmp
 /plugins/tests/.deps
diff --git a/NPTest.pm b/NPTest.pm
index bbbe579a..da076bb2 100644
--- a/NPTest.pm
+++ b/NPTest.pm
@@ -546,7 +546,7 @@ sub TestsFrom
       if ( $excludeIfAppMissing )
       {
         $application = basename( $filename, ".t" );
-        if ( ! -e $application and ! -e $application.'.pm' and ! -e $directory."/".$application )
+        if ( ! -e $application and ! -e $application.'.pm' and ! -e ($directory."/".$application) )
         {
           print STDERR "No application (${application}) found for test harness (${filename})\n";
           next;
diff --git a/configure.ac b/configure.ac
index e8651cbc..b3e881b8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -175,8 +175,7 @@ if test "$enable_libtap" = "yes" ; then
 	EXTRA_TEST="test_utils test_tcp test_cmd test_base64 test_generic_output"
 	AC_SUBST(EXTRA_TEST)
 
-	EXTRA_PLUGIN_TESTS="tests/test_check_swap tests/test_check_disk tests/test_sslutils"
-
+	EXTRA_PLUGIN_TESTS="tests/test_check_swap tests/test_check_disk tests/test_sslutils tests/test_check_ntp_peer"
 	AC_SUBST(EXTRA_PLUGIN_TESTS)
 fi
 
diff --git a/lib/tests/test_utils.c b/lib/tests/test_utils.c
index 8040dec8..ce374a4f 100644
--- a/lib/tests/test_utils.c
+++ b/lib/tests/test_utils.c
@@ -28,7 +28,7 @@
 #include "utils_base.c"
 
 int main(int argc, char **argv) {
-	plan_tests(155);
+	plan_tests(132);
 
 	ok(this_monitoring_plugin == NULL, "monitoring_plugin not initialised");
 
@@ -217,84 +217,6 @@ int main(int argc, char **argv) {
 	test = np_escaped_string("everything");
 	ok(strcmp(test, "everything") == 0, "everything okay");
 
-	/* np_extract_ntpvar tests (23) */
-	test = np_extract_ntpvar("foo=bar, bar=foo, foobar=barfoo\n", "foo");
-	ok(test && !strcmp(test, "bar"), "1st test as expected");
-	free(test);
-
-	test = np_extract_ntpvar("foo=bar,bar=foo,foobar=barfoo\n", "bar");
-	ok(test && !strcmp(test, "foo"), "2nd test as expected");
-	free(test);
-
-	test = np_extract_ntpvar("foo=bar, bar=foo, foobar=barfoo\n", "foobar");
-	ok(test && !strcmp(test, "barfoo"), "3rd test as expected");
-	free(test);
-
-	test = np_extract_ntpvar("foo=bar\n", "foo");
-	ok(test && !strcmp(test, "bar"), "Single test as expected");
-	free(test);
-
-	test = np_extract_ntpvar("foo=bar, bar=foo, foobar=barfooi\n", "abcd");
-	ok(!test, "Key not found 1");
-
-	test = np_extract_ntpvar("foo=bar\n", "abcd");
-	ok(!test, "Key not found 2");
-
-	test = np_extract_ntpvar("foo=bar=foobar", "foo");
-	ok(test && !strcmp(test, "bar=foobar"), "Strange string 1");
-	free(test);
-
-	test = np_extract_ntpvar("foo", "foo");
-	ok(!test, "Malformed string 1");
-
-	test = np_extract_ntpvar("foo,", "foo");
-	ok(!test, "Malformed string 2");
-
-	test = np_extract_ntpvar("foo=", "foo");
-	ok(!test, "Malformed string 3");
-
-	test = np_extract_ntpvar("foo=,bar=foo", "foo");
-	ok(!test, "Malformed string 4");
-
-	test = np_extract_ntpvar(",foo", "foo");
-	ok(!test, "Malformed string 5");
-
-	test = np_extract_ntpvar("=foo", "foo");
-	ok(!test, "Malformed string 6");
-
-	test = np_extract_ntpvar("=foo,", "foo");
-	ok(!test, "Malformed string 7");
-
-	test = np_extract_ntpvar(",,,", "foo");
-	ok(!test, "Malformed string 8");
-
-	test = np_extract_ntpvar("===", "foo");
-	ok(!test, "Malformed string 9");
-
-	test = np_extract_ntpvar(",=,=,", "foo");
-	ok(!test, "Malformed string 10");
-
-	test = np_extract_ntpvar("=,=,=", "foo");
-	ok(!test, "Malformed string 11");
-
-	test = np_extract_ntpvar("  foo=bar  ,\n bar=foo\n , foobar=barfoo  \n  ", "foo");
-	ok(test && !strcmp(test, "bar"), "Random spaces and newlines 1");
-	free(test);
-
-	test = np_extract_ntpvar("  foo=bar  ,\n bar=foo\n , foobar=barfoo  \n  ", "bar");
-	ok(test && !strcmp(test, "foo"), "Random spaces and newlines 2");
-	free(test);
-
-	test = np_extract_ntpvar("  foo=bar  ,\n bar=foo\n , foobar=barfoo  \n  ", "foobar");
-	ok(test && !strcmp(test, "barfoo"), "Random spaces and newlines 3");
-	free(test);
-
-	test = np_extract_ntpvar("  foo=bar  ,\n bar\n \n= \n foo\n , foobar=barfoo  \n  ", "bar");
-	ok(test && !strcmp(test, "foo"), "Random spaces and newlines 4");
-	free(test);
-
-	test = np_extract_ntpvar("", "foo");
-	ok(!test, "Empty string return NULL");
 
 	ok(mp_suid() == false, "Test aren't suid");
 
diff --git a/lib/utils_base.c b/lib/utils_base.c
index 7450bd30..812bed65 100644
--- a/lib/utils_base.c
+++ b/lib/utils_base.c
@@ -47,8 +47,6 @@ monitoring_plugin *this_monitoring_plugin = NULL;
 mp_state_enum timeout_state = STATE_CRITICAL;
 unsigned int timeout_interval = DEFAULT_SOCKET_TIMEOUT;
 
-bool _np_state_read_file(FILE *state_file);
-
 void np_init(char *plugin_name, int argc, char **argv) {
 	if (this_monitoring_plugin == NULL) {
 		this_monitoring_plugin = calloc(1, sizeof(monitoring_plugin));
@@ -324,75 +322,7 @@ char *np_escaped_string(const char *string) {
 
 int np_check_if_root(void) { return (geteuid() == 0); }
 
-/*
- * Extract the value from key/value pairs, or return NULL. The value returned
- * can be free()ed.
- * This function can be used to parse NTP control packet data and performance
- * data strings.
- */
-char *np_extract_value(const char *varlist, const char *name, char sep) {
-	char *tmp = NULL;
-	char *value = NULL;
-
-	while (true) {
-		/* Strip any leading space */
-		for (; isspace(varlist[0]); varlist++) {
-			;
-		}
 
-		if (strncmp(name, varlist, strlen(name)) == 0) {
-			varlist += strlen(name);
-			/* strip trailing spaces */
-			for (; isspace(varlist[0]); varlist++) {
-				;
-			}
-
-			if (varlist[0] == '=') {
-				/* We matched the key, go past the = sign */
-				varlist++;
-				/* strip leading spaces */
-				for (; isspace(varlist[0]); varlist++) {
-					;
-				}
-
-				if ((tmp = index(varlist, sep))) {
-					/* Value is delimited by a comma */
-					if (tmp - varlist == 0) {
-						continue;
-					}
-					value = (char *)calloc(1, (unsigned long)(tmp - varlist + 1));
-					strncpy(value, varlist, (unsigned long)(tmp - varlist));
-					value[tmp - varlist] = '\0';
-				} else {
-					/* Value is delimited by a \0 */
-					if (strlen(varlist) == 0) {
-						continue;
-					}
-					value = (char *)calloc(1, strlen(varlist) + 1);
-					strncpy(value, varlist, strlen(varlist));
-					value[strlen(varlist)] = '\0';
-				}
-				break;
-			}
-		}
-		if ((tmp = index(varlist, sep))) {
-			/* More keys, keep going... */
-			varlist = tmp + 1;
-		} else {
-			/* We're done */
-			break;
-		}
-	}
-
-	/* Clean-up trailing spaces/newlines */
-	if (value) {
-		for (unsigned long i = strlen(value) - 1; isspace(value[i]); i--) {
-			value[i] = '\0';
-		}
-	}
-
-	return value;
-}
 
 const char *state_text(mp_state_enum result) {
 	switch (result) {
diff --git a/lib/utils_base.h b/lib/utils_base.h
index 1da96f78..aaf236ee 100644
--- a/lib/utils_base.h
+++ b/lib/utils_base.h
@@ -63,20 +63,6 @@ int np_check_if_root(void);
  * running a suid plugin */
 #define mp_suid() (getuid() != geteuid())
 
-/*
- * Extract the value from key/value pairs, or return NULL. The value returned
- * can be free()ed.
- * This function can be used to parse NTP control packet data and performance
- * data strings.
- */
-char *np_extract_value(const char *, const char *, char);
-
-/*
- * Same as np_extract_value with separator suitable for NTP control packet
- * payloads (comma)
- */
-#define np_extract_ntpvar(l, n) np_extract_value(l, n, ',')
-
 /*
  * Read a string representing a state (ok, warning... or numeric: 0, 1) and
  * return the corresponding NP_STATE or ERROR)
@@ -85,7 +71,7 @@ int mp_translate_state(char *);
 
 void np_init(char *, int argc, char **argv);
 void np_set_args(int argc, char **argv);
-void np_cleanup(void);
+// void np_cleanup(void);
 const char *state_text(mp_state_enum);
 
 #endif /* _UTILS_BASE_ */
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index c04a5dee..d1697d56 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -50,6 +50,7 @@ EXTRA_PROGRAMS = check_mysql check_radius check_pgsql check_hpjd \
 	tests/test_check_swap \
 	tests/test_check_snmp \
 	tests/test_check_disk \
+	tests/test_check_ntp_peer \
 	tests/test_sslutils
 
 SUBDIRS = picohttpparser
@@ -61,12 +62,14 @@ mopl_test_scripts = tests/check_curl.t \
 				  tests/test_check_disk.t \
 				  tests/test_check_snmp.t \
 				  tests/test_check_swap.t \
+				  tests/test_check_ntp_peer.t \
 				  tests/test_sslutils.t
 
 mopl_test_sources = tests/check_snmp_agent.pl \
 	tests/test_check_disk.c \
 	tests/test_check_snmp.c \
 	tests/test_check_swap.c \
+	tests/test_check_ntp_peer.c \
 	tests/test_sslutils.c
 
 EXTRA_DIST = t \
@@ -172,6 +175,7 @@ check_mysql_query_CFLAGS = $(AM_CFLAGS) $(MYSQLCFLAGS)
 check_mysql_query_CPPFLAGS = $(AM_CPPFLAGS) $(MYSQLINCLUDE)
 check_mysql_query_LDADD = $(NETLIBS) $(MYSQLLIBS)
 check_nagios_LDADD = $(BASEOBJS)
+check_ntp_peer_SOURCES = check_ntp_peer.c check_ntp_peer.d/check_ntp_peer_helper.c
 check_ntp_peer_LDADD = $(NETLIBS) $(MATHLIBS)
 check_pgsql_LDADD = $(NETLIBS) $(PGLIBS)
 check_ping_LDADD = $(NETLIBS)
@@ -211,6 +215,8 @@ tests_test_check_disk_LDADD = $(BASEOBJS) $(tap_ldflags) check_disk.d/utils_disk
 tests_test_check_disk_SOURCES = tests/test_check_disk.c
 tests_test_sslutils_LDADD = $(SSLOBJS) $(tap_ldflags) -ltap
 tests_test_sslutils_SOURCES = tests/test_sslutils.c
+tests_test_check_ntp_peer_LDADD = $(BASEOBJS) $(tap_ldflags) check_ntp_peer.d/check_ntp_peer_helper.c -ltap
+tests_test_check_ntp_peer_SOURCES = tests/test_check_ntp_peer.c
 
 ##############################################################################
 # secondary dependencies
diff --git a/plugins/check_ntp_peer.c b/plugins/check_ntp_peer.c
index b9947945..71d71d20 100644
--- a/plugins/check_ntp_peer.c
+++ b/plugins/check_ntp_peer.c
@@ -48,6 +48,7 @@ const char *email = "devel at monitoring-plugins.org";
 #include "utils.h"
 #include "../lib/states.h"
 #include "check_ntp_peer.d/config.h"
+#include "check_ntp_peer.d/check_ntp_peer_helper.h"
 
 static int verbose = 0;
 
@@ -374,7 +375,7 @@ ntp_request_result ntp_request(const check_ntp_peer_config config) {
 
 			DBG_PRINT_1("parsing offset from peer %.2x: ", ntohs(peers[i].assoc));
 
-			value = np_extract_ntpvar(data, "offset");
+			value = check_ntp_peer_extract_ntpvar(data, "offset");
 			nptr = NULL;
 			/* Convert the value if we have one */
 			if (value != NULL) {
@@ -400,8 +401,8 @@ ntp_request_result ntp_request(const check_ntp_peer_config config) {
 				DBG_PRINT_1("parsing %s from peer %.2x: ",
 							strstr(getvar, "dispersion") != NULL ? "dispersion" : "jitter",
 							ntohs(peers[i].assoc));
-				value = np_extract_ntpvar(data, strstr(getvar, "dispersion") != NULL ? "dispersion"
-																					 : "jitter");
+				value = check_ntp_peer_extract_ntpvar(
+					data, strstr(getvar, "dispersion") != NULL ? "dispersion" : "jitter");
 				nptr = NULL;
 				/* Convert the value if we have one */
 				if (value != NULL) {
@@ -419,7 +420,7 @@ ntp_request_result ntp_request(const check_ntp_peer_config config) {
 			if (config.do_stratum) {
 				/* get the stratum */
 				DBG_PRINT_1("parsing stratum from peer %.2x: ", ntohs(peers[i].assoc));
-				value = np_extract_ntpvar(data, "stratum");
+				value = check_ntp_peer_extract_ntpvar(data, "stratum");
 				nptr = NULL;
 				/* Convert the value if we have one */
 				if (value != NULL) {
@@ -624,24 +625,25 @@ check_ntp_peer_config_wrapper process_arguments(int argc, char **argv) {
 
 char *perfd_offset(double offset, thresholds *offset_thresholds) {
 	return mopl_utils_fperfdata("offset", offset, "s", true, offset_thresholds->warning->end, true,
-					 offset_thresholds->critical->end, false, 0, false, 0);
+								offset_thresholds->critical->end, false, 0, false, 0);
 }
 
 char *perfd_jitter(double jitter, bool do_jitter, thresholds *jitter_thresholds) {
-	return mopl_utils_fperfdata("jitter", jitter, "", do_jitter, jitter_thresholds->warning->end, do_jitter,
-					 jitter_thresholds->critical->end, true, 0, false, 0);
+	return mopl_utils_fperfdata("jitter", jitter, "", do_jitter, jitter_thresholds->warning->end,
+								do_jitter, jitter_thresholds->critical->end, true, 0, false, 0);
 }
 
 char *perfd_stratum(int stratum, bool do_stratum, thresholds *stratum_thresholds) {
-	return mopl_utils_perfdata("stratum", stratum, "", do_stratum, (int)stratum_thresholds->warning->end,
-					do_stratum, (int)stratum_thresholds->critical->end, true, 0, true, 16);
+	return mopl_utils_perfdata("stratum", stratum, "", do_stratum,
+							   (int)stratum_thresholds->warning->end, do_stratum,
+							   (int)stratum_thresholds->critical->end, true, 0, true, 16);
 }
 
 char *perfd_truechimers(int num_truechimers, const bool do_truechimers,
 						thresholds *truechimer_thresholds) {
 	return mopl_utils_perfdata("truechimers", num_truechimers, "", do_truechimers,
-					(int)truechimer_thresholds->warning->end, do_truechimers,
-					(int)truechimer_thresholds->critical->end, true, 0, false, 0);
+							   (int)truechimer_thresholds->warning->end, do_truechimers,
+							   (int)truechimer_thresholds->critical->end, true, 0, false, 0);
 }
 
 int main(int argc, char *argv[]) {
diff --git a/plugins/check_ntp_peer.d/check_ntp_peer_helper.c b/plugins/check_ntp_peer.d/check_ntp_peer_helper.c
new file mode 100644
index 00000000..7c639b0d
--- /dev/null
+++ b/plugins/check_ntp_peer.d/check_ntp_peer_helper.c
@@ -0,0 +1,80 @@
+#include "./check_ntp_peer_helper.h"
+#include "../../config.h"
+#include <ctype.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+/*
+ * Extract the value from key/value pairs, or return NULL. The value returned
+ * can be free()ed.
+ * This function can be used to parse NTP control packet data and performance
+ * data strings.
+ */
+char *check_ntp_peer_extract_value(const char *varlist, const char *name, char sep) {
+	char *tmp = NULL;
+	char *value = NULL;
+
+	while (true) {
+		/* Strip any leading space */
+		for (; isspace(varlist[0]); varlist++) {
+			;
+		}
+
+		if (strncmp(name, varlist, strlen(name)) == 0) {
+			varlist += strlen(name);
+			/* strip trailing spaces */
+			for (; isspace(varlist[0]); varlist++) {
+				;
+			}
+
+			if (varlist[0] == '=') {
+				/* We matched the key, go past the = sign */
+				varlist++;
+				/* strip leading spaces */
+				for (; isspace(varlist[0]); varlist++) {
+					;
+				}
+
+				if ((tmp = index(varlist, sep))) {
+					/* Value is delimited by a comma */
+					if (tmp - varlist == 0) {
+						continue;
+					}
+					value = (char *)calloc(1, (unsigned long)(tmp - varlist + 1));
+					strncpy(value, varlist, (unsigned long)(tmp - varlist));
+					value[tmp - varlist] = '\0';
+				} else {
+					/* Value is delimited by a \0 */
+					if (strlen(varlist) == 0) {
+						continue;
+					}
+					value = (char *)calloc(1, strlen(varlist) + 1);
+					strncpy(value, varlist, strlen(varlist));
+					value[strlen(varlist)] = '\0';
+				}
+				break;
+			}
+		}
+		if ((tmp = index(varlist, sep))) {
+			/* More keys, keep going... */
+			varlist = tmp + 1;
+		} else {
+			/* We're done */
+			break;
+		}
+	}
+
+	/* Clean-up trailing spaces/newlines */
+	if (value) {
+		for (unsigned long i = strlen(value) - 1; isspace(value[i]); i--) {
+			value[i] = '\0';
+		}
+	}
+
+	return value;
+}
+
+char *check_ntp_peer_extract_ntpvar(const char *varlist, const char *name) {
+	return check_ntp_peer_extract_value(varlist, name, ',');
+}
diff --git a/plugins/check_ntp_peer.d/check_ntp_peer_helper.h b/plugins/check_ntp_peer.d/check_ntp_peer_helper.h
new file mode 100644
index 00000000..f222de82
--- /dev/null
+++ b/plugins/check_ntp_peer.d/check_ntp_peer_helper.h
@@ -0,0 +1,13 @@
+/*
+ * Extract the value from key/value pairs, or return NULL. The value returned
+ * can be free()ed.
+ * This function can be used to parse NTP control packet data and performance
+ * data strings.
+ */
+char *check_ntp_peer_extract_value(const char *, const char *, char);
+
+/*
+ * Same as np_extract_value with separator suitable for NTP control packet
+ * payloads (comma)
+ */
+char *check_ntp_peer_extract_ntpvar(const char *, const char *n);
diff --git a/plugins/tests/test_check_ntp_peer.c b/plugins/tests/test_check_ntp_peer.c
new file mode 100644
index 00000000..fbc647f6
--- /dev/null
+++ b/plugins/tests/test_check_ntp_peer.c
@@ -0,0 +1,91 @@
+#include "../../tap/tap.h"
+#include "../check_ntp_peer.d/check_ntp_peer_helper.h"
+
+#include "../../config.h"
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc, char **argv) {
+	plan_tests(23);
+	/* check_ntp_peer_extract_ntpvar tests (23) */
+	char *test;
+	test = check_ntp_peer_extract_ntpvar("foo=bar, bar=foo, foobar=barfoo\n", "foo");
+	ok(test && !strcmp(test, "bar"), "1st test as expected");
+	free(test);
+
+	test = check_ntp_peer_extract_ntpvar("foo=bar,bar=foo,foobar=barfoo\n", "bar");
+	ok(test && !strcmp(test, "foo"), "2nd test as expected");
+	free(test);
+
+	test = check_ntp_peer_extract_ntpvar("foo=bar, bar=foo, foobar=barfoo\n", "foobar");
+	ok(test && !strcmp(test, "barfoo"), "3rd test as expected");
+	free(test);
+
+	test = check_ntp_peer_extract_ntpvar("foo=bar\n", "foo");
+	ok(test && !strcmp(test, "bar"), "Single test as expected");
+	free(test);
+
+	test = check_ntp_peer_extract_ntpvar("foo=bar, bar=foo, foobar=barfooi\n", "abcd");
+	ok(!test, "Key not found 1");
+
+	test = check_ntp_peer_extract_ntpvar("foo=bar\n", "abcd");
+	ok(!test, "Key not found 2");
+
+	test = check_ntp_peer_extract_ntpvar("foo=bar=foobar", "foo");
+	ok(test && !strcmp(test, "bar=foobar"), "Strange string 1");
+	free(test);
+
+	test = check_ntp_peer_extract_ntpvar("foo", "foo");
+	ok(!test, "Malformed string 1");
+
+	test = check_ntp_peer_extract_ntpvar("foo,", "foo");
+	ok(!test, "Malformed string 2");
+
+	test = check_ntp_peer_extract_ntpvar("foo=", "foo");
+	ok(!test, "Malformed string 3");
+
+	test = check_ntp_peer_extract_ntpvar("foo=,bar=foo", "foo");
+	ok(!test, "Malformed string 4");
+
+	test = check_ntp_peer_extract_ntpvar(",foo", "foo");
+	ok(!test, "Malformed string 5");
+
+	test = check_ntp_peer_extract_ntpvar("=foo", "foo");
+	ok(!test, "Malformed string 6");
+
+	test = check_ntp_peer_extract_ntpvar("=foo,", "foo");
+	ok(!test, "Malformed string 7");
+
+	test = check_ntp_peer_extract_ntpvar(",,,", "foo");
+	ok(!test, "Malformed string 8");
+
+	test = check_ntp_peer_extract_ntpvar("===", "foo");
+	ok(!test, "Malformed string 9");
+
+	test = check_ntp_peer_extract_ntpvar(",=,=,", "foo");
+	ok(!test, "Malformed string 10");
+
+	test = check_ntp_peer_extract_ntpvar("=,=,=", "foo");
+	ok(!test, "Malformed string 11");
+
+	test = check_ntp_peer_extract_ntpvar("  foo=bar  ,\n bar=foo\n , foobar=barfoo  \n  ", "foo");
+	ok(test && !strcmp(test, "bar"), "Random spaces and newlines 1");
+	free(test);
+
+	test = check_ntp_peer_extract_ntpvar("  foo=bar  ,\n bar=foo\n , foobar=barfoo  \n  ", "bar");
+	ok(test && !strcmp(test, "foo"), "Random spaces and newlines 2");
+	free(test);
+
+	test =
+		check_ntp_peer_extract_ntpvar("  foo=bar  ,\n bar=foo\n , foobar=barfoo  \n  ", "foobar");
+	ok(test && !strcmp(test, "barfoo"), "Random spaces and newlines 3");
+	free(test);
+
+	test = check_ntp_peer_extract_ntpvar("  foo=bar  ,\n bar\n \n= \n foo\n , foobar=barfoo  \n  ",
+										 "bar");
+	ok(test && !strcmp(test, "foo"), "Random spaces and newlines 4");
+	free(test);
+
+	test = check_ntp_peer_extract_ntpvar("", "foo");
+	ok(!test, "Empty string return NULL");
+}
diff --git a/plugins/tests/test_check_ntp_peer.t b/plugins/tests/test_check_ntp_peer.t
new file mode 100755
index 00000000..af00369f
--- /dev/null
+++ b/plugins/tests/test_check_ntp_peer.t
@@ -0,0 +1,12 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Test::More;
+
+my $test_file_path = "tests/test_check_ntp_peer";
+
+if (! -e $test_file_path) {
+	plan skip_all => $test_file_path." not compiled - please enable libtap library to test";
+}
+exec $test_file_path;



More information about the Commits mailing list