Francois Gouget : winetest: Fix detecting whether a test can be run or not.

Alexandre Julliard julliard at winehq.org
Tue Mar 16 16:39:03 CDT 2021


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

Author: Francois Gouget <fgouget at codeweavers.com>
Date:   Tue Mar 16 10:34:07 2021 +0100

winetest: Fix detecting whether a test can be run or not.

Rather than second-guessing the loader, run 'test.exe --list' with the
critical-error handler message box disabled and use the resulting exit
codes.
But keep the activation context and COM code to improve the chances of
getting the dll version.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45032
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50783
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/winetest/main.c | 46 ++++++++++++++++++++++++++++++++--------------
 1 file changed, 32 insertions(+), 14 deletions(-)

diff --git a/programs/winetest/main.c b/programs/winetest/main.c
index e203b781dc8..8f80aca9919 100644
--- a/programs/winetest/main.c
+++ b/programs/winetest/main.c
@@ -608,11 +608,12 @@ static void append_path( const char *path)
    value of WaitForSingleObject.
  */
 static int
-run_ex (char *cmd, HANDLE out_file, const char *tempdir, DWORD ms, DWORD* pid)
+run_ex (char *cmd, HANDLE out_file, const char *tempdir, DWORD ms, BOOL nocritical, DWORD* pid)
 {
     STARTUPINFOA si;
     PROCESS_INFORMATION pi;
-    DWORD wait, status;
+    DWORD wait, status, flags;
+    UINT old_errmode;
 
     /* Flush to disk so we know which test caused Windows to crash if it does */
     if (out_file)
@@ -623,14 +624,24 @@ run_ex (char *cmd, HANDLE out_file, const char *tempdir, DWORD ms, DWORD* pid)
     si.hStdInput  = GetStdHandle( STD_INPUT_HANDLE );
     si.hStdOutput = out_file ? out_file : GetStdHandle( STD_OUTPUT_HANDLE );
     si.hStdError  = out_file ? out_file : GetStdHandle( STD_ERROR_HANDLE );
+    if (nocritical)
+    {
+        old_errmode = SetErrorMode(0);
+        SetErrorMode(old_errmode | SEM_FAILCRITICALERRORS);
+        flags = 0;
+    }
+    else
+        flags = CREATE_DEFAULT_ERROR_MODE;
 
-    if (!CreateProcessA (NULL, cmd, NULL, NULL, TRUE, CREATE_DEFAULT_ERROR_MODE,
+    if (!CreateProcessA (NULL, cmd, NULL, NULL, TRUE, flags,
                          NULL, tempdir, &si, &pi))
     {
+        if (nocritical) SetErrorMode(old_errmode);
         if (pid) *pid = 0;
         return -2;
     }
 
+    if (nocritical) SetErrorMode(old_errmode);
     CloseHandle (pi.hThread);
     if (pid) *pid = pi.dwProcessId;
     status = wait_process( pi.hProcess, ms );
@@ -716,7 +727,7 @@ get_subtests (const char *tempdir, struct wine_test *test, LPSTR res_name)
         /* We need to add the path (to the main dll) to PATH */
         append_path(test->maindllpath);
     }
-    status = run_ex (cmd, subfile, tempdir, 5000, NULL);
+    status = run_ex (cmd, subfile, tempdir, 5000, TRUE, NULL);
     err = GetLastError();
     if (test->maindllpath) {
         /* Restore PATH again */
@@ -792,7 +803,7 @@ run_test (struct wine_test* test, const char* subtest, HANDLE out_file, const ch
         char *cmd = strmake (NULL, "%s %s", test->exename, subtest);
         report (R_STEP, "Running: %s:%s", test->name, subtest);
         xprintf ("%s:%s start %s -\n", test->name, subtest, file);
-        status = run_ex (cmd, out_file, tempdir, 120000, &pid);
+        status = run_ex (cmd, out_file, tempdir, 120000, FALSE, &pid);
         heap_free (cmd);
         xprintf ("%s:%s:%04x done (%d) in %ds\n", test->name, subtest, pid, status, (GetTickCount()-start)/1000);
         if (status) failures++;
@@ -943,12 +954,7 @@ extract_test_proc (HMODULE hModule, LPCSTR lpszType, LPSTR lpszName, LONG_PTR lP
     }
 
     run = TRUE;
-    if (!dll)
-    {
-        xprintf ("    %s=dll is missing\n", dllname);
-        run = FALSE;
-    }
-    else
+    if (dll)
     {
         if (is_stub_dll(dllname))
         {
@@ -967,14 +973,26 @@ extract_test_proc (HMODULE hModule, LPCSTR lpszType, LPSTR lpszName, LONG_PTR lP
     if (run)
     {
         err = get_subtests( tempdir, &wine_tests[nr_of_files], lpszName );
-        if (!err)
+        switch (err)
         {
+        case 0:
             xprintf ("    %s=%s\n", dllname, get_file_version(filename));
             nr_of_tests += wine_tests[nr_of_files].subtest_count;
             nr_of_files++;
-        }
-        else
+            break;
+        case STATUS_DLL_NOT_FOUND:
+            xprintf ("    %s=dll is missing\n", dllname);
+            break;
+        case STATUS_ORDINAL_NOT_FOUND:
+            xprintf ("    %s=dll is missing an ordinal (%s)\n", dllname, get_file_version(filename));
+            break;
+        case STATUS_ENTRYPOINT_NOT_FOUND:
+            xprintf ("    %s=dll is missing an entrypoint (%s)\n", dllname, get_file_version(filename));
+            break;
+        default:
             xprintf ("    %s=load error %u\n", dllname, err);
+            break;
+        }
     }
 
     if (actctx != INVALID_HANDLE_VALUE)




More information about the wine-cvs mailing list