summaryrefslogtreecommitdiff
path: root/test/internals
diff options
context:
space:
mode:
authorSimon McVittie <smcv@collabora.com>2018-11-20 12:48:51 +0000
committerSimon McVittie <smcv@collabora.com>2018-11-20 12:58:17 +0000
commita889e5aa8ca98c2b4951182499f6f17c33509e70 (patch)
tree1a2c096d51e8be20658b1b1da340e19e642accc9 /test/internals
parent77327b7bd897985261315e38e8524c21c266b1f0 (diff)
downloaddbus-a889e5aa8ca98c2b4951182499f6f17c33509e70.tar.gz
Add a test for assertions
Signed-off-by: Simon McVittie <smcv@collabora.com>
Diffstat (limited to 'test/internals')
-rw-r--r--test/internals/assertions.c235
1 files changed, 235 insertions, 0 deletions
diff --git a/test/internals/assertions.c b/test/internals/assertions.c
new file mode 100644
index 00000000..92f905c8
--- /dev/null
+++ b/test/internals/assertions.c
@@ -0,0 +1,235 @@
+/*
+ * Copyright © 2018 Collabora Ltd.
+ *
+ * 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 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 <config.h>
+
+#include <dbus/dbus.h>
+#include "dbus/dbus-internals.h"
+#include "test-utils-glib.h"
+
+typedef struct
+{
+ int dummy;
+} Fixture;
+
+static void
+setup (Fixture *f G_GNUC_UNUSED,
+ gconstpointer context G_GNUC_UNUSED)
+{
+}
+
+#if defined(DBUS_ENABLE_ASSERT) == defined(DBUS_DISABLE_ASSERT)
+# error Macros contradict
+#endif
+
+#if defined(DBUS_ENABLE_CHECKS) == defined(DBUS_DISABLE_CHECKS)
+# error Macros contradict
+#endif
+
+static void
+test_assert (Fixture *f,
+ gconstpointer context G_GNUC_UNUSED)
+{
+#ifdef DBUS_ENABLE_ASSERT
+ if (!g_test_undefined ())
+ {
+ g_test_skip ("Not testing programming errors");
+ }
+ else if (g_test_subprocess ())
+ {
+ dbus_setenv ("DBUS_BLOCK_ON_ABORT", NULL);
+ _dbus_disable_crash_handling ();
+ _dbus_assert (42 == 23);
+ }
+ else
+ {
+ g_test_trap_subprocess (NULL, 0, 0);
+ g_test_trap_assert_failed ();
+ g_test_trap_assert_stderr ("*42 == 23*");
+ }
+#else
+ g_test_skip ("Assertions disabled");
+#endif
+}
+
+static void
+test_assert_error_is_set (Fixture *f,
+ gconstpointer context G_GNUC_UNUSED)
+{
+ DBusError e = DBUS_ERROR_INIT;
+ DBusError *ep = NULL;
+
+#if defined(DBUS_ENABLE_ASSERT) && defined(DBUS_ENABLE_CHECKS)
+ if (!g_test_undefined ())
+ {
+ g_test_skip ("Not testing programming errors");
+ }
+ else if (g_test_subprocess ())
+ {
+ dbus_setenv ("DBUS_BLOCK_ON_ABORT", NULL);
+ _dbus_disable_crash_handling ();
+ _DBUS_ASSERT_ERROR_IS_SET (&e);
+ }
+ else
+ {
+ g_test_trap_subprocess (NULL, 0, 0);
+ g_test_trap_assert_failed ();
+ }
+
+ _DBUS_SET_OOM (&e);
+ _DBUS_ASSERT_ERROR_IS_SET (&e);
+ _DBUS_ASSERT_ERROR_IS_SET (ep);
+ dbus_error_free (&e);
+#else
+ g_test_skip ("Assertions or checks disabled");
+#endif
+}
+
+static void
+test_assert_error_is_clear (Fixture *f,
+ gconstpointer context G_GNUC_UNUSED)
+{
+#if defined(DBUS_ENABLE_ASSERT) && defined(DBUS_ENABLE_CHECKS)
+ DBusError e = DBUS_ERROR_INIT;
+ DBusError *ep = NULL;
+
+ if (!g_test_undefined ())
+ {
+ g_test_skip ("Not testing programming errors");
+ }
+ else if (g_test_subprocess ())
+ {
+ dbus_setenv ("DBUS_BLOCK_ON_ABORT", NULL);
+ _dbus_disable_crash_handling ();
+ _DBUS_SET_OOM (&e);
+ _DBUS_ASSERT_ERROR_IS_CLEAR (&e);
+ }
+ else
+ {
+ g_test_trap_subprocess (NULL, 0, 0);
+ g_test_trap_assert_failed ();
+ }
+
+ _DBUS_ASSERT_ERROR_IS_CLEAR (&e);
+ _DBUS_ASSERT_ERROR_IS_CLEAR (ep);
+#else
+ g_test_skip ("Assertions or checks disabled");
+#endif
+}
+
+static void
+test_assert_error_xor_true (Fixture *f,
+ gconstpointer context G_GNUC_UNUSED)
+{
+#if defined(DBUS_ENABLE_ASSERT) && defined(DBUS_ENABLE_CHECKS)
+ DBusError e = DBUS_ERROR_INIT;
+ DBusError *ep = NULL;
+ dbus_bool_t retval = TRUE;
+
+ if (!g_test_undefined ())
+ {
+ g_test_skip ("Not testing programming errors");
+ }
+ else if (g_test_subprocess ())
+ {
+ dbus_setenv ("DBUS_BLOCK_ON_ABORT", NULL);
+ _dbus_disable_crash_handling ();
+ _DBUS_SET_OOM (&e);
+ _DBUS_ASSERT_ERROR_XOR_BOOL (&e, retval);
+ }
+ else
+ {
+ g_test_trap_subprocess (NULL, 0, 0);
+ g_test_trap_assert_failed ();
+ }
+
+ _DBUS_ASSERT_ERROR_XOR_BOOL (&e, retval);
+ _DBUS_ASSERT_ERROR_XOR_BOOL (ep, retval);
+#else
+ g_test_skip ("Assertions or checks disabled");
+#endif
+}
+
+static void
+test_assert_error_xor_false (Fixture *f,
+ gconstpointer context G_GNUC_UNUSED)
+{
+#if defined(DBUS_ENABLE_ASSERT) && defined(DBUS_ENABLE_CHECKS)
+ DBusError e = DBUS_ERROR_INIT;
+ DBusError *ep = NULL;
+ void *retval = NULL;
+
+ if (!g_test_undefined ())
+ {
+ g_test_skip ("Not testing programming errors");
+ }
+ else if (g_test_subprocess ())
+ {
+ dbus_setenv ("DBUS_BLOCK_ON_ABORT", NULL);
+ _dbus_disable_crash_handling ();
+ _DBUS_ASSERT_ERROR_XOR_BOOL (&e, retval != NULL);
+ }
+ else
+ {
+ g_test_trap_subprocess (NULL, 0, 0);
+ g_test_trap_assert_failed ();
+ }
+
+ _DBUS_SET_OOM (&e);
+ _DBUS_ASSERT_ERROR_XOR_BOOL (&e, retval != NULL);
+ _DBUS_ASSERT_ERROR_XOR_BOOL (ep, retval != NULL);
+#else
+ g_test_skip ("Assertions or checks disabled");
+#endif
+}
+
+static void
+teardown (Fixture *f G_GNUC_UNUSED,
+ gconstpointer context G_GNUC_UNUSED)
+{
+}
+
+int
+main (int argc,
+ char **argv)
+{
+ int ret;
+
+ test_init (&argc, &argv);
+
+ g_test_add ("/assertions/assert",
+ Fixture, NULL, setup, test_assert, teardown);
+ g_test_add ("/assertions/assert_error_is_set",
+ Fixture, NULL, setup, test_assert_error_is_set, teardown);
+ g_test_add ("/assertions/assert_error_is_clear",
+ Fixture, NULL, setup, test_assert_error_is_clear, teardown);
+ g_test_add ("/assertions/assert_error_xor_true",
+ Fixture, NULL, setup, test_assert_error_xor_true, teardown);
+ g_test_add ("/assertions/assert_error_xor_false",
+ Fixture, NULL, setup, test_assert_error_xor_false, teardown);
+
+ ret = g_test_run ();
+ dbus_shutdown ();
+ return ret;
+}