[2/3] shell32/tests: Add FindExecutable() tests.

Francois Gouget fgouget at codeweavers.com
Wed Dec 13 11:06:21 CST 2006


---
 dlls/shell32/tests/shlexec.c |  163 +++++++++++++++++++++++++++++++++++------
 1 files changed, 139 insertions(+), 24 deletions(-)

diff --git a/dlls/shell32/tests/shlexec.c b/dlls/shell32/tests/shlexec.c
index add8648..cb05217 100644
--- a/dlls/shell32/tests/shlexec.c
+++ b/dlls/shell32/tests/shlexec.c
@@ -230,7 +230,7 @@ static void delete_test_association(const char* extension)
 }
 
 static void create_test_verb(const char* extension, const char* verb,
-                             const char* cmdtail)
+                             int rawcmd, const char* cmdtail)
 {
     HKEY hkey_shell, hkey_verb, hkey_cmd;
     char shell[MAX_PATH];
@@ -248,12 +248,19 @@ static void create_test_verb(const char* extension, const char* verb,
                       NULL, &hkey_cmd, NULL);
     assert(rc==ERROR_SUCCESS);
 
-    cmd=malloc(strlen(argv0)+10+strlen(child_file)+2+strlen(cmdtail)+1);
-    sprintf(cmd,"%s shlexec \"%s\" %s", argv0, child_file, cmdtail);
-    rc=RegSetValueEx(hkey_cmd, NULL, 0, REG_SZ, (LPBYTE) cmd, strlen(cmd)+1);
-    assert(rc==ERROR_SUCCESS);
+    if (rawcmd)
+    {
+        rc=RegSetValueEx(hkey_cmd, NULL, 0, REG_SZ, (LPBYTE)cmdtail, strlen(cmdtail)+1);
+    }
+    else
+    {
+        cmd=malloc(strlen(argv0)+10+strlen(child_file)+2+strlen(cmdtail)+1);
+        sprintf(cmd,"%s shlexec \"%s\" %s", argv0, child_file, cmdtail);
+        rc=RegSetValueEx(hkey_cmd, NULL, 0, REG_SZ, (LPBYTE)cmd, strlen(cmd)+1);
+        assert(rc==ERROR_SUCCESS);
+        free(cmd);
+    }
 
-    free(cmd);
     CloseHandle(hkey_shell);
     CloseHandle(hkey_verb);
     CloseHandle(hkey_cmd);
@@ -470,6 +477,9 @@ static const char* testfiles[]=
     "%s\\test file.shlexec.noassoc",
     "%s\\test_shortcut_shlexec.lnk",
     "%s\\test_shortcut_exe.lnk",
+    "%s\\test file.shl",
+    "%s\\test file.shlfoo",
+    "%s\\test file.sfe",
     NULL
 };
 
@@ -484,28 +494,28 @@ typedef struct
 static filename_tests_t filename_tests[]=
 {
     /* Test bad / nonexistent filenames */
-    {NULL,           "%s\\nonexistent.shlexec", 0x1, ERROR_FILE_NOT_FOUND},
-    {NULL,           "%s\\nonexistent.noassoc", 0x1, ERROR_FILE_NOT_FOUND},
+    {NULL,           "%s\\nonexistent.shlexec", 0x11, SE_ERR_FNF},
+    {NULL,           "%s\\nonexistent.noassoc", 0x11, SE_ERR_FNF},
 
     /* Standard tests */
-    {NULL,           "%s\\test file.shlexec",   0x0, 33},
-    {NULL,           "%s\\test file.shlexec.",  0x0, 33},
-    {NULL,           "%s\\%%nasty%% $file.shlexec", 0x0, 33},
-    {NULL,           "%s/test file.shlexec",    0x0, 33},
+    {NULL,           "%s\\test file.shlexec",   0x20, 33},
+    {NULL,           "%s\\test file.shlexec.",  0x20, 33},
+    {NULL,           "%s\\%%nasty%% $file.shlexec", 0x20, 33},
+    {NULL,           "%s/test file.shlexec",    0x20, 33},
 
     /* Test filenames with no association */
-    {NULL,           "%s\\test file.noassoc",   0x0, SE_ERR_NOASSOC},
+    {NULL,           "%s\\test file.noassoc",   0x0,  SE_ERR_NOASSOC},
 
     /* Test double extensions */
-    {NULL,           "%s\\test file.noassoc.shlexec", 0x0, 33},
+    {NULL,           "%s\\test file.noassoc.shlexec", 0x20, 33},
     {NULL,           "%s\\test file.shlexec.noassoc", 0x0, SE_ERR_NOASSOC},
 
     /* Test alternate verbs */
-    {"LowerL",       "%s\\nonexistent.shlexec", 0x1, ERROR_FILE_NOT_FOUND},
-    {"LowerL",       "%s\\test file.noassoc",   0x0, SE_ERR_NOASSOC},
+    {"LowerL",       "%s\\nonexistent.shlexec", 0x11, SE_ERR_FNF},
+    {"LowerL",       "%s\\test file.noassoc",   0x0,  SE_ERR_NOASSOC},
 
-    {"QuotedLowerL", "%s\\test file.shlexec",   0x0, 33},
-    {"QuotedUpperL", "%s\\test file.shlexec",   0x0, 33},
+    {"QuotedLowerL", "%s\\test file.shlexec",   0x20, 33},
+    {"QuotedUpperL", "%s\\test file.shlexec",   0x20, 33},
 
     {NULL, NULL, 0}
 };
@@ -673,6 +683,110 @@ static void test_filename(void)
     }
 }
 
+static void test_find_executable(void)
+{
+    char filename[MAX_PATH];
+    char command[MAX_PATH];
+    const filename_tests_t* test;
+    int rc;
+
+    create_test_association(".sfe");
+    create_test_verb(".sfe", "Open", 1, "%1");
+
+    /* Don't test FindExecutable(..., NULL), it always crashes */
+
+    strcpy(command, "your word");
+    rc=(int)FindExecutableA(NULL, NULL, command);
+    ok(rc == SE_ERR_FNF || rc > 32, "FindExecutable(NULL) returned %d\n", rc);
+    ok(strcmp(command, "your word") != 0, "FindExecutable(NULL) returned command=[%s]\n", command);
+
+    strcpy(command, "your word");
+    rc=(int)FindExecutableA(tmpdir, NULL, command);
+    todo_wine ok(rc == SE_ERR_FNF || rc > 32, "FindExecutable(NULL) returned %d\n", rc);
+    ok(strcmp(command, "your word") != 0, "FindExecutable(NULL) returned command=[%s]\n", command);
+
+    sprintf(filename, "%s\\test file.sfe", tmpdir);
+    rc=(int)FindExecutableA(filename, NULL, command);
+    ok(rc > 32, "FindExecutable(%s) returned %d\n", filename, rc);
+    /* Depending on the platform, command could be '%1' or 'test file.sfe' */
+
+    rc=(int)FindExecutableA("test file.sfe", tmpdir, command);
+    ok(rc > 32, "FindExecutable(%s) returned %d\n", filename, rc);
+
+    rc=(int)FindExecutableA("test file.sfe", NULL, command);
+    todo_wine ok(rc == SE_ERR_FNF, "FindExecutable(%s) returned %d\n", filename, rc);
+
+    delete_test_association(".sfe");
+
+    create_test_association(".shl");
+    create_test_verb(".shl", "Open", 0, "Open");
+
+    sprintf(filename, "%s\\test file.shl", tmpdir);
+    rc=(int)FindExecutableA(filename, NULL, command);
+    ok(rc > 32, "FindExecutable(%s) returned %d\n", filename, rc);
+
+    sprintf(filename, "%s\\test file.shlfoo", tmpdir);
+    rc=(int)FindExecutableA(filename, NULL, command);
+
+    delete_test_association(".shl");
+
+    if (rc > 32)
+    {
+        /* On Windows XP and 2003 FindExecutable() is completely broken.
+         * Probably what it does is convert the filename to 8.3 format,
+         * which as a side effect converts the '.shlfoo' extension to '.shl',
+         * and then tries to find an association for '.shl'. This means it
+         * will normally fail on most extensions with more than 3 characters,
+         * like '.mpeg', etc.
+         * Also it means we cannot do any other test.
+         */
+        trace("FindExecutable() is broken -> skipping 4+ character extension tests\n");
+        return;
+    }
+
+    test=filename_tests;
+    while (test->basename)
+    {
+        sprintf(filename, test->basename, tmpdir);
+        if (strchr(filename, '/'))
+        {
+            char* c;
+            c=filename;
+            while (*c)
+            {
+                if (*c=='\\')
+                    *c='/';
+                c++;
+            }
+        }
+        rc=(int)FindExecutableA(filename, NULL, command);
+        if (rc > 32)
+            rc=33;
+        if ((test->todo & 0x10)==0)
+        {
+            ok(rc==test->rc, "FindExecutable(%s) failed: rc=%d\n", filename, rc);
+        }
+        else todo_wine
+        {
+            ok(rc==test->rc, "FindExecutable(%s) failed: rc=%d\n", filename, rc);
+        }
+        if (rc > 32)
+        {
+            if ((test->todo & 0x20)==0)
+            {
+                ok(strcmp(command, argv0) == 0, "FindExecutable(%s) returned command='%s' instead of '%s'\n",
+                   filename, command, argv0);
+            }
+            else todo_wine
+            {
+                ok(strcmp(command, argv0) == 0, "FindExecutable(%s) returned command='%s' instead of '%s'\n",
+                   filename, command, argv0);
+            }
+        }
+        test++;
+    }
+}
+
 
 static filename_tests_t lnk_tests[]=
 {
@@ -939,12 +1053,12 @@ static void init_test(void)
 
     /* Create a basic association suitable for most tests */
     create_test_association(".shlexec");
-    create_test_verb(".shlexec", "Open", "Open \"%1\"");
-    create_test_verb(".shlexec", "NoQuotes", "NoQuotes %1");
-    create_test_verb(".shlexec", "LowerL", "LowerL %l");
-    create_test_verb(".shlexec", "QuotedLowerL", "QuotedLowerL \"%l\"");
-    create_test_verb(".shlexec", "UpperL", "UpperL %L");
-    create_test_verb(".shlexec", "QuotedUpperL", "QuotedUpperL \"%L\"");
+    create_test_verb(".shlexec", "Open", 0, "Open \"%1\"");
+    create_test_verb(".shlexec", "NoQuotes", 0, "NoQuotes %1");
+    create_test_verb(".shlexec", "LowerL", 0, "LowerL %l");
+    create_test_verb(".shlexec", "QuotedLowerL", 0, "QuotedLowerL \"%l\"");
+    create_test_verb(".shlexec", "UpperL", 0, "UpperL %L");
+    create_test_verb(".shlexec", "QuotedUpperL", 0, "QuotedUpperL \"%L\"");
 }
 
 static void cleanup_test(void)
@@ -983,6 +1097,7 @@ START_TEST(shlexec)
     init_test();
 
     test_filename();
+    test_find_executable();
     test_lnks();
     test_exes();
     test_exes_long();
-- 
1.4.4.1




More information about the wine-patches mailing list