diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 01:24:41 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 01:24:41 +0000 |
commit | a9bcc81f821d7c66f623779fa5147e728eb3c388 (patch) | |
tree | 98676963bcdd537ae5908a067a8eb110b93486a6 /winpr/libwinpr/error/test | |
parent | Initial commit. (diff) | |
download | freerdp3-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.txt | 26 | ||||
-rw-r--r-- | winpr/libwinpr/error/test/TestErrorSetLastError.c | 135 |
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; +} |