summaryrefslogtreecommitdiff
path: root/support/support_test_compare_blob.c
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2018-05-16 17:00:35 +0200
committerFlorian Weimer <fweimer@redhat.com>2018-05-16 17:00:36 +0200
commit2afece36f6006844e87d7cb2fcb1ad8b220b2623 (patch)
tree52958dc70aaab18d73b3b3ecafc8adfacd0b7131 /support/support_test_compare_blob.c
parent9761bf4dfae04016bccaa82414719523b090dd60 (diff)
support: Add TEST_COMPARE_BLOB, support_quote_blob
The declaration of support_test_compare_blob uses unsigned long int, to avoid including <stddef.h>. Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'support/support_test_compare_blob.c')
-rw-r--r--support/support_test_compare_blob.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/support/support_test_compare_blob.c b/support/support_test_compare_blob.c
new file mode 100644
index 0000000000..c5e63d1b93
--- /dev/null
+++ b/support/support_test_compare_blob.c
@@ -0,0 +1,76 @@
+/* Check two binary blobs for equality.
+ Copyright (C) 2018 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library 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 License, or (at your option) any later version.
+
+ The GNU C 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 the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <support/check.h>
+#include <support/support.h>
+#include <support/xmemstream.h>
+
+static void
+report_length (const char *what, unsigned long int length, const char *expr)
+{
+ printf (" %s %lu bytes (from %s)\n", what, length, expr);
+}
+
+static void
+report_blob (const char *what, const unsigned char *blob,
+ unsigned long int length, const char *expr)
+{
+ if (length > 0)
+ {
+ printf (" %s (evaluated from %s):\n", what, expr);
+ char *quoted = support_quote_blob (blob, length);
+ printf (" \"%s\"\n", quoted);
+ free (quoted);
+
+ fputs (" ", stdout);
+ for (unsigned long i = 0; i < length; ++i)
+ printf (" %02X", blob[i]);
+ putc ('\n', stdout);
+ }
+}
+
+void
+support_test_compare_blob (const void *left, unsigned long int left_length,
+ const void *right, unsigned long int right_length,
+ const char *file, int line,
+ const char *left_expr, const char *left_len_expr,
+ const char *right_expr, const char *right_len_expr)
+{
+ /* No differences are possible if both lengths are null. */
+ if (left_length == 0 && right_length == 0)
+ return;
+
+ if (left_length != right_length || left == NULL || right == NULL
+ || memcmp (left, right, left_length) != 0)
+ {
+ support_record_failure ();
+ printf ("%s:%d: error: blob comparison failed\n", file, line);
+ if (left_length == right_length)
+ printf (" blob length: %lu bytes\n", left_length);
+ else
+ {
+ report_length ("left length: ", left_length, left_len_expr);
+ report_length ("right length:", right_length, right_len_expr);
+ }
+ report_blob ("left", left, left_length, left_expr);
+ report_blob ("right", right, right_length, right_expr);
+ }
+}