1295367Sdes/*	$OpenBSD: test_helper.c,v 1.6 2015/03/03 20:42:49 djm Exp $	*/
2276707Sdes/*
3276707Sdes * Copyright (c) 2011 Damien Miller <djm@mindrot.org>
4276707Sdes *
5276707Sdes * Permission to use, copy, modify, and distribute this software for any
6276707Sdes * purpose with or without fee is hereby granted, provided that the above
7276707Sdes * copyright notice and this permission notice appear in all copies.
8276707Sdes *
9276707Sdes * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10276707Sdes * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11276707Sdes * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12276707Sdes * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13276707Sdes * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14276707Sdes * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15276707Sdes * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16276707Sdes */
17276707Sdes
18276707Sdes/* Utility functions/framework for regress tests */
19276707Sdes
20276707Sdes#include "includes.h"
21276707Sdes
22276707Sdes#include <sys/types.h>
23276707Sdes#include <sys/param.h>
24295367Sdes#include <sys/uio.h>
25276707Sdes
26276707Sdes#include <fcntl.h>
27276707Sdes#include <stdio.h>
28276707Sdes#ifdef HAVE_STDINT_H
29276707Sdes# include <stdint.h>
30276707Sdes#endif
31276707Sdes#include <stdlib.h>
32276707Sdes#include <string.h>
33276707Sdes#include <assert.h>
34276707Sdes#include <unistd.h>
35295367Sdes#include <signal.h>
36276707Sdes
37276707Sdes#include <openssl/bn.h>
38276707Sdes
39276707Sdes#if defined(HAVE_STRNVIS) && defined(HAVE_VIS_H) && !defined(BROKEN_STRNVIS)
40276707Sdes# include <vis.h>
41276707Sdes#endif
42276707Sdes
43276707Sdes#include "test_helper.h"
44295367Sdes#include "atomicio.h"
45276707Sdes
46276707Sdes#define TEST_CHECK_INT(r, pred) do {		\
47276707Sdes		switch (pred) {			\
48276707Sdes		case TEST_EQ:			\
49276707Sdes			if (r == 0)		\
50276707Sdes				return;		\
51276707Sdes			break;			\
52276707Sdes		case TEST_NE:			\
53276707Sdes			if (r != 0)		\
54276707Sdes				return;		\
55276707Sdes			break;			\
56276707Sdes		case TEST_LT:			\
57276707Sdes			if (r < 0)		\
58276707Sdes				return;		\
59276707Sdes			break;			\
60276707Sdes		case TEST_LE:			\
61276707Sdes			if (r <= 0)		\
62276707Sdes				return;		\
63276707Sdes			break;			\
64276707Sdes		case TEST_GT:			\
65276707Sdes			if (r > 0)		\
66276707Sdes				return;		\
67276707Sdes			break;			\
68276707Sdes		case TEST_GE:			\
69276707Sdes			if (r >= 0)		\
70276707Sdes				return;		\
71276707Sdes			break;			\
72276707Sdes		default:			\
73276707Sdes			abort();		\
74276707Sdes		}				\
75276707Sdes	} while (0)
76276707Sdes
77276707Sdes#define TEST_CHECK(x1, x2, pred) do {		\
78276707Sdes		switch (pred) {			\
79276707Sdes		case TEST_EQ:			\
80276707Sdes			if (x1 == x2)		\
81276707Sdes				return;		\
82276707Sdes			break;			\
83276707Sdes		case TEST_NE:			\
84276707Sdes			if (x1 != x2)		\
85276707Sdes				return;		\
86276707Sdes			break;			\
87276707Sdes		case TEST_LT:			\
88276707Sdes			if (x1 < x2)		\
89276707Sdes				return;		\
90276707Sdes			break;			\
91276707Sdes		case TEST_LE:			\
92276707Sdes			if (x1 <= x2)		\
93276707Sdes				return;		\
94276707Sdes			break;			\
95276707Sdes		case TEST_GT:			\
96276707Sdes			if (x1 > x2)		\
97276707Sdes				return;		\
98276707Sdes			break;			\
99276707Sdes		case TEST_GE:			\
100276707Sdes			if (x1 >= x2)		\
101276707Sdes				return;		\
102276707Sdes			break;			\
103276707Sdes		default:			\
104276707Sdes			abort();		\
105276707Sdes		}				\
106276707Sdes	} while (0)
107276707Sdes
108276707Sdesextern char *__progname;
109276707Sdes
110276707Sdesstatic int verbose_mode = 0;
111276707Sdesstatic int quiet_mode = 0;
112276707Sdesstatic char *active_test_name = NULL;
113276707Sdesstatic u_int test_number = 0;
114276707Sdesstatic test_onerror_func_t *test_onerror = NULL;
115276707Sdesstatic void *onerror_ctx = NULL;
116276707Sdesstatic const char *data_dir = NULL;
117295367Sdesstatic char subtest_info[512];
118276707Sdes
119276707Sdesint
120276707Sdesmain(int argc, char **argv)
121276707Sdes{
122276707Sdes	int ch;
123276707Sdes
124276707Sdes	/* Handle systems without __progname */
125276707Sdes	if (__progname == NULL) {
126276707Sdes		__progname = strrchr(argv[0], '/');
127276707Sdes		if (__progname == NULL || __progname[1] == '\0')
128276707Sdes			__progname = argv[0];
129276707Sdes		else
130276707Sdes			__progname++;
131276707Sdes		if ((__progname = strdup(__progname)) == NULL) {
132276707Sdes			fprintf(stderr, "strdup failed\n");
133276707Sdes			exit(1);
134276707Sdes		}
135276707Sdes	}
136276707Sdes
137276707Sdes	while ((ch = getopt(argc, argv, "vqd:")) != -1) {
138276707Sdes		switch (ch) {
139276707Sdes		case 'd':
140276707Sdes			data_dir = optarg;
141276707Sdes			break;
142276707Sdes		case 'q':
143276707Sdes			verbose_mode = 0;
144276707Sdes			quiet_mode = 1;
145276707Sdes			break;
146276707Sdes		case 'v':
147276707Sdes			verbose_mode = 1;
148276707Sdes			quiet_mode = 0;
149276707Sdes			break;
150276707Sdes		default:
151276707Sdes			fprintf(stderr, "Unrecognised command line option\n");
152276707Sdes			fprintf(stderr, "Usage: %s [-v]\n", __progname);
153276707Sdes			exit(1);
154276707Sdes		}
155276707Sdes	}
156276707Sdes	setvbuf(stdout, NULL, _IONBF, 0);
157276707Sdes	if (!quiet_mode)
158276707Sdes		printf("%s: ", __progname);
159276707Sdes	if (verbose_mode)
160276707Sdes		printf("\n");
161276707Sdes
162276707Sdes	tests();
163276707Sdes
164276707Sdes	if (!quiet_mode)
165276707Sdes		printf(" %u tests ok\n", test_number);
166276707Sdes	return 0;
167276707Sdes}
168276707Sdes
169276707Sdesconst char *
170276707Sdestest_data_file(const char *name)
171276707Sdes{
172276707Sdes	static char ret[PATH_MAX];
173276707Sdes
174276707Sdes	if (data_dir != NULL)
175276707Sdes		snprintf(ret, sizeof(ret), "%s/%s", data_dir, name);
176276707Sdes	else
177276707Sdes		strlcpy(ret, name, sizeof(ret));
178276707Sdes	if (access(ret, F_OK) != 0) {
179276707Sdes		fprintf(stderr, "Cannot access data file %s: %s\n",
180276707Sdes		    ret, strerror(errno));
181276707Sdes		exit(1);
182276707Sdes	}
183276707Sdes	return ret;
184276707Sdes}
185276707Sdes
186276707Sdesvoid
187295367Sdestest_info(char *s, size_t len)
188295367Sdes{
189295367Sdes	snprintf(s, len, "In test %u: \"%s\"%s%s\n", test_number,
190295367Sdes	    active_test_name == NULL ? "<none>" : active_test_name,
191295367Sdes	    *subtest_info != '\0' ? " - " : "", subtest_info);
192295367Sdes}
193295367Sdes
194295367Sdes#ifdef SIGINFO
195295367Sdesstatic void
196295367Sdessiginfo(int unused __attribute__((__unused__)))
197295367Sdes{
198295367Sdes	char buf[256];
199295367Sdes
200295367Sdes	test_info(buf, sizeof(buf));
201295367Sdes	atomicio(vwrite, STDERR_FILENO, buf, strlen(buf));
202295367Sdes}
203295367Sdes#endif
204295367Sdes
205295367Sdesvoid
206276707Sdestest_start(const char *n)
207276707Sdes{
208276707Sdes	assert(active_test_name == NULL);
209276707Sdes	assert((active_test_name = strdup(n)) != NULL);
210295367Sdes	*subtest_info = '\0';
211276707Sdes	if (verbose_mode)
212276707Sdes		printf("test %u - \"%s\": ", test_number, active_test_name);
213276707Sdes	test_number++;
214295367Sdes#ifdef SIGINFO
215295367Sdes	signal(SIGINFO, siginfo);
216295367Sdes#endif
217276707Sdes}
218276707Sdes
219276707Sdesvoid
220276707Sdesset_onerror_func(test_onerror_func_t *f, void *ctx)
221276707Sdes{
222276707Sdes	test_onerror = f;
223276707Sdes	onerror_ctx = ctx;
224276707Sdes}
225276707Sdes
226276707Sdesvoid
227276707Sdestest_done(void)
228276707Sdes{
229295367Sdes	*subtest_info = '\0';
230276707Sdes	assert(active_test_name != NULL);
231276707Sdes	free(active_test_name);
232276707Sdes	active_test_name = NULL;
233276707Sdes	if (verbose_mode)
234276707Sdes		printf("OK\n");
235276707Sdes	else if (!quiet_mode) {
236276707Sdes		printf(".");
237276707Sdes		fflush(stdout);
238276707Sdes	}
239276707Sdes}
240276707Sdes
241276707Sdesvoid
242295367Sdestest_subtest_info(const char *fmt, ...)
243295367Sdes{
244295367Sdes	va_list ap;
245295367Sdes
246295367Sdes	va_start(ap, fmt);
247295367Sdes	vsnprintf(subtest_info, sizeof(subtest_info), fmt, ap);
248295367Sdes	va_end(ap);
249295367Sdes}
250295367Sdes
251295367Sdesvoid
252276707Sdesssl_err_check(const char *file, int line)
253276707Sdes{
254276707Sdes	long openssl_error = ERR_get_error();
255276707Sdes
256276707Sdes	if (openssl_error == 0)
257276707Sdes		return;
258276707Sdes
259276707Sdes	fprintf(stderr, "\n%s:%d: uncaught OpenSSL error: %s",
260276707Sdes	    file, line, ERR_error_string(openssl_error, NULL));
261276707Sdes	abort();
262276707Sdes}
263276707Sdes
264276707Sdesstatic const char *
265276707Sdespred_name(enum test_predicate p)
266276707Sdes{
267276707Sdes	switch (p) {
268276707Sdes	case TEST_EQ:
269276707Sdes		return "EQ";
270276707Sdes	case TEST_NE:
271276707Sdes		return "NE";
272276707Sdes	case TEST_LT:
273276707Sdes		return "LT";
274276707Sdes	case TEST_LE:
275276707Sdes		return "LE";
276276707Sdes	case TEST_GT:
277276707Sdes		return "GT";
278276707Sdes	case TEST_GE:
279276707Sdes		return "GE";
280276707Sdes	default:
281276707Sdes		return "UNKNOWN";
282276707Sdes	}
283276707Sdes}
284276707Sdes
285276707Sdesstatic void
286276707Sdestest_die(void)
287276707Sdes{
288276707Sdes	if (test_onerror != NULL)
289276707Sdes		test_onerror(onerror_ctx);
290276707Sdes	abort();
291276707Sdes}
292276707Sdes
293276707Sdesstatic void
294276707Sdestest_header(const char *file, int line, const char *a1, const char *a2,
295276707Sdes    const char *name, enum test_predicate pred)
296276707Sdes{
297295367Sdes	fprintf(stderr, "\n%s:%d test #%u \"%s\"%s%s\n",
298295367Sdes	    file, line, test_number, active_test_name,
299295367Sdes	    *subtest_info != '\0' ? " - " : "", subtest_info);
300276707Sdes	fprintf(stderr, "ASSERT_%s_%s(%s%s%s) failed:\n",
301276707Sdes	    name, pred_name(pred), a1,
302276707Sdes	    a2 != NULL ? ", " : "", a2 != NULL ? a2 : "");
303276707Sdes}
304276707Sdes
305276707Sdesvoid
306276707Sdesassert_bignum(const char *file, int line, const char *a1, const char *a2,
307276707Sdes    const BIGNUM *aa1, const BIGNUM *aa2, enum test_predicate pred)
308276707Sdes{
309276707Sdes	int r = BN_cmp(aa1, aa2);
310276707Sdes
311276707Sdes	TEST_CHECK_INT(r, pred);
312276707Sdes	test_header(file, line, a1, a2, "BIGNUM", pred);
313276707Sdes	fprintf(stderr, "%12s = 0x%s\n", a1, BN_bn2hex(aa1));
314276707Sdes	fprintf(stderr, "%12s = 0x%s\n", a2, BN_bn2hex(aa2));
315276707Sdes	test_die();
316276707Sdes}
317276707Sdes
318276707Sdesvoid
319276707Sdesassert_string(const char *file, int line, const char *a1, const char *a2,
320276707Sdes    const char *aa1, const char *aa2, enum test_predicate pred)
321276707Sdes{
322295367Sdes	int r;
323276707Sdes
324295367Sdes	/* Verify pointers are not NULL */
325295367Sdes	assert_ptr(file, line, a1, "NULL", aa1, NULL, TEST_NE);
326295367Sdes	assert_ptr(file, line, a2, "NULL", aa2, NULL, TEST_NE);
327295367Sdes
328295367Sdes	r = strcmp(aa1, aa2);
329276707Sdes	TEST_CHECK_INT(r, pred);
330276707Sdes	test_header(file, line, a1, a2, "STRING", pred);
331276707Sdes	fprintf(stderr, "%12s = %s (len %zu)\n", a1, aa1, strlen(aa1));
332276707Sdes	fprintf(stderr, "%12s = %s (len %zu)\n", a2, aa2, strlen(aa2));
333276707Sdes	test_die();
334276707Sdes}
335276707Sdes
336276707Sdesstatic char *
337276707Sdestohex(const void *_s, size_t l)
338276707Sdes{
339276707Sdes	u_int8_t *s = (u_int8_t *)_s;
340276707Sdes	size_t i, j;
341276707Sdes	const char *hex = "0123456789abcdef";
342276707Sdes	char *r = malloc((l * 2) + 1);
343276707Sdes
344276707Sdes	assert(r != NULL);
345276707Sdes	for (i = j = 0; i < l; i++) {
346276707Sdes		r[j++] = hex[(s[i] >> 4) & 0xf];
347276707Sdes		r[j++] = hex[s[i] & 0xf];
348276707Sdes	}
349276707Sdes	r[j] = '\0';
350276707Sdes	return r;
351276707Sdes}
352276707Sdes
353276707Sdesvoid
354276707Sdesassert_mem(const char *file, int line, const char *a1, const char *a2,
355276707Sdes    const void *aa1, const void *aa2, size_t l, enum test_predicate pred)
356276707Sdes{
357295367Sdes	int r;
358276707Sdes
359295367Sdes	if (l == 0)
360295367Sdes		return;
361295367Sdes	/* If length is >0, then verify pointers are not NULL */
362295367Sdes	assert_ptr(file, line, a1, "NULL", aa1, NULL, TEST_NE);
363295367Sdes	assert_ptr(file, line, a2, "NULL", aa2, NULL, TEST_NE);
364295367Sdes
365295367Sdes	r = memcmp(aa1, aa2, l);
366276707Sdes	TEST_CHECK_INT(r, pred);
367276707Sdes	test_header(file, line, a1, a2, "STRING", pred);
368276707Sdes	fprintf(stderr, "%12s = %s (len %zu)\n", a1, tohex(aa1, MIN(l, 256)), l);
369276707Sdes	fprintf(stderr, "%12s = %s (len %zu)\n", a2, tohex(aa2, MIN(l, 256)), l);
370276707Sdes	test_die();
371276707Sdes}
372276707Sdes
373276707Sdesstatic int
374276707Sdesmemvalcmp(const u_int8_t *s, u_char v, size_t l, size_t *where)
375276707Sdes{
376276707Sdes	size_t i;
377276707Sdes
378276707Sdes	for (i = 0; i < l; i++) {
379276707Sdes		if (s[i] != v) {
380276707Sdes			*where = i;
381276707Sdes			return 1;
382276707Sdes		}
383276707Sdes	}
384276707Sdes	return 0;
385276707Sdes}
386276707Sdes
387276707Sdesvoid
388276707Sdesassert_mem_filled(const char *file, int line, const char *a1,
389276707Sdes    const void *aa1, u_char v, size_t l, enum test_predicate pred)
390276707Sdes{
391276707Sdes	size_t where = -1;
392295367Sdes	int r;
393276707Sdes	char tmp[64];
394276707Sdes
395276707Sdes	if (l == 0)
396276707Sdes		return;
397295367Sdes	/* If length is >0, then verify the pointer is not NULL */
398295367Sdes	assert_ptr(file, line, a1, "NULL", aa1, NULL, TEST_NE);
399295367Sdes
400295367Sdes	r = memvalcmp(aa1, v, l, &where);
401276707Sdes	TEST_CHECK_INT(r, pred);
402276707Sdes	test_header(file, line, a1, NULL, "MEM_ZERO", pred);
403276707Sdes	fprintf(stderr, "%20s = %s%s (len %zu)\n", a1,
404276707Sdes	    tohex(aa1, MIN(l, 20)), l > 20 ? "..." : "", l);
405276707Sdes	snprintf(tmp, sizeof(tmp), "(%s)[%zu]", a1, where);
406276707Sdes	fprintf(stderr, "%20s = 0x%02x (expected 0x%02x)\n", tmp,
407276707Sdes	    ((u_char *)aa1)[where], v);
408276707Sdes	test_die();
409276707Sdes}
410276707Sdes
411276707Sdesvoid
412276707Sdesassert_int(const char *file, int line, const char *a1, const char *a2,
413276707Sdes    int aa1, int aa2, enum test_predicate pred)
414276707Sdes{
415276707Sdes	TEST_CHECK(aa1, aa2, pred);
416276707Sdes	test_header(file, line, a1, a2, "INT", pred);
417276707Sdes	fprintf(stderr, "%12s = %d\n", a1, aa1);
418276707Sdes	fprintf(stderr, "%12s = %d\n", a2, aa2);
419276707Sdes	test_die();
420276707Sdes}
421276707Sdes
422276707Sdesvoid
423276707Sdesassert_size_t(const char *file, int line, const char *a1, const char *a2,
424276707Sdes    size_t aa1, size_t aa2, enum test_predicate pred)
425276707Sdes{
426276707Sdes	TEST_CHECK(aa1, aa2, pred);
427276707Sdes	test_header(file, line, a1, a2, "SIZE_T", pred);
428276707Sdes	fprintf(stderr, "%12s = %zu\n", a1, aa1);
429276707Sdes	fprintf(stderr, "%12s = %zu\n", a2, aa2);
430276707Sdes	test_die();
431276707Sdes}
432276707Sdes
433276707Sdesvoid
434276707Sdesassert_u_int(const char *file, int line, const char *a1, const char *a2,
435276707Sdes    u_int aa1, u_int aa2, enum test_predicate pred)
436276707Sdes{
437276707Sdes	TEST_CHECK(aa1, aa2, pred);
438276707Sdes	test_header(file, line, a1, a2, "U_INT", pred);
439276707Sdes	fprintf(stderr, "%12s = %u / 0x%x\n", a1, aa1, aa1);
440276707Sdes	fprintf(stderr, "%12s = %u / 0x%x\n", a2, aa2, aa2);
441276707Sdes	test_die();
442276707Sdes}
443276707Sdes
444276707Sdesvoid
445276707Sdesassert_long_long(const char *file, int line, const char *a1, const char *a2,
446276707Sdes    long long aa1, long long aa2, enum test_predicate pred)
447276707Sdes{
448276707Sdes	TEST_CHECK(aa1, aa2, pred);
449276707Sdes	test_header(file, line, a1, a2, "LONG LONG", pred);
450276707Sdes	fprintf(stderr, "%12s = %lld / 0x%llx\n", a1, aa1, aa1);
451276707Sdes	fprintf(stderr, "%12s = %lld / 0x%llx\n", a2, aa2, aa2);
452276707Sdes	test_die();
453276707Sdes}
454276707Sdes
455276707Sdesvoid
456276707Sdesassert_char(const char *file, int line, const char *a1, const char *a2,
457276707Sdes    char aa1, char aa2, enum test_predicate pred)
458276707Sdes{
459276707Sdes	char buf[8];
460276707Sdes
461276707Sdes	TEST_CHECK(aa1, aa2, pred);
462276707Sdes	test_header(file, line, a1, a2, "CHAR", pred);
463276707Sdes	fprintf(stderr, "%12s = '%s' / 0x02%x\n", a1,
464276707Sdes	    vis(buf, aa1, VIS_SAFE|VIS_NL|VIS_TAB|VIS_OCTAL, 0), aa1);
465276707Sdes	fprintf(stderr, "%12s = '%s' / 0x02%x\n", a1,
466276707Sdes	    vis(buf, aa2, VIS_SAFE|VIS_NL|VIS_TAB|VIS_OCTAL, 0), aa2);
467276707Sdes	test_die();
468276707Sdes}
469276707Sdes
470276707Sdesvoid
471276707Sdesassert_u8(const char *file, int line, const char *a1, const char *a2,
472276707Sdes    u_int8_t aa1, u_int8_t aa2, enum test_predicate pred)
473276707Sdes{
474276707Sdes	TEST_CHECK(aa1, aa2, pred);
475276707Sdes	test_header(file, line, a1, a2, "U8", pred);
476276707Sdes	fprintf(stderr, "%12s = 0x%02x %u\n", a1, aa1, aa1);
477276707Sdes	fprintf(stderr, "%12s = 0x%02x %u\n", a2, aa2, aa2);
478276707Sdes	test_die();
479276707Sdes}
480276707Sdes
481276707Sdesvoid
482276707Sdesassert_u16(const char *file, int line, const char *a1, const char *a2,
483276707Sdes    u_int16_t aa1, u_int16_t aa2, enum test_predicate pred)
484276707Sdes{
485276707Sdes	TEST_CHECK(aa1, aa2, pred);
486276707Sdes	test_header(file, line, a1, a2, "U16", pred);
487276707Sdes	fprintf(stderr, "%12s = 0x%04x %u\n", a1, aa1, aa1);
488276707Sdes	fprintf(stderr, "%12s = 0x%04x %u\n", a2, aa2, aa2);
489276707Sdes	test_die();
490276707Sdes}
491276707Sdes
492276707Sdesvoid
493276707Sdesassert_u32(const char *file, int line, const char *a1, const char *a2,
494276707Sdes    u_int32_t aa1, u_int32_t aa2, enum test_predicate pred)
495276707Sdes{
496276707Sdes	TEST_CHECK(aa1, aa2, pred);
497276707Sdes	test_header(file, line, a1, a2, "U32", pred);
498276707Sdes	fprintf(stderr, "%12s = 0x%08x %u\n", a1, aa1, aa1);
499276707Sdes	fprintf(stderr, "%12s = 0x%08x %u\n", a2, aa2, aa2);
500276707Sdes	test_die();
501276707Sdes}
502276707Sdes
503276707Sdesvoid
504276707Sdesassert_u64(const char *file, int line, const char *a1, const char *a2,
505276707Sdes    u_int64_t aa1, u_int64_t aa2, enum test_predicate pred)
506276707Sdes{
507276707Sdes	TEST_CHECK(aa1, aa2, pred);
508276707Sdes	test_header(file, line, a1, a2, "U64", pred);
509276707Sdes	fprintf(stderr, "%12s = 0x%016llx %llu\n", a1,
510276707Sdes	    (unsigned long long)aa1, (unsigned long long)aa1);
511276707Sdes	fprintf(stderr, "%12s = 0x%016llx %llu\n", a2,
512276707Sdes	    (unsigned long long)aa2, (unsigned long long)aa2);
513276707Sdes	test_die();
514276707Sdes}
515276707Sdes
516276707Sdesvoid
517276707Sdesassert_ptr(const char *file, int line, const char *a1, const char *a2,
518276707Sdes    const void *aa1, const void *aa2, enum test_predicate pred)
519276707Sdes{
520276707Sdes	TEST_CHECK(aa1, aa2, pred);
521276707Sdes	test_header(file, line, a1, a2, "PTR", pred);
522276707Sdes	fprintf(stderr, "%12s = %p\n", a1, aa1);
523276707Sdes	fprintf(stderr, "%12s = %p\n", a2, aa2);
524276707Sdes	test_die();
525276707Sdes}
526276707Sdes
527