Guy Albertelli : kernel32/tests: Add tests for GetVolumeInformationA and QueryDosDevice.
Alexandre Julliard
julliard at winehq.org
Wed Apr 29 10:20:20 CDT 2009
Module: wine
Branch: master
Commit: 6f1390646cdf440ee43a6b06073276c50b00fded
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6f1390646cdf440ee43a6b06073276c50b00fded
Author: Guy Albertelli <galberte at neo.rr.com>
Date: Tue Apr 28 21:07:12 2009 -0400
kernel32/tests: Add tests for GetVolumeInformationA and QueryDosDevice.
---
dlls/kernel32/tests/volume.c | 138 ++++++++++++++++++++++++++++++++++++++++-
1 files changed, 134 insertions(+), 4 deletions(-)
diff --git a/dlls/kernel32/tests/volume.c b/dlls/kernel32/tests/volume.c
index 97e3559..1bbdb68 100644
--- a/dlls/kernel32/tests/volume.c
+++ b/dlls/kernel32/tests/volume.c
@@ -20,6 +20,7 @@
#include "wine/test.h"
#include "winbase.h"
+#include <stdio.h>
static HINSTANCE hdll;
static BOOL (WINAPI * pGetVolumeNameForVolumeMountPointA)(LPCSTR, LPSTR, DWORD);
@@ -29,29 +30,62 @@ static BOOL (WINAPI *pFindNextVolumeA)(HANDLE,LPSTR,DWORD);
static BOOL (WINAPI *pFindVolumeClose)(HANDLE);
static UINT (WINAPI *pGetLogicalDriveStringsA)(UINT,LPSTR);
static UINT (WINAPI *pGetLogicalDriveStringsW)(UINT,LPWSTR);
+static BOOL (WINAPI *pGetVolumeInformationA)(LPCSTR, LPSTR, DWORD, LPDWORD, LPDWORD, LPDWORD, LPSTR, DWORD);
/* ############################### */
static void test_query_dos_deviceA(void)
{
char drivestr[] = "a:";
- char *p, buffer[2000];
- DWORD ret;
+ char *p, *q, *buffer, buffer2[2000];
+ DWORD ret, ret2, buflen=32768;
BOOL found = FALSE;
+ buffer = HeapAlloc( GetProcessHeap(), 0, buflen );
+ ret = QueryDosDeviceA( NULL, buffer, buflen );
+ ok(ret && GetLastError() != ERROR_INSUFFICIENT_BUFFER,
+ "QueryDosDevice buffer too small\n");
+ if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+ HeapFree( GetProcessHeap(), 0, buffer );
+ return;
+ }
+ ok(ret, "QueryDosDeviceA failed to return list, last error %u\n", GetLastError());
+ if (ret) {
+ p = buffer;
+ for (;;) {
+ if (!strlen(p)) break;
+ trace("device entry %s\n", p);
+ ret2 = QueryDosDeviceA( p, buffer2, sizeof(buffer2) );
+ ok(ret2, "QueryDosDeviceA failed to return current mapping, last error %u\n", GetLastError());
+ if (ret2) {
+ q = buffer2;
+ for (;;) {
+ if (!strlen(q)) break;
+ trace("for device %s, current mapping %s\n", p, q);
+ q += strlen(q) + 1;
+ if (ret2 <= (q-buffer2)) break;
+ }
+ }
+ p += strlen(p) + 1;
+ if (ret <= (p-buffer)) break;
+ }
+ }
+
if (!pFindFirstVolumeA) {
- skip("On win9x, HARDDISK and RAMDISK not present\n");
+ win_skip("On win9x, HARDDISK and RAMDISK not present\n");
+ HeapFree( GetProcessHeap(), 0, buffer );
return;
}
for (;drivestr[0] <= 'z'; drivestr[0]++) {
- ret = QueryDosDeviceA( drivestr, buffer, sizeof(buffer));
+ ret = QueryDosDeviceA( drivestr, buffer, buflen);
if(ret) {
for (p = buffer; *p; p++) *p = toupper(*p);
if (strstr(buffer, "HARDDISK") || strstr(buffer, "RAMDISK")) found = TRUE;
}
}
ok(found, "expected at least one devicename to contain HARDDISK or RAMDISK\n");
+ HeapFree( GetProcessHeap(), 0, buffer );
}
static void test_FindFirstVolume(void)
@@ -216,6 +250,100 @@ static void test_GetLogicalDriveStringsW(void)
HeapFree(GetProcessHeap(), 0, buf);
}
+static void test_GetVolumeInformationA(void)
+{
+ BOOL ret;
+ UINT result;
+ char Root_Dir0[]="C:";
+ char Root_Dir1[]="C:\\";
+ char Root_Dir2[]="\\\\?\\C:\\";
+ char volume[MAX_PATH+1];
+ DWORD vol_name_size=MAX_PATH+1, vol_serial_num=-1, max_comp_len=0, fs_flags=0, fs_name_len=MAX_PATH+1;
+ char vol_name_buf[MAX_PATH+1], fs_name_buf[MAX_PATH+1];
+ char windowsdir[MAX_PATH+10];
+
+ if (!pGetVolumeInformationA) {
+ win_skip("GetVolumeInformationA not found\n");
+ return;
+ }
+ if (!pGetVolumeNameForVolumeMountPointA) {
+ win_skip("GetVolumeNameForVolumeMountPointA not found\n");
+ return;
+ }
+
+ /* get windows drive letter and update strings for testing */
+ result = GetWindowsDirectory(windowsdir, sizeof(windowsdir));
+ ok(result < sizeof(windowsdir), "windowsdir is abnormally long!\n");
+ ok(result != 0, "GetWindowsDirectory: error %d\n", GetLastError());
+ Root_Dir0[0] = windowsdir[0];
+ Root_Dir1[0] = windowsdir[0];
+ Root_Dir2[4] = windowsdir[0];
+
+ /* get the unique volume name for the windows drive */
+ ret = pGetVolumeNameForVolumeMountPointA(Root_Dir1, volume, MAX_PATH);
+ ok(ret == TRUE, "GetVolumeNameForVolumeMountPointA failed\n");
+
+ /* **** now start the tests **** */
+ /* check for error on no trailing \ */
+ ret = pGetVolumeInformationA(Root_Dir0, vol_name_buf, vol_name_size, NULL,
+ NULL, NULL, fs_name_buf, fs_name_len);
+todo_wine
+ ok(!ret && GetLastError() == ERROR_INVALID_NAME,
+ "GetVolumeInformationA w/o '\\' did not fail, last error %u\n", GetLastError());
+
+ /* try null root directory to return "root of the current directory" */
+ ret = pGetVolumeInformationA(NULL, vol_name_buf, vol_name_size, NULL,
+ NULL, NULL, fs_name_buf, fs_name_len);
+ ok(ret, "GetVolumeInformationA failed on null root dir, last error %u\n", GetLastError());
+ if (ret) {
+ trace("for %s, vol_serial_num=0x%08x, max_comp_len=%d, filesys flags=0x%08x, vol name=%s, filesys name=%s\n",
+ "<NULL>", vol_serial_num, max_comp_len, fs_flags, vol_name_buf, fs_name_buf);
+ }
+
+ /* Try normal drive letter with trailing \ */
+ ret = pGetVolumeInformationA(Root_Dir1, vol_name_buf, vol_name_size,
+ &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len);
+ ok(ret, "GetVolumeInformationA failed, root=%s, last error=%u\n", Root_Dir1, GetLastError());
+ if (ret) {
+ trace("for %s, vol_serial_num=0x%08x, max_comp_len=%d, filesys flags=0x%08x, vol name=%s, filesys name=%s\n",
+ Root_Dir1, vol_serial_num, max_comp_len, fs_flags, vol_name_buf, fs_name_buf);
+ }
+
+ /* try again with dirve letter and the "disable parsing" prefix */
+ ret = pGetVolumeInformationA(Root_Dir2, vol_name_buf, vol_name_size,
+ &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len);
+ todo_wine ok(ret, "GetVolumeInformationA failed, root=%s, last error=%u\n", Root_Dir2, GetLastError());
+ if (ret) {
+ trace("for %s, vol_serial_num=0x%08x, max_comp_len=%d, filesys flags=0x%08x, vol name=%s, filesys name=%s\n",
+ Root_Dir2, vol_serial_num, max_comp_len, fs_flags, vol_name_buf, fs_name_buf);
+ }
+
+ /* try again with unique voluem name */
+ ret = pGetVolumeInformationA(volume, vol_name_buf, vol_name_size,
+ &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len);
+ todo_wine ok(ret, "GetVolumeInformationA failed, root=%s, last error=%u\n", volume, GetLastError());
+ if (ret) {
+ trace("for %s, vol_serial_num=0x%08x, max_comp_len=%d, filesys flags=0x%08x, vol name=%s, filesys name=%s\n",
+ volume, vol_serial_num, max_comp_len, fs_flags, vol_name_buf, fs_name_buf);
+ }
+
+ /* try again with device name space */
+ Root_Dir2[2] = '.';
+ ret = pGetVolumeInformationA(Root_Dir2, vol_name_buf, vol_name_size,
+ &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len);
+ todo_wine ok(ret, "GetVolumeInformationA failed, root=%s, last error=%u\n", Root_Dir2, GetLastError());
+ if (ret) {
+ trace("for %s, vol_serial_num=0x%08x, max_comp_len=%d, filesys flags=0x%08x, vol name=%s, filesys name=%s\n",
+ Root_Dir2, vol_serial_num, max_comp_len, fs_flags, vol_name_buf, fs_name_buf);
+ }
+
+ /* try again with a directory off the root - should generate error */
+ ret = pGetVolumeInformationA(windowsdir, vol_name_buf, vol_name_size,
+ &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len);
+ todo_wine ok(!ret && GetLastError()==ERROR_DIR_NOT_ROOT,
+ "GetVolumeInformationA failed, root=%s, last error=%u\n", windowsdir, GetLastError());
+}
+
START_TEST(volume)
{
hdll = GetModuleHandleA("kernel32.dll");
@@ -226,6 +354,7 @@ START_TEST(volume)
pFindVolumeClose = (void *) GetProcAddress(hdll, "FindVolumeClose");
pGetLogicalDriveStringsA = (void *) GetProcAddress(hdll, "GetLogicalDriveStringsA");
pGetLogicalDriveStringsW = (void *) GetProcAddress(hdll, "GetLogicalDriveStringsW");
+ pGetVolumeInformationA = (void *) GetProcAddress(hdll, "GetVolumeInformationA");
test_query_dos_deviceA();
test_FindFirstVolume();
@@ -233,4 +362,5 @@ START_TEST(volume)
test_GetVolumeNameForVolumeMountPointW();
test_GetLogicalDriveStringsA();
test_GetLogicalDriveStringsW();
+ test_GetVolumeInformationA();
}
More information about the wine-cvs
mailing list