Home | History | Annotate | Download | only in WebKitAPITest
      1 /*
      2  * Copyright (C) 2010 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1.  Redistributions of source code must retain the above copyright
      8  *     notice, this list of conditions and the following disclaimer.
      9  * 2.  Redistributions in binary form must reproduce the above copyright
     10  *     notice, this list of conditions and the following disclaimer in the
     11  *     documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     23  */
     24 
     25 #include "config.h"
     26 #include "TestsController.h"
     27 
     28 #include "Test.h"
     29 #include <wtf/PassOwnPtr.h>
     30 
     31 using namespace std;
     32 
     33 namespace WebKitAPITest {
     34 
     35 static const LPCWSTR testsControllerWindowClassName = L"TestsControllerWindowClass";
     36 
     37 enum { runNextTestTimerID = 1 };
     38 
     39 inline TestsController::TestsController()
     40     : m_testFailed(false)
     41     , m_anyTestFailed(false)
     42 {
     43     registerWindowClass();
     44     m_window = CreateWindowExW(0, testsControllerWindowClassName, 0, WS_CHILD, 0, 0, 0, 0, HWND_MESSAGE, 0, GetModuleHandle(0), 0);
     45 }
     46 
     47 TestsController& TestsController::shared()
     48 {
     49     static TestsController& shared = *new TestsController;
     50     return shared;
     51 }
     52 
     53 bool TestsController::runAllTests()
     54 {
     55     if (m_tests.isEmpty())
     56         return true;
     57 
     58     MSG msg;
     59     BOOL result;
     60     while ((result = GetMessage(&msg, 0, 0, 0))) {
     61         if (result == -1)
     62             break;
     63         TranslateMessage(&msg);
     64         DispatchMessage(&msg);
     65     }
     66 
     67     if (msg.message != WM_QUIT)
     68         return false;
     69 
     70     return !m_anyTestFailed;
     71 }
     72 
     73 void TestsController::addTest(PassOwnPtr<Test> test)
     74 {
     75     m_tests.append(test.leakPtr());
     76     runNextTestSoon();
     77 }
     78 
     79 void TestsController::testFailed(const char* file, int line, const char* message)
     80 {
     81     ASSERT(!m_tests.isEmpty());
     82 
     83     m_testFailed = true;
     84     m_anyTestFailed = true;
     85 
     86     printf("FAIL: %s\n\t%s (%s:%d)\n", m_tests.first()->name(), message, file, line);
     87     fflush(stdout);
     88 }
     89 
     90 void TestsController::runNextTest()
     91 {
     92     if (m_tests.isEmpty()) {
     93         PostQuitMessage(0);
     94         return;
     95     }
     96 
     97     Test* test = m_tests.first();
     98 
     99     m_testFailed = false;
    100     printf("RUN: %s\n", test->name());
    101     fflush(stdout);
    102     test->run();
    103 
    104     if (!m_testFailed) {
    105         printf("PASS: %s\n", test->name());
    106         fflush(stdout);
    107     }
    108 
    109     m_tests.removeFirst();
    110     delete test;
    111 
    112     runNextTestSoon();
    113 }
    114 
    115 void TestsController::runNextTestSoon()
    116 {
    117     SetTimer(m_window, runNextTestTimerID, 0, 0);
    118 }
    119 
    120 void TestsController::registerWindowClass()
    121 {
    122     static bool initialized;
    123     if (initialized)
    124         return;
    125     initialized = true;
    126 
    127     WNDCLASSEXW wndClass = {0};
    128     wndClass.cbSize = sizeof(wndClass);
    129     wndClass.lpfnWndProc = wndProc;
    130     wndClass.hCursor = LoadCursor(0, IDC_ARROW);
    131     wndClass.hInstance = GetModuleHandle(0);
    132     wndClass.lpszClassName = testsControllerWindowClassName;
    133 
    134     RegisterClassExW(&wndClass);
    135 }
    136 
    137 LRESULT TestsController::wndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    138 {
    139     if (uMsg == WM_TIMER && wParam == runNextTestTimerID) {
    140         KillTimer(hWnd, runNextTestTimerID);
    141         TestsController::shared().runNextTest();
    142         return 0;
    143     }
    144 
    145     return DefWindowProcW(hWnd, uMsg, wParam, lParam);
    146 }
    147 
    148 } // namespace WebKitAPITest
    149