3#include <winpr/thread.h>
4#include <winpr/collections.h>
6static DWORD WINAPI message_queue_consumer_thread(LPVOID arg)
8 wMessage message = WINPR_C_ARRAY_INIT;
9 wMessageQueue* queue = (wMessageQueue*)arg;
11 while (MessageQueue_Wait(queue))
13 if (MessageQueue_Peek(queue, &message, TRUE))
15 if (message.id == WMQ_QUIT)
18 printf(
"Message.Type: %" PRIu32
"\n", message.id);
25static bool wrap_test(
bool (*fkt)(wMessageQueue* queue))
27 wMessageQueue* queue = MessageQueue_New(
nullptr);
32 const bool rc = fkt(queue);
33 MessageQueue_Free(queue);
37static bool check(
const wMessage* message,
size_t pos)
41 if (message->context != (
void*)13)
43 if (message->id != pos)
45 if (message->wParam != (
void*)23)
47 if (message->lParam != (
void*)42)
49 if (message->Free !=
nullptr)
54static bool append(wMessageQueue* queue,
size_t pos)
56 const wMessage message = { .context = (
void*)13,
57 .
id = WINPR_ASSERTING_INT_CAST(DWORD, pos),
62 return MessageQueue_Dispatch(queue, &message);
65static bool fill_capcity(wMessageQueue* queue,
size_t* pos)
70 const size_t capacity = MessageQueue_Capacity(queue);
71 while (MessageQueue_Size(queue) < capacity)
73 if (!append(queue, cpos++))
80static bool drain(wMessageQueue* queue,
size_t expect)
82 wMessage message = WINPR_C_ARRAY_INIT;
83 if (MessageQueue_Get(queue, &message) < 0)
85 if (!check(&message, expect))
90static bool drain_capcity(wMessageQueue* queue,
size_t remain,
size_t* pos)
95 while (MessageQueue_Size(queue) > remain)
97 if (!drain(queue, cpos++))
105static bool test_growth_move(wMessageQueue* queue,
bool big)
109 const size_t cap = MessageQueue_Capacity(queue);
115 if (!fill_capcity(queue, &wpos))
120 if (!append(queue, wpos++))
124 if (!drain_capcity(queue, 3, &rpos))
127 if (!fill_capcity(queue, &wpos))
130 if (!append(queue, wpos++))
133 return drain_capcity(queue, 0, &rpos);
136static bool test_growth_big_move(wMessageQueue* queue)
138 return test_growth_move(queue,
true);
141static bool test_growth_small_move(wMessageQueue* queue)
143 return test_growth_move(queue,
false);
146static bool test_operation_run(wMessageQueue* queue, HANDLE thread)
149 WINPR_ASSERT(thread);
151 if (!MessageQueue_Post(queue,
nullptr, 123,
nullptr,
nullptr))
154 if (!MessageQueue_Post(queue,
nullptr, 456,
nullptr,
nullptr))
157 if (!MessageQueue_Post(queue,
nullptr, 789,
nullptr,
nullptr))
160 if (!MessageQueue_PostQuit(queue, 0))
163 const DWORD status = WaitForSingleObject(thread, INFINITE);
164 return (status == WAIT_OBJECT_0);
167static bool test_operation(wMessageQueue* queue)
171 HANDLE thread = CreateThread(
nullptr, 0, message_queue_consumer_thread, queue, 0,
nullptr);
174 printf(
"failed to create thread\n");
177 const bool rc = test_operation_run(queue, thread);
178 if (!CloseHandle(thread))
183int TestMessageQueue(WINPR_ATTR_UNUSED
int argc, WINPR_ATTR_UNUSED
char* argv[])
185 if (!wrap_test(test_growth_big_move))
187 if (!wrap_test(test_growth_small_move))
189 if (!wrap_test(test_operation))