From: Kai Koehne Date: Fri, 11 Nov 2011 14:57:05 +0000 (+0100) Subject: Debugger: Add unit tests for v8 profiler service X-Git-Tag: qt-v5.0.0-alpha1~1120 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dbde405068efa39a544485592d2dbc752db21cc5;p=profile%2Fivi%2Fqtdeclarative.git Debugger: Add unit tests for v8 profiler service Change-Id: I556b9c537a43347b42669b2272925af6b05e6014 Reviewed-by: Christiaan Janssen --- diff --git a/src/declarative/debugger/qv8profilerservice_p.h b/src/declarative/debugger/qv8profilerservice_p.h index f2d517b..95b48f9 100644 --- a/src/declarative/debugger/qv8profilerservice_p.h +++ b/src/declarative/debugger/qv8profilerservice_p.h @@ -61,7 +61,7 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -struct QV8ProfilerData +struct Q_AUTOTEST_EXPORT QV8ProfilerData { int messageType; QString filename; @@ -77,7 +77,7 @@ struct QV8ProfilerData class QDeclarativeEngine; class QV8ProfilerServicePrivate; -class QV8ProfilerService : public QDeclarativeDebugService +class Q_AUTOTEST_EXPORT QV8ProfilerService : public QDeclarativeDebugService { Q_OBJECT public: diff --git a/tests/auto/declarative/debugger/debugger.pro b/tests/auto/declarative/debugger/debugger.pro index 90c5d4b..bdcb528 100644 --- a/tests/auto/declarative/debugger/debugger.pro +++ b/tests/auto/declarative/debugger/debugger.pro @@ -7,7 +7,8 @@ PRIVATETESTS += \ qdeclarativedebugjs \ qdeclarativeinspector \ qdeclarativedebugtrace \ - qpacketprotocol + qpacketprotocol \ + qv8profilerservice contains(QT_CONFIG, private_tests) { SUBDIRS += $$PRIVATETESTS diff --git a/tests/auto/declarative/debugger/qv8profilerservice/data/test.qml b/tests/auto/declarative/debugger/qv8profilerservice/data/test.qml new file mode 100644 index 0000000..9c36e13 --- /dev/null +++ b/tests/auto/declarative/debugger/qv8profilerservice/data/test.qml @@ -0,0 +1,5 @@ +import QtQuick 2.0 + +Item { + +} diff --git a/tests/auto/declarative/debugger/qv8profilerservice/qv8profilerservice.pro b/tests/auto/declarative/debugger/qv8profilerservice/qv8profilerservice.pro new file mode 100644 index 0000000..ab1746d --- /dev/null +++ b/tests/auto/declarative/debugger/qv8profilerservice/qv8profilerservice.pro @@ -0,0 +1,14 @@ +CONFIG += testcase +TARGET = tst_qv8profilerservice +macx:CONFIG -= app_bundle + +HEADERS += ../shared/debugutil_p.h + +SOURCES += tst_qv8profilerservice.cpp \ + ../shared/debugutil.cpp + +OTHER_FILES += data/test.qml + +CONFIG += parallel_test declarative_debug + +QT += core-private gui-private v8-private declarative-private network testlib diff --git a/tests/auto/declarative/debugger/qv8profilerservice/tst_qv8profilerservice.cpp b/tests/auto/declarative/debugger/qv8profilerservice/tst_qv8profilerservice.cpp new file mode 100644 index 0000000..00ed131 --- /dev/null +++ b/tests/auto/declarative/debugger/qv8profilerservice/tst_qv8profilerservice.cpp @@ -0,0 +1,235 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#include "QtDeclarative/private/qv8profilerservice_p.h" +#include "../shared/debugutil_p.h" +#include "../../shared/util.h" + +#define PORT 13774 +#define STR_PORT "13774" + +class QV8ProfilerClient : public QDeclarativeDebugClient +{ + Q_OBJECT + +public: + QV8ProfilerClient(QDeclarativeDebugConnection *connection) + : QDeclarativeDebugClient(QLatin1String("V8Profiler"), connection) + { + } + + void startProfiling(const QString &name) { + QByteArray message; + QDataStream stream(&message, QIODevice::WriteOnly); + stream << QByteArray("V8PROFILER") << QByteArray("start") << name; + sendMessage(message); + } + + void stopProfiling(const QString &name) { + QByteArray message; + QDataStream stream(&message, QIODevice::WriteOnly); + stream << QByteArray("V8PROFILER") << QByteArray("stop") << name; + sendMessage(message); + } + + void takeSnapshot() { + QByteArray message; + QDataStream stream(&message, QIODevice::WriteOnly); + stream << QByteArray("V8SNAPSHOT") << QByteArray("full"); + sendMessage(message); + } + + void deleteSnapshots() { + QByteArray message; + QDataStream stream(&message, QIODevice::WriteOnly); + stream << QByteArray("V8SNAPSHOT") << QByteArray("delete"); + sendMessage(message); + } + + QList traceMessages; + +signals: + void complete(); + +protected: + void messageReceived(const QByteArray &message); +}; + +class tst_QV8ProfilerService : public QObject +{ + Q_OBJECT + +public: + tst_QV8ProfilerService() + : m_process(0) + , m_connection(0) + , m_client(0) + { + } + +private: + QDeclarativeDebugProcess *m_process; + QDeclarativeDebugConnection *m_connection; + QV8ProfilerClient *m_client; + + void connect(bool block); + +private slots: + void cleanup(); + + void blockingConnectWithTraceEnabled(); + void blockingConnectWithTraceDisabled(); + void nonBlockingConnect(); +}; + +void QV8ProfilerClient::messageReceived(const QByteArray &message) +{ + QByteArray msg = message; + QDataStream stream(&msg, QIODevice::ReadOnly); + + int messageType; + stream >> messageType; + + QVERIFY(messageType >= 0); + QVERIFY(messageType < QV8ProfilerService::V8MaximumMessage); + + switch (messageType) { + case QV8ProfilerService::V8Entry: { + QV8ProfilerData entry; + stream >> entry.filename >> entry.functionname >> entry.lineNumber >> entry.totalTime >> entry.selfTime >> entry.treeLevel; + traceMessages.append(entry); + break; + } + case QV8ProfilerService::V8Complete: + emit complete(); + break; + case QV8ProfilerService::V8Snapshot: + break; + default: + QString failMessage = QString("Unknown message type: %1").arg(messageType); + QFAIL(qPrintable(failMessage)); + } + + QVERIFY(stream.atEnd()); +} + +void tst_QV8ProfilerService::connect(bool block) +{ + const QString executable = QLibraryInfo::location(QLibraryInfo::BinariesPath) + "/qmlscene"; + QStringList arguments; + + if (block) + arguments << QString("-qmljsdebugger=port:"STR_PORT",block"); + else + arguments << QString("-qmljsdebugger=port:"STR_PORT); + + arguments << QString(TESTDATA(QLatin1String("test.qml"))); + + m_process = new QDeclarativeDebugProcess(executable); + m_process->start(QStringList() << arguments); + if (!m_process->waitForSessionStart()) { + QString failMsg = QString("Could not launch app '%1'.\nApplication output:\n%2").arg( + executable, m_process->output()); + QFAIL(qPrintable(failMsg)); + } + + QDeclarativeDebugConnection *m_connection = new QDeclarativeDebugConnection(); + m_client = new QV8ProfilerClient(m_connection); + + m_connection->connectToHost(QLatin1String("127.0.0.1"), PORT); +} + +void tst_QV8ProfilerService::cleanup() +{ + delete m_process; + delete m_connection; + delete m_client; +} + +void tst_QV8ProfilerService::blockingConnectWithTraceEnabled() +{ + connect(true); + QTRY_COMPARE(m_client->status(), QDeclarativeDebugClient::Enabled); + + m_client->startProfiling(""); + m_client->stopProfiling(""); + if (!QDeclarativeDebugTest::waitForSignal(m_client, SIGNAL(complete()))) { + QString failMsg + = QString("No trace received in time. App output: %1\n\n").arg(m_process->output()); + QFAIL(qPrintable(failMsg)); + } +} + +void tst_QV8ProfilerService::blockingConnectWithTraceDisabled() +{ + connect(true); + QTRY_COMPARE(m_client->status(), QDeclarativeDebugClient::Enabled); + + m_client->startProfiling(""); + m_client->stopProfiling(""); + m_client->startProfiling(""); + if (!QDeclarativeDebugTest::waitForSignal(m_client, SIGNAL(complete()))) { + QString failMsg + = QString("No trace received in time. App output: %1\n\n").arg(m_process->output()); + QFAIL(qPrintable(failMsg)); + } +} + +void tst_QV8ProfilerService::nonBlockingConnect() +{ + connect(false); + QTRY_COMPARE(m_client->status(), QDeclarativeDebugClient::Enabled); + + m_client->stopProfiling(""); + m_client->startProfiling(""); + if (!QDeclarativeDebugTest::waitForSignal(m_client, SIGNAL(complete()))) { + QString failMsg + = QString("No trace received in time. App output: %1\n\n").arg(m_process->output()); + QFAIL(qPrintable(failMsg)); + } +} + +QTEST_MAIN(tst_QV8ProfilerService) + +#include "tst_qv8profilerservice.moc"