// Semantic patch for common patterns and their replacement by igt // infrastructure and macros. Please run with // // spatch --sp-file lib/igt.cocci --in-place tests/*.c // // on your new testcase. // Replace open-coded augmented igt_assert/skip/require with macro versions @@ expression Ec; expression list[n] Ep; @@ - if (Ec) { ( - igt_warn( Ep ); | - igt_info( Ep ); | - igt_debug( Ep ); ) - igt_fail(...); - } + igt_fail_on_f(Ec, Ep); @@ expression Ec; @@ - if (Ec) { - igt_fail(...); - } + igt_fail_on(Ec); @@ expression Ec; expression list[n] Ep; @@ - if (Ec) { - igt_skip(Ep); - } + igt_skip_on_f(Ec, Ep); @@ expression Ec; expression list[n] Ep; @@ - if (Ec) { - igt_warn(Ep); - } + igt_warn_on_f(Ec, Ep); // Enforce use of logging functions @@ expression list[n] Ep; @@ -fprintf(stderr, Ep); +igt_warn(Ep); @@ expression E; @@ -perror(E); +igt_warn(E); @@ expression list[n] Ep; @@ -fprintf(stdout, Ep); +igt_info(Ep); @@ expression list[n] Ep; @@ -printf(Ep); +igt_info(Ep); // No abort for tests, really. Should only be used for internal library checks // in lib/* @@ @@ -abort(); +igt_fail(IGT_EXIT_FAILURE); @@ iterator name for_each_pipe; igt_display_t *display; expression pipe; @@ - for (pipe = 0; pipe < igt_display_get_n_pipes(display); pipe++) { + for_each_pipe (display, pipe) { ... } // Tests really shouldn't use plain assert! @@ expression E; @@ - assert(E); + igt_assert(E); // Replace open-coded igt_swap() @@ type T; T a, b, tmp; @@ - tmp = a; - a = b; - b = tmp; + igt_swap(a, b); // Replace open-coded min() @@ expression a; expression b; @@ ( - ((a) < (b) ? (a) : (b)) + min(a, b) | - ((a) <= (b) ? (a) : (b)) + min(a, b) ) // Replace open-coded max() @@ expression a; expression b; @@ ( - ((a) > (b) ? (a) : (b)) + max(a, b) | - ((a) >= (b) ? (a) : (b)) + max(a, b) ) // drm_open_any always returns a valid file descriptor @@ expression a; @@ a = drm_open_any(); ( - igt_assert(a >= 0); | - if (a < 0) { - ... - return ...; - } ) // Use comparison macros instead of raw igt_assert when possible @@ typedef uint32_t; uint32_t E1, E2; int E3, E4; @@ ( - igt_assert(E1 == E2); + igt_assert_eq_u32(E1, E2); | - igt_assert(E1 != E2); + igt_assert_neq_u32(E1, E2); | - igt_assert(E1 <= E2); + igt_assert_lte_u32(E1, E2); | - igt_assert(E1 < E2); + igt_assert_lt_u32(E1, E2); | - igt_assert(E1 >= E2); + igt_assert_lte_u32(E2, E1); | - igt_assert(E1 > E2); + igt_assert_lt_u32(E2, E1); | - igt_assert(E3 == E4); + igt_assert_eq(E3, E4); | - igt_assert(E3 != E4); + igt_assert_neq(E3, E4); | - igt_assert(E3 <= E4); + igt_assert_lte(E3, E4); | - igt_assert(E3 < E4); + igt_assert_lt(E3, E4); | - igt_assert(E3 >= E4); + igt_assert_lte(E4, E3); | - igt_assert(E3 > E4); + igt_assert_lt(E4, E3); ) // avoid unused-result warnings when compiling with _FORTIFY_SOURCE defined @@ identifier func =~ "^(read|write)$"; expression list[2] E; expression size; @@ -func(E, size); +igt_assert_eq(func(E, size), size); @@ expression ptr, size, nmemb, stream; @@ -fread(ptr, size, nmemb, stream); +igt_assert_eq(fread(ptr, size, nmemb, stream), nmemb); @@ expression list E; @@ -fgets(E); +igt_assert(fgets(E) != NULL); @@ identifier func =~ "^v?asprintf$"; expression list E; @@ -func(E); +igt_assert_neq(func(E), -1); // replace open-coded do_ioctl @@ expression a, b, c, e; @@ ( -do_or_die(drmIoctl(a, b, c)); +do_ioctl(a, b, c); | -igt_assert(drmIoctl(a, b, c) == 0); +do_ioctl(a, b, c); | -igt_assert(drmIoctl(a, b, c) == -1 && errno == e); +do_ioctl_err(a, b, c, e); | -igt_assert(drmIoctl(a, b, c) < 0 && errno == e); +do_ioctl_err(a, b, c, e); )