From 55dfdc06394130ca5c6ddac8d217e231f7501e44 Mon Sep 17 00:00:00 2001 From: Ilya Basin Date: Thu, 4 Mar 2010 21:48:58 +0300 Subject: shell32/tests: add tests for the parser of SHELLEXECUTEINFO.lpFile [try 5] To: wine-patches Reply-To: wine-devel 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 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 | 83 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 83 insertions(+), 0 deletions(-) diff --git a/dlls/shell32/tests/shlexec.c b/dlls/shell32/tests/shlexec.c index 5d5db34..59ab61e 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,84 @@ 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; + int expected; + + GetTempPathA(sizeof(fileA), fileA); + shorttmpdir = tmpdir + strlen(fileA); + + /* ensure tmpdir is in %TEMP%: GetTempPath() can succeed even if TEMP is undefined */ + SetEnvironmentVariableA("TEMP", fileA); + + #define TEST_LPFILE_PARSED_ok_(cond) ok((cond), "expected %s (%d), got %s (%d), lpFile: %s \n", \ + expected==33 ? "success" : "failure", expected, rc > 32 ? "success" : "failure", rc, fileA) + + #define TEST_LPFILE_PARSED_ok_condition() (rc==expected || (rc>32 && expected>32)) + #define TEST_LPFILE_PARSED_ok() TEST_LPFILE_PARSED_ok_(TEST_LPFILE_PARSED_ok_condition()) + + /* existing "drawback_file.noassoc" prevents finding "drawback_file.noassoc foo.shlexec" on wine */ + testfile = "%s\\drawback_file.noassoc foo.shlexec"; + expected = 33; sprintf(fileA, testfile, tmpdir); + rc=shell_execute(NULL, fileA, NULL, NULL); + todo_wine { TEST_LPFILE_PARSED_ok(); } + + /* if quoted, existing "drawback_file.noassoc" not prevents finding "drawback_file.noassoc foo.shlexec" on wine */ + testfile = "\"%s\\drawback_file.noassoc foo.shlexec\""; + expected = 33; sprintf(fileA, testfile, tmpdir); + rc=shell_execute(NULL, fileA, NULL, NULL); + TEST_LPFILE_PARSED_ok_(TEST_LPFILE_PARSED_ok_condition() || broken(rc == 2) /* Win95/NT4 */ ); + + /* error should be 2, not 31 */ + testfile = "\"%s\\drawback_file.noassoc\" foo.shlexec"; + expected = 2; sprintf(fileA, testfile, tmpdir); + rc=shell_execute(NULL, fileA, NULL, NULL); + TEST_LPFILE_PARSED_ok(); + + /* ""command"" not works on wine (and real win9x and w2k) */ + testfile = "\"\"%s\\simple.shlexec\"\""; + expected = 33; sprintf(fileA, testfile, tmpdir); + rc=shell_execute(NULL, fileA, NULL, NULL); + todo_wine { TEST_LPFILE_PARSED_ok_(TEST_LPFILE_PARSED_ok_condition() || broken(rc == 2) /* Win9x/2000 */ ); } + + /* nonexisting "drawback_nonexist.noassoc" not prevents finding "drawback_nonexist.noassoc foo.shlexec" on wine */ + testfile = "%s\\drawback_nonexist.noassoc foo.shlexec"; + expected = 33; sprintf(fileA, testfile, tmpdir); + rc=shell_execute(NULL, fileA, NULL, NULL); + TEST_LPFILE_PARSED_ok(); + + /* 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"; + expected = 2; sprintf(fileA, testfile, shorttmpdir); + rc=shell_execute(NULL, fileA, NULL, NULL); + todo_wine { TEST_LPFILE_PARSED_ok(); } + + /* quoted */ + testfile = "\"%%TEMP%%\\%s\\simple.shlexec\""; + expected = 2; sprintf(fileA, testfile, shorttmpdir); + rc=shell_execute(NULL, fileA, NULL, NULL); + todo_wine { TEST_LPFILE_PARSED_ok(); } + + /* test SEE_MASK_DOENVSUBST works */ + testfile = "%%TEMP%%\\%s\\simple.shlexec"; + expected = 33; sprintf(fileA, testfile, shorttmpdir); + rc=shell_execute_ex(SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI, NULL, fileA, NULL, NULL); + TEST_LPFILE_PARSED_ok(); + + /* quoted lpFile not works only on real win95 and nt4 */ + testfile = "\"%%TEMP%%\\%s\\simple.shlexec\""; + expected = 33; sprintf(fileA, testfile, shorttmpdir); + rc=shell_execute_ex(SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI, NULL, fileA, NULL, NULL); + TEST_LPFILE_PARSED_ok_(TEST_LPFILE_PARSED_ok_condition() || broken(rc == 2) /* Win95/NT4 */ ); +} + static void test_filename(void) { char filename[MAX_PATH]; @@ -1938,6 +2020,7 @@ START_TEST(shlexec) init_test(); + test_lpFile_parsed(); test_filename(); test_find_executable(); test_lnks(); -- 1.7.0.1