blob: 4606a75b60b19c9527e2c9ead5f32eb9d299c076 [file] [log] [blame]
/*
* 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();
}