diff options
Diffstat (limited to 'gio/tests/gsubprocess.c')
-rw-r--r-- | gio/tests/gsubprocess.c | 105 |
1 files changed, 99 insertions, 6 deletions
diff --git a/gio/tests/gsubprocess.c b/gio/tests/gsubprocess.c index 71b018dd0..716ce06f4 100644 --- a/gio/tests/gsubprocess.c +++ b/gio/tests/gsubprocess.c @@ -546,6 +546,8 @@ test_multi_1 (void) } typedef struct { + gboolean is_utf8; + gboolean is_invalid_utf8; gboolean running; GError *error; } TestAsyncCommunicateData; @@ -556,21 +558,41 @@ on_communicate_complete (GObject *proc, gpointer user_data) { TestAsyncCommunicateData *data = user_data; - GBytes *stdout; + GBytes *stdout = NULL; + char *stdout_str = NULL; const guint8 *stdout_data; gsize stdout_len; data->running = FALSE; - (void) g_subprocess_communicate_finish ((GSubprocess*)proc, result, - &stdout, NULL, &data->error); + if (data->is_utf8) + (void) g_subprocess_communicate_utf8_finish ((GSubprocess*)proc, result, + &stdout_str, NULL, &data->error); + else + (void) g_subprocess_communicate_finish ((GSubprocess*)proc, result, + &stdout, NULL, &data->error); + if (data->is_invalid_utf8) + { + g_assert_error (data->error, G_IO_ERROR, G_IO_ERROR_FAILED); + return; + } g_assert_no_error (data->error); - stdout_data = g_bytes_get_data (stdout, &stdout_len); + if (!data->is_utf8) + { + stdout_data = g_bytes_get_data (stdout, &stdout_len); + } + else + { + stdout_data = (guint8*)stdout_str; + stdout_len = strlen (stdout_str); + } g_assert_cmpint (stdout_len, ==, 11); g_assert (memcmp (stdout_data, "hello world", 11) == 0); - g_bytes_unref (stdout); + if (stdout) + g_bytes_unref (stdout); + g_free (stdout_str); } static void @@ -583,6 +605,7 @@ test_communicate (void) GSubprocess *proc; GCancellable *cancellable = NULL; GBytes *input; + const char *hellostring; args = get_test_subprocess_args ("cat", NULL); proc = g_subprocess_newv ((const gchar* const*)args->pdata, @@ -591,7 +614,8 @@ test_communicate (void) g_assert_no_error (local_error); g_ptr_array_free (args, TRUE); - input = g_bytes_new_static ("hello world", strlen ("hello world")); + hellostring = "hello world"; + input = g_bytes_new_static (hellostring, strlen (hellostring)); data.error = local_error; g_subprocess_communicate_async (proc, input, @@ -608,6 +632,73 @@ test_communicate (void) g_object_unref (proc); } +static void +test_communicate_utf8 (void) +{ + GError *local_error = NULL; + GError **error = &local_error; + GPtrArray *args; + TestAsyncCommunicateData data = { 0, }; + GSubprocess *proc; + GCancellable *cancellable = NULL; + + args = get_test_subprocess_args ("cat", NULL); + proc = g_subprocess_newv ((const gchar* const*)args->pdata, + G_SUBPROCESS_FLAGS_STDIN_PIPE | G_SUBPROCESS_FLAGS_STDOUT_PIPE, + error); + g_assert_no_error (local_error); + g_ptr_array_free (args, TRUE); + + data.error = local_error; + data.is_utf8 = TRUE; + g_subprocess_communicate_utf8_async (proc, "hello world", + cancellable, + on_communicate_complete, + &data); + + data.running = TRUE; + while (data.running) + g_main_context_iteration (NULL, TRUE); + + g_assert_no_error (local_error); + + g_object_unref (proc); +} + +static void +test_communicate_utf8_invalid (void) +{ + GError *local_error = NULL; + GError **error = &local_error; + GPtrArray *args; + TestAsyncCommunicateData data = { 0, }; + GSubprocess *proc; + GCancellable *cancellable = NULL; + + args = get_test_subprocess_args ("cat", NULL); + proc = g_subprocess_newv ((const gchar* const*)args->pdata, + G_SUBPROCESS_FLAGS_STDIN_PIPE | G_SUBPROCESS_FLAGS_STDOUT_PIPE, + error); + g_assert_no_error (local_error); + g_ptr_array_free (args, TRUE); + + data.error = local_error; + data.is_utf8 = TRUE; + data.is_invalid_utf8 = TRUE; + g_subprocess_communicate_utf8_async (proc, "\xFF\xFF", + cancellable, + on_communicate_complete, + &data); + + data.running = TRUE; + while (data.running) + g_main_context_iteration (NULL, TRUE); + + g_assert_no_error (local_error); + + g_object_unref (proc); +} + static gboolean send_terminate (gpointer user_data) { @@ -905,6 +996,8 @@ main (int argc, char **argv) g_test_add_func ("/gsubprocess/cat-eof", test_cat_eof); g_test_add_func ("/gsubprocess/multi1", test_multi_1); g_test_add_func ("/gsubprocess/communicate", test_communicate); + g_test_add_func ("/gsubprocess/communicate-utf8", test_communicate_utf8); + g_test_add_func ("/gsubprocess/communicate-utf8-invalid", test_communicate_utf8_invalid); g_test_add_func ("/gsubprocess/terminate", test_terminate); #ifdef G_OS_UNIX g_test_add_func ("/gsubprocess/stdout-file", test_stdout_file); |