summaryrefslogtreecommitdiff
path: root/src/pal/tests/palsuite/threading/WaitForMultipleObjects/test1/test1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pal/tests/palsuite/threading/WaitForMultipleObjects/test1/test1.cpp')
-rw-r--r--src/pal/tests/palsuite/threading/WaitForMultipleObjects/test1/test1.cpp224
1 files changed, 224 insertions, 0 deletions
diff --git a/src/pal/tests/palsuite/threading/WaitForMultipleObjects/test1/test1.cpp b/src/pal/tests/palsuite/threading/WaitForMultipleObjects/test1/test1.cpp
new file mode 100644
index 0000000000..8249c38d9d
--- /dev/null
+++ b/src/pal/tests/palsuite/threading/WaitForMultipleObjects/test1/test1.cpp
@@ -0,0 +1,224 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*============================================================
+**
+** Source: test1.c
+**
+** Purpose: Test for WaitForMultipleObjects. Call the function
+** on an array of 4 events, and ensure that it returns correct
+** results when we do so.
+**
+**
+**=========================================================*/
+
+#include <palsuite.h>
+
+/* Number of events in array */
+#define MAX_EVENTS 4
+
+BOOL WaitForMultipleObjectsTest()
+{
+ BOOL bRet = TRUE;
+ DWORD dwRet = 0;
+
+ DWORD i = 0, j = 0;
+
+ LPSECURITY_ATTRIBUTES lpEventAttributes = NULL;
+ BOOL bManualReset = TRUE;
+ BOOL bInitialState = TRUE;
+
+ HANDLE hEvent[MAX_EVENTS];
+
+ /* Run through this for loop and create 4 events */
+ for (i = 0; i < MAX_EVENTS; i++)
+ {
+ hEvent[i] = CreateEvent( lpEventAttributes,
+ bManualReset, bInitialState, NULL);
+
+ if (hEvent[i] == INVALID_HANDLE_VALUE)
+ {
+ Trace("WaitForMultipleObjectsTest:CreateEvent %u failed (%x)\n", i, GetLastError());
+ bRet = FALSE;
+ break;
+ }
+
+ /* Set the current event */
+ bRet = SetEvent(hEvent[i]);
+
+ if (!bRet)
+ {
+ Trace("WaitForMultipleObjectsTest:SetEvent %u failed (%x)\n", i, GetLastError());
+ bRet = FALSE;
+ break;
+ }
+
+ /* Ensure that this returns the correct value */
+ dwRet = WaitForSingleObject(hEvent[i],0);
+
+ if (dwRet != WAIT_OBJECT_0)
+ {
+ Trace("WaitForMultipleObjectsTest:WaitForSingleObject %u failed (%x)\n", i, GetLastError());
+ bRet = FALSE;
+ break;
+ }
+
+ /* Reset the event, and again ensure that the return value of
+ WaitForSingle is correct.
+ */
+ bRet = ResetEvent(hEvent[i]);
+
+ if (!bRet)
+ {
+ Trace("WaitForMultipleObjectsTest:ResetEvent %u failed (%x)\n", i, GetLastError());
+ bRet = FALSE;
+ break;
+ }
+
+ dwRet = WaitForSingleObject(hEvent[i],0);
+
+ if (dwRet != WAIT_TIMEOUT)
+ {
+ Trace("WaitForMultipleObjectsTest:WaitForSingleObject %u failed (%x)\n", i, GetLastError());
+ bRet = FALSE;
+ break;
+ }
+ }
+
+ /*
+ * If the first section of the test passed, move on to the
+ * second.
+ */
+
+ if (bRet)
+ {
+ BOOL bWaitAll = TRUE;
+ DWORD nCount = MAX_EVENTS;
+ CONST HANDLE *lpHandles = &hEvent[0];
+
+ /* Call WaitForMultipleOjbects on all the events, the return
+ should be WAIT_TIMEOUT
+ */
+ dwRet = WaitForMultipleObjects( nCount,
+ lpHandles,
+ bWaitAll,
+ 0);
+
+ if (dwRet != WAIT_TIMEOUT)
+ {
+ Trace("WaitForMultipleObjectsTest:WaitForMultipleObjects failed (%x)\n", GetLastError());
+ }
+ else
+ {
+ /* Step through each event and one at a time, set the
+ currect test, while reseting all the other tests
+ */
+
+ for (i = 0; i < MAX_EVENTS; i++)
+ {
+ for (j = 0; j < MAX_EVENTS; j++)
+ {
+ if (j == i)
+ {
+
+ bRet = SetEvent(hEvent[j]);
+
+ if (!bRet)
+ {
+ Trace("WaitForMultipleObjectsTest:SetEvent %u failed (%x)\n", j, GetLastError());
+ break;
+ }
+ }
+ else
+ {
+ bRet = ResetEvent(hEvent[j]);
+
+ if (!bRet)
+ {
+ Trace("WaitForMultipleObjectsTest:ResetEvent %u failed (%x)\n", j, GetLastError());
+ }
+ }
+ }
+
+ bWaitAll = FALSE;
+
+ /* Check that WaitFor returns WAIT_OBJECT + i */
+ dwRet = WaitForMultipleObjects( nCount,
+ lpHandles, bWaitAll, 0);
+
+ if (dwRet != WAIT_OBJECT_0+i)
+ {
+ Trace("WaitForMultipleObjectsTest:WaitForMultipleObjects failed (%x)\n", GetLastError());
+ bRet = FALSE;
+ break;
+ }
+ }
+ }
+
+ for (i = 0; i < MAX_EVENTS; i++)
+ {
+ bRet = CloseHandle(hEvent[i]);
+
+ if (!bRet)
+ {
+ Trace("WaitForMultipleObjectsTest:CloseHandle %u failed (%x)\n", i, GetLastError());
+ }
+ }
+ }
+
+ return bRet;
+}
+
+BOOL WaitMultipleDuplicateHandleTest()
+{
+ BOOL testResult = TRUE;
+ const HANDLE eventHandle = CreateEvent(NULL, TRUE, TRUE, NULL);
+ HANDLE eventHandles[] = {eventHandle, eventHandle};
+
+ // WaitAny - Wait for any of the events (no error expected)
+ DWORD result = WaitForMultipleObjects(sizeof(eventHandles) / sizeof(eventHandles[0]), eventHandles, FALSE, 0);
+ if (result != WAIT_OBJECT_0)
+ {
+ Trace("WaitMultipleDuplicateHandleTest:WaitAny failed (%x)\n", GetLastError());
+ testResult = FALSE;
+ }
+
+ // WaitAll - Wait for all of the events (error expected)
+ result = WaitForMultipleObjects(sizeof(eventHandles) / sizeof(eventHandles[0]), eventHandles, TRUE, 0);
+ if (result != WAIT_FAILED)
+ {
+ Trace("WaitMultipleDuplicateHandleTest:WaitAll failed: call unexpectedly succeeded\n");
+ testResult = FALSE;
+ }
+ else if (GetLastError() != ERROR_INVALID_PARAMETER)
+ {
+ Trace("WaitMultipleDuplicateHandleTest:WaitAll failed: unexpected last error (%x)\n");
+ testResult = FALSE;
+ }
+
+ return testResult;
+}
+
+int __cdecl main(int argc, char **argv)
+{
+
+ if(0 != (PAL_Initialize(argc, argv)))
+ {
+ return ( FAIL );
+ }
+
+ if(!WaitForMultipleObjectsTest())
+ {
+ Fail ("Test failed\n");
+ }
+
+ if (!WaitMultipleDuplicateHandleTest())
+ {
+ Fail("Test failed\n");
+ }
+
+ PAL_Terminate();
+ return ( PASS );
+
+}