summaryrefslogtreecommitdiff
path: root/glnx-backport-testutils.c
diff options
context:
space:
mode:
Diffstat (limited to 'glnx-backport-testutils.c')
-rw-r--r--glnx-backport-testutils.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/glnx-backport-testutils.c b/glnx-backport-testutils.c
new file mode 100644
index 0000000..31105c9
--- /dev/null
+++ b/glnx-backport-testutils.c
@@ -0,0 +1,145 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright 2015 Colin Walters
+ * Copyright 2020 Niels De Graef
+ * Copyright 2021-2022 Collabora Ltd.
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the licence or (at
+ * your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "libglnx-config.h"
+
+#include <string.h>
+#include <unistd.h>
+
+#include <glib/gprintf.h>
+
+#include "glnx-backport-autocleanups.h"
+#include "glnx-backport-autoptr.h"
+#include "glnx-backport-testutils.h"
+#include "glnx-backports.h"
+
+#if !GLIB_CHECK_VERSION (2, 68, 0)
+/* Backport of g_assertion_message_cmpstrv() */
+void
+_glnx_assertion_message_cmpstrv (const char *domain,
+ const char *file,
+ int line,
+ const char *func,
+ const char *expr,
+ const char * const *arg1,
+ const char * const *arg2,
+ gsize first_wrong_idx)
+{
+ const char *s1 = arg1[first_wrong_idx], *s2 = arg2[first_wrong_idx];
+ char *a1, *a2, *s, *t1 = NULL, *t2 = NULL;
+
+ a1 = g_strconcat ("\"", t1 = g_strescape (s1, NULL), "\"", NULL);
+ a2 = g_strconcat ("\"", t2 = g_strescape (s2, NULL), "\"", NULL);
+ g_free (t1);
+ g_free (t2);
+ s = g_strdup_printf ("assertion failed (%s): first differing element at index %" G_GSIZE_FORMAT ": %s does not equal %s",
+ expr, first_wrong_idx, a1, a2);
+ g_free (a1);
+ g_free (a2);
+ g_assertion_message (domain, file, line, func, s);
+ g_free (s);
+}
+#endif
+
+#if !GLIB_CHECK_VERSION(2, 70, 0)
+/*
+ * Same as g_test_message(), but split messages with newlines into
+ * multiple separate messages to avoid corrupting stdout, even in older
+ * GLib versions that didn't do this
+ */
+void
+_glnx_test_message_safe (const char *format,
+ ...)
+{
+ g_autofree char *message = NULL;
+ va_list ap;
+ char *line;
+ char *saveptr = NULL;
+
+ va_start (ap, format);
+ g_vasprintf (&message, format, ap);
+ va_end (ap);
+
+ for (line = strtok_r (message, "\n", &saveptr);
+ line != NULL;
+ line = strtok_r (NULL, "\n", &saveptr))
+ (g_test_message) ("%s", line);
+}
+
+/* Backport of g_test_fail_printf() */
+void
+_glnx_test_fail_printf (const char *format,
+ ...)
+{
+ g_autofree char *message = NULL;
+ va_list ap;
+
+ va_start (ap, format);
+ g_vasprintf (&message, format, ap);
+ va_end (ap);
+
+ /* This is the closest we can do in older GLib */
+ g_test_message ("Bail out! %s", message);
+ g_test_fail ();
+}
+
+/* Backport of g_test_skip_printf() */
+void
+_glnx_test_skip_printf (const char *format,
+ ...)
+{
+ g_autofree char *message = NULL;
+ va_list ap;
+
+ va_start (ap, format);
+ g_vasprintf (&message, format, ap);
+ va_end (ap);
+
+ g_test_skip (message);
+}
+
+/* Backport of g_test_incomplete_printf() */
+void
+_glnx_test_incomplete_printf (const char *format,
+ ...)
+{
+ g_autofree char *message = NULL;
+ va_list ap;
+
+ va_start (ap, format);
+ g_vasprintf (&message, format, ap);
+ va_end (ap);
+
+#if GLIB_CHECK_VERSION(2, 58, 0)
+ /* Since 2.58, g_test_incomplete() sets the exit status correctly. */
+ g_test_incomplete (message);
+#elif GLIB_CHECK_VERSION (2, 38, 0)
+ /* Before 2.58, g_test_incomplete() was treated like a failure for the
+ * purposes of setting the exit status, so prefer to use (our wrapper
+ * around) g_test_skip(). */
+ g_test_skip_printf ("TODO: %s", message);
+#else
+ g_test_message ("TODO: %s", message);
+#endif
+}
+#endif