setupapi/tests: Expand tests for SetupIterateCabinet().
Partially based on a patch by Sebastian Lackner. Signed-off-by: Zebediah Figura <z.figura12@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
c7d65913da
commit
978cc1d856
|
@ -297,108 +297,206 @@ static void test_invalid_callbackW(void)
|
||||||
DeleteFileW(source);
|
DeleteFileW(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *expected_files[] = {"tristram", "wine", "shandy"};
|
static const struct
|
||||||
|
{
|
||||||
|
const char *nameA;
|
||||||
|
const WCHAR *nameW;
|
||||||
|
DWORD size;
|
||||||
|
}
|
||||||
|
expected_files[] =
|
||||||
|
{
|
||||||
|
{"tristram", L"tristram", 10},
|
||||||
|
{"wine", L"wine", 14},
|
||||||
|
{"shandy", L"shandy", 8},
|
||||||
|
};
|
||||||
|
|
||||||
static UINT CALLBACK simple_callbackA(PVOID Context, UINT Notification,
|
static UINT CALLBACK simple_callbackA(void *context, UINT message, UINT_PTR param1, UINT_PTR param2)
|
||||||
UINT_PTR Param1, UINT_PTR Param2)
|
|
||||||
{
|
{
|
||||||
static int index;
|
static int index;
|
||||||
int *file_count = Context;
|
int *file_count = context;
|
||||||
|
|
||||||
switch (Notification)
|
switch (message)
|
||||||
{
|
{
|
||||||
case SPFILENOTIFY_CABINETINFO:
|
case SPFILENOTIFY_CABINETINFO:
|
||||||
index = 0;
|
{
|
||||||
return NO_ERROR;
|
const CABINET_INFO_A *info = (const CABINET_INFO_A *)param1;
|
||||||
|
char temp[MAX_PATH];
|
||||||
|
|
||||||
|
GetTempPathA(ARRAY_SIZE(temp), temp);
|
||||||
|
ok(!strcmp(info->CabinetPath, temp), "Got path %s.\n", debugstr_a(info->CabinetPath));
|
||||||
|
todo_wine ok(!info->CabinetFile[0], "Got file %s.\n", debugstr_a(info->CabinetFile));
|
||||||
|
ok(!info->DiskName[0], "Got disk name %s.\n", debugstr_a(info->DiskName));
|
||||||
|
ok(!info->SetId, "Got set ID %#x.\n", info->SetId);
|
||||||
|
ok(!info->CabinetNumber, "Got cabinet number %u.\n", info->CabinetNumber);
|
||||||
|
ok(!param2, "Got param2 %#Ix.\n", param2);
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
case SPFILENOTIFY_FILEINCABINET:
|
case SPFILENOTIFY_FILEINCABINET:
|
||||||
{
|
{
|
||||||
FILE_IN_CABINET_INFO_A *info = (FILE_IN_CABINET_INFO_A *)Param1;
|
FILE_IN_CABINET_INFO_A *info = (FILE_IN_CABINET_INFO_A *)param1;
|
||||||
|
char temp[MAX_PATH], path[MAX_PATH];
|
||||||
|
|
||||||
(*file_count)++;
|
(*file_count)++;
|
||||||
|
|
||||||
if (index < ARRAY_SIZE(expected_files))
|
ok(index < ARRAY_SIZE(expected_files), "%u: Got unexpected file.\n", index);
|
||||||
|
ok(!strcmp(info->NameInCabinet, expected_files[index].nameA),
|
||||||
|
"%u: Got file name %s.\n", index, debugstr_a(info->NameInCabinet));
|
||||||
|
ok(info->FileSize == expected_files[index].size, "%u: Got file size %u.\n", index, info->FileSize);
|
||||||
|
ok(!info->Win32Error, "%u: Got error %u.\n", index, info->Win32Error);
|
||||||
|
ok(info->DosDate == 14545, "%u: Got date %u.\n", index, info->DosDate);
|
||||||
|
ok(info->DosTime == 18672, "%u: Got time %u.\n", index, info->DosTime);
|
||||||
|
ok(info->DosAttribs == FILE_ATTRIBUTE_ARCHIVE, "%u: Got attributes %#x.\n", index, info->DosAttribs);
|
||||||
|
|
||||||
|
GetTempPathA(ARRAY_SIZE(temp), temp);
|
||||||
|
snprintf(path, ARRAY_SIZE(path), "%s/./testcab.cab", temp);
|
||||||
|
todo_wine ok(!strcmp((const char *)param2, path), "%u: Got file name %s.\n",
|
||||||
|
index, debugstr_a((const char *)param2));
|
||||||
|
|
||||||
|
snprintf(info->FullTargetName, ARRAY_SIZE(info->FullTargetName),
|
||||||
|
"%s\\%s", temp, expected_files[index].nameA);
|
||||||
|
|
||||||
|
return FILEOP_DOIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
case SPFILENOTIFY_FILEEXTRACTED:
|
||||||
{
|
{
|
||||||
ok(!strcmp(expected_files[index], info->NameInCabinet),
|
const FILEPATHS_A *info = (const FILEPATHS_A *)param1;
|
||||||
"[%d] Expected file \"%s\", got \"%s\"\n",
|
char temp[MAX_PATH], path[MAX_PATH];
|
||||||
index, expected_files[index], info->NameInCabinet);
|
|
||||||
index++;
|
GetTempPathA(ARRAY_SIZE(temp), temp);
|
||||||
return FILEOP_SKIP;
|
ok(index < ARRAY_SIZE(expected_files), "%u: Got unexpected file.\n", index);
|
||||||
}
|
snprintf(path, ARRAY_SIZE(path), "%s/./testcab.cab", temp);
|
||||||
else
|
todo_wine ok(!strcmp(info->Source, path), "%u: Got source %s.\n", index, debugstr_a(info->Source));
|
||||||
{
|
snprintf(path, ARRAY_SIZE(path), "%s\\%s", temp, expected_files[index].nameA);
|
||||||
ok(0, "Unexpectedly enumerated more than number of files in cabinet, index = %d\n", index);
|
ok(!strcmp(info->Target, path), "%u: Got target %s.\n", index, debugstr_a(info->Target));
|
||||||
return FILEOP_ABORT;
|
ok(!info->Win32Error, "%u: Got error %u.\n", index, info->Win32Error);
|
||||||
}
|
/* info->Flags seems to contain garbage. */
|
||||||
|
|
||||||
|
ok(!param2, "Got param2 %#Ix.\n", param2);
|
||||||
|
++index;
|
||||||
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return NO_ERROR;
|
ok(0, "Unexpected message %#x.\n", message);
|
||||||
|
return ERROR_CALL_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_simple_enumerationA(void)
|
static void test_simple_enumerationA(void)
|
||||||
{
|
{
|
||||||
BOOL ret;
|
BOOL ret;
|
||||||
char source[MAX_PATH], temp[MAX_PATH];
|
char temp[MAX_PATH], path[MAX_PATH];
|
||||||
int enum_count = 0;
|
unsigned int enum_count = 0, i;
|
||||||
|
|
||||||
GetTempPathA(sizeof(temp), temp);
|
ret = SetupIterateCabinetA(NULL, 0, NULL, NULL);
|
||||||
GetTempFileNameA(temp, "doc", 0, source);
|
if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
|
||||||
|
{
|
||||||
create_source_fileA(source, comp_cab_zip_multi, sizeof(comp_cab_zip_multi));
|
win_skip("SetupIterateCabinetW is not available\n");
|
||||||
|
return;
|
||||||
ret = SetupIterateCabinetA(source, 0, simple_callbackA, &enum_count);
|
|
||||||
ok(ret == 1, "Expected SetupIterateCabinetA to return 1, got %d\n", ret);
|
|
||||||
ok(enum_count == ARRAY_SIZE(expected_files), "Unexpectedly enumerated %d files\n", enum_count);
|
|
||||||
|
|
||||||
DeleteFileA(source);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const WCHAR tristramW[] = {'t','r','i','s','t','r','a','m',0};
|
GetTempPathA(ARRAY_SIZE(temp), temp);
|
||||||
static const WCHAR wineW[] = {'w','i','n','e',0};
|
snprintf(path, ARRAY_SIZE(path), "%s/./testcab.cab", temp);
|
||||||
static const WCHAR shandyW[] = {'s','h','a','n','d','y',0};
|
|
||||||
static const WCHAR *expected_filesW[] = {tristramW, wineW, shandyW};
|
|
||||||
|
|
||||||
static UINT CALLBACK simple_callbackW(PVOID Context, UINT Notification,
|
create_source_fileA(path, comp_cab_zip_multi, sizeof(comp_cab_zip_multi));
|
||||||
UINT_PTR Param1, UINT_PTR Param2)
|
|
||||||
|
ret = SetupIterateCabinetA(path, 0, simple_callbackA, &enum_count);
|
||||||
|
ok(ret == 1, "Expected SetupIterateCabinetW to return 1, got %d\n", ret);
|
||||||
|
ok(enum_count == ARRAY_SIZE(expected_files), "Unexpectedly enumerated %d files\n", enum_count);
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(expected_files); ++i)
|
||||||
|
{
|
||||||
|
snprintf(path, ARRAY_SIZE(path), "%s\\%s", temp, expected_files[i].nameA);
|
||||||
|
ret = DeleteFileA(path);
|
||||||
|
ok(ret, "Failed to delete %s, error %u.\n", debugstr_a(path), GetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(path, ARRAY_SIZE(path), "%s\\testcab.cab", temp);
|
||||||
|
ret = DeleteFileA(path);
|
||||||
|
ok(ret, "Failed to delete %s, error %u.\n", debugstr_a(path), GetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
|
static UINT CALLBACK simple_callbackW(void *context, UINT message, UINT_PTR param1, UINT_PTR param2)
|
||||||
{
|
{
|
||||||
static int index;
|
static int index;
|
||||||
int *file_count = Context;
|
int *file_count = context;
|
||||||
|
|
||||||
switch (Notification)
|
switch (message)
|
||||||
{
|
{
|
||||||
case SPFILENOTIFY_CABINETINFO:
|
case SPFILENOTIFY_CABINETINFO:
|
||||||
index = 0;
|
{
|
||||||
return NO_ERROR;
|
const CABINET_INFO_W *info = (const CABINET_INFO_W *)param1;
|
||||||
|
WCHAR temp[MAX_PATH];
|
||||||
|
|
||||||
|
GetTempPathW(ARRAY_SIZE(temp), temp);
|
||||||
|
ok(!wcscmp(info->CabinetPath, temp), "Got path %s.\n", debugstr_w(info->CabinetPath));
|
||||||
|
todo_wine ok(!info->CabinetFile[0], "Got file %s.\n", debugstr_w(info->CabinetFile));
|
||||||
|
ok(!info->DiskName[0], "Got disk name %s.\n", debugstr_w(info->DiskName));
|
||||||
|
ok(!info->SetId, "Got set ID %#x.\n", info->SetId);
|
||||||
|
ok(!info->CabinetNumber, "Got cabinet number %u.\n", info->CabinetNumber);
|
||||||
|
ok(!param2, "Got param2 %#Ix.\n", param2);
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
case SPFILENOTIFY_FILEINCABINET:
|
case SPFILENOTIFY_FILEINCABINET:
|
||||||
{
|
{
|
||||||
FILE_IN_CABINET_INFO_W *info = (FILE_IN_CABINET_INFO_W *)Param1;
|
FILE_IN_CABINET_INFO_W *info = (FILE_IN_CABINET_INFO_W *)param1;
|
||||||
|
WCHAR temp[MAX_PATH], path[MAX_PATH];
|
||||||
|
|
||||||
(*file_count)++;
|
(*file_count)++;
|
||||||
|
|
||||||
if (index < ARRAY_SIZE(expected_filesW))
|
ok(index < ARRAY_SIZE(expected_files), "%u: Got unexpected file.\n", index);
|
||||||
|
ok(!wcscmp(info->NameInCabinet, expected_files[index].nameW),
|
||||||
|
"%u: Got file name %s.\n", index, debugstr_w(info->NameInCabinet));
|
||||||
|
ok(info->FileSize == expected_files[index].size, "%u: Got file size %u.\n", index, info->FileSize);
|
||||||
|
ok(!info->Win32Error, "%u: Got error %u.\n", index, info->Win32Error);
|
||||||
|
ok(info->DosDate == 14545, "%u: Got date %u.\n", index, info->DosDate);
|
||||||
|
ok(info->DosTime == 18672, "%u: Got time %u.\n", index, info->DosTime);
|
||||||
|
ok(info->DosAttribs == FILE_ATTRIBUTE_ARCHIVE, "%u: Got attributes %#x.\n", index, info->DosAttribs);
|
||||||
|
|
||||||
|
GetTempPathW(ARRAY_SIZE(temp), temp);
|
||||||
|
swprintf(path, ARRAY_SIZE(path), L"%s/./testcab.cab", temp);
|
||||||
|
todo_wine ok(!wcscmp((const WCHAR *)param2, path), "%u: Got file name %s.\n",
|
||||||
|
index, debugstr_w((const WCHAR *)param2));
|
||||||
|
|
||||||
|
swprintf(info->FullTargetName, ARRAY_SIZE(info->FullTargetName),
|
||||||
|
L"%s\\%s", temp, expected_files[index].nameW);
|
||||||
|
|
||||||
|
return FILEOP_DOIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
case SPFILENOTIFY_FILEEXTRACTED:
|
||||||
{
|
{
|
||||||
ok(!lstrcmpW(expected_filesW[index], info->NameInCabinet),
|
const FILEPATHS_W *info = (const FILEPATHS_W *)param1;
|
||||||
"[%d] Expected file %s, got %s\n",
|
WCHAR temp[MAX_PATH], path[MAX_PATH];
|
||||||
index, wine_dbgstr_w(expected_filesW[index]), wine_dbgstr_w(info->NameInCabinet));
|
|
||||||
index++;
|
GetTempPathW(ARRAY_SIZE(temp), temp);
|
||||||
return FILEOP_SKIP;
|
ok(index < ARRAY_SIZE(expected_files), "%u: Got unexpected file.\n", index);
|
||||||
}
|
swprintf(path, ARRAY_SIZE(path), L"%s/./testcab.cab", temp);
|
||||||
else
|
todo_wine ok(!wcscmp(info->Source, path), "%u: Got source %s.\n", index, debugstr_w(info->Source));
|
||||||
{
|
swprintf(path, ARRAY_SIZE(path), L"%s\\%s", temp, expected_files[index].nameW);
|
||||||
ok(0, "Unexpectedly enumerated more than number of files in cabinet, index = %d\n", index);
|
ok(!wcscmp(info->Target, path), "%u: Got target %s.\n", index, debugstr_w(info->Target));
|
||||||
return FILEOP_ABORT;
|
ok(!info->Win32Error, "%u: Got error %u.\n", index, info->Win32Error);
|
||||||
}
|
/* info->Flags seems to contain garbage. */
|
||||||
|
|
||||||
|
ok(!param2, "Got param2 %#Ix.\n", param2);
|
||||||
|
++index;
|
||||||
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return NO_ERROR;
|
ok(0, "Unexpected message %#x.\n", message);
|
||||||
|
return ERROR_CALL_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_simple_enumerationW(void)
|
static void test_simple_enumerationW(void)
|
||||||
{
|
{
|
||||||
BOOL ret;
|
BOOL ret;
|
||||||
WCHAR source[MAX_PATH], temp[MAX_PATH];
|
WCHAR temp[MAX_PATH], path[MAX_PATH];
|
||||||
int enum_count = 0;
|
unsigned int enum_count = 0, i;
|
||||||
|
|
||||||
ret = SetupIterateCabinetW(NULL, 0, NULL, NULL);
|
ret = SetupIterateCabinetW(NULL, 0, NULL, NULL);
|
||||||
if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
|
if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
|
||||||
|
@ -408,15 +506,24 @@ static void test_simple_enumerationW(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
GetTempPathW(ARRAY_SIZE(temp), temp);
|
GetTempPathW(ARRAY_SIZE(temp), temp);
|
||||||
GetTempFileNameW(temp, docW, 0, source);
|
swprintf(path, ARRAY_SIZE(path), L"%s/./testcab.cab", temp);
|
||||||
|
|
||||||
create_source_fileW(source, comp_cab_zip_multi, sizeof(comp_cab_zip_multi));
|
create_source_fileW(path, comp_cab_zip_multi, sizeof(comp_cab_zip_multi));
|
||||||
|
|
||||||
ret = SetupIterateCabinetW(source, 0, simple_callbackW, &enum_count);
|
ret = SetupIterateCabinetW(path, 0, simple_callbackW, &enum_count);
|
||||||
ok(ret == 1, "Expected SetupIterateCabinetW to return 1, got %d\n", ret);
|
ok(ret == 1, "Expected SetupIterateCabinetW to return 1, got %d\n", ret);
|
||||||
ok(enum_count == ARRAY_SIZE(expected_files), "Unexpectedly enumerated %d files\n", enum_count);
|
ok(enum_count == ARRAY_SIZE(expected_files), "Unexpectedly enumerated %d files\n", enum_count);
|
||||||
|
|
||||||
DeleteFileW(source);
|
for (i = 0; i < ARRAY_SIZE(expected_files); ++i)
|
||||||
|
{
|
||||||
|
swprintf(path, ARRAY_SIZE(path), L"%s\\%s", temp, expected_files[i].nameW);
|
||||||
|
ret = DeleteFileW(path);
|
||||||
|
ok(ret, "Failed to delete %s, error %u.\n", debugstr_w(path), GetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
|
swprintf(path, ARRAY_SIZE(path), L"%s\\testcab.cab", temp);
|
||||||
|
ret = DeleteFileW(path);
|
||||||
|
ok(ret, "Failed to delete %s, error %u.\n", debugstr_w(path), GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
START_TEST(setupcab)
|
START_TEST(setupcab)
|
||||||
|
|
Loading…
Reference in New Issue