tests: Add splice cancellation test

This doesn't trigger the cancellation assertion issue when run locally
(the task didn't return yet, so the error is simply overwritten), but
perhaps it ever does in CI. Anyhow, it's good to have a cancellation
test.
This commit is contained in:
Carlos Garnacho 2020-08-24 12:30:16 +02:00
parent c033450f93
commit cf85241aba

View File

@ -32,6 +32,7 @@ typedef enum
TEST_THREADED_NONE = 0,
TEST_THREADED_ISTREAM = 1,
TEST_THREADED_OSTREAM = 2,
TEST_CANCEL = 4,
TEST_THREADED_BOTH = TEST_THREADED_ISTREAM | TEST_THREADED_OSTREAM,
} TestThreadedFlags;
@ -58,6 +59,14 @@ test_copy_chunks_splice_cb (GObject *source,
bytes_spliced = g_output_stream_splice_finish (G_OUTPUT_STREAM (source),
res, &error);
if (data->flags & TEST_CANCEL)
{
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
g_main_loop_quit (data->main_loop);
return;
}
g_assert_no_error (error);
g_assert_cmpint (bytes_spliced, ==, strlen (data->data));
@ -100,11 +109,18 @@ test_copy_chunks_start (TestThreadedFlags flags)
{
TestCopyChunksData data;
GError *error = NULL;
GCancellable *cancellable = NULL;
data.main_loop = g_main_loop_new (NULL, FALSE);
data.data = "abcdefghijklmnopqrstuvwxyz";
data.flags = flags;
if (data.flags & TEST_CANCEL)
{
cancellable = g_cancellable_new ();
g_cancellable_cancel (cancellable);
}
if (data.flags & TEST_THREADED_ISTREAM)
{
GFile *file;
@ -150,7 +166,7 @@ test_copy_chunks_start (TestThreadedFlags flags)
g_output_stream_splice_async (data.ostream, data.istream,
G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE |
G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
G_PRIORITY_DEFAULT, NULL,
G_PRIORITY_DEFAULT, cancellable,
test_copy_chunks_splice_cb, &data);
/* We do not hold a ref in data struct, this is to make sure the operation
@ -158,6 +174,7 @@ test_copy_chunks_start (TestThreadedFlags flags)
*/
g_object_unref (data.istream);
g_object_unref (data.ostream);
g_clear_object (&cancellable);
g_main_loop_run (data.main_loop);
g_main_loop_unref (data.main_loop);
@ -187,6 +204,12 @@ test_copy_chunks_threaded (void)
test_copy_chunks_start (TEST_THREADED_BOTH);
}
static void
test_cancelled (void)
{
test_copy_chunks_start (TEST_THREADED_NONE | TEST_CANCEL);
}
int
main (int argc,
char *argv[])
@ -200,6 +223,8 @@ main (int argc,
test_copy_chunks_threaded_output);
g_test_add_func ("/async-splice/copy-chunks-threaded",
test_copy_chunks_threaded);
g_test_add_func ("/async-splice/cancelled",
test_cancelled);
return g_test_run();
}