1 | /*
|
---|
2 | Unix SMB/CIFS implementation.
|
---|
3 | SMB torture UI functions
|
---|
4 |
|
---|
5 | Copyright (C) Jelmer Vernooij 2006
|
---|
6 |
|
---|
7 | This program is free software; you can redistribute it and/or modify
|
---|
8 | it under the terms of the GNU General Public License as published by
|
---|
9 | the Free Software Foundation; either version 3 of the License, or
|
---|
10 | (at your option) any later version.
|
---|
11 |
|
---|
12 | This program is distributed in the hope that it will be useful,
|
---|
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
15 | GNU General Public License for more details.
|
---|
16 |
|
---|
17 | You should have received a copy of the GNU General Public License
|
---|
18 | along with this program. If not, see <http://www.gnu.org/licenses/>.
|
---|
19 | */
|
---|
20 |
|
---|
21 | #ifndef __TORTURE_UI_H__
|
---|
22 | #define __TORTURE_UI_H__
|
---|
23 |
|
---|
24 | struct torture_test;
|
---|
25 | struct torture_context;
|
---|
26 | struct torture_suite;
|
---|
27 | struct torture_tcase;
|
---|
28 | struct torture_results;
|
---|
29 |
|
---|
30 | enum torture_result {
|
---|
31 | TORTURE_OK=0,
|
---|
32 | TORTURE_FAIL=1,
|
---|
33 | TORTURE_ERROR=2,
|
---|
34 | TORTURE_SKIP=3
|
---|
35 | };
|
---|
36 |
|
---|
37 | enum torture_progress_whence {
|
---|
38 | TORTURE_PROGRESS_SET,
|
---|
39 | TORTURE_PROGRESS_CUR,
|
---|
40 | TORTURE_PROGRESS_POP,
|
---|
41 | TORTURE_PROGRESS_PUSH,
|
---|
42 | };
|
---|
43 |
|
---|
44 | /*
|
---|
45 | * These callbacks should be implemented by any backend that wishes
|
---|
46 | * to listen to reports from the torture tests.
|
---|
47 | */
|
---|
48 | struct torture_ui_ops
|
---|
49 | {
|
---|
50 | void (*init) (struct torture_results *);
|
---|
51 | void (*comment) (struct torture_context *, const char *);
|
---|
52 | void (*warning) (struct torture_context *, const char *);
|
---|
53 | void (*suite_start) (struct torture_context *, struct torture_suite *);
|
---|
54 | void (*suite_finish) (struct torture_context *, struct torture_suite *);
|
---|
55 | void (*tcase_start) (struct torture_context *, struct torture_tcase *);
|
---|
56 | void (*tcase_finish) (struct torture_context *, struct torture_tcase *);
|
---|
57 | void (*test_start) (struct torture_context *,
|
---|
58 | struct torture_tcase *,
|
---|
59 | struct torture_test *);
|
---|
60 | void (*test_result) (struct torture_context *,
|
---|
61 | enum torture_result, const char *reason);
|
---|
62 | void (*progress) (struct torture_context *, int offset, enum torture_progress_whence whence);
|
---|
63 | void (*report_time) (struct torture_context *);
|
---|
64 | };
|
---|
65 |
|
---|
66 | void torture_ui_test_start(struct torture_context *context,
|
---|
67 | struct torture_tcase *tcase,
|
---|
68 | struct torture_test *test);
|
---|
69 |
|
---|
70 | void torture_ui_test_result(struct torture_context *context,
|
---|
71 | enum torture_result result,
|
---|
72 | const char *comment);
|
---|
73 |
|
---|
74 | void torture_ui_report_time(struct torture_context *context);
|
---|
75 |
|
---|
76 | /*
|
---|
77 | * Holds information about a specific run of the testsuite.
|
---|
78 | * The data in this structure should be considered private to
|
---|
79 | * the torture tests and should only be used directly by the torture
|
---|
80 | * code and the ui backends.
|
---|
81 | *
|
---|
82 | * Torture tests should instead call the torture_*() macros and functions
|
---|
83 | * specified below.
|
---|
84 | */
|
---|
85 |
|
---|
86 | struct torture_context
|
---|
87 | {
|
---|
88 | struct torture_results *results;
|
---|
89 |
|
---|
90 | struct torture_test *active_test;
|
---|
91 | struct torture_tcase *active_tcase;
|
---|
92 |
|
---|
93 | enum torture_result last_result;
|
---|
94 | char *last_reason;
|
---|
95 |
|
---|
96 | /** Directory used for temporary test data */
|
---|
97 | const char *outputdir;
|
---|
98 |
|
---|
99 | /** Event context */
|
---|
100 | struct tevent_context *ev;
|
---|
101 |
|
---|
102 | /** Loadparm context (will go away in favor of torture_setting_ at some point) */
|
---|
103 | struct loadparm_context *lp_ctx;
|
---|
104 | };
|
---|
105 |
|
---|
106 | struct torture_results
|
---|
107 | {
|
---|
108 | const struct torture_ui_ops *ui_ops;
|
---|
109 | void *ui_data;
|
---|
110 |
|
---|
111 | /** Whether tests should avoid writing output to stdout */
|
---|
112 | bool quiet;
|
---|
113 |
|
---|
114 | bool returncode;
|
---|
115 | };
|
---|
116 |
|
---|
117 | /*
|
---|
118 | * Describes a particular torture test
|
---|
119 | */
|
---|
120 | struct torture_test {
|
---|
121 | /** Short unique name for the test. */
|
---|
122 | const char *name;
|
---|
123 |
|
---|
124 | /** Long description for the test. */
|
---|
125 | const char *description;
|
---|
126 |
|
---|
127 | /** Whether this is a dangerous test
|
---|
128 | * (can corrupt the remote servers data or bring it down). */
|
---|
129 | bool dangerous;
|
---|
130 |
|
---|
131 | /** Function to call to run this test */
|
---|
132 | bool (*run) (struct torture_context *torture_ctx,
|
---|
133 | struct torture_tcase *tcase,
|
---|
134 | struct torture_test *test);
|
---|
135 |
|
---|
136 | struct torture_test *prev, *next;
|
---|
137 |
|
---|
138 | /** Pointer to the actual test function. This is run by the
|
---|
139 | * run() function above. */
|
---|
140 | void *fn;
|
---|
141 |
|
---|
142 | /** Use data for this test */
|
---|
143 | const void *data;
|
---|
144 | };
|
---|
145 |
|
---|
146 | /*
|
---|
147 | * Describes a particular test case.
|
---|
148 | */
|
---|
149 | struct torture_tcase {
|
---|
150 | const char *name;
|
---|
151 | const char *description;
|
---|
152 | bool (*setup) (struct torture_context *tcase, void **data);
|
---|
153 | bool (*teardown) (struct torture_context *tcase, void *data);
|
---|
154 | bool fixture_persistent;
|
---|
155 | void *data;
|
---|
156 | struct torture_test *tests;
|
---|
157 | struct torture_tcase *prev, *next;
|
---|
158 | };
|
---|
159 |
|
---|
160 | struct torture_suite
|
---|
161 | {
|
---|
162 | const char *name;
|
---|
163 | const char *description;
|
---|
164 | struct torture_tcase *testcases;
|
---|
165 | struct torture_suite *children;
|
---|
166 |
|
---|
167 | /* Pointers to siblings of this torture suite */
|
---|
168 | struct torture_suite *prev, *next;
|
---|
169 | };
|
---|
170 |
|
---|
171 | /** Create a new torture suite */
|
---|
172 | struct torture_suite *torture_suite_create(TALLOC_CTX *mem_ctx,
|
---|
173 | const char *name);
|
---|
174 |
|
---|
175 | /** Change the setup and teardown functions for a testcase */
|
---|
176 | void torture_tcase_set_fixture(struct torture_tcase *tcase,
|
---|
177 | bool (*setup) (struct torture_context *, void **),
|
---|
178 | bool (*teardown) (struct torture_context *, void *));
|
---|
179 |
|
---|
180 | /* Add another test to run for a particular testcase */
|
---|
181 | struct torture_test *torture_tcase_add_test_const(struct torture_tcase *tcase,
|
---|
182 | const char *name,
|
---|
183 | bool (*run) (struct torture_context *test,
|
---|
184 | const void *tcase_data, const void *test_data),
|
---|
185 | const void *test_data);
|
---|
186 |
|
---|
187 | /* Add a testcase to a testsuite */
|
---|
188 | struct torture_tcase *torture_suite_add_tcase(struct torture_suite *suite,
|
---|
189 | const char *name);
|
---|
190 |
|
---|
191 | /* Convenience wrapper that adds a testcase against only one
|
---|
192 | * test will be run */
|
---|
193 | struct torture_tcase *torture_suite_add_simple_tcase_const(
|
---|
194 | struct torture_suite *suite,
|
---|
195 | const char *name,
|
---|
196 | bool (*run) (struct torture_context *test,
|
---|
197 | const void *test_data),
|
---|
198 | const void *data);
|
---|
199 |
|
---|
200 | /* Convenience function that adds a test which only
|
---|
201 | * gets the test case data */
|
---|
202 | struct torture_test *torture_tcase_add_simple_test_const(
|
---|
203 | struct torture_tcase *tcase,
|
---|
204 | const char *name,
|
---|
205 | bool (*run) (struct torture_context *test,
|
---|
206 | const void *tcase_data));
|
---|
207 |
|
---|
208 | /* Convenience wrapper that adds a test that doesn't need any
|
---|
209 | * testcase data */
|
---|
210 | struct torture_tcase *torture_suite_add_simple_test(
|
---|
211 | struct torture_suite *suite,
|
---|
212 | const char *name,
|
---|
213 | bool (*run) (struct torture_context *test));
|
---|
214 |
|
---|
215 | /* Add a child testsuite to an existing testsuite */
|
---|
216 | bool torture_suite_add_suite(struct torture_suite *suite,
|
---|
217 | struct torture_suite *child);
|
---|
218 |
|
---|
219 | /* Run the specified testsuite recursively */
|
---|
220 | bool torture_run_suite(struct torture_context *context,
|
---|
221 | struct torture_suite *suite);
|
---|
222 |
|
---|
223 | /* Run the specified testsuite recursively, but only the specified
|
---|
224 | * tests */
|
---|
225 | bool torture_run_suite_restricted(struct torture_context *context,
|
---|
226 | struct torture_suite *suite, const char **restricted);
|
---|
227 |
|
---|
228 | /* Run the specified testcase */
|
---|
229 | bool torture_run_tcase(struct torture_context *context,
|
---|
230 | struct torture_tcase *tcase);
|
---|
231 |
|
---|
232 | bool torture_run_tcase_restricted(struct torture_context *context,
|
---|
233 | struct torture_tcase *tcase, const char **restricted);
|
---|
234 |
|
---|
235 | /* Run the specified test */
|
---|
236 | bool torture_run_test(struct torture_context *context,
|
---|
237 | struct torture_tcase *tcase,
|
---|
238 | struct torture_test *test);
|
---|
239 |
|
---|
240 | bool torture_run_test_restricted(struct torture_context *context,
|
---|
241 | struct torture_tcase *tcase,
|
---|
242 | struct torture_test *test,
|
---|
243 | const char **restricted);
|
---|
244 |
|
---|
245 | void torture_comment(struct torture_context *test, const char *comment, ...) PRINTF_ATTRIBUTE(2,3);
|
---|
246 | void torture_warning(struct torture_context *test, const char *comment, ...) PRINTF_ATTRIBUTE(2,3);
|
---|
247 | void torture_result(struct torture_context *test,
|
---|
248 | enum torture_result, const char *reason, ...) PRINTF_ATTRIBUTE(3,4);
|
---|
249 |
|
---|
250 | #define torture_assert(torture_ctx,expr,cmt) \
|
---|
251 | if (!(expr)) { \
|
---|
252 | torture_result(torture_ctx, TORTURE_FAIL, __location__": Expression `%s' failed: %s", __STRING(expr), cmt); \
|
---|
253 | return false; \
|
---|
254 | }
|
---|
255 |
|
---|
256 | #define torture_assert_goto(torture_ctx,expr,ret,label,cmt) \
|
---|
257 | if (!(expr)) { \
|
---|
258 | torture_result(torture_ctx, TORTURE_FAIL, __location__": Expression `%s' failed: %s", __STRING(expr), cmt); \
|
---|
259 | ret = false; \
|
---|
260 | goto label; \
|
---|
261 | }
|
---|
262 |
|
---|
263 | #define torture_assert_werr_equal(torture_ctx, got, expected, cmt) \
|
---|
264 | do { WERROR __got = got, __expected = expected; \
|
---|
265 | if (!W_ERROR_EQUAL(__got, __expected)) { \
|
---|
266 | torture_result(torture_ctx, TORTURE_FAIL, __location__": "#got" was %s, expected %s: %s", win_errstr(__got), win_errstr(__expected), cmt); \
|
---|
267 | return false; \
|
---|
268 | } \
|
---|
269 | } while (0)
|
---|
270 |
|
---|
271 | #define torture_assert_ntstatus_equal(torture_ctx,got,expected,cmt) \
|
---|
272 | do { NTSTATUS __got = got, __expected = expected; \
|
---|
273 | if (!NT_STATUS_EQUAL(__got, __expected)) { \
|
---|
274 | torture_result(torture_ctx, TORTURE_FAIL, __location__": "#got" was %s, expected %s: %s", nt_errstr(__got), nt_errstr(__expected), cmt); \
|
---|
275 | return false; \
|
---|
276 | }\
|
---|
277 | } while(0)
|
---|
278 |
|
---|
279 | #define torture_assert_ntstatus_equal_goto(torture_ctx,got,expected,ret,label,cmt) \
|
---|
280 | do { NTSTATUS __got = got, __expected = expected; \
|
---|
281 | if (!NT_STATUS_EQUAL(__got, __expected)) { \
|
---|
282 | torture_result(torture_ctx, TORTURE_FAIL, __location__": "#got" was %s, expected %s: %s", nt_errstr(__got), nt_errstr(__expected), cmt); \
|
---|
283 | ret = false; \
|
---|
284 | goto label; \
|
---|
285 | }\
|
---|
286 | } while(0)
|
---|
287 |
|
---|
288 | #define torture_assert_ndr_err_equal(torture_ctx,got,expected,cmt) \
|
---|
289 | do { enum ndr_err_code __got = got, __expected = expected; \
|
---|
290 | if (__got != __expected) { \
|
---|
291 | torture_result(torture_ctx, TORTURE_FAIL, __location__": "#got" was %d, expected %d (%s): %s", __got, __expected, __STRING(expected), cmt); \
|
---|
292 | return false; \
|
---|
293 | }\
|
---|
294 | } while(0)
|
---|
295 |
|
---|
296 | #define torture_assert_casestr_equal(torture_ctx,got,expected,cmt) \
|
---|
297 | do { const char *__got = (got), *__expected = (expected); \
|
---|
298 | if (!strequal(__got, __expected)) { \
|
---|
299 | torture_result(torture_ctx, TORTURE_FAIL, __location__": "#got" was %s, expected %s: %s", __got, __expected, cmt); \
|
---|
300 | return false; \
|
---|
301 | } \
|
---|
302 | } while(0)
|
---|
303 |
|
---|
304 | #define torture_assert_str_equal(torture_ctx,got,expected,cmt)\
|
---|
305 | do { const char *__got = (got), *__expected = (expected); \
|
---|
306 | if (strcmp_safe(__got, __expected) != 0) { \
|
---|
307 | torture_result(torture_ctx, TORTURE_FAIL, \
|
---|
308 | __location__": "#got" was %s, expected %s: %s", \
|
---|
309 | __got, __expected, cmt); \
|
---|
310 | return false; \
|
---|
311 | } \
|
---|
312 | } while(0)
|
---|
313 |
|
---|
314 | #define torture_assert_strn_equal(torture_ctx,got,expected,len,cmt)\
|
---|
315 | do { const char *__got = (got), *__expected = (expected); \
|
---|
316 | if (strncmp(__got, __expected, len) != 0) { \
|
---|
317 | torture_result(torture_ctx, TORTURE_FAIL, \
|
---|
318 | __location__": "#got" %s of len %d did not match "#expected" %s: %s", \
|
---|
319 | __got, (int)len, __expected, cmt); \
|
---|
320 | return false; \
|
---|
321 | } \
|
---|
322 | } while(0)
|
---|
323 |
|
---|
324 | #define torture_assert_str_equal_goto(torture_ctx,got,expected,ret,label,cmt)\
|
---|
325 | do { const char *__got = (got), *__expected = (expected); \
|
---|
326 | if (strcmp_safe(__got, __expected) != 0) { \
|
---|
327 | torture_result(torture_ctx, TORTURE_FAIL, \
|
---|
328 | __location__": "#got" was %s, expected %s: %s", \
|
---|
329 | __got, __expected, cmt); \
|
---|
330 | ret = false; \
|
---|
331 | goto label; \
|
---|
332 | } \
|
---|
333 | } while(0)
|
---|
334 |
|
---|
335 | #define torture_assert_mem_equal(torture_ctx,got,expected,len,cmt)\
|
---|
336 | do { const void *__got = (got), *__expected = (expected); \
|
---|
337 | if (memcmp(__got, __expected, len) != 0) { \
|
---|
338 | torture_result(torture_ctx, TORTURE_FAIL, \
|
---|
339 | __location__": "#got" of len %d did not match "#expected": %s", (int)len, cmt); \
|
---|
340 | return false; \
|
---|
341 | } \
|
---|
342 | } while(0)
|
---|
343 |
|
---|
344 | #define torture_assert_data_blob_equal(torture_ctx,got,expected,cmt)\
|
---|
345 | do { const DATA_BLOB __got = (got), __expected = (expected); \
|
---|
346 | if (__got.length != __expected.length) { \
|
---|
347 | torture_result(torture_ctx, TORTURE_FAIL, \
|
---|
348 | __location__": "#got".len %d did not match "#expected" len %d: %s", \
|
---|
349 | (int)__got.length, (int)__expected.length, cmt); \
|
---|
350 | return false; \
|
---|
351 | } \
|
---|
352 | if (memcmp(__got.data, __expected.data, __got.length) != 0) { \
|
---|
353 | torture_result(torture_ctx, TORTURE_FAIL, \
|
---|
354 | __location__": "#got" of len %d did not match "#expected": %s", (int)__got.length, cmt); \
|
---|
355 | return false; \
|
---|
356 | } \
|
---|
357 | } while(0)
|
---|
358 |
|
---|
359 | #define torture_assert_file_contains_text(torture_ctx,filename,expected,cmt)\
|
---|
360 | do { \
|
---|
361 | char *__got; \
|
---|
362 | const char *__expected = (expected); \
|
---|
363 | size_t __size; \
|
---|
364 | __got = file_load(filename, &__size, 0, torture_ctx); \
|
---|
365 | if (__got == NULL) { \
|
---|
366 | torture_result(torture_ctx, TORTURE_FAIL, \
|
---|
367 | __location__": unable to open %s: %s\n", \
|
---|
368 | filename, cmt); \
|
---|
369 | return false; \
|
---|
370 | } \
|
---|
371 | \
|
---|
372 | if (strcmp_safe(__got, __expected) != 0) { \
|
---|
373 | torture_result(torture_ctx, TORTURE_FAIL, \
|
---|
374 | __location__": %s contained:\n%sExpected: %s%s\n", \
|
---|
375 | filename, __got, __expected, cmt); \
|
---|
376 | talloc_free(__got); \
|
---|
377 | return false; \
|
---|
378 | } \
|
---|
379 | talloc_free(__got); \
|
---|
380 | } while(0)
|
---|
381 |
|
---|
382 | #define torture_assert_file_contains(torture_ctx,filename,expected,cmt)\
|
---|
383 | do { const char *__got, *__expected = (expected); \
|
---|
384 | size_t __size; \
|
---|
385 | __got = file_load(filename, *size, 0, torture_ctx); \
|
---|
386 | if (strcmp_safe(__got, __expected) != 0) { \
|
---|
387 | torture_result(torture_ctx, TORTURE_FAIL, \
|
---|
388 | __location__": %s contained:\n%sExpected: %s%s\n", \
|
---|
389 | __got, __expected, cmt); \
|
---|
390 | talloc_free(__got); \
|
---|
391 | return false; \
|
---|
392 | } \
|
---|
393 | talloc_free(__got); \
|
---|
394 | } while(0)
|
---|
395 |
|
---|
396 | #define torture_assert_int_equal(torture_ctx,got,expected,cmt)\
|
---|
397 | do { int __got = (got), __expected = (expected); \
|
---|
398 | if (__got != __expected) { \
|
---|
399 | torture_result(torture_ctx, TORTURE_FAIL, \
|
---|
400 | __location__": "#got" was %d (0x%X), expected %d (0x%X): %s", \
|
---|
401 | __got, __got, __expected, __expected, cmt); \
|
---|
402 | return false; \
|
---|
403 | } \
|
---|
404 | } while(0)
|
---|
405 |
|
---|
406 | #define torture_assert_int_equal_goto(torture_ctx,got,expected,ret,label,cmt)\
|
---|
407 | do { int __got = (got), __expected = (expected); \
|
---|
408 | if (__got != __expected) { \
|
---|
409 | torture_result(torture_ctx, TORTURE_FAIL, \
|
---|
410 | __location__": "#got" was %d (0x%X), expected %d (0x%X): %s", \
|
---|
411 | __got, __got, __expected, __expected, cmt); \
|
---|
412 | ret = false; \
|
---|
413 | goto label; \
|
---|
414 | } \
|
---|
415 | } while(0)
|
---|
416 |
|
---|
417 | #define torture_assert_u64_equal(torture_ctx,got,expected,cmt)\
|
---|
418 | do { uint64_t __got = (got), __expected = (expected); \
|
---|
419 | if (__got != __expected) { \
|
---|
420 | torture_result(torture_ctx, TORTURE_FAIL, \
|
---|
421 | __location__": "#got" was %llu (0x%llX), expected %llu (0x%llX): %s", \
|
---|
422 | (unsigned long long)__got, (unsigned long long)__got, \
|
---|
423 | (unsigned long long)__expected, (unsigned long long)__expected, \
|
---|
424 | cmt); \
|
---|
425 | return false; \
|
---|
426 | } \
|
---|
427 | } while(0)
|
---|
428 |
|
---|
429 | #define torture_assert_u64_equal_goto(torture_ctx,got,expected,ret,label,cmt)\
|
---|
430 | do { uint64_t __got = (got), __expected = (expected); \
|
---|
431 | if (__got != __expected) { \
|
---|
432 | torture_result(torture_ctx, TORTURE_FAIL, \
|
---|
433 | __location__": "#got" was %llu (0x%llX), expected %llu (0x%llX): %s", \
|
---|
434 | (unsigned long long)__got, (unsigned long long)__got, \
|
---|
435 | (unsigned long long)__expected, (unsigned long long)__expected, \
|
---|
436 | cmt); \
|
---|
437 | ret = false; \
|
---|
438 | goto label; \
|
---|
439 | } \
|
---|
440 | } while(0)
|
---|
441 |
|
---|
442 | #define torture_assert_errno_equal(torture_ctx,expected,cmt)\
|
---|
443 | do { int __expected = (expected); \
|
---|
444 | if (errno != __expected) { \
|
---|
445 | torture_result(torture_ctx, TORTURE_FAIL, \
|
---|
446 | __location__": errno was %d (%s), expected %d: %s: %s", \
|
---|
447 | errno, strerror(errno), __expected, \
|
---|
448 | strerror(__expected), cmt); \
|
---|
449 | return false; \
|
---|
450 | } \
|
---|
451 | } while(0)
|
---|
452 |
|
---|
453 | #define torture_assert_nttime_equal(torture_ctx,got,expected,cmt) \
|
---|
454 | do { NTTIME __got = got, __expected = expected; \
|
---|
455 | if (!nt_time_equal(&__got, &__expected)) { \
|
---|
456 | torture_result(torture_ctx, TORTURE_FAIL, __location__": "#got" was %s, expected %s: %s", nt_time_string(tctx, __got), nt_time_string(tctx, __expected), cmt); \
|
---|
457 | return false; \
|
---|
458 | }\
|
---|
459 | } while(0)
|
---|
460 |
|
---|
461 | #define torture_skip(torture_ctx,cmt) do {\
|
---|
462 | torture_result(torture_ctx, TORTURE_SKIP, __location__": %s", cmt);\
|
---|
463 | return true; \
|
---|
464 | } while(0)
|
---|
465 | #define torture_skip_goto(torture_ctx,label,cmt) do {\
|
---|
466 | torture_result(torture_ctx, TORTURE_SKIP, __location__": %s", cmt);\
|
---|
467 | goto label; \
|
---|
468 | } while(0)
|
---|
469 | #define torture_fail(torture_ctx,cmt) do {\
|
---|
470 | torture_result(torture_ctx, TORTURE_FAIL, __location__": %s", cmt);\
|
---|
471 | return false; \
|
---|
472 | } while (0)
|
---|
473 | #define torture_fail_goto(torture_ctx,label,cmt) do {\
|
---|
474 | torture_result(torture_ctx, TORTURE_FAIL, __location__": %s", cmt);\
|
---|
475 | goto label; \
|
---|
476 | } while (0)
|
---|
477 |
|
---|
478 | #define torture_out stderr
|
---|
479 |
|
---|
480 | /* Convenience macros */
|
---|
481 | #define torture_assert_ntstatus_ok(torture_ctx,expr,cmt) \
|
---|
482 | torture_assert_ntstatus_equal(torture_ctx,expr,NT_STATUS_OK,cmt)
|
---|
483 |
|
---|
484 | #define torture_assert_ntstatus_ok_goto(torture_ctx,expr,ret,label,cmt) \
|
---|
485 | torture_assert_ntstatus_equal_goto(torture_ctx,expr,NT_STATUS_OK,ret,label,cmt)
|
---|
486 |
|
---|
487 | #define torture_assert_werr_ok(torture_ctx,expr,cmt) \
|
---|
488 | torture_assert_werr_equal(torture_ctx,expr,WERR_OK,cmt)
|
---|
489 |
|
---|
490 | #define torture_assert_ndr_success(torture_ctx,expr,cmt) \
|
---|
491 | torture_assert_ndr_err_equal(torture_ctx,expr,NDR_ERR_SUCCESS,cmt)
|
---|
492 |
|
---|
493 | /* Getting settings */
|
---|
494 | const char *torture_setting_string(struct torture_context *test, \
|
---|
495 | const char *name,
|
---|
496 | const char *default_value);
|
---|
497 |
|
---|
498 | int torture_setting_int(struct torture_context *test,
|
---|
499 | const char *name,
|
---|
500 | int default_value);
|
---|
501 |
|
---|
502 | double torture_setting_double(struct torture_context *test,
|
---|
503 | const char *name,
|
---|
504 | double default_value);
|
---|
505 |
|
---|
506 | bool torture_setting_bool(struct torture_context *test,
|
---|
507 | const char *name,
|
---|
508 | bool default_value);
|
---|
509 |
|
---|
510 | struct torture_suite *torture_find_suite(struct torture_suite *parent,
|
---|
511 | const char *name);
|
---|
512 |
|
---|
513 | unsigned long torture_setting_ulong(struct torture_context *test,
|
---|
514 | const char *name,
|
---|
515 | unsigned long default_value);
|
---|
516 |
|
---|
517 | NTSTATUS torture_temp_dir(struct torture_context *tctx,
|
---|
518 | const char *prefix,
|
---|
519 | char **tempdir);
|
---|
520 | NTSTATUS torture_deltree_outputdir(struct torture_context *tctx);
|
---|
521 |
|
---|
522 | struct torture_test *torture_tcase_add_simple_test(struct torture_tcase *tcase,
|
---|
523 | const char *name,
|
---|
524 | bool (*run) (struct torture_context *test, void *tcase_data));
|
---|
525 |
|
---|
526 |
|
---|
527 | bool torture_suite_init_tcase(struct torture_suite *suite,
|
---|
528 | struct torture_tcase *tcase,
|
---|
529 | const char *name);
|
---|
530 | int torture_suite_children_count(const struct torture_suite *suite);
|
---|
531 |
|
---|
532 | struct torture_context *torture_context_init(struct tevent_context *event_ctx, struct torture_results *results);
|
---|
533 |
|
---|
534 | struct torture_results *torture_results_init(TALLOC_CTX *mem_ctx, const struct torture_ui_ops *ui_ops);
|
---|
535 |
|
---|
536 | struct torture_context *torture_context_child(struct torture_context *tctx);
|
---|
537 |
|
---|
538 | extern const struct torture_ui_ops torture_subunit_ui_ops;
|
---|
539 |
|
---|
540 | #endif /* __TORTURE_UI_H__ */
|
---|