Show execution time of tests
Modified: trunk/reactos/regtests/regtests/regtests.c
Modified: trunk/reactos/regtests/regtests/regtests.def
Modified: trunk/reactos/regtests/shared/regtests.c
Modified: trunk/reactos/regtests/shared/regtests.h
Modified: trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp
Modified: trunk/reactos/tools/rbuild/testsupportcode.cpp

Modified: trunk/reactos/regtests/regtests/regtests.c
--- trunk/reactos/regtests/regtests/regtests.c	2005-06-12 14:09:39 UTC (rev 15875)
+++ trunk/reactos/regtests/regtests/regtests.c	2005-06-12 15:33:34 UTC (rev 15876)
@@ -54,3 +54,35 @@
   return WaitForSingleObject(hHandle, dwMilliseconds);
 }
 
+DWORD STDCALL
+_GetLastError()
+{
+  return GetLastError();
+}
+
+VOID STDCALL
+_CloseHandle(HANDLE handle)
+{
+  CloseHandle (handle);
+}
+
+BOOL STDCALL
+_GetThreadTimes(HANDLE hThread, LPFILETIME lpCreationTime,
+	            LPFILETIME lpExitTime, LPFILETIME lpKernelTime,
+	            LPFILETIME lpUserTime)
+{
+  return GetThreadTimes(hThread, lpCreationTime, lpExitTime,
+                        lpKernelTime, lpUserTime);
+}
+
+BOOL STDCALL
+_SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass)
+{
+  return SetPriorityClass(hProcess, dwPriorityClass);
+}
+
+BOOL STDCALL
+_SetThreadPriority(HANDLE hThread, int nPriority)
+{
+  return SetThreadPriority(hThread, nPriority);
+}

Modified: trunk/reactos/regtests/regtests/regtests.def
--- trunk/reactos/regtests/regtests/regtests.def	2005-06-12 14:09:39 UTC (rev 15875)
+++ trunk/reactos/regtests/regtests/regtests.def	2005-06-12 15:33:34 UTC (rev 15876)
@@ -7,3 +7,8 @@
 _CreateThread@24
 _TerminateThread@8
 _WaitForSingleObject@8
+_GetLastError@0
+_CloseHandle@4
+_GetThreadTimes@20
+_SetPriorityClass@8
+_SetThreadPriority@8

Modified: trunk/reactos/regtests/shared/regtests.c
--- trunk/reactos/regtests/shared/regtests.c	2005-06-12 14:09:39 UTC (rev 15875)
+++ trunk/reactos/regtests/shared/regtests.c	2005-06-12 15:33:34 UTC (rev 15876)
@@ -37,6 +37,17 @@
   InitializeListHead(&AllTests);
 }
 
+char*
+FormatExecutionTime(char *buffer, LPFILETIME time)
+{
+  ULONG milliseconds = time->dwLowDateTime / 10000;
+  
+  sprintf(buffer,
+	      "%ldms",
+	      milliseconds);
+  return buffer;
+}
+
 DWORD WINAPI
 PerformTest(PVOID _arg)
 {
@@ -44,11 +55,18 @@
   TestOutputRoutine OutputRoutine = Args->OutputRoutine;
   PROS_TEST Test = Args->Test;
   LPSTR TestName = Args->TestName;
+  HANDLE hThread;
+  FILETIME time;
+  FILETIME ExecutionTime;
   char OutputBuffer[5000];
   char Buffer[5000];
+  char Format[100];
 
+  hThread = GetCurrentThread();
+  _SetThreadPriority(hThread, THREAD_PRIORITY_IDLE);
+
   memset(Buffer, 0, sizeof(Buffer));
-
+  
   _SEH_TRY {
     _Result = TS_OK;
     _Buffer = Buffer;
@@ -58,22 +76,30 @@
     sprintf(Buffer, "due to exception 0x%lx", _SEH_GetExceptionCode());
   } _SEH_END;
 
-  if (_Result != TS_OK)
+  if (_Result == TS_OK)
     {
-      sprintf(OutputBuffer, "[%s] Failed (%s)\n", TestName, Buffer);
+      if (!_GetThreadTimes(hThread,
+  	                       &time,
+  	                       &time,
+  	                       &time,
+  	                       &ExecutionTime))
+      {
+        ExecutionTime.dwLowDateTime = 10;
+        ExecutionTime.dwHighDateTime = 10;
+      }
+      sprintf(OutputBuffer,
+              "[%s] Success [%s]\n",
+              TestName,
+              FormatExecutionTime(Format,
+                                  &ExecutionTime));
     }
   else
-    {
-      sprintf(OutputBuffer, "[%s] Success\n", TestName);
-    }
+      sprintf(OutputBuffer, "[%s] Failed (%s)\n", TestName, Buffer);
+
   if (OutputRoutine != NULL)
-    {
       (*OutputRoutine)(OutputBuffer);
-    }
   else
-    {
       DbgPrint(OutputBuffer);
-    }
   return 1;
 }
 
@@ -108,19 +134,12 @@
       if (_Result != TS_OK)
         {
           if (TestName != NULL)
-            {
-              continue;
-            }
+            continue;
           strcpy(Name, "Unnamed");
         }
 
-      if (TestName != NULL)
-        {
-          if (_stricmp(Name, TestName) != 0)
-            {
-              continue;
-            }
-        }
+      if ((TestName != NULL) && (_stricmp(Name, TestName) != 0))
+        continue;
 
       /* Get timeout for test */
       TimeOut = 0;
@@ -128,44 +147,34 @@
       _Buffer = (char *)&TimeOut;
       (Current->Routine)(TESTCMD_TIMEOUT);
       if (_Result != TS_OK || TimeOut == INFINITE)
-        {
           TimeOut = 5000;
-        }
 
       /* Run test in thread */
       hThread = _CreateThread(NULL, 0, PerformTest, (PVOID)&Args, 0, NULL);
       if (hThread == NULL)
-        {
           sprintf(OutputBuffer,
-                  "[%s] Failed (CreateThread failed: 0x%x)\n",
-                  Name, (unsigned int)GetLastError());
-        }
+                  "[%s] Failed (CreateThread() failed: %d)\n",
+                  Name, (unsigned int)_GetLastError());
       else if (_WaitForSingleObject(hThread, TimeOut) == WAIT_TIMEOUT)
         {
           if (!_TerminateThread(hThread, 0))
-            {
               sprintf(OutputBuffer,
-                      "[%s] Failed (Test timed out - %d ms, TerminateThread failed: 0x%x)\n",
-                      Name, (int)TimeOut, (unsigned int)GetLastError());
-            }
+                      "[%s] Failed (timed out after %dms; TerminateThread() failed: %d)\n",
+                      Name, (int)TimeOut, (unsigned int)_GetLastError());
           else
-            {
-              sprintf(OutputBuffer, "[%s] Failed (Test timed out - %d ms)\n", Name, (int)TimeOut);
-            }
+              sprintf(OutputBuffer, "[%s] Failed (timed out after %dms)\n", Name, (int)TimeOut);          
+      	  _CloseHandle(hThread);
         }
       else
         {
+      	  _CloseHandle(hThread);
           continue;
         }
 
       if (OutputRoutine != NULL)
-        {
           (*OutputRoutine)(OutputBuffer);
-        }
       else
-        {
           DbgPrint(OutputBuffer);
-        }
     }
 }
 

Modified: trunk/reactos/regtests/shared/regtests.h
--- trunk/reactos/regtests/shared/regtests.h	2005-06-12 14:09:39 UTC (rev 15875)
+++ trunk/reactos/regtests/shared/regtests.h	2005-06-12 15:33:34 UTC (rev 15876)
@@ -188,7 +188,24 @@
 DWORD STDCALL
 _WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
 
+DWORD STDCALL
+_GetLastError();
 
+VOID STDCALL
+_CloseHandle(HANDLE handle);
+
+BOOL STDCALL
+_GetThreadTimes(HANDLE hThread, LPFILETIME lpCreationTime,
+	            LPFILETIME lpExitTime, LPFILETIME lpKernelTime,
+	            LPFILETIME lpUserTime);
+
+BOOL STDCALL
+_SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass);
+
+BOOL STDCALL
+_SetThreadPriority(HANDLE hThread, int nPriority);
+
+
 static inline PCHAR
 FrameworkGetExportedFunctionNameInternal(PAPI_DESCRIPTION ApiDescription)
 {

Modified: trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp
--- trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp	2005-06-12 14:09:39 UTC (rev 15875)
+++ trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp	2005-06-12 15:33:34 UTC (rev 15876)
@@ -608,7 +608,7 @@
 	fprintf ( fMakefile,
 	          "REGTESTS_RUN_TARGET = regtests.dll\n" );
 	fprintf ( fMakefile,
-	          "$(REGTESTS_RUN_TARGET):\n" );
+	          "$(REGTESTS_RUN_TARGET): $(REGTESTS_TARGET)\n" );
 	fprintf ( fMakefile,
 	          "\t$(cp) $(REGTESTS_TARGET) $(REGTESTS_RUN_TARGET)\n" );
 	fprintf ( fMakefile, "\n" );

Modified: trunk/reactos/tools/rbuild/testsupportcode.cpp
--- trunk/reactos/tools/rbuild/testsupportcode.cpp	2005-06-12 14:09:39 UTC (rev 15875)
+++ trunk/reactos/tools/rbuild/testsupportcode.cpp	2005-06-12 15:33:34 UTC (rev 15876)
@@ -333,6 +333,7 @@
 	s = s + sprintf ( s, "  LPSTR lpszCmdParam,\n" );
 	s = s + sprintf ( s, "  int nCmdShow)\n" );
 	s = s + sprintf ( s, "{\n" );
+	s = s + sprintf ( s, "  _SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);\n" );
 	s = s + sprintf ( s, "  InitializeTests();\n" );
 	s = s + sprintf ( s, "  RegisterTests();\n" );
 	s = s + sprintf ( s, "  SetupOnce();\n" );