Misha Koshelev : shell32/tests: Add tests for default DDE application name.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 30 08:56:48 CDT 2007


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

Author: Misha Koshelev <mk144210 at bcm.edu>
Date:   Sun May 27 20:01:06 2007 -0500

shell32/tests: Add tests for default DDE application name.

---

 dlls/shell32/tests/shlexec.c |  164 +++++++++++++++++++++++++++++++++++++++---
 1 files changed, 154 insertions(+), 10 deletions(-)

diff --git a/dlls/shell32/tests/shlexec.c b/dlls/shell32/tests/shlexec.c
index eabd25c..37f736d 100644
--- a/dlls/shell32/tests/shlexec.c
+++ b/dlls/shell32/tests/shlexec.c
@@ -567,6 +567,8 @@ static const char* testfiles[]=
     "%s\\masked file.shlexec",
     "%s\\masked",
     "%s\\test file.sde",
+    "%s\\test file.exe",
+    "%s\\test2.exe",
     NULL
 };
 
@@ -1102,8 +1104,9 @@ static dde_tests_t dde_tests[] =
     {NULL, NULL, NULL, NULL, 0x0, 0}
 };
 
+static DWORD ddeInst;
 static HSZ hszTopic;
-static char ddeExec[MAX_PATH];
+static char ddeExec[MAX_PATH], ddeApplication[MAX_PATH];
 static BOOL denyNextConnection;
 
 static HDDEDATA CALLBACK ddeCb(UINT uType, UINT uFmt, HCONV hConv,
@@ -1124,7 +1127,11 @@ static HDDEDATA CALLBACK ddeCb(UINT uType, UINT uFmt, HCONV hConv,
                 if (denyNextConnection)
                     denyNextConnection = FALSE;
                 else
+                {
+                    size = DdeQueryString(ddeInst, hsz2, ddeApplication, MAX_PATH, CP_WINANSI);
+                    assert(size < MAX_PATH);
                     return (HDDEDATA)TRUE;
+                }
             }
             return (HDDEDATA)FALSE;
 
@@ -1167,12 +1174,12 @@ static void test_dde(void)
     dde_thread_info_t info = { filename, GetCurrentThreadId() };
     const dde_tests_t* test;
     char params[1024];
-    DWORD inst = 0;
     HANDLE hThread;
     MSG msg;
     int rc;
 
-    rc = DdeInitializeA(&inst, ddeCb, CBF_SKIP_ALLNOTIFICATIONS | CBF_FAIL_ADVISES |
+    ddeInst = 0;
+    rc = DdeInitializeA(&ddeInst, ddeCb, CBF_SKIP_ALLNOTIFICATIONS | CBF_FAIL_ADVISES |
                         CBF_FAIL_POKES | CBF_FAIL_REQUESTS, 0L);
     assert(rc == DMLERR_NO_ERROR);
 
@@ -1188,12 +1195,12 @@ static void test_dde(void)
         create_test_association(".sde");
         create_test_verb_dde(".sde", "Open", 0, test->command, test->ddeexec,
                              test->application, test->topic, test->ifexec);
-        hszApplication = DdeCreateStringHandleA(inst, test->application ?
+        hszApplication = DdeCreateStringHandleA(ddeInst, test->application ?
                                                 test->application : defApplication, CP_WINANSI);
-        hszTopic = DdeCreateStringHandleA(inst, test->topic ? test->topic : SZDDESYS_TOPIC,
+        hszTopic = DdeCreateStringHandleA(ddeInst, test->topic ? test->topic : SZDDESYS_TOPIC,
                                           CP_WINANSI);
         assert(hszApplication && hszTopic);
-        assert(DdeNameService(inst, hszApplication, 0L, DNS_REGISTER));
+        assert(DdeNameService(ddeInst, hszApplication, 0L, DNS_REGISTER));
         denyNextConnection = TRUE;
         ddeExec[0] = 0;
 
@@ -1256,14 +1263,150 @@ static void test_dde(void)
             }
         }
 
-        assert(DdeNameService(inst, hszApplication, 0L, DNS_UNREGISTER));
-        assert(DdeFreeStringHandle(inst, hszTopic));
-        assert(DdeFreeStringHandle(inst, hszApplication));
+        assert(DdeNameService(ddeInst, hszApplication, 0L, DNS_UNREGISTER));
+        assert(DdeFreeStringHandle(ddeInst, hszTopic));
+        assert(DdeFreeStringHandle(ddeInst, hszApplication));
+        delete_test_association(".sde");
+        test++;
+    }
+
+    assert(DdeUninitialize(ddeInst));
+}
+
+typedef struct
+{
+    const char* command;
+    const char* expectedDdeApplication;
+    int todo;
+    int rc;
+} dde_default_app_tests_t;
+
+static dde_default_app_tests_t dde_default_app_tests[] =
+{
+    /* Test unquoted existing filename with a space */
+    {"%s\\test file.exe", "test file", 0x1, 33},
+    {"%s\\test file.exe param", "test file", 0x1, 33},
+
+    /* Test quoted existing filename with a space */
+    {"\"%s\\test file.exe\"", "test file", 0x1, 33},
+    {"\"%s\\test file.exe\" param", "test file", 0x1, 33},
+
+    /* Test unquoted filename with a space that doesn't exist, but
+     * test2.exe does */
+    {"%s\\test2 file.exe", "test2", 0x1, 33},
+    {"%s\\test2 file.exe param", "test2", 0x1, 33},
+
+    /* Test quoted filename with a space that does not exist */
+    {"\"%s\\test2 file.exe\"", "", 0x1, 5},
+    {"\"%s\\test2 file.exe\" param", "", 0x1, 5},
+
+    /* Test filename supplied without the extension */
+    {"%s\\test2", "test2", 0x1, 33},
+    {"%s\\test2 param", "test2", 0x1, 33},
+
+    /* Test an unquoted non-existent filename */
+    {"%s\\notexist.exe", "", 0x1, 5},
+    {"%s\\notexist.exe param", "", 0x1, 5},
+
+    /* Test an application that will be found on the path */
+    {"cmd", "cmd", 0x1, 33},
+    {"cmd param", "cmd", 0x1, 33},
+
+    /* Test an application that will not be found on the path */
+    {"xyzwxyzwxyz", "", 0x1, 5},
+    {"xyzwxyzwxyz param", "", 0x1, 5},
+
+    {NULL, NULL, 0, 0}
+};
+
+static void test_dde_default_app(void)
+{
+    char filename[MAX_PATH];
+    HSZ hszApplication;
+    dde_thread_info_t info = { filename, GetCurrentThreadId() };
+    const dde_default_app_tests_t* test;
+    char params[1024];
+    HANDLE hThread;
+    MSG msg;
+    int rc;
+
+    ddeInst = 0;
+    rc = DdeInitializeA(&ddeInst, ddeCb, CBF_SKIP_ALLNOTIFICATIONS | CBF_FAIL_ADVISES |
+                        CBF_FAIL_POKES | CBF_FAIL_REQUESTS, 0L);
+    assert(rc == DMLERR_NO_ERROR);
+
+    sprintf(filename, "%s\\test file.sde", tmpdir);
+
+    /* It is strictly not necessary to register an application name here, but wine's
+     * DdeNameService implementation complains if 0L is passed instead of
+     * hszApplication with DNS_FILTEROFF */
+    hszApplication = DdeCreateStringHandleA(ddeInst, "shlexec", CP_WINANSI);
+    hszTopic = DdeCreateStringHandleA(ddeInst, "shlexec", CP_WINANSI);
+    assert(hszApplication && hszTopic);
+    assert(DdeNameService(ddeInst, hszApplication, 0L, DNS_REGISTER | DNS_FILTEROFF));
+
+    test = dde_default_app_tests;
+    while (test->command)
+    {
+        create_test_association(".sde");
+        sprintf(params, test->command, tmpdir);
+        create_test_verb_dde(".sde", "Open", 1, params, "[test]", NULL,
+                             "shlexec", NULL);
+        denyNextConnection = FALSE;
+        ddeApplication[0] = 0;
+
+        /* No application will be run as we will respond to the first DDE event,
+         * so don't wait for it */
+        SetEvent(hEvent);
+
+        hThread = CreateThread(NULL, 0, ddeThread, (LPVOID)&info, 0, NULL);
+        assert(hThread);
+        while (GetMessage(&msg, NULL, 0, 0))
+        {
+            /* Need a message loop for DDE server */
+            TranslateMessage(&msg);
+            DispatchMessage(&msg);
+        }
+        rc = WaitForSingleObject(hThread, 5000);
+        assert(rc == WAIT_OBJECT_0);
+
+        GetExitCodeThread(hThread, (DWORD *)&rc);
+        if (rc > 32)
+            rc=33;
+        if ((test->todo & 0x1)==0)
+        {
+            ok(rc==test->rc, "%s failed: rc=%d err=%d\n", shell_call,
+               rc, GetLastError());
+        }
+        else todo_wine
+        {
+            ok(rc==test->rc, "%s failed: rc=%d err=%d\n", shell_call,
+               rc, GetLastError());
+        }
+        if (rc == 33)
+        {
+            if ((test->todo & 0x2)==0)
+            {
+                ok(!strcmp(ddeApplication, test->expectedDdeApplication),
+                   "Expected application '%s', got '%s'\n",
+                   test->expectedDdeApplication, ddeApplication);
+            }
+            else todo_wine
+            {
+                ok(!strcmp(ddeApplication, test->expectedDdeApplication),
+                   "Expected application '%s', got '%s'\n",
+                   test->expectedDdeApplication, ddeApplication);
+            }
+        }
+
         delete_test_association(".sde");
         test++;
     }
 
-    assert(DdeUninitialize(inst));
+    assert(DdeNameService(ddeInst, hszApplication, 0L, DNS_UNREGISTER));
+    assert(DdeFreeStringHandle(ddeInst, hszTopic));
+    assert(DdeFreeStringHandle(ddeInst, hszApplication));
+    assert(DdeUninitialize(ddeInst));
 }
 
 static void init_test(void)
@@ -1409,6 +1552,7 @@ START_TEST(shlexec)
     test_exes();
     test_exes_long();
     test_dde();
+    test_dde_default_app();
 
     cleanup_test();
 }




More information about the wine-cvs mailing list