Piotr Caban : msvcr90/tests: Added nonblocking FILE functions test.
Alexandre Julliard
julliard at winehq.org
Wed Nov 16 12:46:46 CST 2011
Module: wine
Branch: master
Commit: abd0f4318e964fd833923bb524cdec9d0c35755a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=abd0f4318e964fd833923bb524cdec9d0c35755a
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Nov 16 12:51:06 2011 +0100
msvcr90/tests: Added nonblocking FILE functions test.
---
dlls/msvcr90/tests/msvcr90.c | 113 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 113 insertions(+), 0 deletions(-)
diff --git a/dlls/msvcr90/tests/msvcr90.c b/dlls/msvcr90/tests/msvcr90.c
index b6ae4c3..09b4a40 100644
--- a/dlls/msvcr90/tests/msvcr90.c
+++ b/dlls/msvcr90/tests/msvcr90.c
@@ -100,6 +100,15 @@ static void* (__cdecl *p_get_terminate)(void);
static void* (__cdecl *p_get_unexpected)(void);
static int (__cdecl *p__vswprintf_l)(wchar_t*, const wchar_t*, _locale_t, __ms_va_list);
static int (__cdecl *p_vswprintf_l)(wchar_t*, const wchar_t*, _locale_t, __ms_va_list);
+static FILE* (__cdecl *p_fopen)(const char*, const char*);
+static int (__cdecl *p_fclose)(FILE*);
+static int (__cdecl *p_unlink)(const char*);
+static void (__cdecl *p_lock_file)(FILE*);
+static void (__cdecl *p_unlock_file)(FILE*);
+static int (__cdecl *p_fileno)(FILE*);
+static int (__cdecl *p_feof)(FILE*);
+static int (__cdecl *p_ferror)(FILE*);
+static int (__cdecl *p_flsbuf)(int, FILE*);
/* type info */
@@ -268,6 +277,15 @@ static BOOL init(void)
SET(p_get_unexpected, "_get_unexpected");
SET(p__vswprintf_l, "__vswprintf_l");
SET(p_vswprintf_l, "_vswprintf_l");
+ SET(p_fopen, "fopen");
+ SET(p_fclose, "fclose");
+ SET(p_unlink, "_unlink");
+ SET(p_lock_file, "_lock_file");
+ SET(p_unlock_file, "_unlock_file");
+ SET(p_fileno, "_fileno");
+ SET(p_feof, "feof");
+ SET(p_ferror, "ferror");
+ SET(p_flsbuf, "_flsbuf");
if (sizeof(void *) == 8)
{
SET(p_type_info_name_internal_method, "?_name_internal_method at type_info@@QEBAPEBDPEAU__type_info_node@@@Z");
@@ -1025,6 +1043,100 @@ static void test__vswprintf_l(void)
wine_dbgstr_w(buf), wine_dbgstr_w(format));
}
+struct block_file_arg
+{
+ FILE *read;
+ FILE *write;
+ HANDLE blocked;
+};
+
+static DWORD WINAPI block_file(void *arg)
+{
+ struct block_file_arg *files = arg;
+
+ p_lock_file(files->read);
+ p_lock_file(files->write);
+ SetEvent(files->blocked);
+ WaitForSingleObject(files->blocked, INFINITE);
+ p_unlock_file(files->read);
+ p_unlock_file(files->write);
+ return 0;
+}
+
+static void test_nonblocking_file_access(void)
+{
+ HANDLE thread;
+ struct block_file_arg arg;
+ FILE *filer, *filew;
+ int ret;
+
+ if(!p_lock_file || !p_unlock_file) {
+ win_skip("_lock_file not available\n");
+ return;
+ }
+
+ filew = p_fopen("test_file", "w");
+ ok(filew != NULL, "unable to create test file\n");
+ if(!filew)
+ return;
+ filer = p_fopen("test_file", "r");
+ ok(filer != NULL, "unable to open test file\n");
+ if(!filer) {
+ p_fclose(filew);
+ p_unlink("test_file");
+ return;
+ }
+
+ arg.read = filer;
+ arg.write = filew;
+ arg.blocked = CreateEvent(NULL, FALSE, FALSE, NULL);
+ ok(arg.blocked != NULL, "CreateEvent failed\n");
+ if(!arg.blocked) {
+ p_fclose(filer);
+ p_fclose(filew);
+ p_unlink("test_file");
+ return;
+ }
+ thread = CreateThread(NULL, 0, block_file, (void*)&arg, 0, NULL);
+ ok(thread != NULL, "CreateThread failed\n");
+ if(!thread) {
+ CloseHandle(arg.blocked);
+ p_fclose(filer);
+ p_fclose(filew);
+ p_unlink("test_file");
+ return;
+ }
+ WaitForSingleObject(arg.blocked, INFINITE);
+
+ ret = p_fileno(filer);
+ ok(ret, "_fileno(filer) returned %d\n", ret);
+ ret = p_fileno(filew);
+ ok(ret, "_fileno(filew) returned %d\n", ret);
+
+ ret = p_feof(filer);
+ ok(ret==0, "feof(filer) returned %d\n", ret);
+ ret = p_feof(filew);
+ ok(ret==0, "feof(filew) returned %d\n", ret);
+
+ ret = p_ferror(filer);
+ ok(ret==0, "ferror(filer) returned %d\n", ret);
+ ret = p_ferror(filew);
+ ok(ret==0, "ferror(filew) returned %d\n", ret);
+
+ ret = p_flsbuf('a', filer);
+ ok(ret==-1, "_flsbuf(filer) returned %d\n", ret);
+ ret = p_flsbuf('a', filew);
+ ok(ret=='a', "_flsbuf(filew) returned %d\n", ret);
+
+ SetEvent(arg.blocked);
+ WaitForSingleObject(thread, INFINITE);
+ CloseHandle(arg.blocked);
+ CloseHandle(thread);
+ p_fclose(filer);
+ p_fclose(filew);
+ p_unlink("test_file");
+}
+
START_TEST(msvcr90)
{
if(!init())
@@ -1046,4 +1158,5 @@ START_TEST(msvcr90)
test_typeinfo();
test_getptd();
test__vswprintf_l();
+ test_nonblocking_file_access();
}
More information about the wine-cvs
mailing list