/* * Unit test suite for serialui API functions * * Copyright 2007 Detlef Riekenberg * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * */ #include <stdarg.h> #include <stdio.h> #include "windef.h" #include "winbase.h" #include "winerror.h" #include "winnls.h" #include "wine/test.h" static HINSTANCE hdll; static DWORD (WINAPI *pCommConfigDialogA)(LPCSTR, HWND, LPCOMMCONFIG); static DWORD (WINAPI *pCommConfigDialogW)(LPCWSTR, HWND, LPCOMMCONFIG); static DWORD (WINAPI *pGetDefaultCommConfigA)(LPCSTR, LPCOMMCONFIG, LPDWORD); static DWORD (WINAPI *pGetDefaultCommConfigW)(LPCWSTR, LPCOMMCONFIG, LPDWORD); static const CHAR com1A[] = "com1"; static const CHAR emptyA[] = ""; static const CHAR fmt_comA[] = "com%d"; static const CHAR str_colonA[] = ":"; static const WCHAR com1W[] = {'c','o','m','1',0}; static const WCHAR emptyW[] = {0}; static const WCHAR str_colonW[] = {':',0}; /* ################# */ static LPCSTR load_functions(void) { LPCSTR ptr; ptr = "serialui.dll"; hdll = LoadLibraryA(ptr); if (!hdll) return ptr; ptr = "drvCommConfigDialogA"; pCommConfigDialogA = (VOID *) GetProcAddress(hdll, ptr); if (!pCommConfigDialogA) return ptr; ptr = "drvCommConfigDialogW"; pCommConfigDialogW = (VOID *) GetProcAddress(hdll, ptr); if (!pCommConfigDialogW) return ptr; ptr = "drvGetDefaultCommConfigA"; pGetDefaultCommConfigA = (VOID *) GetProcAddress(hdll, ptr); if (!pGetDefaultCommConfigA) return ptr; ptr = "drvGetDefaultCommConfigW"; pGetDefaultCommConfigW = (VOID *) GetProcAddress(hdll, ptr); if (!pGetDefaultCommConfigW) return ptr; return NULL; } /* ################# */ static void test_drvCommConfigDialogA(void) { COMMCONFIG pCC[3]; CHAR bufferA[16]; DWORD i; DWORD res; DWORD len; /* test ports "com1" - "com4" */ for (i = 1; i < 5 ; i++) { sprintf(bufferA, fmt_comA, i); len = sizeof(pCC); ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigA(bufferA, pCC, &len); if (res == ERROR_CALL_NOT_IMPLEMENTED) { /* NT does not implement the ANSI API */ win_skip("*A not implemented\n"); return; } if (res == ERROR_SUCCESS) { if (winetest_interactive) { SetLastError(0xdeadbeef); res = pCommConfigDialogA(bufferA, NULL, pCC); /* OK: ERROR_SUCCESS, Cancel: ERROR_CANCELLED */ trace("returned %u with %u for '%s'\n", res, GetLastError(), bufferA); } ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pCommConfigDialogA(bufferA, NULL, pCC); ok( res == ERROR_INSUFFICIENT_BUFFER, "returned %u with %u for '%s' (expected ERROR_INSUFFICIENT_BUFFER)\n", res, GetLastError(), bufferA); SetLastError(0xdeadbeef); res = pCommConfigDialogA(bufferA, NULL, NULL); ok( res == ERROR_INVALID_PARAMETER, "returned %u with %u for '%s' (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError(), bufferA); } } ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pCommConfigDialogA(emptyA, NULL, pCC); ok( res == ERROR_INSUFFICIENT_BUFFER, "returned %u with %u (expected ERROR_INSUFFICIENT_BUFFER)\n", res, GetLastError()); ZeroMemory(pCC, sizeof(pCC)); pCC[0].dwSize = sizeof(COMMCONFIG); SetLastError(0xdeadbeef); res = pCommConfigDialogA(emptyA, NULL, pCC); ok( res == ERROR_BADKEY, "returned %u with %u (expected ERROR_BADKEY)\n", res, GetLastError()); ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pCommConfigDialogA(NULL, NULL, pCC); ok( res == ERROR_INVALID_PARAMETER, "returned %u with %u (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError()); } /* ################# */ static void test_drvCommConfigDialogW(void) { COMMCONFIG pCC[3]; CHAR bufferA[16]; WCHAR bufferW[16]; DWORD i; DWORD res; DWORD len; /* test ports "com1" - "com4" */ for (i = 1; i < 5 ; i++) { sprintf(bufferA, fmt_comA, i); MultiByteToWideChar( CP_ACP, 0, bufferA, -1, bufferW, sizeof(bufferW)/sizeof(WCHAR) ); len = sizeof(pCC); ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigW(bufferW, pCC, &len); if (res == ERROR_CALL_NOT_IMPLEMENTED) { win_skip("*W not implemented\n"); return; } if (res == ERROR_SUCCESS) { if (winetest_interactive) { SetLastError(0xdeadbeef); res = pCommConfigDialogW(bufferW, NULL, pCC); /* OK: ERROR_SUCCESS, Cancel: ERROR_CANCELLED */ trace("returned %u with %u for '%s'\n", res, GetLastError(), bufferA); } ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pCommConfigDialogW(bufferW, NULL, pCC); ok( res == ERROR_INSUFFICIENT_BUFFER, "returned %u with %u for '%s' (expected ERROR_INSUFFICIENT_BUFFER)\n", res, GetLastError(), bufferA); SetLastError(0xdeadbeef); res = pCommConfigDialogW(bufferW, NULL, NULL); ok( res == ERROR_INVALID_PARAMETER, "returned %u with %u for '%s' (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError(), bufferA); } } ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pCommConfigDialogW(emptyW, NULL, pCC); ok( res == ERROR_INSUFFICIENT_BUFFER, "returned %u with %u (expected ERROR_INSUFFICIENT_BUFFER)\n", res, GetLastError()); ZeroMemory(pCC, sizeof(pCC)); pCC[0].dwSize = sizeof(COMMCONFIG); SetLastError(0xdeadbeef); res = pCommConfigDialogW(emptyW, NULL, pCC); ok( res == ERROR_BADKEY, "returned %u with %u (expected ERROR_BADKEY)\n", res, GetLastError()); ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pCommConfigDialogW(NULL, NULL, pCC); ok( res == ERROR_INVALID_PARAMETER, "returned %u with %u (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError()); } /* ################# */ static void test_drvGetDefaultCommConfigA(void) { COMMCONFIG pCC[3]; CHAR bufferA[16]; DWORD i; DWORD res; DWORD len; /* off by one: one byte smaller */ i = sizeof(COMMCONFIG); len = sizeof(COMMCONFIG) -1; ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigA(com1A, pCC, &len); if (res == ERROR_CALL_NOT_IMPLEMENTED) { /* NT does not implement the ANSI API */ win_skip("*A not implemented\n"); return; } ok( (res == ERROR_INSUFFICIENT_BUFFER) && (len >= i), "returned %u with %u and %u (expected " "ERROR_INSUFFICIENT_BUFFER and '>= %u')\n", res, GetLastError(), len, i); /* test ports "com0" - "com10" */ for (i = 0; i < 11 ; i++) { sprintf(bufferA, fmt_comA, i); len = sizeof(pCC); ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigA(bufferA, pCC, &len); if (i == 0) { ok( res == ERROR_BADKEY, "returned %u with %u and %u for %s (expected " "ERROR_BADKEY)\n", res, GetLastError(), len, bufferA); } else { ok((res == ERROR_SUCCESS) || (res == ERROR_BADKEY), "returned %u with %u and %u for %s (expected ERROR_SUCCESS or " "ERROR_BADKEY)\n", res, GetLastError(), len, bufferA); } /* a name with a colon is invalid */ if (res == ERROR_SUCCESS) { lstrcatA(bufferA, str_colonA); len = sizeof(pCC); ZeroMemory(pCC, sizeof(pCC)); res = pGetDefaultCommConfigA(bufferA, pCC, &len); ok( res == ERROR_BADKEY, "returned %u with %u and %u for %s (expected '0' with " "ERROR_BADKEY)\n", res, GetLastError(), len, bufferA); } } /* an empty String is not allowed */ len = sizeof(pCC); ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigA(emptyA, pCC, &len); ok( res == ERROR_BADKEY, "returned %u with %u and %u for %s (expected ERROR_BADKEY)\n", res, GetLastError(), len, emptyA); /* some NULL checks */ len = sizeof(pCC); ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigA(NULL, pCC, &len); ok( res == ERROR_INVALID_PARAMETER, "returned %u with %u and %u for NULL (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError(), len); len = sizeof(pCC); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigA(com1A, NULL, &len); ok( res == ERROR_INVALID_PARAMETER, "returned %u with %u and %u (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError(), len); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigA(com1A, pCC, NULL); ok( res == ERROR_INVALID_PARAMETER, "returned %u with %u (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError()); } /* ################# */ static void test_drvGetDefaultCommConfigW(void) { COMMCONFIG pCC[3]; WCHAR bufferW[16]; CHAR bufferA[16]; DWORD i; DWORD res; DWORD len; /* off by one: one byte smaller */ i = sizeof(COMMCONFIG); len = sizeof(COMMCONFIG) -1; ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigW(com1W, pCC, &len); if (res == ERROR_CALL_NOT_IMPLEMENTED) { win_skip("*W not implemented\n"); return; } ok( (res == ERROR_INSUFFICIENT_BUFFER) && (len >= i), "returned %u with %u and %u (expected " "ERROR_INSUFFICIENT_BUFFER and '>= %u')\n", res, GetLastError(), len, i); /* test ports "com0" - "com10" */ for (i = 0; i < 11 ; i++) { sprintf(bufferA, fmt_comA, i); MultiByteToWideChar( CP_ACP, 0, bufferA, -1, bufferW, sizeof(bufferW)/sizeof(WCHAR) ); len = sizeof(pCC); ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigW(bufferW, pCC, &len); if (i == 0) { ok( res == ERROR_BADKEY, "returned %u with %u and %u for %s (expected " "ERROR_BADKEY)\n", res, GetLastError(), len, bufferA); } else { ok((res == ERROR_SUCCESS) || (res == ERROR_BADKEY), "returned %u with %u and %u for %s (expected ERROR_SUCCESS or " "ERROR_BADKEY)\n", res, GetLastError(), len, bufferA); } /* a name with a colon is invalid */ if (res == ERROR_SUCCESS) { lstrcatA(bufferA, str_colonA); lstrcatW(bufferW, str_colonW); len = sizeof(pCC); ZeroMemory(pCC, sizeof(pCC)); res = pGetDefaultCommConfigW(bufferW, pCC, &len); ok( res == ERROR_BADKEY, "returned %u with %u and %u for %s (expected '0' with " "ERROR_BADKEY)\n", res, GetLastError(), len, bufferA); } } /* an empty String is not allowed */ len = sizeof(pCC); ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigW(emptyW, pCC, &len); ok( res == ERROR_BADKEY, "returned %u with %u and %u for %s (expected ERROR_BADKEY)\n", res, GetLastError(), len, emptyA); /* some NULL checks */ len = sizeof(pCC); ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigW(NULL, pCC, &len); ok( res == ERROR_INVALID_PARAMETER, "returned %u with %u and %u for NULL (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError(), len); len = sizeof(pCC); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigW(com1W, NULL, &len); ok( res == ERROR_INVALID_PARAMETER, "returned %u with %u and %u (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError(), len); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigW(com1W, pCC, NULL); ok( res == ERROR_INVALID_PARAMETER, "returned %u with %u (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError()); } /* ################# */ START_TEST(confdlg) { LPCSTR ptr; ptr = load_functions(); if (ptr) { win_skip("got NULL with %u for %s\n", GetLastError(), ptr); return; } test_drvCommConfigDialogA(); test_drvCommConfigDialogW(); test_drvGetDefaultCommConfigA(); test_drvGetDefaultCommConfigW(); }