summaryrefslogtreecommitdiffstats
path: root/winpr/libwinpr/utils/test/TestMessagePipe.c
diff options
context:
space:
mode:
Diffstat (limited to 'winpr/libwinpr/utils/test/TestMessagePipe.c')
-rw-r--r--winpr/libwinpr/utils/test/TestMessagePipe.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/winpr/libwinpr/utils/test/TestMessagePipe.c b/winpr/libwinpr/utils/test/TestMessagePipe.c
new file mode 100644
index 0000000..c5a3ee2
--- /dev/null
+++ b/winpr/libwinpr/utils/test/TestMessagePipe.c
@@ -0,0 +1,105 @@
+
+#include <winpr/crt.h>
+#include <winpr/thread.h>
+#include <winpr/collections.h>
+
+static DWORD WINAPI message_echo_pipe_client_thread(LPVOID arg)
+{
+ int index = 0;
+ wMessagePipe* pipe = (wMessagePipe*)arg;
+
+ while (index < 100)
+ {
+ wMessage message = { 0 };
+ int count = -1;
+
+ if (!MessageQueue_Post(pipe->In, NULL, 0, (void*)(size_t)index, NULL))
+ break;
+
+ if (!MessageQueue_Wait(pipe->Out))
+ break;
+
+ if (!MessageQueue_Peek(pipe->Out, &message, TRUE))
+ break;
+
+ if (message.id == WMQ_QUIT)
+ break;
+
+ count = (int)(size_t)message.wParam;
+
+ if (count != index)
+ printf("Echo count mismatch: Actual: %d, Expected: %d\n", count, index);
+
+ index++;
+ }
+
+ MessageQueue_PostQuit(pipe->In, 0);
+
+ return 0;
+}
+
+static DWORD WINAPI message_echo_pipe_server_thread(LPVOID arg)
+{
+ wMessage message = { 0 };
+ wMessagePipe* pipe = (wMessagePipe*)arg;
+
+ while (MessageQueue_Wait(pipe->In))
+ {
+ if (MessageQueue_Peek(pipe->In, &message, TRUE))
+ {
+ if (message.id == WMQ_QUIT)
+ break;
+
+ if (!MessageQueue_Dispatch(pipe->Out, &message))
+ break;
+ }
+ }
+
+ return 0;
+}
+
+int TestMessagePipe(int argc, char* argv[])
+{
+ HANDLE ClientThread = NULL;
+ HANDLE ServerThread = NULL;
+ wMessagePipe* EchoPipe = NULL;
+ int ret = 1;
+
+ WINPR_UNUSED(argc);
+ WINPR_UNUSED(argv);
+
+ if (!(EchoPipe = MessagePipe_New()))
+ {
+ printf("failed to create message pipe\n");
+ goto out;
+ }
+
+ if (!(ClientThread =
+ CreateThread(NULL, 0, message_echo_pipe_client_thread, (void*)EchoPipe, 0, NULL)))
+ {
+ printf("failed to create client thread\n");
+ goto out;
+ }
+
+ if (!(ServerThread =
+ CreateThread(NULL, 0, message_echo_pipe_server_thread, (void*)EchoPipe, 0, NULL)))
+ {
+ printf("failed to create server thread\n");
+ goto out;
+ }
+
+ WaitForSingleObject(ClientThread, INFINITE);
+ WaitForSingleObject(ServerThread, INFINITE);
+
+ ret = 0;
+
+out:
+ if (EchoPipe)
+ MessagePipe_Free(EchoPipe);
+ if (ClientThread)
+ CloseHandle(ClientThread);
+ if (ServerThread)
+ CloseHandle(ServerThread);
+
+ return ret;
+}