[rosautotest]
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Thu, 13 Jan 2011 09:58:04 +0000 (09:58 +0000)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Thu, 13 Jan 2011 09:58:04 +0000 (09:58 +0000)
-Implement closing any dialog that shows and stays visible for some time. This way rosautotest can now continue if a test application crashes or asserts.

svn path=/trunk/; revision=50381

rostests/rosautotest/CDialogSurpass.cpp [new file with mode: 0644]
rostests/rosautotest/CDialogSurpass.h [new file with mode: 0644]
rostests/rosautotest/main.cpp
rostests/rosautotest/precomp.h
rostests/rosautotest/rosautotest.rbuild

diff --git a/rostests/rosautotest/CDialogSurpass.cpp b/rostests/rosautotest/CDialogSurpass.cpp
new file mode 100644 (file)
index 0000000..59728b4
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * PROJECT:     ReactOS Automatic Testing Utility
+ * LICENSE:     GNU GPLv2 or any later version as published by the Free Software Foundation
+ * PURPOSE:     Class for managing all the configuration parameters
+ * COPYRIGHT:   Copyright 2011 
+ */
+
+#include "precomp.h"
+
+BOOL CALLBACK PrintWindow(HWND hwnd, LPARAM lParam)
+{
+    CHAR WindowTitle[100];
+    int lenght;
+
+    lenght = GetWindowTextA(hwnd, WindowTitle, 100);
+    if(lenght == 0)
+        return TRUE;
+
+    StringOut( string(WindowTitle) + "\n" );
+
+    return TRUE;
+}
+
+
+void CALLBACK WinEventProc(HWINEVENTHOOK hWinEventHook,
+                           DWORD event,
+                           HWND hwnd,
+                           LONG idObject,
+                           LONG idChild,
+                           DWORD dwEventThread,
+                           DWORD dwmsEventTime)
+{
+    /* make sure we got the correct event */
+    if(event == EVENT_SYSTEM_DIALOGSTART)
+    {
+        /* wait for some time to make sure that the dialog is hung */
+        Sleep(30 * 1000);
+
+        /* Check if it is still open */
+        if(IsWindow(hwnd))
+        {
+            /* Print an error message */
+            StringOut("Closing following dialog box:\n");
+            PrintWindow(hwnd, NULL);
+            EnumChildWindows(hwnd, PrintWindow, NULL);
+
+            /* Close the dialog */
+            SendMessage(hwnd, WM_CLOSE, 0, 0);
+        }
+    }
+}
+
+
+DWORD WINAPI DialogSurpassThread(LPVOID lpThreadParameter)
+{
+    MSG dummy;
+
+    /* Install event notifications */
+    SetWinEventHook(EVENT_SYSTEM_DIALOGSTART,
+                    EVENT_SYSTEM_DIALOGSTART,
+                    NULL,
+                    WinEventProc,
+                    0,
+                    0,
+                    WINEVENT_OUTOFCONTEXT);
+
+    while(GetMessage(&dummy, 0,0,0))
+    {
+        /* There is no need to dispatch messages here */
+        /* Actually this block will never be executed */
+    }
+
+    return 0;
+}
+
+CDialogSurpass::CDialogSurpass()
+{
+    /* Creat the trhead that will receive notifications */
+    hThread = CreateThread(NULL,
+                           0,
+                           DialogSurpassThread,
+                           NULL,
+                           0,
+                           &ThreadID);
+}
+
+CDialogSurpass::~CDialogSurpass()
+{
+    /* Notify the thread to close */
+    PostThreadMessage(ThreadID, WM_QUIT, 0, 0);
+
+    /* Wait for it close */
+    WaitForSingleObject(hThread, INFINITE);
+
+    /* Now close its handle*/
+    CloseHandle(hThread);
+}
diff --git a/rostests/rosautotest/CDialogSurpass.h b/rostests/rosautotest/CDialogSurpass.h
new file mode 100644 (file)
index 0000000..54e186d
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * PROJECT:     ReactOS Automatic Testing Utility
+ * LICENSE:     GNU GPLv2 or any later version as published by the Free Software Foundation
+ * PURPOSE:     Class for managing all the configuration parameters
+ * COPYRIGHT:   Copyright 2011
+ */
+
+class CDialogSurpass
+{
+private:
+
+    DWORD ThreadID;
+    HANDLE hThread;
+public:
+    CDialogSurpass();
+    ~CDialogSurpass();
+};
index 5fb5dd4..17189a5 100644 (file)
@@ -48,6 +48,7 @@ wmain(int argc, wchar_t* argv[])
 {
     CWineTest WineTest;
     int ReturnValue = 1;
+    CDialogSurpass s;
 
     try
     {
index f5e65ad..9f71ff1 100644 (file)
@@ -20,6 +20,7 @@ using namespace std;
 /* Class includes */
 #include "auto_array_ptr.h"
 #include "CConfiguration.h"
+#include "CDialogSurpass.h"
 #include "CFatalException.h"
 #include "CInvalidParameterException.h"
 #include "CProcess.h"
index 5224c24..0f593c5 100644 (file)
@@ -8,6 +8,7 @@
        <library>user32</library>
        <library>wininet</library>
        <file>CConfiguration.cpp</file>
+       <file>CDialogSurpass.cpp</file>
        <file>CFatalException.cpp</file>
        <file>CInvalidParameterException.cpp</file>
        <file>CJournaledTestList.cpp</file>