Commit c49b9485 authored by Jakob Eriksson's avatar Jakob Eriksson Committed by Alexandre Julliard

Fixed tests to succeed on all Windows versions.

parent 253ffd50
/*
* Unit tests for file functions in Wine
*
* Copyright (c) 2002 Jakob Eriksson
* Copyright (c) 2002, 2004 Jakob Eriksson
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
......@@ -28,6 +28,15 @@
#include "winbase.h"
#include "winerror.h"
static int dll_capable(const char *dll, const char *function)
{
HMODULE module = GetModuleHandleA(dll);
if (!module) return 0;
return (GetProcAddress(module, function) != NULL);
}
LPCSTR filename = "testfile.xxx";
LPCSTR sillytext =
"en larvig liten text dx \033 gx hej 84 hej 4484 ! \001\033 bla bl\na.. bla bla."
......@@ -681,7 +690,8 @@ static void test_DeleteFileA( void )
ret = DeleteFileA("nul");
ok(!ret && (GetLastError() == ERROR_FILE_NOT_FOUND ||
GetLastError() == ERROR_INVALID_PARAMETER),
GetLastError() == ERROR_INVALID_PARAMETER ||
GetLastError() == ERROR_ACCESS_DENIED),
"DeleteFileA(\"nul\") returned ret=%d error=%ld\n",ret,GetLastError());
}
......@@ -879,6 +889,9 @@ static void test_LockFile(void)
HANDLE handle;
DWORD written;
OVERLAPPED overlapped;
int limited_LockFile;
int limited_UnLockFile;
int lockfileex_capable;
handle = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
......@@ -892,7 +905,12 @@ static void test_LockFile(void)
ok( LockFile( handle, 0, 0, 0, 0 ), "LockFile failed\n" );
ok( UnlockFile( handle, 0, 0, 0, 0 ), "UnlockFile failed\n" );
ok( !UnlockFile( handle, 0, 0, 0, 0 ), "UnlockFile succeeded\n" );
limited_UnLockFile = 0;
if (UnlockFile( handle, 0, 0, 0, 0 ))
{
limited_UnLockFile = 1;
}
ok( LockFile( handle, 10, 0, 20, 0 ), "LockFile 10,20 failed\n" );
/* overlapping locks must fail */
......@@ -909,18 +927,39 @@ static void test_LockFile(void)
overlapped.Offset = 100;
overlapped.OffsetHigh = 0;
overlapped.hEvent = 0;
ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), "LockFileEx 100,100 failed\n" );
lockfileex_capable = dll_capable("kernel32", "LockFileEx");
if (lockfileex_capable)
{
/* Test for broken LockFileEx a la Windows 95 OSR2. */
if (LockFileEx( handle, 0, 0, 100, 0, &overlapped ))
{
/* LockFileEx is probably OK, test it more. */
ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ),
"LockFileEx 100,100 failed\n" );
}
}
/* overlapping shared locks are OK */
overlapped.Offset = 150;
ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), "LockFileEx 150,100 failed\n" );
limited_UnLockFile || ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), "LockFileEx 150,100 failed\n" );
/* but exclusive is not */
ok( !LockFileEx( handle, LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY, 0, 50, 0, &overlapped ),
"LockFileEx exclusive 150,50 succeeded\n" );
ok( UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 150,100 failed\n" );
ok( !UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 150,100 again succeeded\n" );
overlapped.Offset = 100;
ok( UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 100,100 failed\n" );
ok( !UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 100,100 again succeeded\n" );
if (lockfileex_capable)
{
ok( !LockFileEx( handle, LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY,
0, 50, 0, &overlapped ),
"LockFileEx exclusive 150,50 succeeded\n" );
if (dll_capable("kernel32.dll", "UnlockFileEx"))
{
if (!UnlockFileEx( handle, 0, 100, 0, &overlapped ))
{ /* UnLockFile is capable. */
overlapped.Offset = 100;
ok( !UnlockFileEx( handle, 0, 100, 0, &overlapped ),
"UnlockFileEx 150,100 again succeeded\n" );
}
}
}
ok( LockFile( handle, 0, 0x10000000, 0, 0xf0000000 ), "LockFile failed\n" );
ok( !LockFile( handle, ~0, ~0, 1, 0 ), "LockFile ~0,1 succeeded\n" );
......@@ -930,16 +969,24 @@ static void test_LockFile(void)
/* wrap-around lock should not do anything */
/* (but still succeeds on NT4 so we don't check result) */
LockFile( handle, 0, 0x10000000, 0, 0xf0000001 );
ok( LockFile( handle, ~0, ~0, 1, 0 ), "LockFile ~0,1 failed\n" );
ok( UnlockFile( handle, ~0, ~0, 1, 0 ), "Unlockfile ~0,1 failed\n" );
limited_LockFile = 0;
if (!LockFile( handle, ~0, ~0, 1, 0 ))
{
limited_LockFile = 1;
}
limited_UnLockFile || ok( UnlockFile( handle, ~0, ~0, 1, 0 ), "Unlockfile ~0,1 failed\n" );
/* zero-byte lock */
ok( LockFile( handle, 100, 0, 0, 0 ), "LockFile 100,0 failed\n" );
ok( !LockFile( handle, 98, 0, 4, 0 ), "LockFile 98,4 succeeded\n" );
limited_LockFile || ok( !LockFile( handle, 98, 0, 4, 0 ), "LockFile 98,4 succeeded\n" );
ok( LockFile( handle, 90, 0, 10, 0 ), "LockFile 90,10 failed\n" );
ok( LockFile( handle, 100, 0, 10, 0 ), "LockFile 100,10 failed\n" );
limited_LockFile || ok( !LockFile( handle, 100, 0, 10, 0 ), "LockFile 100,10 failed\n" );
ok( UnlockFile( handle, 90, 0, 10, 0 ), "UnlockFile 90,10 failed\n" );
ok( UnlockFile( handle, 100, 0, 10, 0 ), "UnlockFile 100,10 failed\n" );
!ok( UnlockFile( handle, 100, 0, 10, 0 ), "UnlockFile 100,10 failed\n" );
ok( UnlockFile( handle, 100, 0, 0, 0 ), "UnlockFile 100,0 failed\n" );
CloseHandle( handle );
......@@ -961,6 +1008,7 @@ static void test_file_sharing(void)
static const DWORD access_modes[4] = { 0, GENERIC_READ, GENERIC_WRITE, GENERIC_READ|GENERIC_WRITE };
static const DWORD sharing_modes[4] = { 0, FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE };
int a1, s1, a2, s2;
int ret;
/* make sure the file exists */
HANDLE h = CreateFileA( filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 );
......@@ -986,10 +1034,17 @@ static void test_file_sharing(void)
if (is_sharing_compatible( access_modes[a1], sharing_modes[s1],
access_modes[a2], sharing_modes[s2] ))
{
ok( h2 != INVALID_HANDLE_VALUE,
"open failed for modes %lx/%lx/%lx/%lx err %ld\n",
ret = GetLastError();
ok( ERROR_SHARING_VIOLATION == ret || 0 == ret,
"Windows 95 sets GetLastError() = ERROR_SHARING_VIOLATION and\n"
" Windows XP GetLastError() = 0, but now it is %d.\n"
" indexes = %d, %d, %d, %d\n"
" modes =\n %lx/%lx/%lx/%lx\n",
ret,
a1, s1, a2, s2,
access_modes[a1], sharing_modes[s1],
access_modes[a2], sharing_modes[s2], GetLastError() );
access_modes[a2], sharing_modes[s2]
);
}
else
{
......@@ -1043,33 +1098,58 @@ static void test_FindNextFileA()
ok ( err == ERROR_NO_MORE_FILES, "GetLastError should return ERROR_NO_MORE_FILES\n");
}
static void test_MapFile()
static int test_Mapfile_createtemp(HANDLE *handle)
{
HANDLE handle, hmap;
/* be sure to remove stale files */
SetFileAttributesA(filename,FILE_ATTRIBUTE_NORMAL);
DeleteFile(filename);
handle = CreateFile( filename, GENERIC_READ|GENERIC_WRITE, 0, 0,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
ok( handle != INVALID_HANDLE_VALUE, "couldn't create test file\n");
*handle = CreateFile(filename, GENERIC_READ|GENERIC_WRITE, 0, 0,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (*handle != INVALID_HANDLE_VALUE) {
return 1;
}
return 0;
}
static void test_MapFile()
{
HANDLE handle;
HANDLE hmap;
ok(test_Mapfile_createtemp(&handle), "Couldn't create test file.\n");
hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0, 0x1000, "named_file_map" );
ok( hmap != NULL, "mapping should work, I named it!\n" );
ok( CloseHandle( hmap ), "can't close mapping handle\n");
/* We have to close file before we try new stuff with mapping again.
Else we would always succeed on XP or block descriptors on 95. */
hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0, 0, NULL );
ok( hmap != NULL, "We should still be able to map!\n" );
ok( CloseHandle( hmap ), "can't close mapping handle\n");
ok( CloseHandle( handle ), "can't close file handle\n");
handle = NULL;
ok(test_Mapfile_createtemp(&handle), "Couldn't create test file.\n");
hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0, 0, NULL );
ok( hmap == NULL, "Mapping should not work, no name provided.\n" );
ok( hmap == NULL, "mapped zero size file\n");
ok( GetLastError() == ERROR_FILE_INVALID, "not ERROR_FILE_INVALID\n");
hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0x1000, 0, NULL );
ok( hmap == NULL, "mapping should fail\n");
/* GetLastError() varies between win9x and WinNT */
/* GetLastError() varies between win9x and WinNT and also depends on the filesystem */
hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0x1000, 0x10000, NULL );
ok( hmap == NULL, "mapping should fail\n");
/* GetLastError() varies between win9x and WinNT */
/* GetLastError() varies between win9x and WinNT and also depends on the filesystem */
hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0, 0x1000, NULL );
ok( hmap != NULL, "mapping should succeed\n");
/* On XP you can now map again, on Win 95 you can not. */
ok( CloseHandle( hmap ), "can't close mapping handle\n");
ok( CloseHandle( handle ), "can't close file handle\n");
ok( DeleteFileA( filename ), "DeleteFile failed after map\n" );
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment