mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-09 04:58:04 +02:00
[boilerplate] Add cairo_boilerplate_get/free_targets
This means, test and perf suites now share the same target handling code, including parsing CAIRO_TEST_TARGET.
This commit is contained in:
parent
47c02a6bd6
commit
157074c794
4 changed files with 92 additions and 61 deletions
|
|
@ -1366,7 +1366,7 @@ cleanup_svg (void *closure)
|
|||
}
|
||||
#endif /* CAIRO_HAS_SVG_SURFACE && CAIRO_CAN_TEST_SVG_SURFACE */
|
||||
|
||||
cairo_boilerplate_target_t targets[] =
|
||||
static cairo_boilerplate_target_t targets[] =
|
||||
{
|
||||
/* I'm uncompromising about leaving the image backend as 0
|
||||
* for tolerance. There shouldn't ever be anything that is out of
|
||||
|
|
@ -1517,10 +1517,77 @@ cairo_boilerplate_target_t targets[] =
|
|||
{ "directfb-bitmap", CAIRO_SURFACE_TYPE_DIRECTFB, CAIRO_CONTENT_COLOR_ALPHA, 0,
|
||||
create_directfb_surface, cairo_surface_write_to_png,cleanup_directfb},
|
||||
#endif
|
||||
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
cairo_boilerplate_target_t **
|
||||
cairo_boilerplate_get_targets (int *pnum_targets, cairo_bool_t *plimited_targets)
|
||||
{
|
||||
size_t i, num_targets;
|
||||
cairo_bool_t limited_targets = FALSE;
|
||||
const char *tname;
|
||||
cairo_boilerplate_target_t **targets_to_test;
|
||||
|
||||
if ((tname = getenv ("CAIRO_TEST_TARGET")) != NULL && *tname) {
|
||||
|
||||
limited_targets = TRUE;
|
||||
|
||||
num_targets = 0;
|
||||
targets_to_test = NULL;
|
||||
|
||||
while (*tname) {
|
||||
int found = 0;
|
||||
const char *end = strpbrk (tname, " \t\r\n;:,");
|
||||
if (!end)
|
||||
end = tname + strlen (tname);
|
||||
|
||||
if (end == tname) {
|
||||
tname = end + 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
for (i = 0; i < sizeof (targets) / sizeof (targets[0]); i++) {
|
||||
if (0 == strncmp (targets[i].name, tname, end - tname) &&
|
||||
!isalnum (targets[i].name[end - tname])) {
|
||||
/* realloc isn't exactly the best thing here, but meh. */
|
||||
targets_to_test = realloc (targets_to_test, sizeof(cairo_boilerplate_target_t *) * (num_targets+1));
|
||||
targets_to_test[num_targets++] = &targets[i];
|
||||
found = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
fprintf (stderr, "Cannot find target '%.*s'\n", (int)(end - tname), tname);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if (*end)
|
||||
end++;
|
||||
tname = end;
|
||||
}
|
||||
} else {
|
||||
num_targets = sizeof (targets) / sizeof (targets[0]);
|
||||
targets_to_test = malloc (sizeof(cairo_boilerplate_target_t*) * num_targets);
|
||||
for (i = 0; i < num_targets; i++) {
|
||||
targets_to_test[i] = &targets[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (pnum_targets)
|
||||
*pnum_targets = num_targets;
|
||||
|
||||
if (plimited_targets)
|
||||
*plimited_targets = limited_targets;
|
||||
|
||||
return targets_to_test;
|
||||
}
|
||||
|
||||
void
|
||||
cairo_boilerplate_free_targets (cairo_boilerplate_target_t **targets)
|
||||
{
|
||||
free (targets);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
xasprintf (char **strp, const char *fmt, ...)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -123,7 +123,11 @@ typedef struct _cairo_boilerplate_target
|
|||
void *closure;
|
||||
} cairo_boilerplate_target_t;
|
||||
|
||||
extern cairo_boilerplate_target_t targets[];
|
||||
cairo_boilerplate_target_t **
|
||||
cairo_boilerplate_get_targets (int *num_targets, cairo_bool_t *limited_targets);
|
||||
|
||||
void
|
||||
cairo_boilerplate_free_targets (cairo_boilerplate_target_t **targets);
|
||||
|
||||
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
|
||||
#define CAIRO_PRINTF_FORMAT(fmt_index, va_index) \
|
||||
|
|
|
|||
|
|
@ -302,11 +302,10 @@ check_cpu_affinity(void)
|
|||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
int i, j;
|
||||
int i, j, num_targets;
|
||||
cairo_perf_case_t *perf_case;
|
||||
cairo_perf_t perf;
|
||||
const char *cairo_test_target = getenv ("CAIRO_TEST_TARGET");
|
||||
cairo_boilerplate_target_t *target;
|
||||
cairo_boilerplate_target_t **targets;
|
||||
cairo_surface_t *surface;
|
||||
|
||||
parse_options (&perf, argc, argv);
|
||||
|
|
@ -324,17 +323,16 @@ main (int argc, char *argv[])
|
|||
stderr);
|
||||
}
|
||||
|
||||
if (!*cairo_test_target)
|
||||
cairo_test_target = NULL;
|
||||
targets = cairo_boilerplate_get_targets (&num_targets, NULL);
|
||||
|
||||
for (i = 0; targets[i].name; i++) {
|
||||
perf.target = target = &targets[i];
|
||||
perf.test_number = 0;
|
||||
for (i = 0; i < num_targets; i++) {
|
||||
cairo_boilerplate_target_t *target = targets[i];
|
||||
|
||||
if (! target_is_measurable (target))
|
||||
continue;
|
||||
if (cairo_test_target && ! strstr (cairo_test_target, target->name))
|
||||
continue;
|
||||
|
||||
perf.target = target;
|
||||
perf.test_number = 0;
|
||||
|
||||
for (j = 0; perf_cases[j].run; j++) {
|
||||
|
||||
|
|
@ -378,6 +376,8 @@ main (int argc, char *argv[])
|
|||
}
|
||||
}
|
||||
|
||||
cairo_boilerplate_free_targets (targets);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -383,7 +383,6 @@ cairo_test_expecting (cairo_test_t *test,
|
|||
* by longjmp */
|
||||
volatile size_t i, j, num_targets;
|
||||
volatile cairo_bool_t limited_targets = FALSE, print_fail_on_stdout = TRUE;
|
||||
const char *tname;
|
||||
#ifdef HAVE_SIGNAL_H
|
||||
void (*old_segfault_handler)(int);
|
||||
#endif
|
||||
|
|
@ -409,51 +408,12 @@ cairo_test_expecting (cairo_test_t *test,
|
|||
if (expectation == CAIRO_TEST_FAILURE)
|
||||
printf ("Expecting failure\n");
|
||||
|
||||
if ((tname = getenv ("CAIRO_TEST_TARGET")) != NULL && *tname) {
|
||||
|
||||
limited_targets = TRUE;
|
||||
|
||||
num_targets = 0;
|
||||
targets_to_test = NULL;
|
||||
|
||||
while (*tname) {
|
||||
int found = 0;
|
||||
const char *end = strpbrk (tname, " \t\r\n;:,");
|
||||
if (!end)
|
||||
end = tname + strlen (tname);
|
||||
|
||||
if (end == tname) {
|
||||
tname = end + 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
for (i = 0; targets[i].name != NULL; i++) {
|
||||
if (0 == strncmp (targets[i].name, tname, end - tname) &&
|
||||
!isalnum (targets[i].name[end - tname])) {
|
||||
/* realloc isn't exactly the best thing here, but meh. */
|
||||
targets_to_test = realloc (targets_to_test, sizeof(cairo_boilerplate_target_t *) * (num_targets+1));
|
||||
targets_to_test[num_targets++] = &targets[i];
|
||||
found = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
fprintf (stderr, "Cannot test target '%.*s'\n", (int)(end - tname), tname);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if (*end)
|
||||
end++;
|
||||
tname = end;
|
||||
}
|
||||
} else {
|
||||
num_targets = 0;
|
||||
for (i = 0; targets[i].name != NULL; i++)
|
||||
num_targets++;
|
||||
targets_to_test = malloc (sizeof(cairo_boilerplate_target_t*) * num_targets);
|
||||
for (i = 0; i < num_targets; i++) {
|
||||
targets_to_test[i] = &targets[i];
|
||||
}
|
||||
{
|
||||
int tmp_num_targets;
|
||||
cairo_bool_t tmp_limited_targets;
|
||||
targets_to_test = cairo_boilerplate_get_targets (&tmp_num_targets, &tmp_limited_targets);
|
||||
num_targets = tmp_num_targets;
|
||||
limited_targets = tmp_limited_targets;
|
||||
}
|
||||
|
||||
/* The intended logic here is that we return overall SUCCESS
|
||||
|
|
@ -583,7 +543,7 @@ cairo_test_expecting (cairo_test_t *test,
|
|||
|
||||
cairo_test_fini ();
|
||||
|
||||
free (targets_to_test);
|
||||
cairo_boilerplate_free_targets (targets_to_test);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue