1*f3e7f55eSRobert Mustacchi /*
2*f3e7f55eSRobert Mustacchi * This file and its contents are supplied under the terms of the
3*f3e7f55eSRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0.
4*f3e7f55eSRobert Mustacchi * You may only use this file in accordance with the terms of version
5*f3e7f55eSRobert Mustacchi * 1.0 of the CDDL.
6*f3e7f55eSRobert Mustacchi *
7*f3e7f55eSRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this
8*f3e7f55eSRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at
9*f3e7f55eSRobert Mustacchi * http://www.illumos.org/license/CDDL.
10*f3e7f55eSRobert Mustacchi */
11*f3e7f55eSRobert Mustacchi
12*f3e7f55eSRobert Mustacchi /*
13*f3e7f55eSRobert Mustacchi * Copyright 2015 Joyent, Inc.
14*f3e7f55eSRobert Mustacchi */
15*f3e7f55eSRobert Mustacchi
16*f3e7f55eSRobert Mustacchi /*
17*f3e7f55eSRobert Mustacchi * mergeq testing routines
18*f3e7f55eSRobert Mustacchi */
19*f3e7f55eSRobert Mustacchi
20*f3e7f55eSRobert Mustacchi #include <mergeq.h>
21*f3e7f55eSRobert Mustacchi #include <stdio.h>
22*f3e7f55eSRobert Mustacchi #include <errno.h>
23*f3e7f55eSRobert Mustacchi #include <string.h>
24*f3e7f55eSRobert Mustacchi #include <stdlib.h>
25*f3e7f55eSRobert Mustacchi
26*f3e7f55eSRobert Mustacchi const char *
_umem_debug_init()27*f3e7f55eSRobert Mustacchi _umem_debug_init()
28*f3e7f55eSRobert Mustacchi {
29*f3e7f55eSRobert Mustacchi return ("default,verbose");
30*f3e7f55eSRobert Mustacchi }
31*f3e7f55eSRobert Mustacchi
32*f3e7f55eSRobert Mustacchi const char *
_umem_logging_init(void)33*f3e7f55eSRobert Mustacchi _umem_logging_init(void)
34*f3e7f55eSRobert Mustacchi {
35*f3e7f55eSRobert Mustacchi return ("fail,contents");
36*f3e7f55eSRobert Mustacchi }
37*f3e7f55eSRobert Mustacchi
38*f3e7f55eSRobert Mustacchi void *
mergeq_alloc(size_t size)39*f3e7f55eSRobert Mustacchi mergeq_alloc(size_t size)
40*f3e7f55eSRobert Mustacchi {
41*f3e7f55eSRobert Mustacchi return (malloc(size));
42*f3e7f55eSRobert Mustacchi }
43*f3e7f55eSRobert Mustacchi
44*f3e7f55eSRobert Mustacchi /*ARGSUSED*/
45*f3e7f55eSRobert Mustacchi void
mergeq_free(void * buf,size_t size)46*f3e7f55eSRobert Mustacchi mergeq_free(void *buf, size_t size)
47*f3e7f55eSRobert Mustacchi {
48*f3e7f55eSRobert Mustacchi free(buf);
49*f3e7f55eSRobert Mustacchi }
50*f3e7f55eSRobert Mustacchi
51*f3e7f55eSRobert Mustacchi static int
mqt_int(void * first,void * second,void ** outp,void * arg)52*f3e7f55eSRobert Mustacchi mqt_int(void *first, void *second, void **outp, void *arg)
53*f3e7f55eSRobert Mustacchi {
54*f3e7f55eSRobert Mustacchi uintptr_t a, b, c;
55*f3e7f55eSRobert Mustacchi a = (uintptr_t)first;
56*f3e7f55eSRobert Mustacchi b = (uintptr_t)second;
57*f3e7f55eSRobert Mustacchi c = a + b;
58*f3e7f55eSRobert Mustacchi *outp = (void *)c;
59*f3e7f55eSRobert Mustacchi
60*f3e7f55eSRobert Mustacchi return (0);
61*f3e7f55eSRobert Mustacchi }
62*f3e7f55eSRobert Mustacchi
63*f3e7f55eSRobert Mustacchi static int
mqt_append(void * first,void * second,void ** outp,void * arg)64*f3e7f55eSRobert Mustacchi mqt_append(void *first, void *second, void **outp, void *arg)
65*f3e7f55eSRobert Mustacchi {
66*f3e7f55eSRobert Mustacchi char *out;
67*f3e7f55eSRobert Mustacchi
68*f3e7f55eSRobert Mustacchi /* Yes, this leaks, don't worry about it for the test */
69*f3e7f55eSRobert Mustacchi if (asprintf(&out, "%s%s", first, second) != -1) {
70*f3e7f55eSRobert Mustacchi *outp = out;
71*f3e7f55eSRobert Mustacchi return (0);
72*f3e7f55eSRobert Mustacchi }
73*f3e7f55eSRobert Mustacchi return (-1);
74*f3e7f55eSRobert Mustacchi }
75*f3e7f55eSRobert Mustacchi
76*f3e7f55eSRobert Mustacchi static int
mqt_fatal(void * first,void * second,void ** outp,void * arg)77*f3e7f55eSRobert Mustacchi mqt_fatal(void *first, void *second, void **outp, void *arg)
78*f3e7f55eSRobert Mustacchi {
79*f3e7f55eSRobert Mustacchi return (-1);
80*f3e7f55eSRobert Mustacchi }
81*f3e7f55eSRobert Mustacchi
82*f3e7f55eSRobert Mustacchi /*
83*f3e7f55eSRobert Mustacchi * Test structures and cases. We really want mq_args to be a flexible array
84*f3e7f55eSRobert Mustacchi * member, but then we cant initialize it. Thus we set a fixed size number of
85*f3e7f55eSRobert Mustacchi * entries.
86*f3e7f55eSRobert Mustacchi */
87*f3e7f55eSRobert Mustacchi typedef struct mq_test {
88*f3e7f55eSRobert Mustacchi const char *mq_desc; /* test description/name */
89*f3e7f55eSRobert Mustacchi mergeq_proc_f *mq_proc; /* processing function */
90*f3e7f55eSRobert Mustacchi int mq_rval; /* mergeq_merge return value */
91*f3e7f55eSRobert Mustacchi int mq_uerr; /* user error, if any */
92*f3e7f55eSRobert Mustacchi boolean_t mq_strcmp; /* use strcmp rather than == */
93*f3e7f55eSRobert Mustacchi void *mq_result; /* expected result */
94*f3e7f55eSRobert Mustacchi void **mq_args; /* argument array */
95*f3e7f55eSRobert Mustacchi } mq_test_t;
96*f3e7f55eSRobert Mustacchi
97*f3e7f55eSRobert Mustacchi static void *mqt_empty_args[] = { NULL };
98*f3e7f55eSRobert Mustacchi static void *mqt_single_args[] = { (void *)42, NULL };
99*f3e7f55eSRobert Mustacchi static void *mqt_double_args[] = { (void *)42, (void *)27, NULL };
100*f3e7f55eSRobert Mustacchi static void *mqt_wrap_args[] = {
101*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
102*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
103*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
104*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
105*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
106*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
107*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
108*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
109*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
110*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
111*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, NULL
112*f3e7f55eSRobert Mustacchi };
113*f3e7f55eSRobert Mustacchi static void *mqt_grow_args[] = {
114*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
115*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
116*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
117*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
118*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
119*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
120*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
121*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
122*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
123*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
124*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
125*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
126*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
127*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
128*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, (void *)1, (void *)1, (void *)1, (void *)1,
129*f3e7f55eSRobert Mustacchi (void *)1, (void *)1, NULL
130*f3e7f55eSRobert Mustacchi };
131*f3e7f55eSRobert Mustacchi static void *mqt_order_args[] = { "l", "e", "g", "e", "n", "d", " ", "o", "f",
132*f3e7f55eSRobert Mustacchi " ", "z", "e", "l", "d", "a", NULL };
133*f3e7f55eSRobert Mustacchi
134*f3e7f55eSRobert Mustacchi
135*f3e7f55eSRobert Mustacchi static mq_test_t mq_tests[] = {
136*f3e7f55eSRobert Mustacchi { "empty", mqt_int, 0, 0, B_FALSE, NULL, mqt_empty_args },
137*f3e7f55eSRobert Mustacchi { "single", mqt_int, 0, 0, B_FALSE, (void *)42, mqt_single_args },
138*f3e7f55eSRobert Mustacchi { "double", mqt_int, 0, 0, B_FALSE, (void *)69, mqt_double_args },
139*f3e7f55eSRobert Mustacchi { "wrap", mqt_int, 0, 0, B_FALSE, (void *)64, mqt_wrap_args },
140*f3e7f55eSRobert Mustacchi { "grow", mqt_int, 0, 0, B_FALSE, (void *)92, mqt_grow_args },
141*f3e7f55eSRobert Mustacchi { "fatal", mqt_fatal, MERGEQ_UERROR, -1, B_FALSE, NULL,
142*f3e7f55eSRobert Mustacchi mqt_double_args },
143*f3e7f55eSRobert Mustacchi { "order", mqt_append, 0, 0, B_TRUE, "alegend of zeld", mqt_order_args }
144*f3e7f55eSRobert Mustacchi };
145*f3e7f55eSRobert Mustacchi
146*f3e7f55eSRobert Mustacchi #define NMQ_TESTS (sizeof (mq_tests) / sizeof (mq_test_t))
147*f3e7f55eSRobert Mustacchi
148*f3e7f55eSRobert Mustacchi static void
mq_test_run(mergeq_t * mqp,mq_test_t * mqt)149*f3e7f55eSRobert Mustacchi mq_test_run(mergeq_t *mqp, mq_test_t *mqt)
150*f3e7f55eSRobert Mustacchi {
151*f3e7f55eSRobert Mustacchi int ret, err;
152*f3e7f55eSRobert Mustacchi void **itemp = mqt->mq_args;
153*f3e7f55eSRobert Mustacchi void *out;
154*f3e7f55eSRobert Mustacchi
155*f3e7f55eSRobert Mustacchi while (*itemp != NULL) {
156*f3e7f55eSRobert Mustacchi if ((ret = mergeq_add(mqp, *itemp)) != 0) {
157*f3e7f55eSRobert Mustacchi (void) fprintf(stderr,
158*f3e7f55eSRobert Mustacchi "test %s: failed to add item: %s\n",
159*f3e7f55eSRobert Mustacchi mqt->mq_desc, strerror(errno));
160*f3e7f55eSRobert Mustacchi exit(1);
161*f3e7f55eSRobert Mustacchi }
162*f3e7f55eSRobert Mustacchi itemp++;
163*f3e7f55eSRobert Mustacchi }
164*f3e7f55eSRobert Mustacchi
165*f3e7f55eSRobert Mustacchi ret = mergeq_merge(mqp, mqt->mq_proc, NULL, &out, &err);
166*f3e7f55eSRobert Mustacchi if (ret != mqt->mq_rval) {
167*f3e7f55eSRobert Mustacchi (void) fprintf(stderr, "test %s: got incorrect rval. "
168*f3e7f55eSRobert Mustacchi "Expected %d, got %d\n", mqt->mq_desc, mqt->mq_rval, ret);
169*f3e7f55eSRobert Mustacchi exit(1);
170*f3e7f55eSRobert Mustacchi }
171*f3e7f55eSRobert Mustacchi
172*f3e7f55eSRobert Mustacchi if (ret == MERGEQ_UERROR && err != mqt->mq_uerr) {
173*f3e7f55eSRobert Mustacchi (void) fprintf(stderr, "test %s: got incorrect user error. "
174*f3e7f55eSRobert Mustacchi "Expected %d, got %d\n", mqt->mq_desc, mqt->mq_uerr, err);
175*f3e7f55eSRobert Mustacchi exit(1);
176*f3e7f55eSRobert Mustacchi }
177*f3e7f55eSRobert Mustacchi
178*f3e7f55eSRobert Mustacchi if (ret == 0) {
179*f3e7f55eSRobert Mustacchi if (mqt->mq_strcmp == B_TRUE &&
180*f3e7f55eSRobert Mustacchi strcmp(out, mqt->mq_result) != 0) {
181*f3e7f55eSRobert Mustacchi (void) fprintf(stderr, "test %s: got unexpected "
182*f3e7f55eSRobert Mustacchi "result: %s, expected %s\n", mqt->mq_desc, out,
183*f3e7f55eSRobert Mustacchi mqt->mq_result);
184*f3e7f55eSRobert Mustacchi exit(1);
185*f3e7f55eSRobert Mustacchi } else if (mqt->mq_strcmp == B_FALSE && out != mqt->mq_result) {
186*f3e7f55eSRobert Mustacchi (void) fprintf(stderr, "test %s: got unexpected "
187*f3e7f55eSRobert Mustacchi "result: %p, expected %p\n", mqt->mq_desc, out,
188*f3e7f55eSRobert Mustacchi mqt->mq_result);
189*f3e7f55eSRobert Mustacchi exit(1);
190*f3e7f55eSRobert Mustacchi }
191*f3e7f55eSRobert Mustacchi }
192*f3e7f55eSRobert Mustacchi }
193*f3e7f55eSRobert Mustacchi
194*f3e7f55eSRobert Mustacchi int
main(void)195*f3e7f55eSRobert Mustacchi main(void)
196*f3e7f55eSRobert Mustacchi {
197*f3e7f55eSRobert Mustacchi int ret, i, t;
198*f3e7f55eSRobert Mustacchi mergeq_t *mqp;
199*f3e7f55eSRobert Mustacchi int nthreads[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, -1 };
200*f3e7f55eSRobert Mustacchi
201*f3e7f55eSRobert Mustacchi for (t = 0; nthreads[t] != -1; t++) {
202*f3e7f55eSRobert Mustacchi printf("Beginning tests with %d threads\n", nthreads[t]);
203*f3e7f55eSRobert Mustacchi if ((ret = mergeq_init(&mqp, nthreads[t])) != 0) {
204*f3e7f55eSRobert Mustacchi fprintf(stderr, "failed to init mergeq: %s\n",
205*f3e7f55eSRobert Mustacchi strerror(errno));
206*f3e7f55eSRobert Mustacchi return (1);
207*f3e7f55eSRobert Mustacchi }
208*f3e7f55eSRobert Mustacchi
209*f3e7f55eSRobert Mustacchi for (i = 0; i < NMQ_TESTS; i++) {
210*f3e7f55eSRobert Mustacchi mq_test_run(mqp, &mq_tests[i]);
211*f3e7f55eSRobert Mustacchi }
212*f3e7f55eSRobert Mustacchi
213*f3e7f55eSRobert Mustacchi mergeq_fini(mqp);
214*f3e7f55eSRobert Mustacchi }
215*f3e7f55eSRobert Mustacchi
216*f3e7f55eSRobert Mustacchi return (0);
217*f3e7f55eSRobert Mustacchi }
218