[2/3] kernel32/tests: test CopyFileEx callback and cancellation (resend)
Daniel Jeliński
djelinski1 at gmail.com
Sun Sep 29 15:51:31 CDT 2013
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20130929/ad0316d9/attachment.html>
-------------- next part --------------
From a844534188537f4c2153f938fb917cd1981bfb24 Mon Sep 17 00:00:00 2001
From: Daniel Jelinski <djelinski1 at gmail.com>
Date: Fri, 13 Sep 2013 23:09:11 +0200
Subject: [PATCH 2/3] kernel32/tests: test CopyFileEx callback and cancellation
---
dlls/kernel32/tests/file.c | 105 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 105 insertions(+)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index dc69193..d22959a 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -69,6 +69,15 @@ struct test_list {
const DWORD options; /* option flag to use for open */
const BOOL todo_flag; /* todo_wine indicator */
} ;
+struct progress_list {
+ const DWORD progress_retval_init; /* value to return from progress routine */
+ const BOOL cancel_init; /* value to set Cancel flag to */
+ const DWORD progress_retval_end; /* value to return from progress routine */
+ const BOOL cancel_end; /* value to set Cancel flag to */
+ const DWORD progress_count; /* number of times progress is invoked */
+ const BOOL copy_retval; /* expected CopyFileEx result */
+ const DWORD lastError; /* expected CopyFileEx error code */
+} ;
static void InitFunctionPointers(void)
{
@@ -792,7 +801,102 @@ static void test_CopyFileW(void)
ret = DeleteFileW(dest);
ok(ret, "DeleteFileW: error %d\n", GetLastError());
}
+static int progressInvoked;
+static BOOL cancel;
+static const struct progress_list progress_tests[] = {
+ { PROGRESS_CONTINUE, FALSE, PROGRESS_CONTINUE, FALSE, 2, TRUE, 0 },
+ { PROGRESS_CONTINUE, FALSE, PROGRESS_CONTINUE, TRUE, 2, FALSE, ERROR_REQUEST_ABORTED },
+ { PROGRESS_CONTINUE, FALSE, PROGRESS_CANCEL, FALSE, 2, FALSE, ERROR_REQUEST_ABORTED },
+ { PROGRESS_CONTINUE, FALSE, PROGRESS_STOP, FALSE, 2, FALSE, ERROR_REQUEST_ABORTED },
+
+ { PROGRESS_CONTINUE, TRUE, 0, 0, 1, FALSE, ERROR_REQUEST_ABORTED },
+ { PROGRESS_CANCEL, FALSE, 0, 0, 1, FALSE, ERROR_REQUEST_ABORTED },
+ { PROGRESS_STOP, FALSE, 0, 0, 1, FALSE, ERROR_REQUEST_ABORTED },
+
+ { PROGRESS_CONTINUE, FALSE, PROGRESS_QUIET, FALSE, 2, TRUE, 0 },
+ { PROGRESS_QUIET, FALSE, 0, 0, 1, TRUE, 0 },
+ };
+
+static DWORD WINAPI progress(LARGE_INTEGER TotalFileSize,
+ LARGE_INTEGER TotalBytesTransferred,
+ LARGE_INTEGER StreamSize,
+ LARGE_INTEGER StreamBytesTransferred,
+ DWORD dwStreamNumber,
+ DWORD dwCallbackReason,
+ HANDLE hSourceFile,
+ HANDLE hDestinationFile,
+ LPVOID lpData)
+{
+ progressInvoked++;
+ if (dwCallbackReason == CALLBACK_STREAM_SWITCH)
+ {
+ ok(TotalFileSize.LowPart == 4, "Unexpected TotalFileSize: %d\n", TotalFileSize.LowPart);
+ ok(TotalBytesTransferred.LowPart == 0, "Unexpected TotalBytesTransferred: %d\n", TotalBytesTransferred.LowPart);
+ ok(StreamSize.LowPart == 4, "Unexpected StreamSize: %d\n", StreamSize.LowPart);
+ ok(StreamBytesTransferred.LowPart == 0, "Unexpected StreamBytesTransferred: %d\n", StreamBytesTransferred.LowPart);
+ ok(dwStreamNumber == 1, "Unexpected dwStreamNumber: %d\n", dwStreamNumber);
+ cancel = progress_tests[(DWORD)lpData].cancel_init;
+ return progress_tests[(DWORD)lpData].progress_retval_init;
+ }
+ else
+ {
+ ok(TotalFileSize.LowPart == 4, "Unexpected TotalFileSize: %d\n", TotalFileSize.LowPart);
+ ok(TotalBytesTransferred.LowPart == 4, "Unexpected TotalBytesTransferred: %d\n", TotalBytesTransferred.LowPart);
+ ok(StreamSize.LowPart == 4, "Unexpected StreamSize: %d\n", StreamSize.LowPart);
+ ok(StreamBytesTransferred.LowPart == 4, "Unexpected StreamBytesTransferred: %d\n", StreamBytesTransferred.LowPart);
+ ok(dwStreamNumber == 1, "Unexpected dwStreamNumber: %d\n", dwStreamNumber);
+ ok(dwCallbackReason == CALLBACK_CHUNK_FINISHED, "Unexpected dwCallbackReason: %d\n", dwCallbackReason);
+ cancel = progress_tests[(DWORD)lpData].cancel_end;
+ return progress_tests[(DWORD)lpData].progress_retval_end;
+ }
+}
+static void test_CopyFileEx(void)
+{
+ char temp_path[MAX_PATH];
+ char source[MAX_PATH], dest[MAX_PATH];
+ static const char prefix[] = "pfx";
+ HANDLE hfile;
+ DWORD ret;
+ BOOL retok;
+ int i;
+
+ ret = GetTempPathA(MAX_PATH, temp_path);
+ ok(ret != 0, "GetTempPathA error %d\n", GetLastError());
+ ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
+
+ ret = GetTempFileNameA(temp_path, prefix, 0, source);
+ ok(ret != 0, "GetTempFileNameA error %d\n", GetLastError());
+
+ /* make the source have not zero size */
+ hfile = CreateFileA(source, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0 );
+ ok(hfile != INVALID_HANDLE_VALUE, "failed to open source file\n");
+ retok = WriteFile(hfile, prefix, sizeof(prefix), &ret, NULL );
+ ok( retok && ret == sizeof(prefix),
+ "WriteFile error %d\n", GetLastError());
+ ok(GetFileSize(hfile, NULL) == sizeof(prefix), "source file has wrong size\n");
+ CloseHandle(hfile);
+ ret = GetTempFileNameA(temp_path, prefix, 0, dest);
+ ok(ret != 0, "GetTempFileNameA error %d\n", GetLastError());
+
+ for (i = 0; i < sizeof(progress_tests) / sizeof(progress_tests[0]); i++)
+ {
+ progressInvoked = 0;
+ SetLastError(0xdeadbeef);
+ ret = CopyFileExA(source, dest, progress, (LPVOID)i, &cancel, 0);
+ if(progress_tests[i].copy_retval)
+ ok(ret == progress_tests[i].copy_retval, "CopyFileExA: unexpected result %d in test %d\n", ret, i);
+ else
+ todo_wine ok(ret == progress_tests[i].copy_retval, "CopyFileExA: unexpected result %d in test %d\n", ret, i);
+ todo_wine ok(progressInvoked == progress_tests[i].progress_count, "Unexpected number of progress reports %d in test %d\n", progressInvoked, i);
+ if(!ret)
+ ok(GetLastError() == progress_tests[i].lastError, "Unexpected error code 0x%08x in test %i\n", GetLastError(), i);
+ }
+ ret = DeleteFileA(source);
+ ok(ret, "DeleteFileA: error %d\n", GetLastError());
+ ret = DeleteFileA(dest);
+ ok(ret, "DeleteFileA: error %d\n", GetLastError());
+}
static void test_CopyFile2(void)
{
static const WCHAR doesntexistW[] = {'d','o','e','s','n','t','e','x','i','s','t',0};
@@ -4045,6 +4149,7 @@ START_TEST(file)
test_GetTempFileNameA();
test_CopyFileA();
test_CopyFileW();
+ test_CopyFileEx();
test_CopyFile2();
test_CreateFile();
test_CreateFileA();
--
1.8.1.2
More information about the wine-patches
mailing list