]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
stats: Add unittest for basic stats serialization 10426/head
authorArne Welzel <arne.welzel@corelight.com>
Thu, 8 Feb 2024 17:23:38 +0000 (18:23 +0100)
committerVictor Julien <victor@inliniac.net>
Wed, 14 Feb 2024 20:20:52 +0000 (21:20 +0100)
Main purpose is to validate that the 30 of bond0.30 isn't expanded into
a nested object during serialization.

src/Makefile.am
src/output-json-stats.c
src/output-json-stats.h
src/runmode-unittests.c
src/tests/output-json-stats.c [new file with mode: 0644]

index b8c28dcf63721546aed57dac8cfe195325a116f4..166555e8c0b83eb7f4e932f237b82d48a7666800 100755 (executable)
@@ -1289,7 +1289,8 @@ EXTRA_DIST = \
        tests/detect-tls-version.c \
        tests/detect-ipaddr.c \
        tests/detect.c \
-       tests/stream-tcp.c
+       tests/stream-tcp.c \
+       tests/output-json-stats.c
 
 install-headers:
        mkdir -p $(DESTDIR)${includedir}/suricata
index 0e0f7f7680c480b61dcc8b582292209dcfc184d7..33f98afa2dda91853fb1b59180f056d754eb7437 100644 (file)
@@ -483,3 +483,7 @@ void JsonStatsLogRegister(void) {
         "eve-log.stats", OutputStatsLogInitSub, JsonStatsLogger,
         JsonStatsLogThreadInit, JsonStatsLogThreadDeinit, NULL);
 }
+
+#ifdef UNITTESTS
+#include "tests/output-json-stats.c"
+#endif
index 9b96d5001298fe1cac408dd090d78950d4e31e2a..b569e30b6429631b0351677bb59d479d45af06e4 100644 (file)
@@ -35,4 +35,6 @@ TmEcode OutputEngineStatsReloadTime(json_t **jdata);
 TmEcode OutputEngineStatsRuleset(json_t **jdata);
 void JsonStatsLogRegister(void);
 
+void OutputJsonStatsRegisterTests(void);
+
 #endif /* __OUTPUT_JSON_COUNTERS_H__ */
index 1150bad89580c2a2ef672d3bf40818bf335cda1e..8ce0244146a34fea36f0780775554002e916b0b4 100644 (file)
 #include "decode-vntag.h"
 #include "decode-vxlan.h"
 
+#include "output-json-stats.h"
+
 #ifdef OS_WIN32
 #include "win32-syscall.h"
 #endif
@@ -215,6 +217,7 @@ static void RegisterUnittests(void)
 #endif
     SCProtoNameRegisterTests();
     UtilCIDRTests();
+    OutputJsonStatsRegisterTests();
 }
 #endif
 
diff --git a/src/tests/output-json-stats.c b/src/tests/output-json-stats.c
new file mode 100644 (file)
index 0000000..ac1336e
--- /dev/null
@@ -0,0 +1,70 @@
+/* Copyright (C) 2024 Open Information Security Foundation
+ *
+ * You can copy, redistribute or modify this Program under the terms of
+ * the GNU General Public License version 2 as published by the Free
+ * Software Foundation.
+ *
+ * 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
+ * version 2 along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "../suricata-common.h"
+
+#include "../output-json-stats.h"
+
+#include "../util-unittest.h"
+
+static int OutputJsonStatsTest01(void)
+{
+    StatsRecord global_records[] = { { 0 }, { 0 } };
+    StatsRecord thread_records[2];
+    thread_records[0].name = "capture.kernel_packets";
+    thread_records[0].short_name = "kernel_packets";
+    thread_records[0].tm_name = "W#01-bond0.30";
+    thread_records[0].value = 42;
+    thread_records[1].name = "capture.kernel_drops";
+    thread_records[1].short_name = "kernel_drops";
+    thread_records[1].tm_name = "W#01-bond0.30";
+    thread_records[1].value = 4711;
+
+    StatsTable table = {
+        .nstats = 2,
+        .stats = &global_records[0],
+        .ntstats = 1,
+        .tstats = &thread_records[0],
+    };
+
+    json_t *r = StatsToJSON(&table, JSON_STATS_TOTALS | JSON_STATS_THREADS);
+    if (!r)
+        return 0;
+
+    // Remove variable content
+    json_object_del(r, "uptime");
+
+    char *serialized = json_dumps(r, 0);
+
+    // Cheesy comparison
+    const char *expected = "{\"threads\": {\"W#01-bond0.30\": {\"capture\": {\"kernel_packets\": "
+                           "42, \"kernel_drops\": 4711}}}}";
+
+    int cmp_result = strcmp(expected, serialized);
+    if (cmp_result != 0)
+        printf("unexpected result\nexpected=%s\ngot=%s\n", expected, serialized);
+
+    free(serialized);
+    json_decref(r);
+
+    return cmp_result == 0;
+}
+
+void OutputJsonStatsRegisterTests(void)
+{
+    UtRegisterTest("OutputJsonStatsTest01", OutputJsonStatsTest01);
+}