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