diff --git a/testsuite/css/parser/test-css-parser.c b/testsuite/css/parser/test-css-parser.c index eb909583f7..c18c3e0585 100644 --- a/testsuite/css/parser/test-css-parser.c +++ b/testsuite/css/parser/test-css-parser.c @@ -72,52 +72,38 @@ test_get_errors_file (const char *css_file) return g_string_free (file, FALSE); } -static char * +static GBytes * diff_with_file (const char *file1, char *text, gssize len, GError **error) { - const char *command[] = { "diff", "-u", file1, NULL, NULL }; - char *diff, *tmpfile; - int fd; + GSubprocess *process; + GBytes *input, *output; - diff = NULL; - - if (len < 0) - len = strlen (text); - - /* write the text buffer to a temporary file */ - fd = g_file_open_tmp (NULL, &tmpfile, error); - if (fd < 0) + process = g_subprocess_new (G_SUBPROCESS_FLAGS_STDIN_PIPE + | G_SUBPROCESS_FLAGS_STDOUT_PIPE, + error, + "diff", "-u", file1, "-", NULL); + if (process == NULL) return NULL; - if (write (fd, text, len) != (int) len) + input = g_bytes_new_static (text, len >= 0 ? len : strlen (text)); + if (!g_subprocess_communicate (process, + input, + NULL, + &output, + NULL, + error)) { - close (fd); - g_set_error (error, - G_FILE_ERROR, G_FILE_ERROR_FAILED, - "Could not write data to temporary file '%s'", tmpfile); - goto done; + g_object_unref (process); + g_bytes_unref (input); + return NULL; } - close (fd); - command[3] = tmpfile; - /* run diff command */ - g_spawn_sync (NULL, - (char **) command, - NULL, - G_SPAWN_SEARCH_PATH, - NULL, NULL, - &diff, - NULL, NULL, - error); + g_bytes_unref (input); -done: - g_unlink (tmpfile); - g_free (tmpfile); - - return diff; + return output; } static void @@ -168,9 +154,9 @@ static void parse_css_file (GFile *file, gboolean generate) { GtkCssProvider *provider; - char *css, *diff; - char *css_file, *reference_file, *errors_file; + char *css, *css_file, *reference_file, *errors_file; GString *errors; + GBytes *diff; GError *error = NULL; css_file = g_file_get_path (file); @@ -196,12 +182,14 @@ parse_css_file (GFile *file, gboolean generate) diff = diff_with_file (reference_file, css, -1, &error); g_assert_no_error (error); - if (diff && diff[0]) + if (diff && g_bytes_get_size (diff) > 0) { - g_test_message ("Resulting CSS doesn't match reference:\n%s", diff); + g_test_message ("Resulting CSS doesn't match reference:\n%s", + (const char *) g_bytes_get_data (diff, NULL)); g_test_fail (); } g_free (reference_file); + g_clear_pointer (&diff, g_bytes_unref); errors_file = test_get_errors_file (css_file); @@ -210,11 +198,13 @@ parse_css_file (GFile *file, gboolean generate) diff = diff_with_file (errors_file, errors->str, errors->len, &error); g_assert_no_error (error); - if (diff && diff[0]) + if (diff && g_bytes_get_size (diff) > 0) { - g_test_message ("Errors don't match expected errors:\n%s", diff); + g_test_message ("Errors don't match expected errors:\n%s", + (const char *) g_bytes_get_data (diff, NULL)); g_test_fail (); } + g_clear_pointer (&diff, g_bytes_unref); } else if (errors->str[0]) { @@ -225,8 +215,6 @@ parse_css_file (GFile *file, gboolean generate) g_free (errors_file); g_string_free (errors, TRUE); - g_free (diff); - out: g_free (css_file); g_free (css);