[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:
Behdad Esfahbod 2007-04-18 19:46:30 -04:00
parent 47c02a6bd6
commit 157074c794
4 changed files with 92 additions and 61 deletions

View file

@ -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, ...)
{

View file

@ -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) \

View file

@ -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;
}

View file

@ -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;
}