/* * 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 #include #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%ld"; static const CHAR str_colonA[] = ":"; /* ################# */ 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 %lu with %lu for '%s'\n", res, GetLastError(), bufferA); } ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pCommConfigDialogA(bufferA, NULL, pCC); ok( res == ERROR_INSUFFICIENT_BUFFER, "returned %lu with %lu for '%s' (expected ERROR_INSUFFICIENT_BUFFER)\n", res, GetLastError(), bufferA); SetLastError(0xdeadbeef); res = pCommConfigDialogA(bufferA, NULL, NULL); ok( res == ERROR_INVALID_PARAMETER, "returned %lu with %lu 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 %lu with %lu (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 %lu with %lu (expected ERROR_BADKEY)\n", res, GetLastError()); ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pCommConfigDialogA(NULL, NULL, pCC); ok( res == ERROR_INVALID_PARAMETER, "returned %lu with %lu (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, ARRAY_SIZE(bufferW)); 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 %lu with %lu for '%s'\n", res, GetLastError(), bufferA); } ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pCommConfigDialogW(bufferW, NULL, pCC); ok( res == ERROR_INSUFFICIENT_BUFFER, "returned %lu with %lu for '%s' (expected ERROR_INSUFFICIENT_BUFFER)\n", res, GetLastError(), bufferA); SetLastError(0xdeadbeef); res = pCommConfigDialogW(bufferW, NULL, NULL); ok( res == ERROR_INVALID_PARAMETER, "returned %lu with %lu for '%s' (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError(), bufferA); } } ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pCommConfigDialogW(L"", NULL, pCC); ok( res == ERROR_INSUFFICIENT_BUFFER, "returned %lu with %lu (expected ERROR_INSUFFICIENT_BUFFER)\n", res, GetLastError()); ZeroMemory(pCC, sizeof(pCC)); pCC[0].dwSize = sizeof(COMMCONFIG); SetLastError(0xdeadbeef); res = pCommConfigDialogW(L"", NULL, pCC); ok( res == ERROR_BADKEY, "returned %lu with %lu (expected ERROR_BADKEY)\n", res, GetLastError()); ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pCommConfigDialogW(NULL, NULL, pCC); ok( res == ERROR_INVALID_PARAMETER, "returned %lu with %lu (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 %lu with %lu and %lu (expected " "ERROR_INSUFFICIENT_BUFFER and '>= %lu')\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 %lu with %lu and %lu for %s (expected " "ERROR_BADKEY)\n", res, GetLastError(), len, bufferA); } else { ok((res == ERROR_SUCCESS) || (res == ERROR_BADKEY), "returned %lu with %lu and %lu 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 %lu with %lu and %lu 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 %lu with %lu and %lu 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 %lu with %lu and %lu 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 %lu with %lu and %lu (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError(), len); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigA(com1A, pCC, NULL); ok( res == ERROR_INVALID_PARAMETER, "returned %lu with %lu (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(L"com1", pCC, &len); if (res == ERROR_CALL_NOT_IMPLEMENTED) { win_skip("*W not implemented\n"); return; } ok( (res == ERROR_INSUFFICIENT_BUFFER) && (len >= i), "returned %lu with %lu and %lu (expected " "ERROR_INSUFFICIENT_BUFFER and '>= %lu')\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, ARRAY_SIZE(bufferW)); len = sizeof(pCC); ZeroMemory(pCC, sizeof(pCC)); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigW(bufferW, pCC, &len); if (i == 0) { ok( res == ERROR_BADKEY, "returned %lu with %lu and %lu for %s (expected " "ERROR_BADKEY)\n", res, GetLastError(), len, bufferA); } else { ok((res == ERROR_SUCCESS) || (res == ERROR_BADKEY), "returned %lu with %lu and %lu 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, L":"); len = sizeof(pCC); ZeroMemory(pCC, sizeof(pCC)); res = pGetDefaultCommConfigW(bufferW, pCC, &len); ok( res == ERROR_BADKEY, "returned %lu with %lu and %lu 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(L"", pCC, &len); ok( res == ERROR_BADKEY, "returned %lu with %lu and %lu 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 %lu with %lu and %lu for NULL (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError(), len); len = sizeof(pCC); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigW(L"com1", NULL, &len); ok( res == ERROR_INVALID_PARAMETER, "returned %lu with %lu and %lu (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError(), len); SetLastError(0xdeadbeef); res = pGetDefaultCommConfigW(L"com1", pCC, NULL); ok( res == ERROR_INVALID_PARAMETER, "returned %lu with %lu (expected ERROR_INVALID_PARAMETER)\n", res, GetLastError()); } /* ################# */ START_TEST(confdlg) { LPCSTR ptr; ptr = load_functions(); if (ptr) { win_skip("got NULL with %lu for %s\n", GetLastError(), ptr); return; } test_drvCommConfigDialogA(); test_drvCommConfigDialogW(); test_drvGetDefaultCommConfigA(); test_drvGetDefaultCommConfigW(); }