summaryrefslogtreecommitdiff
path: root/test/TestAllFiles.h
diff options
context:
space:
mode:
authorAlan Coopersmith <alan.coopersmith@oracle.com>2023-01-07 13:39:56 -0800
committerAlan Coopersmith <alan.coopersmith@oracle.com>2023-01-08 14:50:03 -0800
commit501494c6c68a84114fdd0b44d4b67ef9cde776c9 (patch)
treefb5b1c7483d8f6859f52ed93c8ea931a1dde11ad /test/TestAllFiles.h
parent4841039e5385f264d12757903894f47c64f59361 (diff)
test: Add unit tests using glib framework
Includes rudimentary tests for XpmReadFileToXpmImage, XpmReadFileToData, XpmReadFileToBuffer, XpmCreateXpmImageFromData, XpmCreateXpmImageFromBuffer, XpmWriteFileFromXpmImage, XpmWriteFileFromData, XpmWriteFileFromBuffer, XpmAttributesSize, XpmGetErrorString, XpmLibraryVersion Includes test cases for CVE-2004-0687 Tests .Z and .gz files if --enable-open-zfile is active Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
Diffstat (limited to 'test/TestAllFiles.h')
-rw-r--r--test/TestAllFiles.h160
1 files changed, 160 insertions, 0 deletions
diff --git a/test/TestAllFiles.h b/test/TestAllFiles.h
new file mode 100644
index 0000000..d07436a
--- /dev/null
+++ b/test/TestAllFiles.h
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 2023, Oracle and/or its affiliates.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include <glib.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "config.h"
+
+#define DEFAULT_TIMEOUT 10 /* maximum seconds for each file */
+
+static sigjmp_buf jump_env;
+
+static void sigalrm (int sig)
+{
+ siglongjmp(jump_env, 1);
+}
+
+typedef int (*testfilefunc)(const gchar *filepath);
+
+/*
+ * Test all files in a given subdir of either the build or source directory
+ */
+static void
+TestAllFilesByType(GTestFileType file_type, gboolean compressed,
+ const char *subdir, int expected, testfilefunc testfunc)
+{
+ const gchar *datadir_path, *filename;
+ GDir *datadir;
+ GError *err = NULL;
+ int timeout = DEFAULT_TIMEOUT;
+ char *timeout_env;
+
+ GPatternSpec *xpm_pattern = g_pattern_spec_new("*.xpm");
+#ifndef NO_ZPIPE
+ GPatternSpec *z_pattern = compressed ? g_pattern_spec_new("*.xpm.Z") : NULL;
+ GPatternSpec *gz_pattern = compressed ? g_pattern_spec_new("*.xpm.gz") : NULL;
+#endif
+
+ /* Allow override when debugging tests */
+ timeout_env = getenv("XPM_TEST_TIMEOUT");
+ if (timeout_env != NULL) {
+ int from_env = atoi(timeout_env);
+
+ if (from_env >= 0)
+ timeout = from_env;
+ }
+
+ datadir_path = g_test_get_filename(file_type, "pixmaps", subdir,
+ (file_type == G_TEST_BUILT) ? "generated" : NULL, NULL);
+ g_assert_nonnull(datadir_path);
+ g_test_message("Reading files from %s", datadir_path);
+
+ datadir = g_dir_open(datadir_path, 0, &err);
+ g_assert_no_error(err);
+
+ errno = 0;
+ while ((filename = g_dir_read_name(datadir)) != NULL) {
+
+ if (!g_pattern_match_string(xpm_pattern, filename)) {
+#ifndef NO_ZPIPE
+ if (!compressed ||
+ (!g_pattern_match_string(z_pattern, filename) &&
+ !g_pattern_match_string(gz_pattern, filename)))
+#endif
+ {
+ g_test_message("skipping \"%s\"", filename);
+ continue;
+ }
+ }
+
+ /*
+ * Assumes the test function should complete in less than "timeout"
+ * seconds and fails if they don't, in order to catch runaway loops.
+ */
+ if (timeout > 0) {
+ struct sigaction sa = {
+ .sa_handler = sigalrm,
+ .sa_flags = SA_RESTART
+ };
+ sigemptyset (&sa.sa_mask);
+ sigaction(SIGALRM, &sa, NULL);
+ }
+
+ if (sigsetjmp(jump_env, 1) == 0) {
+ int status;
+ gchar *filepath;
+
+ filepath = g_build_filename(datadir_path, filename, NULL);
+
+ g_test_message("testing \"%s\", should return %d",
+ filename, expected);
+ if (timeout > 0)
+ alarm(timeout);
+ status = testfunc(filepath);
+ g_assert_cmpint(status, ==, expected);
+
+ if (timeout > 0) {
+ status = alarm(0); /* cancel alarm */
+ g_test_message("%d seconds left on %d second timer",
+ status, timeout);
+ }
+
+ g_free(filepath);
+ }
+ else {
+ g_test_message("timed out reading %s", filename);
+ g_assertion_message(G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC,
+ "test timed out");
+ }
+
+ errno = 0;
+ }
+ // g_assert_cmpint(errno, ==, 0); - not sure why this sometimes fails
+
+ g_dir_close(datadir);
+}
+
+/*
+ * Test all non-compressed files in a given subdir
+ */
+static void
+TestAllNormalFiles(const char *subdir, int expected, testfilefunc testfunc)
+{
+ TestAllFilesByType(G_TEST_DIST, FALSE, subdir, expected, testfunc);
+}
+
+/*
+ * Test all compressed files in a given subdir
+ */
+static void
+TestAllCompressedFiles(const char *subdir, int expected, testfilefunc testfunc)
+{
+ TestAllFilesByType(G_TEST_BUILT, TRUE, subdir, expected, testfunc);
+}