summaryrefslogtreecommitdiffstats
path: root/winpr/libwinpr/error/test
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 01:24:41 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 01:24:41 +0000
commita9bcc81f821d7c66f623779fa5147e728eb3c388 (patch)
tree98676963bcdd537ae5908a067a8eb110b93486a6 /winpr/libwinpr/error/test
parentInitial commit. (diff)
downloadfreerdp3-a9bcc81f821d7c66f623779fa5147e728eb3c388.tar.xz
freerdp3-a9bcc81f821d7c66f623779fa5147e728eb3c388.zip
Adding upstream version 3.3.0+dfsg1.upstream/3.3.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'winpr/libwinpr/error/test')
-rw-r--r--winpr/libwinpr/error/test/CMakeLists.txt26
-rw-r--r--winpr/libwinpr/error/test/TestErrorSetLastError.c135
2 files changed, 161 insertions, 0 deletions
diff --git a/winpr/libwinpr/error/test/CMakeLists.txt b/winpr/libwinpr/error/test/CMakeLists.txt
new file mode 100644
index 0000000..83b16e1
--- /dev/null
+++ b/winpr/libwinpr/error/test/CMakeLists.txt
@@ -0,0 +1,26 @@
+
+set(MODULE_NAME "TestError")
+set(MODULE_PREFIX "TEST_ERROR")
+
+set(${MODULE_PREFIX}_DRIVER ${MODULE_NAME}.c)
+
+set(${MODULE_PREFIX}_TESTS
+ TestErrorSetLastError.c)
+
+create_test_sourcelist(${MODULE_PREFIX}_SRCS
+ ${${MODULE_PREFIX}_DRIVER}
+ ${${MODULE_PREFIX}_TESTS})
+
+add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS})
+
+target_link_libraries(${MODULE_NAME} winpr)
+
+set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}")
+
+foreach(test ${${MODULE_PREFIX}_TESTS})
+ get_filename_component(TestName ${test} NAME_WE)
+ add_test(${TestName} ${TESTING_OUTPUT_DIRECTORY}/${MODULE_NAME} ${TestName})
+endforeach()
+
+set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR/Test")
+
diff --git a/winpr/libwinpr/error/test/TestErrorSetLastError.c b/winpr/libwinpr/error/test/TestErrorSetLastError.c
new file mode 100644
index 0000000..a3d57af
--- /dev/null
+++ b/winpr/libwinpr/error/test/TestErrorSetLastError.c
@@ -0,0 +1,135 @@
+/**
+ * CTest for winpr's SetLastError/GetLastError
+ *
+ * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2013 Thincast Technologies GmbH
+ * Copyright 2013 Norbert Federa <norbert.federa@thincast.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <winpr/crt.h>
+#include <winpr/wlog.h>
+#include <winpr/synch.h>
+#include <winpr/thread.h>
+#include <winpr/interlocked.h>
+
+#include <winpr/error.h>
+
+static int status = 0;
+
+static LONG* pLoopCount = NULL;
+static BOOL bStopTest = FALSE;
+
+static DWORD WINAPI test_error_thread(LPVOID arg)
+{
+ int id = 0;
+ DWORD dwErrorSet = 0;
+ DWORD dwErrorGet = 0;
+
+ id = (int)(size_t)arg;
+
+ do
+ {
+ dwErrorSet = (DWORD)abs(rand()) + 1;
+ SetLastError(dwErrorSet);
+ if ((dwErrorGet = GetLastError()) != dwErrorSet)
+ {
+ printf("GetLastError() failure (thread %d): Expected: 0x%08" PRIX32
+ ", Actual: 0x%08" PRIX32 "\n",
+ id, dwErrorSet, dwErrorGet);
+ if (!status)
+ status = -1;
+ break;
+ }
+ InterlockedIncrement(pLoopCount);
+ } while (!status && !bStopTest);
+
+ return 0;
+}
+
+int TestErrorSetLastError(int argc, char* argv[])
+{
+ DWORD error = 0;
+ HANDLE threads[4];
+
+ WINPR_UNUSED(argc);
+ WINPR_UNUSED(argv);
+
+ /* We must initialize WLog here. It will check for settings
+ * in the environment and if the variables are not set, the last
+ * error state is changed... */
+ WLog_GetRoot();
+
+ SetLastError(ERROR_ACCESS_DENIED);
+
+ error = GetLastError();
+
+ if (error != ERROR_ACCESS_DENIED)
+ {
+ printf("GetLastError() failure: Expected: 0x%08X, Actual: 0x%08" PRIX32 "\n",
+ ERROR_ACCESS_DENIED, error);
+ return -1;
+ }
+
+ pLoopCount = winpr_aligned_malloc(sizeof(LONG), sizeof(LONG));
+ if (!pLoopCount)
+ {
+ printf("Unable to allocate memory\n");
+ return -1;
+ }
+ *pLoopCount = 0;
+
+ for (int i = 0; i < 4; i++)
+ {
+ if (!(threads[i] = CreateThread(NULL, 0, test_error_thread, (void*)(size_t)0, 0, NULL)))
+ {
+ printf("Failed to create thread #%d\n", i);
+ return -1;
+ }
+ }
+
+ // let the threads run for at least 0.2 seconds
+ Sleep(200);
+ bStopTest = TRUE;
+
+ WaitForSingleObject(threads[0], INFINITE);
+ WaitForSingleObject(threads[1], INFINITE);
+ WaitForSingleObject(threads[2], INFINITE);
+ WaitForSingleObject(threads[3], INFINITE);
+
+ CloseHandle(threads[0]);
+ CloseHandle(threads[1]);
+ CloseHandle(threads[2]);
+ CloseHandle(threads[3]);
+
+ error = GetLastError();
+
+ if (error != ERROR_ACCESS_DENIED)
+ {
+ printf("GetLastError() failure: Expected: 0x%08X, Actual: 0x%08" PRIX32 "\n",
+ ERROR_ACCESS_DENIED, error);
+ return -1;
+ }
+
+ if (*pLoopCount < 4)
+ {
+ printf("Error: unexpected loop count\n");
+ return -1;
+ }
+
+ printf("Completed %" PRId32 " iterations.\n", *pLoopCount);
+ winpr_aligned_free(pLoopCount);
+
+ return status;
+}