diff options
author | Alan Coopersmith <alan.coopersmith@oracle.com> | 2023-01-07 13:39:56 -0800 |
---|---|---|
committer | Alan Coopersmith <alan.coopersmith@oracle.com> | 2023-01-08 14:50:03 -0800 |
commit | 501494c6c68a84114fdd0b44d4b67ef9cde776c9 (patch) | |
tree | fb5b1c7483d8f6859f52ed93c8ea931a1dde11ad /test/TestAllFiles.h | |
parent | 4841039e5385f264d12757903894f47c64f59361 (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.h | 160 |
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); +} |