From c5dde308bfa67c8bc725f4be10268617801df6c9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Mon, 6 Mar 2017 19:14:27 +0000 Subject: [PATCH] [KERNEL32_APITEST]: Add basic tests for lstrlenA/W, focusing on its special handling of the NULL pointer. We detect that the NULL pointer is handled separately because no exception is generated, contrary to when the function is called with truly invalid pointers. I thank Mark for having mentioned the vectored exception handling to me, needed to catch first-chance exceptions. svn path=/trunk/; revision=74118 --- rostests/apitests/kernel32/CMakeLists.txt | 1 + rostests/apitests/kernel32/lstrlen.c | 56 +++++++++++++++++++++++ rostests/apitests/kernel32/testlist.c | 2 + 3 files changed, 59 insertions(+) create mode 100644 rostests/apitests/kernel32/lstrlen.c diff --git a/rostests/apitests/kernel32/CMakeLists.txt b/rostests/apitests/kernel32/CMakeLists.txt index a6fe595aca4..4fbde1f4b03 100644 --- a/rostests/apitests/kernel32/CMakeLists.txt +++ b/rostests/apitests/kernel32/CMakeLists.txt @@ -14,6 +14,7 @@ list(APPEND SOURCE interlck.c LoadLibraryExW.c lstrcpynW.c + lstrlen.c MultiByteToWideChar.c PrivMoveFileIdentityW.c SetConsoleWindowInfo.c diff --git a/rostests/apitests/kernel32/lstrlen.c b/rostests/apitests/kernel32/lstrlen.c new file mode 100644 index 00000000000..69db9ae18e7 --- /dev/null +++ b/rostests/apitests/kernel32/lstrlen.c @@ -0,0 +1,56 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: Tests for lstrlenA/W + * PROGRAMMER: Hermes Belusca-Maito + */ + +#include + +#define WIN32_NO_STATUS +#include + +LONG WINAPI VEHandler_1(PEXCEPTION_POINTERS ExceptionInfo) +{ + /* + * Vectored Exception Handler possibly called for lstrlen(NULL). + * Expected not to be called! + */ + ok(FALSE, "VEHandler_1 called!\n"); + return EXCEPTION_CONTINUE_SEARCH; +} + +LONG WINAPI VEHandler_2(PEXCEPTION_POINTERS ExceptionInfo) +{ + /* Vectored Exception Handler that should be called for lstrlen() */ + ok(TRUE, "VEHandler_2 not called?\n"); + return EXCEPTION_CONTINUE_SEARCH; +} + +START_TEST(lstrlen) +{ + PVOID pVEH; + + /* Test basic functionality */ + ok(lstrlenA( "Hello World!") == 12, "lstrlenA failed!\n"); + ok(lstrlenW(L"Hello World!") == 12, "lstrlenW failed!\n"); + + /* + * NULL buffer is special and is considered separately; + * no internal exception is generated. + * Use Vectored Exception Handling to monitor for first-chance exceptions. + */ +pVEH = AddVectoredExceptionHandler(1, VEHandler_1); + ok(lstrlenA(NULL) == 0, "lstrlenA should have returned 0.\n"); + ok(lstrlenW(NULL) == 0, "lstrlenW should have returned 0.\n"); +RemoveVectoredExceptionHandler(pVEH); + + /* + * Test some invalid buffers. Internal exceptions should be generated. + * Use Vectored Exception Handling to monitor for first-chance exceptions. + */ +pVEH = AddVectoredExceptionHandler(1, VEHandler_2); + ok(lstrlenA( (LPSTR)0xbaadf00d) == 0, "lstrlenA should have returned 0.\n"); + ok(lstrlenW((LPWSTR)0xbaadf00d) == 0, "lstrlenW should have returned 0.\n"); +RemoveVectoredExceptionHandler(pVEH); +} diff --git a/rostests/apitests/kernel32/testlist.c b/rostests/apitests/kernel32/testlist.c index 002aa406350..f1beea841a6 100644 --- a/rostests/apitests/kernel32/testlist.c +++ b/rostests/apitests/kernel32/testlist.c @@ -15,6 +15,7 @@ extern void func_GetModuleFileName(void); extern void func_interlck(void); extern void func_LoadLibraryExW(void); extern void func_lstrcpynW(void); +extern void func_lstrlen(void); extern void func_Mailslot(void); extern void func_MultiByteToWideChar(void); extern void func_PrivMoveFileIdentityW(void); @@ -39,6 +40,7 @@ const struct test winetest_testlist[] = { "interlck", func_interlck }, { "LoadLibraryExW", func_LoadLibraryExW }, { "lstrcpynW", func_lstrcpynW }, + { "lstrlen", func_lstrlen }, { "MailslotRead", func_Mailslot }, { "MultiByteToWideChar", func_MultiByteToWideChar }, { "PrivMoveFileIdentityW", func_PrivMoveFileIdentityW }, -- 2.17.1