shell32/tests: add tests for the parser of SHELLEXECUTEINFO.lpFile [try 7]

Ilya Basin basinilya at gmail.com
Mon Mar 8 12:44:57 CST 2010


This should expose this bug:
http://bugs.winehq.org/show_bug.cgi?id=19385 ( the 'wine start'
launcher does not open MS Office documents that have spaces in their
path ). Although the title is misleading, many other tickets are
marked as duplicates of it.
It's not about spaces. It's about sometimes unneeded parsing of
SHELLEXECUTEINFO.lpFile, trying to extract arguments from it.

try 7:
    removed redundant conditions & format string params
try 6:
    removed custom macros
try 5:
    replaced every win_skip() with broken()
try 4:
    added these comments
try 3:
    fixed test failures on 95/NT
    new job results https://winetestbot.geldorp.nl/JobDetails.pl?Key=868
try 2:
    added 4 todo_wine's to mark bad wine behavior
    added GetProcAddress(hkernel32, "AttachConsole") to detect XP/2k3
    removed special case when XP emulates 9x because can't do it without
    using GetVersion().

---
 dlls/shell32/tests/shlexec.c |  111 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 111 insertions(+), 0 deletions(-)

diff --git a/dlls/shell32/tests/shlexec.c b/dlls/shell32/tests/shlexec.c
index 5d5db34..b46fdb3 100644
--- a/dlls/shell32/tests/shlexec.c
+++ b/dlls/shell32/tests/shlexec.c
@@ -797,6 +797,10 @@ static const char* testfiles[]=
     "%s\\test file.sde",
     "%s\\test file.exe",
     "%s\\test2.exe",
+    "%s\\simple.shlexec",
+    "%s\\drawback_file.noassoc",
+    "%s\\drawback_file.noassoc foo.shlexec",
+    "%s\\drawback_nonexist.noassoc foo.shlexec",
     NULL
 };
 
@@ -852,6 +856,112 @@ static filename_tests_t noquotes_tests[]=
     {NULL, NULL, 0}
 };
 
+static void test_lpFile_parsed(void)
+{
+    /* basename tmpdir */
+    const char* shorttmpdir;
+
+    const char *testfile;
+    char fileA[MAX_PATH];
+
+    int rc;
+
+    GetTempPathA(sizeof(fileA), fileA);
+    shorttmpdir = tmpdir + strlen(fileA);
+
+    /* ensure tmpdir is in %TEMP%: GetTempPath() can succeed even if TEMP is undefined */
+    SetEnvironmentVariableA("TEMP", fileA);
+
+    /* existing "drawback_file.noassoc" prevents finding "drawback_file.noassoc foo.shlexec" on wine */
+    testfile = "%s\\drawback_file.noassoc foo.shlexec";
+    sprintf(fileA, testfile, tmpdir);
+    rc=shell_execute(NULL, fileA, NULL, NULL);
+    todo_wine { 
+        ok(rc>32, 
+            "expected success (33), got %s (%d), lpFile: %s \n", 
+            rc > 32 ? "success" : "failure", rc, fileA
+            );
+    }
+
+    /* if quoted, existing "drawback_file.noassoc" not prevents finding "drawback_file.noassoc foo.shlexec" on wine */
+    testfile = "\"%s\\drawback_file.noassoc foo.shlexec\"";
+    sprintf(fileA, testfile, tmpdir);
+    rc=shell_execute(NULL, fileA, NULL, NULL);
+    ok(rc>32 || broken(rc == 2) /* Win95/NT4 */, 
+        "expected success (33), got %s (%d), lpFile: %s \n", 
+        rc > 32 ? "success" : "failure", rc, fileA
+        );
+
+    /* error should be 2, not 31 */
+    testfile = "\"%s\\drawback_file.noassoc\" foo.shlexec";
+    sprintf(fileA, testfile, tmpdir);
+    rc=shell_execute(NULL, fileA, NULL, NULL);
+    ok(rc==2, 
+        "expected failure (2), got %s (%d), lpFile: %s \n", 
+        rc > 32 ? "success" : "failure", rc, fileA
+        );
+
+    /* ""command"" not works on wine (and real win9x and w2k) */
+    testfile = "\"\"%s\\simple.shlexec\"\"";
+    sprintf(fileA, testfile, tmpdir);
+    rc=shell_execute(NULL, fileA, NULL, NULL);
+    todo_wine { 
+        ok(rc>32 || broken(rc == 2) /* Win9x/2000 */, 
+            "expected success (33), got %s (%d), lpFile: %s \n", 
+            rc > 32 ? "success" : "failure", rc, fileA
+            );
+    }
+
+    /* nonexisting "drawback_nonexist.noassoc" not prevents finding "drawback_nonexist.noassoc foo.shlexec" on wine */
+    testfile = "%s\\drawback_nonexist.noassoc foo.shlexec";
+    sprintf(fileA, testfile, tmpdir);
+    rc=shell_execute(NULL, fileA, NULL, NULL);
+    ok(rc>32, 
+        "expected success (33), got %s (%d), lpFile: %s \n", 
+        rc > 32 ? "success" : "failure", rc, fileA
+        );
+
+    /* is SEE_MASK_DOENVSUBST default flag? Should only be when XP emulates 9x (XP bug or real 95 or ME behavior ?) */
+    testfile = "%%TEMP%%\\%s\\simple.shlexec";
+    sprintf(fileA, testfile, shorttmpdir);
+    rc=shell_execute(NULL, fileA, NULL, NULL);
+    todo_wine { 
+        ok(rc==2, 
+            "expected failure (2), got %s (%d), lpFile: %s \n", 
+            rc > 32 ? "success" : "failure", rc, fileA
+            );
+    }
+
+    /* quoted */ 
+    testfile = "\"%%TEMP%%\\%s\\simple.shlexec\"";
+    sprintf(fileA, testfile, shorttmpdir);
+    rc=shell_execute(NULL, fileA, NULL, NULL);
+    todo_wine { 
+        ok(rc==2, 
+            "expected failure (2), got %s (%d), lpFile: %s \n", 
+            rc > 32 ? "success" : "failure", rc, fileA
+            );
+    }
+
+    /* test SEE_MASK_DOENVSUBST works */
+    testfile = "%%TEMP%%\\%s\\simple.shlexec";
+    sprintf(fileA, testfile, shorttmpdir);
+    rc=shell_execute_ex(SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI, NULL, fileA, NULL, NULL);
+    ok(rc>32, 
+        "expected success (33), got %s (%d), lpFile: %s \n", 
+        rc > 32 ? "success" : "failure", rc, fileA
+        );
+
+    /* quoted lpFile not works only on real win95 and nt4 */
+    testfile = "\"%%TEMP%%\\%s\\simple.shlexec\"";
+    sprintf(fileA, testfile, shorttmpdir);
+    rc=shell_execute_ex(SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI, NULL, fileA, NULL, NULL);
+    ok(rc>32 || broken(rc == 2) /* Win95/NT4 */, 
+        "expected success (33), got %s (%d), lpFile: %s \n", 
+        rc > 32 ? "success" : "failure", rc, fileA
+        );
+}
+
 static void test_filename(void)
 {
     char filename[MAX_PATH];
@@ -1938,6 +2048,7 @@ START_TEST(shlexec)
 
     init_test();
 
+    test_lpFile_parsed();
     test_filename();
     test_find_executable();
     test_lnks();
-- 
1.7.0.1




More information about the wine-patches mailing list