file.c

来自「Wine-20031016」· C语言 代码 · 共 953 行 · 第 1/3 页

C
953
字号
/* * Unit tests for file functions in Wine * * Copyright (c) 2002 Jakob Eriksson * * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * */#include <stdarg.h>#include <stdlib.h>#include <time.h>#include "wine/test.h"#include "windef.h"#include "winbase.h"#include "winerror.h"LPCSTR filename = "testfile.xxx";LPCSTR sillytext ="en larvig liten text dx \033 gx hej 84 hej 4484 ! \001\033 bla bl\na.. bla bla.""1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3""1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3""1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3""1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3""1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3""1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3""1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3""1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3""sdlkfjasdlkfj a dslkj adsklf  \n  \nasdklf askldfa sdlkf \nsadklf asdklf asdf ";static void test__hread( void ){    HFILE filehandle;    char buffer[10000];    long bytes_read;    long bytes_wanted;    long i;    SetFileAttributesA(filename,FILE_ATTRIBUTE_NORMAL); /* be sure to remove stale files */    DeleteFileA( filename );    filehandle = _lcreat( filename, 0 );    if (filehandle == HFILE_ERROR)    {        ok(0,"couldn't create file \"%s\" (err=%ld)",filename,GetLastError());        return;    }    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains" );    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );    filehandle = _lopen( filename, OF_READ );    ok( HFILE_ERROR != filehandle, "couldn't open file \"%s\" again (err=%ld)", filename, GetLastError(  ) );    bytes_read = _hread( filehandle, buffer, 2 * strlen( sillytext ) );    ok( lstrlenA( sillytext ) == bytes_read, "file read size error" );    for (bytes_wanted = 0; bytes_wanted < lstrlenA( sillytext ); bytes_wanted++)    {        ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains" );        ok( _hread( filehandle, buffer, bytes_wanted ) == bytes_wanted, "erratic _hread return value" );        for (i = 0; i < bytes_wanted; i++)        {            ok( buffer[i] == sillytext[i], "that's not what's written" );        }    }    ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains" );    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)", GetLastError(  ) );}static void test__hwrite( void ){    HFILE filehandle;    char buffer[10000];    long bytes_read;    long bytes_written;    long blocks;    long i;    char *contents;    HLOCAL memory_object;    char checksum[1];    filehandle = _lcreat( filename, 0 );    if (filehandle == HFILE_ERROR)    {        ok(0,"couldn't create file \"%s\" (err=%ld)",filename,GetLastError());        return;    }    ok( HFILE_ERROR != _hwrite( filehandle, "", 0 ), "_hwrite complains" );    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );    filehandle = _lopen( filename, OF_READ );    bytes_read = _hread( filehandle, buffer, 1);    ok( 0 == bytes_read, "file read size error" );    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );    filehandle = _lopen( filename, OF_READWRITE );    bytes_written = 0;    checksum[0] = '\0';    srand( (unsigned)time( NULL ) );    for (blocks = 0; blocks < 100; blocks++)    {        for (i = 0; i < (long)sizeof( buffer ); i++)        {            buffer[i] = rand(  );            checksum[0] = checksum[0] + buffer[i];        }        ok( HFILE_ERROR != _hwrite( filehandle, buffer, sizeof( buffer ) ), "_hwrite complains" );        bytes_written = bytes_written + sizeof( buffer );    }    ok( HFILE_ERROR != _hwrite( filehandle, checksum, 1 ), "_hwrite complains" );    bytes_written++;    ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains" );    memory_object = LocalAlloc( LPTR, bytes_written );    ok( 0 != memory_object, "LocalAlloc fails. (Could be out of memory.)" );    contents = LocalLock( memory_object );    filehandle = _lopen( filename, OF_READ );    contents = LocalLock( memory_object );    ok( NULL != contents, "LocalLock whines" );    ok( bytes_written == _hread( filehandle, contents, bytes_written), "read length differ from write length" );    checksum[0] = '\0';    i = 0;    do    {        checksum[0] = checksum[0] + contents[i];        i++;    }    while (i < bytes_written - 1);    ok( checksum[0] == contents[i], "stored checksum differ from computed checksum" );    ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains" );    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)", GetLastError(  ) );}static void test__lclose( void ){    HFILE filehandle;    filehandle = _lcreat( filename, 0 );    if (filehandle == HFILE_ERROR)    {        ok(0,"couldn't create file \"%s\" (err=%ld)",filename,GetLastError());        return;    }    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains" );    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)", GetLastError(  ) );}static void test__lcreat( void ){    HFILE filehandle;    char buffer[10000];    WIN32_FIND_DATAA search_results;    char slashname[] = "testfi/";    HANDLE find;    filehandle = _lcreat( filename, 0 );    if (filehandle == HFILE_ERROR)    {        ok(0,"couldn't create file \"%s\" (err=%ld)",filename,GetLastError());        return;    }    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains" );    ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains" );    ok( _hread( filehandle, buffer, strlen( sillytext ) ) ==  lstrlenA( sillytext ), "erratic _hread return value" );    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );    ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should be able to find file" );    ok( DeleteFileA(filename) != 0, "DeleteFile failed (%ld)", GetLastError());    filehandle = _lcreat( filename, 1 ); /* readonly */    ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)", filename, GetLastError(  ) );    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite shouldn't be able to write never the less" );    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );    ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should be able to find file" );    ok( 0 == DeleteFileA( filename ), "shouldn't be able to delete a readonly file" );    ok( SetFileAttributesA(filename, FILE_ATTRIBUTE_NORMAL ) != 0, "couldn't change attributes on file" );    ok( DeleteFileA( filename ) != 0, "now it should be possible to delete the file!" );    filehandle = _lcreat( filename, 2 );    ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)", filename, GetLastError(  ) );    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains" );    ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains" );    ok( _hread( filehandle, buffer, strlen( sillytext ) ) ==  lstrlenA( sillytext ), "erratic _hread return value" );    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );    ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should STILL be able to find file" );    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)", GetLastError(  ) );    filehandle = _lcreat( filename, 4 ); /* SYSTEM file */    ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)", filename, GetLastError(  ) );    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains" );    ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains" );    ok( _hread( filehandle, buffer, strlen( sillytext ) ) ==  lstrlenA( sillytext ), "erratic _hread return value" );    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );    ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should STILL be able to find file" );    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)", GetLastError(  ) );    filehandle=_lcreat (slashname, 0); /* illegal name */    if (HFILE_ERROR != filehandle || (GetLastError() != ERROR_INVALID_NAME && GetLastError() != ERROR_PATH_NOT_FOUND))    {      todo_wine {        ok (0, "creating file \"%s\" should fail with error 123 or 3, (err=%ld)", slashname, GetLastError ());      }      _lclose(filehandle);      find=FindFirstFileA (slashname, &search_results);      if (INVALID_HANDLE_VALUE==find)        ok (0, "file \"%s\" not found", slashname);      else {        ok (0!=FindClose (find), "FindClose complains (%ld)", GetLastError ());        slashname[strlen(slashname)-1]=0;        ok (!strcmp (slashname, search_results.cFileName),            "found unexpected name \"%s\"", search_results.cFileName);        ok (FILE_ATTRIBUTE_ARCHIVE==search_results.dwFileAttributes,            "attributes of file \"%s\" are 0x%04lx", search_results.cFileName,            search_results.dwFileAttributes);      }      ok (0!=DeleteFileA (slashname), "Can't delete \"%s\" (%ld)", slashname,          GetLastError ());    }    filehandle=_lcreat (filename, 8); /* illegal attribute */    if (HFILE_ERROR==filehandle)      ok (0, "couldn't create volume label \"%s\"", filename);    else {      _lclose(filehandle);      find=FindFirstFileA (filename, &search_results);      if (INVALID_HANDLE_VALUE==find)        ok (0, "file \"%s\" not found", filename);      else {        ok (0!=FindClose (find), "FindClose complains (%ld)", GetLastError ());        ok (!strcmp (filename, search_results.cFileName),            "found unexpected name \"%s\"", search_results.cFileName);        ok (FILE_ATTRIBUTE_ARCHIVE==search_results.dwFileAttributes,            "attributes of file \"%s\" are 0x%04lx", search_results.cFileName,            search_results.dwFileAttributes);      }      ok (0!=DeleteFileA (filename), "Can't delete \"%s\" (%ld)", slashname,          GetLastError ());    }}void test__llseek( void ){    INT i;    HFILE filehandle;    char buffer[1];    long bytes_read;    filehandle = _lcreat( filename, 0 );    if (filehandle == HFILE_ERROR)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?