winetest updates

Ferenc Wagner wferi at afavant.elte.hu
Wed Feb 18 03:36:50 CST 2004


ChangeLog:
 * command line handling (GUI will follow)
 * strip .exe[.so] from test names
 * version 2 output

Side note 1: test_NamedPipe_2 in dlls/kernel/tests/pipe.c
loops and generates tens of megabytes of output on Win9x at
least.  Winetest will refuse to submit files bigger than 1 MB.

Side note 2: Automatically generating build tags in Makefile
isn't such a good idea after all, but I didn't dare to
remove it as that would break compilation.  Always testing
compilation may be worth an occasional recompile.
-- 
Feri.

Index: programs/winetest/maketest
===================================================================
RCS file: /home/wine/wine/programs/winetest/maketest,v
retrieving revision 1.2
diff -u -r1.2 maketest
--- programs/winetest/maketest  30 Dec 2003 19:09:25 -0000      1.2
+++ programs/winetest/maketest  18 Feb 2004 09:35:04 -0000
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 if [ -z "$WINE_BUILD" ]; then
-    WINE_BUILD="`date`"
+    WINE_BUILD="`date +%Y%m%d.%H%M-auto`"
     echo "warning: using automatically generated BUILD tag: $WINE_BUILD" 1>&2
 fi
 
Index: programs/winetest/gui.c
===================================================================
RCS file: /home/wine/wine/programs/winetest/gui.c,v
retrieving revision 1.1
diff -u -r1.1 gui.c
--- programs/winetest/gui.c	15 Jan 2004 01:48:05 -0000	1.1
+++ programs/winetest/gui.c	18 Feb 2004 09:21:36 -0000
@@ -51,6 +51,21 @@
     return buffer;
 }
 
+int
+MBdefault (int uType)
+{
+    static const int matrix[][4] = {{IDOK,    0,        0,        0},
+                                    {IDOK,    IDCANCEL, 0,        0},
+                                    {IDABORT, IDRETRY,  IDIGNORE, 0},
+                                    {IDYES,   IDNO,     IDCANCEL, 0},
+                                    {IDYES,   IDNO,     0,        0},
+                                    {IDRETRY, IDCANCEL, 0,        0}};
+    int type = uType & MB_TYPEMASK;
+    int def  = (uType & MB_DEFMASK) / MB_DEFBUTTON2;
+
+    return matrix[type][def];
+}
+
 /* report (R_STATUS, fmt, ...) */
 int
 textStatus (va_list ap)
@@ -204,63 +219,71 @@
     return 0;
 }
 
-/* report (R_FATAL, fmt, ...) */
+/* report (R_WARNING, fmt, ...) */
 int
-textFatal (va_list ap)
+textWarning (va_list ap)
 {
-    char *str = vstrmake (NULL, ap);
-
-    fputs ("Fatal error: ", stderr);
-    fputs (str, stderr);
-    fputc ('\n', stderr);
-    free (str);
-    exit (1);
+    fputs ("Warning: ", stderr);
+    textStatus (ap);
+    return 0;
 }
 
 int
-guiFatal (va_list ap)
+guiWarning (va_list ap)
 {
     char *str = vstrmake (NULL, ap);
 
-    MessageBox (dialog, str, "Fatal Error", MB_ICONERROR | MB_OK);
+    MessageBox (dialog, str, "Warning", MB_ICONWARNING | MB_OK);
     free (str);
-    exit (1);
+    return 0;
 }
 
-/* report (R_WARNING, fmt, ...) */
+/* report (R_ERROR, fmt, ...) */
 int
-textWarning (va_list ap)
+textError (va_list ap)
 {
-    char *str = vstrmake (NULL, ap);
-
-    fputs ("Warning: ", stderr);
-    fputs (str, stderr);
-    fputc ('\n', stderr);
-    free (str);
+    fputs ("Error: ", stderr);
+    textStatus (ap);
     return 0;
 }
 
 int
-guiWarning (va_list ap)
+guiError (va_list ap)
 {
     char *str = vstrmake (NULL, ap);
 
-    MessageBox (dialog, str, "Warning", MB_ICONWARNING | MB_OK);
+    MessageBox (dialog, str, "Error", MB_ICONERROR | MB_OK);
     free (str);
     return 0;
 }
 
+/* report (R_FATAL, fmt, ...) */
+int
+textFatal (va_list ap)
+{
+    textError (ap);
+    exit (1);
+}
+
+int
+guiFatal (va_list ap)
+{
+    guiError (ap);
+    exit (1);
+}
+
 /* report (R_ASK, type, fmt, ...) */
 int
 textAsk (va_list ap)
 {
     int uType = va_arg (ap, int);
+    int ret = MBdefault (uType);
     char *str = vstrmake (NULL, ap);
 
-    fprintf (stderr, "Question of type %d: %s\n!FIXME, stub\n",
-             uType, str);
+    fprintf (stderr, "Question of type %d: %s\n"
+             "Returning default: %d\n", uType, str, ret);
     free (str);
-    return 0;
+    return ret;
 }
 
 int
@@ -275,6 +298,25 @@
     return ret;
 }
 
+/* Quiet functions */
+int
+qNoOp (va_list ap)
+{
+    return 0;
+}
+
+int
+qFatal (va_list ap)
+{
+    exit (1);
+}
+
+int
+qAsk (va_list ap)
+{
+    return MBdefault (va_arg (ap, int));
+}
+
 BOOL CALLBACK
 AboutProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
@@ -362,7 +404,20 @@
     static r_fun_t * const GUI_funcs[] =
         {guiStatus, guiProgress, guiStep, guiDelta,
          guiDir, guiOut, guiFatal, guiWarning, guiAsk};
+    static r_fun_t * const quiet_funcs[] =
+        {qNoOp, qNoOp, qNoOp, qNoOp,
+         qNoOp, qNoOp, qFatal, qNoOp, qAsk};
     static r_fun_t * const * funcs = NULL;
+
+    switch (t) {
+    case R_TEXTMODE:
+        funcs = text_funcs;
+        return 0;
+    case R_QUIET:
+        funcs = quiet_funcs;
+        return 0;
+    default:
+    }
 
     if (!funcs) {
         HANDLE DlgThread;
Index: programs/winetest/main.c
===================================================================
RCS file: /home/wine/wine/programs/winetest/main.c,v
retrieving revision 1.2
diff -u -r1.2 main.c
--- programs/winetest/main.c	15 Jan 2004 01:48:05 -0000	1.2
+++ programs/winetest/main.c	18 Feb 2004 09:21:36 -0000
@@ -138,6 +138,7 @@
     DWORD size;
     FILE* fout;
     int strlen, bufflen = 128;
+    char *exepos;
 
     code = extract_rcdata (id, &size);
     test->name = xmalloc (bufflen);
@@ -147,15 +148,18 @@
         test->name = xrealloc (test->name, bufflen);
     }
     if (!strlen) report (R_FATAL, "Can't read name of test %d.", id);
-    test->name = xrealloc (test->name, strlen+1);
+    test->exename = strmake (NULL, "%s/%s", dir, test->name);
+    exepos = strstr (test->name, ".exe");
+    if (!exepos) report (R_FATAL, "Not an .exe file: %s", test->name);
+    *exepos = 0;
+    test->name = xrealloc (test->name, exepos - test->name + 1);
     report (R_STEP, "Extracting: %s", test->name);
     test->is_elf = !memcmp (code+1, "ELF", 3);
-    test->exename = strmake (NULL, "%s/%s", dir, test->name);
 
     if (!(fout = fopen (test->exename, "wb")) ||
         (fwrite (code, size, 1, fout) != 1) ||
         fclose (fout)) report (R_FATAL, "Failed to write file %s.",
-                               test->name);
+                               test->exename);
 }
 
 void
@@ -254,11 +258,11 @@
     return TRUE;
 }
 
-void
-run_tests ()
+char *
+run_tests (const char *logname, const char *tag)
 {
     int nr_of_files = 0, nr_of_tests = 0, i;
-    char *tempdir, *logname;
+    char *tempdir;
     FILE *logfile;
     char build_tag[128];
 
@@ -275,8 +279,10 @@
     if (!CreateDirectory (tempdir, NULL))
         report (R_FATAL, "Could not create directory: %s", tempdir);
 
-    logname = tempnam (0, "res");
-    if (!logname) report (R_FATAL, "Can't name logfile.");
+    if (!logname) {
+        logname = tempnam (0, "res");
+        if (!logname) report (R_FATAL, "Can't name logfile.");
+    }
     report (R_OUT, logname);
 
     logfile = fopen (logname, "a");
@@ -285,13 +291,14 @@
         report (R_FATAL, "Can't redirect stdout.");
     fclose (logfile);
 
-    xprintf ("Version 1\n");
+    xprintf ("Version 2\n");
     i = LoadStringA (GetModuleHandle (NULL), 0,
                      build_tag, sizeof build_tag);
     if (i == 0) report (R_FATAL, "Build descriptor not found.");
     if (i >= sizeof build_tag)
         report (R_FATAL, "Build descriptor too long.");
     xprintf ("Tests from build %s\n", build_tag);
+    xprintf ("Tag: %s", tag?tag:"");
     xprintf ("Operating system version:\n");
     print_version ();
     xprintf ("Test output:\n" );
@@ -331,21 +338,87 @@
     free (tempdir);
     free (wine_tests);
 
-    if (report (R_ASK, MB_YESNO,
-                "Do you want to submit the test results?") == IDYES)
-        if (send_file (logname))
-            report (R_FATAL, "Can't submit logfile '%s'", logname);
-
-    if (remove (logname))
-        report (R_WARNING, "Can't remove logfile: %d.", errno);
-    free (logname);
+    return logname;
+}
+
+void
+usage ()
+{
+    fprintf (stderr, "\
+Usage: winetest [OPTION]...\n\n\
+  -c       console mode, no GUI\n\
+  -h       print this message and exit\n\
+  -q       quiet mode, no output at all\n\
+  -o FILE  put report into FILE, do not submit\n\
+  -s FILE  submit FILE, do not run tests\n\
+  -t TAG   include TAG of characters [-.0-9a-zA-Z] in the report\n");
 }
 
 int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
                     LPSTR cmdLine, int cmdShow)
 {
-    report (R_STATUS, "Starting up");
-    run_tests ();
-    report (R_STATUS, "Finished");
+    char *logname = NULL;
+    char *tag = NULL, *cp;
+    char *submit = NULL;
+
+    cmdLine = strtok (cmdLine, " ");
+    while (cmdLine) {
+        if (*cmdLine == '-')
+            if (cmdLine[2]) {
+                report (R_ERROR, "Not a single letter option: %s",
+                        cmdLine);
+                usage ();
+                exit (2);
+            }
+            cmdLine++;
+            switch (*cmdLine) {
+            case 'c':
+                report (R_TEXTMODE);
+                break;
+            case 'h':
+                usage ();
+                exit (0);
+            case 'q':
+                report (R_QUIET);
+                break;
+            case 's':
+                submit = strtok (NULL, " ");
+                if (tag)
+                    report (R_WARNING, "ignoring tag for submit");
+                if (send_file (submit))
+                    report (R_ERROR, "can't submit file %s", submit);
+                break;
+            case 'o':
+                logname = strtok (NULL, " ");
+                run_tests (logname, tag);
+                break;
+            case 't':
+                tag = strtok (NULL, " ");
+                cp = badtagchar (tag);
+                if (cp) {
+                    report (R_ERROR, "invalid char in tag: %c", *cp);
+                    usage ();
+                    exit (2);
+                }
+                break;
+            default:
+                report (R_ERROR, "invalid option: -%c", *cmdLine);
+                usage ();
+                exit (2);
+            }
+        cmdLine = strtok (NULL, " ");
+    }
+    exit (0);
+    if (!logname && !submit) {
+        report (R_STATUS, "Starting up");
+        logname = run_tests (NULL, tag);
+        if (report (R_ASK, MB_YESNO,
+                    "Do you want to submit the test results?") == IDYES)
+            if (send_file (logname))
+                report (R_FATAL, "Can't submit logfile '%s'", logname);
+        if (remove (logname))
+            report (R_WARNING, "Can't remove logfile: %d.", errno);
+        report (R_STATUS, "Finished");
+    }
     exit (0);
 }
Index: programs/winetest/util.c
===================================================================
RCS file: /home/wine/wine/programs/winetest/util.c,v
retrieving revision 1.2
diff -u -r1.2 util.c
--- programs/winetest/util.c	15 Jan 2004 01:48:05 -0000	1.2
+++ programs/winetest/util.c	18 Feb 2004 09:21:36 -0000
@@ -84,3 +84,16 @@
     va_end (ap);
     return p;
 }
+
+char *
+badtagchar (char *tag)
+{
+    while (*tag)
+        if (('a'<=*tag && *tag<='z') ||
+            ('A'<=*tag && *tag<='Z') ||
+            ('0'<=*tag && *tag<='9') ||
+            *tag=='-' || *tag=='.')
+            tag++;
+        else return tag;
+    return NULL;
+}
Index: programs/winetest/winetest.h
===================================================================
RCS file: /home/wine/wine/programs/winetest/winetest.h,v
retrieving revision 1.2
diff -u -r1.2 winetest.h
--- programs/winetest/winetest.h	15 Jan 2004 01:48:05 -0000	1.2
+++ programs/winetest/winetest.h	18 Feb 2004 09:21:36 -0000
@@ -33,6 +33,7 @@
 void xprintf (const char *fmt, ...);
 char *vstrmake (size_t *lenp, va_list ap);
 char *strmake (size_t *lenp, ...);
+char *badtagchar (char *tag);
 
 int send_file (const char *name);
 
@@ -47,9 +48,12 @@
     R_DELTA,
     R_DIR,
     R_OUT,
-    R_FATAL,
     R_WARNING,
-    R_ASK
+    R_ERROR,
+    R_FATAL,
+    R_ASK,
+    R_TEXTMODE,
+    R_QUIET
 };
 
 int report (enum report_type t, ...);



More information about the wine-patches mailing list