diff options
author | Marc-André Lureau <marcandre.lureau@gmail.com> | 2012-08-20 15:47:15 +0200 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@gmail.com> | 2012-08-20 17:10:31 +0200 |
commit | 1c1ba8b5122295651400eed3f3fb3b9f69f0ac47 (patch) | |
tree | cd1eb67200fb835282ddd0281b0e2386197a32b3 | |
parent | b9d7b80897d79cb43c4a795c7d9d3d9a24e140cc (diff) | |
download | glib-1c1ba8b5122295651400eed3f3fb3b9f69f0ac47.tar.gz |
win32: add pipe-io-overlap-test
-rw-r--r-- | gio/tests/win32-streams.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/gio/tests/win32-streams.c b/gio/tests/win32-streams.c index fd4b27b92..e468f7348 100644 --- a/gio/tests/win32-streams.c +++ b/gio/tests/win32-streams.c @@ -278,6 +278,97 @@ test_pipe_io (void) g_object_unref (out); } +typedef struct _PipeIOOverlapReader +{ + char buf[sizeof (DATA)]; + GInputStream *in; + GThread *thread; +} PipeIOOverlapReader; + +#define TEST_PIPE_IO_OVERLAP (1024 * 4) + +static gpointer +pipe_io_overlap_reader_thread (gpointer user_data) +{ + PipeIOOverlapReader *p = user_data; + GError *err = NULL; + gsize read; + guint i; + + for (i = 0; i < TEST_PIPE_IO_OVERLAP; ++i) { + memset (p->buf, 0, sizeof (p->buf)); + g_input_stream_read_all (p->in, p->buf, sizeof (p->buf), + &read, NULL, &err); + + g_assert_cmpuint (read, ==, sizeof (p->buf)); + g_assert_no_error (err); + g_assert_cmpstr (p->buf, ==, DATA); + } + + return NULL; +} + +static gpointer +pipe_io_overlap_writer_thread (gpointer user_data) +{ + GOutputStream *out = user_data; + GError *err = NULL; + gsize bytes_written; + guint i; + + for (i = 0; i < TEST_PIPE_IO_OVERLAP; ++i) { + g_output_stream_write_all (out, DATA, sizeof (DATA), + &bytes_written, NULL, &err); + + g_assert_cmpuint (bytes_written, ==, sizeof (DATA)); + g_assert_no_error (err); + } + + return NULL; +} + +static void +test_pipe_io_overlap (void) +{ + GOutputStream *out_server, *out_client; + GThread *writer_server, *writer_client; + PipeIOOverlapReader rs, rc; + HANDLE server, client; + gchar name[256]; + + g_snprintf (name, sizeof (name), + "\\\\.\\pipe\\gtest-io-overlap-%u", (guint) getpid ()); + + server = CreateNamedPipe (name, + PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, + PIPE_READMODE_BYTE | PIPE_WAIT, + 1, 0, 0, 0, NULL); + g_assert (server != INVALID_HANDLE_VALUE); + + client = CreateFile (name, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); + g_assert (client != INVALID_HANDLE_VALUE); + + out_server = g_win32_output_stream_new (server, TRUE); + writer_server = g_thread_new ("writer_server", pipe_io_overlap_writer_thread, out_server); + rs.in = g_win32_input_stream_new (server, TRUE); + rs.thread = g_thread_new ("reader_server", pipe_io_overlap_reader_thread, &rs); + + out_client = g_win32_output_stream_new (client, TRUE); + writer_client = g_thread_new ("writer_client", pipe_io_overlap_writer_thread, out_client); + rc.in = g_win32_input_stream_new (client, TRUE); + rc.thread = g_thread_new ("reader_client", pipe_io_overlap_reader_thread, &rc); + + g_thread_join (writer_client); + g_thread_join (writer_server); + g_thread_join (rc.thread); + g_thread_join (rs.thread); + + g_object_unref (rs.in); + g_object_unref (rc.in); + g_object_unref (out_server); + g_object_unref (out_client); +} + int main (int argc, char *argv[]) @@ -286,6 +377,7 @@ main (int argc, g_test_init (&argc, &argv, NULL); g_test_add_func ("/win32-streams/pipe-io-test", test_pipe_io); + g_test_add_func ("/win32-streams/pipe-io-overlap-test", test_pipe_io_overlap); return g_test_run(); } |