Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/setupapi/tests/install.c | 96 +++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+)
diff --git a/dlls/setupapi/tests/install.c b/dlls/setupapi/tests/install.c index d761f89103..87615e75e7 100644 --- a/dlls/setupapi/tests/install.c +++ b/dlls/setupapi/tests/install.c @@ -1945,6 +1945,101 @@ static void test_close_queue(void) SetupTermDefaultQueueCallback(context); }
+static unsigned int got_start_copy, start_copy_ret; + +static UINT WINAPI start_copy_cb(void *context, UINT message, UINT_PTR param1, UINT_PTR param2) +{ + if (winetest_debug > 1) trace("%p, %#x, %#lx, %#lx\n", context, message, param1, param2); + + if (message == SPFILENOTIFY_STARTCOPY) + { + const FILEPATHS_A *paths = (const FILEPATHS_A *)param1; + + ++got_start_copy; + + if (strstr(paths->Source, "two.txt")) + { + SetLastError(0xdeadf00d); + return start_copy_ret; + } + } + + return SetupDefaultQueueCallbackA(context, message, param1, param2); +} + +static void test_start_copy(void) +{ + HSPFILEQ queue; + void *context; + BOOL ret; + + ret = CreateDirectoryA("src", NULL); + ok(ret, "Failed to create test directory, error %u.\n", GetLastError()); + create_file("src/one.txt"); + create_file("src/two.txt"); + create_file("src/three.txt"); + + start_copy_ret = FILEOP_DOIT; + got_start_copy = 0; + queue = SetupOpenFileQueue(); + ok(queue != INVALID_HANDLE_VALUE, "Failed to open queue, error %#x.\n", GetLastError()); + ret = SetupQueueCopyA(queue, "src", NULL, "one.txt", NULL, NULL, "dst", NULL, 0); + ok(ret, "Failed to queue copy, error %#x.\n", GetLastError()); + ret = SetupQueueCopyA(queue, "src", NULL, "two.txt", NULL, NULL, "dst", NULL, 0); + ok(ret, "Failed to queue copy, error %#x.\n", GetLastError()); + ret = SetupQueueCopyA(queue, "src", NULL, "three.txt", NULL, NULL, "dst", NULL, 0); + ok(ret, "Failed to queue copy, error %#x.\n", GetLastError()); + run_queue(queue, start_copy_cb); + ok(got_start_copy == 3, "Got %u callbacks.\n", got_start_copy); + ok(delete_file("dst/one.txt"), "Destination file should exist.\n"); + ok(delete_file("dst/two.txt"), "Destination file should exist.\n"); + ok(delete_file("dst/three.txt"), "Destination file should exist.\n"); + + start_copy_ret = FILEOP_SKIP; + got_start_copy = 0; + queue = SetupOpenFileQueue(); + ok(queue != INVALID_HANDLE_VALUE, "Failed to open queue, error %#x.\n", GetLastError()); + ret = SetupQueueCopyA(queue, "src", NULL, "one.txt", NULL, NULL, "dst", NULL, 0); + ok(ret, "Failed to queue copy, error %#x.\n", GetLastError()); + ret = SetupQueueCopyA(queue, "src", NULL, "two.txt", NULL, NULL, "dst", NULL, 0); + ok(ret, "Failed to queue copy, error %#x.\n", GetLastError()); + ret = SetupQueueCopyA(queue, "src", NULL, "three.txt", NULL, NULL, "dst", NULL, 0); + ok(ret, "Failed to queue copy, error %#x.\n", GetLastError()); + run_queue(queue, start_copy_cb); + todo_wine ok(got_start_copy == 3, "Got %u callbacks.\n", got_start_copy); + ok(delete_file("dst/one.txt"), "Destination file should exist.\n"); + ok(!file_exists("dst/two.txt"), "Destination file should not exist.\n"); + todo_wine ok(delete_file("dst/three.txt"), "Destination file should exist.\n"); + + start_copy_ret = FILEOP_ABORT; + got_start_copy = 0; + queue = SetupOpenFileQueue(); + ok(queue != INVALID_HANDLE_VALUE, "Failed to open queue, error %#x.\n", GetLastError()); + ret = SetupQueueCopyA(queue, "src", NULL, "one.txt", NULL, NULL, "dst", NULL, 0); + ok(ret, "Failed to queue copy, error %#x.\n", GetLastError()); + ret = SetupQueueCopyA(queue, "src", NULL, "two.txt", NULL, NULL, "dst", NULL, 0); + ok(ret, "Failed to queue copy, error %#x.\n", GetLastError()); + ret = SetupQueueCopyA(queue, "src", NULL, "three.txt", NULL, NULL, "dst", NULL, 0); + ok(ret, "Failed to queue copy, error %#x.\n", GetLastError()); + context = SetupInitDefaultQueueCallbackEx(NULL, INVALID_HANDLE_VALUE, 0, 0, 0); + SetLastError(0xdeadbeef); + ret = SetupCommitFileQueueA(NULL, queue, start_copy_cb, context); + ok(!ret, "Expected failure.\n"); + ok(GetLastError() == 0xdeadf00d, "Got unexpected error %u.\n", GetLastError()); + SetupTermDefaultQueueCallback(context); + SetupCloseFileQueue(queue); + ok(got_start_copy == 2, "Got %u callbacks.\n", got_start_copy); + ok(delete_file("dst/one.txt"), "Destination file should exist.\n"); + ok(!file_exists("dst/two.txt"), "Destination file should not exist.\n"); + ok(!file_exists("dst/three.txt"), "Destination file should not exist.\n"); + + delete_file("src/one.txt"); + delete_file("src/two.txt"); + delete_file("src/three.txt"); + delete_file("src/"); + delete_file("dst/"); +} + START_TEST(install) { char temp_path[MAX_PATH], prev_path[MAX_PATH]; @@ -1973,6 +2068,7 @@ START_TEST(install) test_need_media(); test_close_queue(); test_install_file(); + test_start_copy();
UnhookWindowsHookEx(hhook);
Fixes a regression introduced by 3e5c9798a80641e0e39e95e4467c60405b22b062.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47436 Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/setupapi/queue.c | 2 +- dlls/setupapi/tests/install.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/setupapi/queue.c b/dlls/setupapi/queue.c index e9b48ed1c2..f7da3a7128 100644 --- a/dlls/setupapi/queue.c +++ b/dlls/setupapi/queue.c @@ -1477,7 +1477,7 @@ BOOL WINAPI SetupCommitFileQueueW( HWND owner, HSPFILEQ handle, PSP_FILE_CALLBAC if (op_result == FILEOP_ABORT) goto done; else if (op_result == FILEOP_SKIP) - break; + continue; else if (op_result != FILEOP_DOIT) FIXME("Unhandled return value %#x.\n", op_result);
diff --git a/dlls/setupapi/tests/install.c b/dlls/setupapi/tests/install.c index 87615e75e7..fd10fd9133 100644 --- a/dlls/setupapi/tests/install.c +++ b/dlls/setupapi/tests/install.c @@ -2006,10 +2006,10 @@ static void test_start_copy(void) ret = SetupQueueCopyA(queue, "src", NULL, "three.txt", NULL, NULL, "dst", NULL, 0); ok(ret, "Failed to queue copy, error %#x.\n", GetLastError()); run_queue(queue, start_copy_cb); - todo_wine ok(got_start_copy == 3, "Got %u callbacks.\n", got_start_copy); + ok(got_start_copy == 3, "Got %u callbacks.\n", got_start_copy); ok(delete_file("dst/one.txt"), "Destination file should exist.\n"); ok(!file_exists("dst/two.txt"), "Destination file should not exist.\n"); - todo_wine ok(delete_file("dst/three.txt"), "Destination file should exist.\n"); + ok(delete_file("dst/three.txt"), "Destination file should exist.\n");
start_copy_ret = FILEOP_ABORT; got_start_copy = 0;