From 56ea938fbfd583df6c57b5cb5db7473357a7d2f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Thu, 4 Oct 2012 23:19:05 -0400 Subject: [PATCH] libwinpr: wrote more tests --- cmake/ConfigOptions.cmake | 1 + winpr/include/winpr/crt.h | 5 ++ winpr/include/winpr/tchar.h | 2 + winpr/libwinpr/library/CMakeLists.txt | 4 ++ winpr/libwinpr/library/module.def | 3 + winpr/libwinpr/library/test/CMakeLists.txt | 9 +-- .../library/test/TestLibraryA/CMakeLists.txt | 22 ++++++++ .../library/test/TestLibraryA/TestLibraryA.c | 19 +++++++ .../library/test/TestLibraryB/CMakeLists.txt | 22 ++++++++ .../library/test/TestLibraryB/TestLibraryB.c | 19 +++++++ .../library/test/TestLibraryFreeLibrary.c | 17 ++++++ .../library/test/TestLibraryGetProcAddress.c | 41 ++++++++++++++ .../library/test/TestLibraryLoadLibrary.c | 17 ++++++ winpr/libwinpr/path/path.c | 55 ++++++++++++++++++- 14 files changed, 231 insertions(+), 5 deletions(-) create mode 100644 winpr/libwinpr/library/module.def create mode 100644 winpr/libwinpr/library/test/TestLibraryA/CMakeLists.txt create mode 100644 winpr/libwinpr/library/test/TestLibraryA/TestLibraryA.c create mode 100644 winpr/libwinpr/library/test/TestLibraryB/CMakeLists.txt create mode 100644 winpr/libwinpr/library/test/TestLibraryB/TestLibraryB.c diff --git a/cmake/ConfigOptions.cmake b/cmake/ConfigOptions.cmake index 908caddfd..c66f518a3 100644 --- a/cmake/ConfigOptions.cmake +++ b/cmake/ConfigOptions.cmake @@ -23,6 +23,7 @@ endif() option(WITH_CLIENT "Build client binaries" ON) option(WITH_SERVER "Build server binaries" OFF) + option(WITH_CHANNELS "Build virtual channel plugins" ON) if(WITH_CLIENT AND WITH_CHANNELS) diff --git a/winpr/include/winpr/crt.h b/winpr/include/winpr/crt.h index 8d73a6b90..045f1b7d3 100644 --- a/winpr/include/winpr/crt.h +++ b/winpr/include/winpr/crt.h @@ -33,6 +33,11 @@ #ifndef _WIN32 +#ifndef _ERRNO_T_DEFINED +#define _ERRNO_T_DEFINED +typedef int errno_t; +#endif + WINPR_API void* _aligned_malloc(size_t size, size_t alignment); WINPR_API void* _aligned_realloc(void* memblock, size_t size, size_t alignment); WINPR_API void* _aligned_recalloc(void* memblock, size_t num, size_t size, size_t alignment); diff --git a/winpr/include/winpr/tchar.h b/winpr/include/winpr/tchar.h index 2050cabf1..34fc27220 100644 --- a/winpr/include/winpr/tchar.h +++ b/winpr/include/winpr/tchar.h @@ -40,11 +40,13 @@ typedef CHAR TCHAR; #define _tcsdup _wcsdup #define _tcscmp wcscmp #define _tcscpy wcscpy +#define _stprintf_s swprintf_s #else #define _tprintf printf #define _tcsdup _strdup #define _tcscmp strcmp #define _tcscpy strcpy +#define _stprintf_s sprintf_s #endif #endif diff --git a/winpr/libwinpr/library/CMakeLists.txt b/winpr/libwinpr/library/CMakeLists.txt index 002cf9d1c..c8cbcad5c 100644 --- a/winpr/libwinpr/library/CMakeLists.txt +++ b/winpr/libwinpr/library/CMakeLists.txt @@ -21,6 +21,10 @@ set(MODULE_PREFIX "WINPR_LIBRARY") set(${MODULE_PREFIX}_SRCS library.c) +if(MSVC AND (NOT WITH_MONOLITHIC_BUILD)) + set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) +endif() + if(WITH_MONOLITHIC_BUILD) add_library(${MODULE_NAME} OBJECT ${${MODULE_PREFIX}_SRCS}) else() diff --git a/winpr/libwinpr/library/module.def b/winpr/libwinpr/library/module.def new file mode 100644 index 000000000..c4a5071c4 --- /dev/null +++ b/winpr/libwinpr/library/module.def @@ -0,0 +1,3 @@ +LIBRARY "libwinpr-library" +EXPORTS + diff --git a/winpr/libwinpr/library/test/CMakeLists.txt b/winpr/libwinpr/library/test/CMakeLists.txt index 8e9c10423..9096ddc93 100644 --- a/winpr/libwinpr/library/test/CMakeLists.txt +++ b/winpr/libwinpr/library/test/CMakeLists.txt @@ -18,13 +18,14 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -if(NOT WIN32) - target_link_libraries(${MODULE_NAME} winpr-library) -endif() +target_link_libraries(${MODULE_NAME} winpr-library winpr-path) foreach(test ${${MODULE_PREFIX}_TESTS}) get_filename_component(TestName ${test} NAME_WE) - add_test(${TestName} ${EXECUTABLE_OUTPUT_PATH}/${MODULE_NAME} ${TestName}) + add_test(${TestName} ${EXECUTABLE_OUTPUT_PATH}/${MODULE_NAME} ${TestName} ${EXECUTABLE_OUTPUT_PATH}) endforeach() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR/Test") + +add_subdirectory(TestLibraryA) +add_subdirectory(TestLibraryB) diff --git a/winpr/libwinpr/library/test/TestLibraryA/CMakeLists.txt b/winpr/libwinpr/library/test/TestLibraryA/CMakeLists.txt new file mode 100644 index 000000000..06156482c --- /dev/null +++ b/winpr/libwinpr/library/test/TestLibraryA/CMakeLists.txt @@ -0,0 +1,22 @@ +# WinPR: Windows Portable Runtime +# libwinpr-library cmake build script +# +# Copyright 2012 Marc-Andre Moreau +# +# 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. + +set(MODULE_NAME "TestLibraryA") + +add_library(${MODULE_NAME} TestLibraryA.c) + +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR/Test/Extra") diff --git a/winpr/libwinpr/library/test/TestLibraryA/TestLibraryA.c b/winpr/libwinpr/library/test/TestLibraryA/TestLibraryA.c new file mode 100644 index 000000000..39155319c --- /dev/null +++ b/winpr/libwinpr/library/test/TestLibraryA/TestLibraryA.c @@ -0,0 +1,19 @@ + +#include +#include +#include +#include +#include + +WINPR_API int FunctionA(int a, int b); +WINPR_API int FunctionB(int a, int b); + +int FunctionA(int a, int b) +{ + return (a * b); /* multiply */ +} + +int FunctionB(int a, int b) +{ + return (a / b); /* divide */ +} diff --git a/winpr/libwinpr/library/test/TestLibraryB/CMakeLists.txt b/winpr/libwinpr/library/test/TestLibraryB/CMakeLists.txt new file mode 100644 index 000000000..16bb12e7b --- /dev/null +++ b/winpr/libwinpr/library/test/TestLibraryB/CMakeLists.txt @@ -0,0 +1,22 @@ +# WinPR: Windows Portable Runtime +# libwinpr-library cmake build script +# +# Copyright 2012 Marc-Andre Moreau +# +# 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. + +set(MODULE_NAME "TestLibraryB") + +add_library(${MODULE_NAME} TestLibraryB.c) + +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR/Test/Extra") diff --git a/winpr/libwinpr/library/test/TestLibraryB/TestLibraryB.c b/winpr/libwinpr/library/test/TestLibraryB/TestLibraryB.c new file mode 100644 index 000000000..7fb963356 --- /dev/null +++ b/winpr/libwinpr/library/test/TestLibraryB/TestLibraryB.c @@ -0,0 +1,19 @@ + +#include +#include +#include +#include +#include + +WINPR_API int FunctionA(int a, int b); +WINPR_API int FunctionB(int a, int b); + +int FunctionA(int a, int b) +{ + return (a + b); /* add */ +} + +int FunctionB(int a, int b) +{ + return (a - b); /* subtract */ +} diff --git a/winpr/libwinpr/library/test/TestLibraryFreeLibrary.c b/winpr/libwinpr/library/test/TestLibraryFreeLibrary.c index 1051402a6..f148995cc 100644 --- a/winpr/libwinpr/library/test/TestLibraryFreeLibrary.c +++ b/winpr/libwinpr/library/test/TestLibraryFreeLibrary.c @@ -2,9 +2,26 @@ #include #include #include +#include #include int TestLibraryFreeLibrary(int argc, char* argv[]) { + HINSTANCE library; + + library = LoadLibrary(_T("kernel32.dll")); + + if (!library) + { + printf("LoadLibrary failure\n"); + return -1; + } + + if (!FreeLibrary(library)) + { + printf("FreeLibrary failure\n"); + return -1; + } + return 0; } diff --git a/winpr/libwinpr/library/test/TestLibraryGetProcAddress.c b/winpr/libwinpr/library/test/TestLibraryGetProcAddress.c index 995639445..5811f181e 100644 --- a/winpr/libwinpr/library/test/TestLibraryGetProcAddress.c +++ b/winpr/libwinpr/library/test/TestLibraryGetProcAddress.c @@ -2,9 +2,50 @@ #include #include #include +#include +#include #include int TestLibraryGetProcAddress(int argc, char* argv[]) { + char* str; + int length; + LPTSTR BasePath; + HINSTANCE library; + LPTSTR LibraryPath; + + str = argv[1]; + +#ifdef UNICODE + length = MultiByteToWideChar(CP_UTF8, 0, str, strlen(str), NULL, 0); + BasePath = (WCHAR*) malloc((length + 1) * sizeof(WCHAR)); + MultiByteToWideChar(CP_UTF8, 0, str, length, (LPWSTR) BasePath, length * sizeof(WCHAR)); + BasePath[length] = 0; +#else + BasePath = _strdup(path); +#endif + + + _tprintf(_T("Base Path: %s\n"), BasePath); + + PathAllocCombine(BasePath, _T("TestLibraryA\\TestLibraryA.dll"), 0, &LibraryPath); + + //_tprintf(_T("Loading Library: %s\n"), LibraryPath); + + /* + library = LoadLibrary(LibraryPath); + + if (!library) + { + printf("LoadLibrary failure\n"); + return -1; + } + + if (!FreeLibrary(library)) + { + printf("FreeLibrary failure\n"); + return -1; + }*/ + return 0; } diff --git a/winpr/libwinpr/library/test/TestLibraryLoadLibrary.c b/winpr/libwinpr/library/test/TestLibraryLoadLibrary.c index 9740cf0f8..5eb3e2f85 100644 --- a/winpr/libwinpr/library/test/TestLibraryLoadLibrary.c +++ b/winpr/libwinpr/library/test/TestLibraryLoadLibrary.c @@ -2,9 +2,26 @@ #include #include #include +#include #include int TestLibraryLoadLibrary(int argc, char* argv[]) { + HINSTANCE library; + + library = LoadLibrary(_T("kernel32.dll")); + + if (!library) + { + printf("LoadLibrary failure\n"); + return -1; + } + + if (!FreeLibrary(library)) + { + printf("FreeLibrary failure\n"); + return -1; + } + return 0; } diff --git a/winpr/libwinpr/path/path.c b/winpr/libwinpr/path/path.c index ce0a80aaa..3561aad34 100644 --- a/winpr/libwinpr/path/path.c +++ b/winpr/libwinpr/path/path.c @@ -21,7 +21,9 @@ #include "config.h" #endif +#include #include +#include #include @@ -152,7 +154,58 @@ HRESULT PathAllocCombineA(PCSTR pszPathIn, PCSTR pszMore, unsigned long dwFlags, HRESULT PathAllocCombineW(PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFlags, PWSTR* ppszPathOut) { - return 0; + PWSTR pszPathOut; + BOOL backslashIn; + BOOL backslashMore; + int pszMoreLength; + int pszPathInLength; + int pszPathOutLength; + + if (!pszPathIn) + return S_FALSE; + + if (!pszMore) + return S_FALSE; + + pszPathInLength = lstrlenW(pszPathIn); + pszMoreLength = lstrlenW(pszMore); + + backslashIn = (pszPathIn[pszPathInLength - 1] == '\\') ? TRUE : FALSE; + backslashMore = (pszMore[0] == '\\') ? TRUE : FALSE; + + if (backslashMore) + { + if ((pszPathIn[1] == ':') && (pszPathIn[2] == '\\')) + { + size_t sizeOfBuffer; + + pszPathOutLength = 2 + pszMoreLength; + sizeOfBuffer = (pszPathOutLength + 1) * 2; + + pszPathOut = (PWSTR) HeapAlloc(GetProcessHeap(), 0, sizeOfBuffer * 2); + _stprintf_s(pszPathOut, sizeOfBuffer, _T("%c:%s"), pszPathIn[0], pszMore); + + *ppszPathOut = pszPathOut; + + return S_OK; + } + } + else if (backslashIn && !backslashMore) + { + size_t sizeOfBuffer; + + pszPathOutLength = pszPathInLength + pszMoreLength; + sizeOfBuffer = (pszPathOutLength + 1) * 2; + + pszPathOut = (PWSTR) HeapAlloc(GetProcessHeap(), 0, sizeOfBuffer * 2); + _stprintf_s(pszPathOut, sizeOfBuffer, _T("%s%s"), pszPathIn, pszMore); + + *ppszPathOut = pszPathOut; + + return S_OK; + } + + return S_OK; } HRESULT PathCchFindExtensionA(PCSTR pszPath, size_t cchPath, PCSTR* ppszExt)