[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