From 87195f5511bf18db2a64f71ea9783ebbfb33c3a5 Mon Sep 17 00:00:00 2001
From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com>
Date: Mon, 8 Sep 2025 15:57:06 +0200
Subject: check_snmp: refactoring + fixes
This commit moves the state retention logic to check_snmp as it is only
used there and I do not want it to be used at all, so it doesn't get a
place in the lib.
Otherwise this adapts tests and fixes the rate computing in the
refactored version of check_snmp.
Also fixes some bugs detected with the tests
---
plugins/tests/test_check_snmp.c | 175 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 175 insertions(+)
create mode 100644 plugins/tests/test_check_snmp.c
(limited to 'plugins/tests/test_check_snmp.c')
diff --git a/plugins/tests/test_check_snmp.c b/plugins/tests/test_check_snmp.c
new file mode 100644
index 00000000..d71706d0
--- /dev/null
+++ b/plugins/tests/test_check_snmp.c
@@ -0,0 +1,175 @@
+/*****************************************************************************
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ *
+ *****************************************************************************/
+
+#include "tap.h"
+#include "../../config.h"
+
+#include
+#include
+#include
+
+#include "utils_base.c"
+#include "../check_snmp.d/check_snmp_helpers.h"
+
+char *_np_state_generate_key(int argc, char **argv);
+char *_np_state_calculate_location_prefix(void);
+
+int main(int argc, char **argv) {
+ char *temp_string = (char *)_np_state_generate_key(argc, argv);
+ ok(!strcmp(temp_string, "e2d17f995fd4c020411b85e3e3d0ff7306d4147e"),
+ "Got hash with exe and no parameters") ||
+ diag("You are probably running in wrong directory. Must run as ./test_utils");
+
+ int fake_argc = 4;
+ char *fake_argv[] = {
+ "./test_utils",
+ "here",
+ "--and",
+ "now",
+ };
+ temp_string = (char *)_np_state_generate_key(fake_argc, fake_argv);
+ ok(!strcmp(temp_string, "bd72da9f78ff1419fad921ea5e43ce56508aef6c"),
+ "Got based on expected argv");
+
+ unsetenv("MP_STATE_PATH");
+ temp_string = (char *)_np_state_calculate_location_prefix();
+ ok(!strcmp(temp_string, NP_STATE_DIR_PREFIX), "Got default directory");
+
+ setenv("MP_STATE_PATH", "", 1);
+ temp_string = (char *)_np_state_calculate_location_prefix();
+ ok(!strcmp(temp_string, NP_STATE_DIR_PREFIX), "Got default directory even with empty string");
+
+ setenv("MP_STATE_PATH", "/usr/local/nagios/var", 1);
+ temp_string = (char *)_np_state_calculate_location_prefix();
+ ok(!strcmp(temp_string, "/usr/local/nagios/var"), "Got default directory");
+
+ fake_argc = 1;
+ fake_argv[0] = "./test_utils";
+ state_key temp_state_key1 = np_enable_state(NULL, 51, "check_test", fake_argc, fake_argv);
+ ok(!strcmp(temp_state_key1.plugin_name, "check_test"), "Got plugin name");
+ ok(!strcmp(temp_state_key1.name, "e2d17f995fd4c020411b85e3e3d0ff7306d4147e"),
+ "Got generated filename");
+
+ state_key temp_state_key2 =
+ np_enable_state("allowedchars_in_keyname", 77, "check_snmp", fake_argc, fake_argv);
+
+ char state_path[1024];
+ sprintf(state_path, "/usr/local/nagios/var/%lu/check_test/allowedchars_in_keyname",
+ (unsigned long)geteuid());
+ ok(!strcmp(temp_state_key2.plugin_name, "check_test"), "Got plugin name");
+ ok(!strcmp(temp_state_key2.name, "allowedchars_in_keyname"), "Got key name with valid chars");
+ ok(!strcmp(temp_state_key2._filename, state_path), "Got internal filename");
+
+ /* Don't do this test just yet. Will die */
+ /*
+ np_enable_state("bad^chars$in@here", 77);
+ temp_state_key = this_monitoring_plugin->state;
+ ok( !strcmp(temp_state_key->name, "bad_chars_in_here"), "Got key name with bad chars replaced"
+ );
+ */
+
+ state_key temp_state_key3 =
+ np_enable_state("funnykeyname", 54, "check_snmp", fake_argc, fake_argv);
+ sprintf(state_path, "/usr/local/nagios/var/%lu/check_test/funnykeyname",
+ (unsigned long)geteuid());
+ ok(!strcmp(temp_state_key3.plugin_name, "check_test"), "Got plugin name");
+ ok(!strcmp(temp_state_key3.name, "funnykeyname"), "Got key name");
+
+ ok(!strcmp(temp_state_key3._filename, state_path), "Got internal filename");
+ ok(temp_state_key3.data_version == 54, "Version set");
+
+ state_data *temp_state_data = np_state_read(temp_state_key3);
+ ok(temp_state_data == NULL, "Got no state data as file does not exist");
+
+ /*
+ temp_fp = fopen("var/statefile", "r");
+ if (temp_fp==NULL)
+ printf("Error opening. errno=%d\n", errno);
+ printf("temp_fp=%s\n", temp_fp);
+ ok( _np_state_read_file(temp_fp) == true, "Can read state file" );
+ fclose(temp_fp);
+ */
+
+ temp_state_key3._filename = "var/statefile";
+ temp_state_data = np_state_read(temp_state_key3);
+ ok(temp_state_data != NULL, "Got state data now") ||
+ diag("Are you running in right directory? Will get coredump next if not");
+ ok(temp_state_data->time == 1234567890, "Got time");
+ ok(!strcmp((char *)temp_state_data->data, "String to read"), "Data as expected");
+
+ temp_state_key3.data_version = 53;
+ temp_state_data = np_state_read(temp_state_key3);
+ ok(temp_state_data == NULL, "Older data version gives NULL");
+ temp_state_key3.data_version = 54;
+
+ temp_state_key3._filename = "var/nonexistent";
+ temp_state_data = np_state_read(temp_state_key3);
+ ok(temp_state_data == NULL, "Missing file gives NULL");
+
+ temp_state_key3._filename = "var/oldformat";
+ temp_state_data = np_state_read(temp_state_key3);
+ ok(temp_state_data == NULL, "Old file format gives NULL");
+
+ temp_state_key3._filename = "var/baddate";
+ temp_state_data = np_state_read(temp_state_key3);
+ ok(temp_state_data == NULL, "Bad date gives NULL");
+
+ temp_state_key3._filename = "var/missingdataline";
+ temp_state_data = np_state_read(temp_state_key3);
+ ok(temp_state_data == NULL, "Missing data line gives NULL");
+
+ unlink("var/generated");
+ temp_state_key3._filename = "var/generated";
+
+ time_t current_time = 1234567890;
+ np_state_write_string(temp_state_key3, current_time, "String to read");
+ ok(system("cmp var/generated var/statefile") == 0, "Generated file same as expected");
+
+ unlink("var/generated_directory/statefile");
+ unlink("var/generated_directory");
+ temp_state_key3._filename = "var/generated_directory/statefile";
+ current_time = 1234567890;
+ np_state_write_string(temp_state_key3, current_time, "String to read");
+ ok(system("cmp var/generated_directory/statefile var/statefile") == 0,
+ "Have created directory");
+
+ /* This test to check cannot write to dir - can't automate yet */
+ /*
+ unlink("var/generated_bad_dir");
+ mkdir("var/generated_bad_dir", S_IRUSR);
+ np_state_write_string(current_time, "String to read");
+ */
+
+ temp_state_key3._filename = "var/generated";
+ time(¤t_time);
+ np_state_write_string(temp_state_key3, 0, "String to read");
+ temp_state_data = np_state_read(temp_state_key3);
+ /* Check time is set to current_time */
+ ok(system("cmp var/generated var/statefile > /dev/null") != 0,
+ "Generated file should be different this time");
+ ok(temp_state_data->time - current_time <= 1, "Has time generated from current time");
+
+ /* Don't know how to automatically test this. Need to be able to redefine die and catch the
+ * error */
+ /*
+ temp_state_key->_filename="/dev/do/not/expect/to/be/able/to/write";
+ np_state_write_string(0, "Bad file");
+ */
+
+ np_cleanup();
+}
--
cgit v1.2.3-74-g34f1