Alexandre Julliard : user32/tests: Add some cross-process clipboard tests.

Alexandre Julliard julliard at winehq.org
Wed Aug 17 10:24:24 CDT 2016


Module: wine
Branch: master
Commit: 2e6fc893956c820a005b910665c5b22f0a90f1b7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2e6fc893956c820a005b910665c5b22f0a90f1b7

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Aug 17 19:01:25 2016 +0900

user32/tests: Add some cross-process clipboard tests.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/tests/clipboard.c | 138 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 138 insertions(+)

diff --git a/dlls/user32/tests/clipboard.c b/dlls/user32/tests/clipboard.c
index 625d550..d218941 100644
--- a/dlls/user32/tests/clipboard.c
+++ b/dlls/user32/tests/clipboard.c
@@ -18,6 +18,7 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#include <stdio.h>
 #include "wine/test.h"
 #include "winbase.h"
 #include "winerror.h"
@@ -28,6 +29,7 @@ static BOOL (WINAPI *pAddClipboardFormatListener)(HWND hwnd);
 static DWORD (WINAPI *pGetClipboardSequenceNumber)(void);
 
 static int thread_from_line;
+static char *argv0;
 
 static DWORD WINAPI open_clipboard_thread(LPVOID arg)
 {
@@ -80,6 +82,32 @@ static DWORD WINAPI set_clipboard_data_thread(LPVOID arg)
     return 0;
 }
 
+static void set_clipboard_data_process( int arg )
+{
+    HANDLE ret;
+
+    SetLastError( 0xdeadbeef );
+    if (arg)
+    {
+        todo_wine_if( arg == 1 || arg == 3 )
+        ok( IsClipboardFormatAvailable( CF_WAVE ), "process %u: CF_WAVE not available\n", arg );
+        ret = SetClipboardData( CF_WAVE, GlobalAlloc( GMEM_DDESHARE | GMEM_ZEROINIT, 100 ));
+        todo_wine_if( arg == 2 || arg == 4 )
+        ok( ret != 0, "process %u: SetClipboardData failed err %u\n", arg, GetLastError() );
+    }
+    else
+    {
+        SetClipboardData( CF_WAVE, 0 );
+        todo_wine ok( GetLastError() == ERROR_CLIPBOARD_NOT_OPEN, "process %u: wrong error %u\n",
+            arg, GetLastError());
+        todo_wine ok( !IsClipboardFormatAvailable( CF_WAVE ), "process %u: SetClipboardData succeeded\n", arg );
+        ret = SetClipboardData( CF_WAVE, GlobalAlloc( GMEM_DDESHARE | GMEM_ZEROINIT, 100 ));
+        ok( !ret, "process %u: SetClipboardData succeeded\n", arg );
+        todo_wine ok( GetLastError() == ERROR_CLIPBOARD_NOT_OPEN, "process %u: wrong error %u\n",
+            arg, GetLastError());
+    }
+}
+
 static void run_thread( LPTHREAD_START_ROUTINE func, void *arg, int line )
 {
     DWORD ret;
@@ -102,6 +130,23 @@ static void run_thread( LPTHREAD_START_ROUTINE func, void *arg, int line )
     CloseHandle(thread);
 }
 
+static void run_process( const char *args )
+{
+    char cmd[MAX_PATH];
+    PROCESS_INFORMATION info;
+    STARTUPINFOA startup;
+
+    sprintf( cmd, "%s clipboard %s", argv0, args );
+    memset( &startup, 0, sizeof(startup) );
+    startup.cb = sizeof(startup);
+    ok( CreateProcessA( NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &startup, &info ),
+        "CreateProcess %s failed\n", cmd );
+
+    winetest_wait_child_process( info.hProcess );
+    CloseHandle( info.hProcess );
+    CloseHandle( info.hThread );
+}
+
 static void test_ClipboardOwner(void)
 {
     HWND hWnd1, hWnd2;
@@ -137,6 +182,7 @@ static void test_ClipboardOwner(void)
     run_thread( open_clipboard_thread, hWnd1, __LINE__ );
     run_thread( empty_clipboard_thread, 0, __LINE__ );
     run_thread( set_clipboard_data_thread, hWnd1, __LINE__ );
+    run_process( "set_clipboard_data 0" );
     ok(!CloseClipboard(), "CloseClipboard should fail if clipboard wasn't open\n");
     ok(OpenClipboard(hWnd1), "OpenClipboard failed\n");
 
@@ -152,6 +198,7 @@ static void test_ClipboardOwner(void)
     ok(GetClipboardOwner() == hWnd1, "clipboard should be owned by %p, not by %p\n", hWnd1, GetClipboardOwner());
     run_thread( empty_clipboard_thread, 0, __LINE__ );
     run_thread( set_clipboard_data_thread, hWnd1, __LINE__ );
+    run_process( "set_clipboard_data 1" );
 
     SetLastError(0xdeadbeef);
     ret = OpenClipboard(hWnd2);
@@ -170,6 +217,7 @@ static void test_ClipboardOwner(void)
     ok( GetClipboardOwner() == GetDesktopWindow(), "wrong owner %p/%p\n",
         GetClipboardOwner(), GetDesktopWindow() );
     run_thread( set_clipboard_data_thread, GetDesktopWindow(), __LINE__ );
+    run_process( "set_clipboard_data 2" );
     ret = CloseClipboard();
     ok( ret, "CloseClipboard error %d\n", GetLastError());
 
@@ -191,6 +239,7 @@ static void test_ClipboardOwner(void)
     ret = OpenClipboard( 0 );
     ok( ret, "OpenClipboard error %d\n", GetLastError());
     run_thread( set_clipboard_data_thread, 0, __LINE__ );
+    run_process( "set_clipboard_data 3" );
     ret = CloseClipboard();
     ok( ret, "CloseClipboard error %d\n", GetLastError());
 
@@ -199,6 +248,7 @@ static void test_ClipboardOwner(void)
     ret = OpenClipboard( 0 );
     ok( ret, "OpenClipboard error %d\n", GetLastError());
     run_thread( set_clipboard_data_thread, 0, __LINE__ );
+    run_process( "set_clipboard_data 4" );
     ret = EmptyClipboard();
     ok( ret, "EmptyClipboard error %d\n", GetLastError());
     ret = CloseClipboard();
@@ -795,8 +845,56 @@ static DWORD WINAPI test_handles_thread( void *arg )
     return 0;
 }
 
+static DWORD WINAPI test_handles_thread2( void *arg )
+{
+    BOOL r;
+    HANDLE h;
+    char *ptr;
+
+    r = OpenClipboard( 0 );
+    ok( r, "gle %d\n", GetLastError() );
+    h = GetClipboardData( CF_TEXT );
+    ok( is_moveable( h ), "expected moveable mem %p\n", h );
+    ptr = GlobalLock( h );
+    if (ptr) ok( !strcmp( "test", ptr ), "wrong data '%.5s'\n", ptr );
+    GlobalUnlock( h );
+    h = GetClipboardData( format_id );
+    ok( is_moveable( h ), "expected moveable mem %p\n", h );
+    ptr = GlobalLock( h );
+    if (ptr) ok( !strcmp( "test", ptr ), "wrong data '%.5s'\n", ptr );
+    GlobalUnlock( h );
+    r = CloseClipboard();
+    ok( r, "gle %d\n", GetLastError() );
+    return 0;
+}
+
+static void test_handles_process( const char *str )
+{
+    BOOL r;
+    HANDLE h;
+    char *ptr;
+
+    format_id = RegisterClipboardFormatA( "my_cool_clipboard_format" );
+    r = OpenClipboard( 0 );
+    ok( r, "gle %d\n", GetLastError() );
+    h = GetClipboardData( CF_TEXT );
+    todo_wine ok( is_fixed( h ), "expected fixed mem %p\n", h );
+    ptr = GlobalLock( h );
+    if (ptr) todo_wine ok( !strcmp( str, ptr ), "wrong data '%.5s'\n", ptr );
+    GlobalUnlock( h );
+    h = GetClipboardData( format_id );
+    todo_wine ok( is_fixed( h ), "expected fixed mem %p\n", h );
+    ptr = GlobalLock( h );
+    if (ptr) ok( !strcmp( str, ptr ), "wrong data '%.5s'\n", ptr );
+    GlobalUnlock( h );
+    r = CloseClipboard();
+    ok( r, "gle %d\n", GetLastError() );
+}
+
 static void test_data_handles(void)
 {
+    BOOL r;
+    HANDLE h;
     HWND hwnd = CreateWindowA( "static", NULL, WS_POPUP, 0, 0, 10, 10, 0, 0, 0, NULL );
 
     format_id = RegisterClipboardFormatA( "my_cool_clipboard_format" );
@@ -805,16 +903,56 @@ static void test_data_handles(void)
     test_handles( GetDesktopWindow() );
     test_handles( hwnd );
     run_thread( test_handles_thread, hwnd, __LINE__ );
+
+    r = OpenClipboard( hwnd );
+    ok( r, "gle %d\n", GetLastError() );
+    r = EmptyClipboard();
+    ok( r, "gle %d\n", GetLastError() );
+    h = SetClipboardData( CF_TEXT, create_text() );
+    ok( is_moveable( h ), "expected moveable mem %p\n", h );
+    h = SetClipboardData( format_id, create_text() );
+    ok( is_moveable( h ), "expected moveable mem %p\n", h );
+    r = CloseClipboard();
+    ok( r, "gle %d\n", GetLastError() );
+
+    run_thread( test_handles_thread2, 0, __LINE__ );
+    run_process( "handles test" );
+
+    r = OpenClipboard( hwnd );
+    ok( r, "gle %d\n", GetLastError() );
+    h = GetClipboardData( CF_TEXT );
+    ok( is_moveable( h ), "expected moveable mem %p\n", h );
+    h = GetClipboardData( format_id );
+    ok( is_moveable( h ), "expected moveable mem %p\n", h );
+    r = EmptyClipboard();
+    ok( r, "gle %d\n", GetLastError() );
+    r = CloseClipboard();
+    ok( r, "gle %d\n", GetLastError() );
+
     DestroyWindow( hwnd );
 }
 
 START_TEST(clipboard)
 {
+    char **argv;
+    int argc = winetest_get_mainargs( &argv );
     HMODULE mod = GetModuleHandleA( "user32" );
 
+    argv0 = argv[0];
     pAddClipboardFormatListener = (void *)GetProcAddress( mod, "AddClipboardFormatListener" );
     pGetClipboardSequenceNumber = (void *)GetProcAddress( mod, "GetClipboardSequenceNumber" );
 
+    if (argc == 4 && !strcmp( argv[2], "set_clipboard_data" ))
+    {
+        set_clipboard_data_process( atoi( argv[3] ));
+        return;
+    }
+    if (argc == 4 && !strcmp( argv[2], "handles" ))
+    {
+        test_handles_process( argv[3] );
+        return;
+    }
+
     test_RegisterClipboardFormatA();
     test_ClipboardOwner();
     test_synthesized();




More information about the wine-cvs mailing list