Files correlati : cg0.exe cg0700a.msk cg0700b.msk cg3.exe cg4.exe Bug : Commento: Merge 1.0 libraries
1444 lines
50 KiB
C++
1444 lines
50 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2015 The Qt Company Ltd.
|
|
** Contact: http://www.qt.io/licensing/
|
|
**
|
|
** This file is part of the test suite of the Qt Toolkit.
|
|
**
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
|
** Commercial License Usage
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
** accordance with the commercial license agreement provided with the
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
** a written agreement between you and The Qt Company. For licensing terms
|
|
** and conditions see http://www.qt.io/terms-conditions. For further
|
|
** information use the contact form at http://www.qt.io/contact-us.
|
|
**
|
|
** GNU Lesser General Public License Usage
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
** General Public License version 2.1 or version 3 as published by the Free
|
|
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
|
|
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
|
|
** following information to ensure the GNU Lesser General Public License
|
|
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
|
|
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
**
|
|
** As a special exception, The Qt Company gives you certain additional
|
|
** rights. These rights are described in The Qt Company 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.
|
|
**
|
|
** $QT_END_LICENSE$
|
|
**
|
|
****************************************************************************/
|
|
|
|
#include <qtest.h>
|
|
#include <QtDeclarative/QDeclarativeEngine>
|
|
#include <QtDeclarative/private/qdeclarativedebugclient_p.h>
|
|
#include <QtDeclarative/private/qdeclarativedebugservice_p.h>
|
|
#include <QtDeclarative/private/qjsdebuggeragent_p.h>
|
|
#include <QtCore/QFileInfo>
|
|
#include <QtCore/QDir>
|
|
#include <QtCore/QProcess>
|
|
#include "../../../shared/util.h"
|
|
#include "../shared/debugutil_p.h"
|
|
|
|
class QJSDebugClient : public QDeclarativeDebugClient
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
QJSDebugClient(QDeclarativeDebugConnection *connection) : QDeclarativeDebugClient(QLatin1String("JSDebugger"), connection) {}
|
|
|
|
void ping();
|
|
void exec(const QByteArray &debuggerId, const QString &expr);
|
|
void setBreakpoints(const QSet<JSAgentBreakpointData> &breakpoints);
|
|
void setWatchExpressions(const QStringList &watchExpressions);
|
|
void stepOver();
|
|
void stepInto();
|
|
void interrupt();
|
|
void stepOut();
|
|
void continueExecution();
|
|
void expandObjectById(const QByteArray& objectName, quint64 objectId);
|
|
void setProperty(const QByteArray& id, qint64 objectId, const QString &property, const QString &value);
|
|
void activateFrame(int frameId);
|
|
void startCoverageCompleted();
|
|
void startCoverageRun();
|
|
|
|
// info from last exec
|
|
JSAgentWatchData exec_data;
|
|
QByteArray exec_iname;
|
|
|
|
QByteArray object_name;
|
|
QList<JSAgentWatchData> object_children;
|
|
|
|
int frame_id;
|
|
|
|
// info from last stop
|
|
QList<JSAgentStackData> break_stackFrames;
|
|
QList<JSAgentWatchData> break_watches;
|
|
QList<JSAgentWatchData> break_locals;
|
|
bool break_becauseOfException;
|
|
QString break_error;
|
|
|
|
signals:
|
|
void statusHasChanged();
|
|
|
|
void pong();
|
|
void result();
|
|
void stopped();
|
|
void expanded();
|
|
void watchTriggered();
|
|
void coverageScriptLoaded();
|
|
void coverageFuncEntered();
|
|
void coverageFuncExited();
|
|
void coveragePosChanged();
|
|
void coverageCompleted();
|
|
|
|
protected:
|
|
virtual void statusChanged(Status status);
|
|
virtual void messageReceived(const QByteArray &data);
|
|
|
|
private:
|
|
int m_ping;
|
|
};
|
|
|
|
class QJSDebugProcess : public QObject
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
QJSDebugProcess();
|
|
~QJSDebugProcess();
|
|
|
|
void start(const QStringList &arguments);
|
|
bool waitForStarted();
|
|
|
|
private slots:
|
|
void processAppOutput();
|
|
|
|
private:
|
|
QProcess m_process;
|
|
QTimer m_timer;
|
|
QEventLoop m_eventLoop;
|
|
bool m_started;
|
|
};
|
|
|
|
class tst_QDeclarativeDebugJS : public QObject
|
|
{
|
|
Q_OBJECT
|
|
private:
|
|
QDeclarativeDebugConnection *m_conn;
|
|
QDeclarativeEngine *m_engine;
|
|
QJSDebugClient *m_client;
|
|
|
|
private slots:
|
|
void pingPong();
|
|
void exec();
|
|
void setBreakpoint();
|
|
void stepOver();
|
|
void stepInto();
|
|
void interrupt();
|
|
void stepOut();
|
|
void continueExecution();
|
|
void expandObject();
|
|
void setProperty();
|
|
void setProperty2();
|
|
void watchExpression();
|
|
void activateFrame();
|
|
void setBreakpoint2();
|
|
void stepOver2();
|
|
void stepInto2();
|
|
void interrupt2();
|
|
void stepOut2();
|
|
void continueExecution2();
|
|
void expandObject2();
|
|
void setProperty3();
|
|
void setProperty4();
|
|
void activateFrame2();
|
|
void verifyQMLOptimizerDisabled();
|
|
void testCoverageCompleted();
|
|
void testCoverageRun();
|
|
|
|
};
|
|
|
|
|
|
void QJSDebugClient::ping()
|
|
{
|
|
m_ping++;
|
|
QByteArray reply;
|
|
QDataStream rs(&reply, QIODevice::WriteOnly);
|
|
QByteArray cmd = "PING";
|
|
rs << cmd;
|
|
rs << m_ping;
|
|
sendMessage(reply);
|
|
}
|
|
|
|
void QJSDebugClient::exec(const QByteArray &debuggerId, const QString &expr)
|
|
{
|
|
QByteArray reply;
|
|
QDataStream rs(&reply, QIODevice::WriteOnly);
|
|
QByteArray cmd = "EXEC";
|
|
rs << cmd;
|
|
rs << debuggerId;
|
|
rs << expr;
|
|
sendMessage(reply);
|
|
}
|
|
|
|
void QJSDebugClient::setBreakpoints(const QSet<JSAgentBreakpointData> &breakpoints)
|
|
{
|
|
QByteArray reply;
|
|
QDataStream rs(&reply, QIODevice::WriteOnly);
|
|
QByteArray cmd = "BREAKPOINTS";
|
|
rs << cmd
|
|
<< breakpoints;
|
|
sendMessage(reply);
|
|
}
|
|
|
|
void QJSDebugClient::setWatchExpressions(const QStringList &watchExpressions)
|
|
{
|
|
QByteArray reply;
|
|
QDataStream rs(&reply, QIODevice::WriteOnly);
|
|
QByteArray cmd = "WATCH_EXPRESSIONS";
|
|
rs << cmd
|
|
<< watchExpressions;
|
|
sendMessage(reply);
|
|
}
|
|
|
|
void QJSDebugClient::stepOver()
|
|
{
|
|
QByteArray reply;
|
|
QDataStream rs(&reply, QIODevice::WriteOnly);
|
|
QByteArray cmd = "STEPOVER";
|
|
rs << cmd;
|
|
sendMessage(reply);
|
|
}
|
|
|
|
void QJSDebugClient::stepInto()
|
|
{
|
|
QByteArray reply;
|
|
QDataStream rs(&reply, QIODevice::WriteOnly);
|
|
QByteArray cmd = "STEPINTO";
|
|
rs << cmd;
|
|
sendMessage(reply);
|
|
}
|
|
|
|
void QJSDebugClient::interrupt()
|
|
{
|
|
QByteArray reply;
|
|
QDataStream rs(&reply, QIODevice::WriteOnly);
|
|
QByteArray cmd = "INTERRUPT";
|
|
rs << cmd;
|
|
sendMessage(reply);
|
|
}
|
|
|
|
void QJSDebugClient::stepOut()
|
|
{
|
|
QByteArray reply;
|
|
QDataStream rs(&reply, QIODevice::WriteOnly);
|
|
QByteArray cmd = "STEPOUT";
|
|
rs << cmd;
|
|
sendMessage(reply);
|
|
}
|
|
|
|
void QJSDebugClient::continueExecution()
|
|
{
|
|
QByteArray reply;
|
|
QDataStream rs(&reply, QIODevice::WriteOnly);
|
|
QByteArray cmd = "CONTINUE";
|
|
rs << cmd;
|
|
sendMessage(reply);
|
|
}
|
|
|
|
void QJSDebugClient::expandObjectById(const QByteArray& objectName, quint64 objectId)
|
|
{
|
|
QByteArray reply;
|
|
QDataStream rs(&reply, QIODevice::WriteOnly);
|
|
QByteArray cmd = "EXPAND";
|
|
rs << cmd
|
|
<< objectName
|
|
<< objectId;
|
|
sendMessage(reply);
|
|
}
|
|
|
|
void QJSDebugClient::setProperty(const QByteArray& id, qint64 objectId, const QString &property, const QString &value)
|
|
{
|
|
QByteArray reply;
|
|
QDataStream rs(&reply, QIODevice::WriteOnly);
|
|
QByteArray cmd = "SET_PROPERTY";
|
|
rs << cmd
|
|
<< id
|
|
<< objectId
|
|
<< property
|
|
<< value;
|
|
sendMessage(reply);
|
|
}
|
|
|
|
void QJSDebugClient::activateFrame(int frameId)
|
|
{
|
|
QByteArray reply;
|
|
QDataStream rs(&reply, QIODevice::WriteOnly);
|
|
QByteArray cmd = "ACTIVATE_FRAME";
|
|
rs << cmd
|
|
<< frameId;
|
|
sendMessage(reply);
|
|
}
|
|
|
|
void QJSDebugClient::startCoverageRun()
|
|
{
|
|
QByteArray reply;
|
|
QDataStream rs(&reply, QIODevice::WriteOnly);
|
|
QByteArray cmd = "COVERAGE";
|
|
bool enabled = true;
|
|
rs << cmd
|
|
<< enabled;
|
|
sendMessage(reply);
|
|
}
|
|
|
|
void QJSDebugClient::startCoverageCompleted()
|
|
{
|
|
QByteArray reply;
|
|
QDataStream rs(&reply, QIODevice::WriteOnly);
|
|
QByteArray cmd = "COVERAGE";
|
|
bool enabled = false;
|
|
rs << cmd
|
|
<< enabled;
|
|
sendMessage(reply);
|
|
}
|
|
|
|
void QJSDebugClient::statusChanged(Status /*status*/)
|
|
{
|
|
emit statusHasChanged();
|
|
}
|
|
|
|
void QJSDebugClient::messageReceived(const QByteArray &data)
|
|
{
|
|
QByteArray rwData = data;
|
|
QDataStream stream(&rwData, QIODevice::ReadOnly);
|
|
|
|
QByteArray command;
|
|
stream >> command;
|
|
|
|
if (command == "STOPPED") {
|
|
stream >> break_stackFrames >> break_watches >> break_locals >> break_becauseOfException >> break_error;
|
|
if (!break_becauseOfException) {
|
|
break_error.clear();
|
|
}
|
|
emit stopped();
|
|
} else if (command == "RESULT") {
|
|
stream >> exec_iname;
|
|
stream >> exec_data;
|
|
emit result();
|
|
} else if (command == "EXPANDED") {
|
|
stream >> object_name >> object_children;
|
|
emit expanded();
|
|
} else if (command == "LOCALS") {
|
|
stream >> frame_id >> break_locals;
|
|
if (!stream.atEnd()) { // compatibility with jsdebuggeragent from 2.1, 2.2
|
|
stream >> break_watches;
|
|
}
|
|
emit watchTriggered();
|
|
} else if (command == "PONG") {
|
|
int ping;
|
|
stream >> ping;
|
|
QCOMPARE(ping, m_ping);
|
|
emit pong();
|
|
} else if (command == "COVERAGE") {
|
|
qint64 time;
|
|
int messageType;
|
|
qint64 scriptId;
|
|
QString program;
|
|
QString fileName;
|
|
int baseLineNumber;
|
|
int lineNumber;
|
|
int columnNumber;
|
|
QString returnValue;
|
|
|
|
stream >> time >> messageType >> scriptId >> program >> fileName >> baseLineNumber
|
|
>> lineNumber >> columnNumber >> returnValue;
|
|
if (messageType == CoverageComplete) {
|
|
emit coverageCompleted();
|
|
} else if (messageType == CoverageScriptLoad) {
|
|
emit coverageScriptLoaded();
|
|
} else if (messageType == CoveragePosChange) {
|
|
emit coveragePosChanged();
|
|
} else if (messageType == CoverageFuncEntry) {
|
|
emit coverageFuncEntered();
|
|
} else if (messageType == CoverageFuncExit) {
|
|
emit coverageFuncExited();
|
|
}
|
|
} else {
|
|
QFAIL("Unknown message :" + command);
|
|
}
|
|
QVERIFY(stream.atEnd());
|
|
}
|
|
|
|
QJSDebugProcess::QJSDebugProcess()
|
|
: m_started(false)
|
|
{
|
|
m_process.setProcessChannelMode(QProcess::MergedChannels);
|
|
connect(&m_process, SIGNAL(readyReadStandardOutput()), this, SLOT(processAppOutput()));
|
|
connect(&m_timer, SIGNAL(timeout()), &m_eventLoop, SLOT(quit()));
|
|
m_timer.setSingleShot(true);
|
|
m_timer.setInterval(5000);
|
|
QStringList environment = QProcess::systemEnvironment();
|
|
environment.append("QML_DISABLE_OPTIMIZER=1");
|
|
m_process.setEnvironment(environment);
|
|
}
|
|
|
|
QJSDebugProcess::~QJSDebugProcess()
|
|
{
|
|
if (m_process.state() != QProcess::NotRunning) {
|
|
m_process.kill();
|
|
m_process.waitForFinished(5000);
|
|
}
|
|
}
|
|
|
|
void QJSDebugProcess::start(const QStringList &arguments)
|
|
{
|
|
QString currentDir = QFileInfo(__FILE__).absoluteDir().absolutePath();
|
|
m_process.start(currentDir + "/app/app", arguments);
|
|
m_timer.start();
|
|
}
|
|
|
|
bool QJSDebugProcess::waitForStarted()
|
|
{
|
|
m_eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
|
|
|
|
return m_started;
|
|
}
|
|
|
|
void QJSDebugProcess::processAppOutput()
|
|
{
|
|
const QString appOutput = m_process.readAll();
|
|
static QRegExp newline("[\n\r]{1,2}");
|
|
QStringList lines = appOutput.split(newline);
|
|
foreach (const QString &line, lines) {
|
|
if (line.isEmpty())
|
|
continue;
|
|
if (line.startsWith("Qml debugging is enabled")) // ignore
|
|
continue;
|
|
if (line.startsWith("QDeclarativeDebugServer:")) {
|
|
if (line.contains("Waiting for connection ")) {
|
|
m_started = true;
|
|
m_eventLoop.quit();
|
|
continue;
|
|
}
|
|
if (line.contains("Connection established")) {
|
|
continue;
|
|
}
|
|
}
|
|
qDebug() << line;
|
|
}
|
|
}
|
|
|
|
inline QString TEST_FILE(const QString &filename)
|
|
{
|
|
QFileInfo fileInfo(__FILE__);
|
|
return fileInfo.absoluteDir().filePath("data/" + filename);
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::pingPong()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QJSDebugClient client(&connection);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
client.ping();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(pong())));
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::exec()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QJSDebugClient client(&connection);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
// Evaluate script without context
|
|
client.exec("queryid", "1+1");
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(result())));
|
|
QCOMPARE(client.exec_iname, QByteArray("queryid"));
|
|
QCOMPARE(client.exec_data.exp, QByteArray("1+1"));
|
|
QCOMPARE(client.exec_data.name, QByteArray("1+1"));
|
|
QCOMPARE(client.exec_data.hasChildren, false);
|
|
QCOMPARE(client.exec_data.type, QByteArray("Number"));
|
|
QCOMPARE(client.exec_data.value, QByteArray("2"));
|
|
|
|
// TODO: Test access to context after breakpoint is hit
|
|
}
|
|
|
|
|
|
void tst_QDeclarativeDebugJS::setBreakpoint()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp1.lineNumber = 11;
|
|
|
|
//TEST LINE
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
JSAgentStackData data = client.break_stackFrames.at(0);
|
|
QCOMPARE(data.fileUrl, bp1.fileUrl);
|
|
QCOMPARE(data.lineNumber, bp1.lineNumber);
|
|
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::stepOver()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp1.lineNumber = 11;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
//TEST LINE
|
|
client.stepOver();
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
JSAgentStackData data = client.break_stackFrames.at(0);
|
|
QCOMPARE(data.fileUrl, bp1.fileUrl);
|
|
QCOMPARE(data.lineNumber, bp1.lineNumber +1);
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::stepInto()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp1.lineNumber = 12;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
//TEST LINE
|
|
client.stepInto();
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
QByteArray functionName("functionInScript");
|
|
JSAgentStackData data = client.break_stackFrames.at(0);
|
|
QCOMPARE(data.functionName, functionName);
|
|
QCOMPARE(data.fileUrl, QByteArray(QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded()));
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::interrupt()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp1.lineNumber = 12;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
//TEST LINE
|
|
client.interrupt();
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
QByteArray functionName("functionInScript");
|
|
JSAgentStackData data = client.break_stackFrames.at(0);
|
|
QCOMPARE(data.functionName, functionName);
|
|
QCOMPARE(data.fileUrl, QByteArray(QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded()));
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::stepOut()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1,bp2;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp1.lineNumber = 12;
|
|
|
|
bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp2.lineNumber = 13;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
client.stepInto();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
//TEST LINE
|
|
client.stepOut();
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
JSAgentStackData data = client.break_stackFrames.at(0);
|
|
|
|
QCOMPARE(data.fileUrl, bp2.fileUrl);
|
|
QCOMPARE(data.lineNumber, bp2.lineNumber);
|
|
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::continueExecution()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1, bp2;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp1.lineNumber = 11;
|
|
|
|
bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp2.lineNumber = 13;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
//TEST LINE
|
|
client.continueExecution();
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
JSAgentStackData data = client.break_stackFrames.at(0);
|
|
QCOMPARE(data.fileUrl, bp2.fileUrl);
|
|
QCOMPARE(data.lineNumber, bp2.lineNumber);
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::expandObject()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded();
|
|
bp1.lineNumber = 17;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
foreach ( JSAgentWatchData data, client.break_locals)
|
|
{
|
|
if( data.name == "details")
|
|
{
|
|
//TEST LINE
|
|
client.expandObjectById(data.name,data.objectId);
|
|
}
|
|
}
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded())));
|
|
QCOMPARE(client.object_name,QByteArray("details"));
|
|
QCOMPARE(client.object_children.at(0).name,QByteArray("category"));
|
|
QCOMPARE(client.object_children.at(0).type,QByteArray("String"));
|
|
QCOMPARE(client.object_children.at(1).name,QByteArray("names"));
|
|
QCOMPARE(client.object_children.at(1).type,QByteArray("Array"));
|
|
QCOMPARE(client.object_children.at(2).name,QByteArray("aliases"));
|
|
QCOMPARE(client.object_children.at(2).type,QByteArray("Array"));
|
|
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::setProperty()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1, bp2;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded();
|
|
bp1.lineNumber = 17;
|
|
bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded();
|
|
bp2.lineNumber = 18;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
quint64 objectId;
|
|
QByteArray objectName;
|
|
|
|
foreach ( JSAgentWatchData data, client.break_locals)
|
|
{
|
|
if( data.name == "details")
|
|
{
|
|
objectId = data.objectId;
|
|
objectName = data.name;
|
|
//TEST LINE
|
|
client.setProperty(data.name, data.objectId, "total", "names.length");
|
|
}
|
|
}
|
|
|
|
client.continueExecution();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
client.expandObjectById(objectName,objectId);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded())));
|
|
|
|
QCOMPARE(client.object_name,QByteArray("details"));
|
|
QCOMPARE(client.object_children.at(0).name,QByteArray("category"));
|
|
QCOMPARE(client.object_children.at(0).type,QByteArray("String"));
|
|
QCOMPARE(client.object_children.at(0).value,QByteArray("Superheroes"));
|
|
QCOMPARE(client.object_children.at(1).name,QByteArray("names"));
|
|
QCOMPARE(client.object_children.at(1).type,QByteArray("Array"));
|
|
QCOMPARE(client.object_children.at(2).name,QByteArray("aliases"));
|
|
QCOMPARE(client.object_children.at(2).type,QByteArray("Array"));
|
|
QCOMPARE(client.object_children.at(3).name,QByteArray("total"));
|
|
QCOMPARE(client.object_children.at(3).type,QByteArray("Number"));
|
|
// foreach ( JSAgentWatchData data, client.object_children)
|
|
// {
|
|
// qDebug() << data.name << data.type << data.value;
|
|
// }
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::setProperty2()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1, bp2;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded();
|
|
bp1.lineNumber = 17;
|
|
bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded();
|
|
bp2.lineNumber = 18;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
quint64 objectId;
|
|
QByteArray objectName;
|
|
|
|
foreach ( JSAgentWatchData data, client.break_locals)
|
|
{
|
|
if( data.name == "details")
|
|
{
|
|
objectId = data.objectId;
|
|
objectName = data.name;
|
|
//TEST LINE
|
|
client.setProperty(data.name, data.objectId, "category", data.name + ".category = 'comic characters'");
|
|
}
|
|
}
|
|
|
|
client.continueExecution();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
client.expandObjectById(objectName,objectId);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded())));
|
|
|
|
QCOMPARE(client.object_name,QByteArray("details"));
|
|
QCOMPARE(client.object_children.at(0).name,QByteArray("category"));
|
|
QCOMPARE(client.object_children.at(0).type,QByteArray("String"));
|
|
QCOMPARE(client.object_children.at(0).value,QByteArray("comic characters"));
|
|
QCOMPARE(client.object_children.at(1).name,QByteArray("names"));
|
|
QCOMPARE(client.object_children.at(1).type,QByteArray("Array"));
|
|
QCOMPARE(client.object_children.at(2).name,QByteArray("aliases"));
|
|
QCOMPARE(client.object_children.at(2).type,QByteArray("Array"));
|
|
|
|
// foreach ( JSAgentWatchData data, client.object_children)
|
|
// {
|
|
// qDebug() << data.name << data.type << data.value;
|
|
// }
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::watchExpression()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
QByteArray watchExpression("root.result = 20");
|
|
QStringList watchList;
|
|
watchList.append(QString(watchExpression));
|
|
|
|
//TEST LINE
|
|
client.setWatchExpressions(watchList);
|
|
|
|
JSAgentBreakpointData bp1;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp1.lineNumber = 11;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1);
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
JSAgentWatchData data = client.break_watches.at(0);
|
|
QCOMPARE(data.exp, watchExpression);
|
|
QCOMPARE(data.value.toInt(), 20);
|
|
QCOMPARE(data.type, QByteArray("Number"));
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::activateFrame()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1, bp2;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded();
|
|
bp1.lineNumber = 3;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
client.stepInto();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
//TEST LINE
|
|
client.activateFrame(2);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(watchTriggered())));
|
|
|
|
QCOMPARE(client.break_locals.at(1).name,QByteArray("names"));
|
|
QCOMPARE(client.break_locals.at(1).type,QByteArray("Array"));
|
|
QCOMPARE(client.break_locals.at(2).name,QByteArray("a"));
|
|
QCOMPARE(client.break_locals.at(2).type,QByteArray("Number"));
|
|
QCOMPARE(client.break_locals.at(2).value,QByteArray("4"));
|
|
QCOMPARE(client.break_locals.at(3).name,QByteArray("b"));
|
|
QCOMPARE(client.break_locals.at(3).type,QByteArray("Number"));
|
|
QCOMPARE(client.break_locals.at(3).value,QByteArray("5"));
|
|
|
|
// foreach ( JSAgentWatchData data, client.break_locals)
|
|
// {
|
|
// qDebug() << data.name << data.type << data.value;
|
|
// }
|
|
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::setBreakpoint2()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp1.lineNumber = 40;
|
|
|
|
//TEST LINE
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1);
|
|
QVERIFY(!QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::stepOver2()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp1.lineNumber = 11;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
//TEST LINE
|
|
client.stepOver();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
client.stepOver();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
JSAgentStackData data = client.break_stackFrames.at(0);
|
|
QCOMPARE(data.fileUrl, bp1.fileUrl);
|
|
QCOMPARE(data.lineNumber, bp1.lineNumber +2);
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::stepInto2()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded();
|
|
bp1.lineNumber = 17;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
//TEST LINE
|
|
client.stepInto();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
client.stepInto();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
QByteArray functionName("logger");
|
|
JSAgentStackData data = client.break_stackFrames.at(0);
|
|
QCOMPARE(data.functionName, functionName);
|
|
QCOMPARE(data.fileUrl, QByteArray(QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded()));
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::interrupt2()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded();
|
|
bp1.lineNumber = 17;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
//TEST LINE
|
|
client.interrupt();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
client.interrupt();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
QByteArray functionName("logger");
|
|
JSAgentStackData data = client.break_stackFrames.at(0);
|
|
QCOMPARE(data.functionName, functionName);
|
|
QCOMPARE(data.fileUrl, QByteArray(QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded()));
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::stepOut2()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1,bp2;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp1.lineNumber = 12;
|
|
|
|
bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp2.lineNumber = 13;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
client.stepInto();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
client.stepInto();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
//TEST LINE
|
|
client.stepOut();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
client.stepOut();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
JSAgentStackData data = client.break_stackFrames.at(0);
|
|
|
|
QCOMPARE(data.fileUrl, bp2.fileUrl);
|
|
QCOMPARE(data.lineNumber, bp2.lineNumber);
|
|
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::continueExecution2()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1, bp2, bp3;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp1.lineNumber = 11;
|
|
|
|
bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp2.lineNumber = 12;
|
|
|
|
bp3.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp3.lineNumber = 13;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2 << bp3);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
//TEST LINE
|
|
client.continueExecution();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
client.continueExecution();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
JSAgentStackData data = client.break_stackFrames.at(0);
|
|
QCOMPARE(data.fileUrl, bp3.fileUrl);
|
|
QCOMPARE(data.lineNumber, bp3.lineNumber);
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::expandObject2()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded();
|
|
bp1.lineNumber = 17;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
//TEST LINE
|
|
client.expandObjectById(QByteArray("details"),123);
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded())));
|
|
QCOMPARE(client.object_name,QByteArray("details"));
|
|
|
|
QEXPECT_FAIL("", "", Continue);
|
|
QCOMPARE(client.object_children.length(),0);
|
|
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::setProperty3()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1, bp2;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded();
|
|
bp1.lineNumber = 17;
|
|
bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded();
|
|
bp2.lineNumber = 18;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
quint64 objectId;
|
|
QByteArray objectName;
|
|
|
|
foreach ( JSAgentWatchData data, client.break_locals)
|
|
{
|
|
if( data.name == "details")
|
|
{
|
|
objectId = data.objectId;
|
|
objectName = data.name;
|
|
//TEST LINE
|
|
client.setProperty(data.name, 123, "total", "names.length");
|
|
}
|
|
}
|
|
|
|
client.continueExecution();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
client.expandObjectById(objectName,objectId);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded())));
|
|
|
|
QCOMPARE(client.object_name,QByteArray("details"));
|
|
QCOMPARE(client.object_children.length(),3);
|
|
|
|
// foreach ( JSAgentWatchData data, client.object_children)
|
|
// {
|
|
// qDebug() << data.name << data.type << data.value;
|
|
// }
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::setProperty4()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1, bp2;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded();
|
|
bp1.lineNumber = 17;
|
|
bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded();
|
|
bp2.lineNumber = 18;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
quint64 objectId;
|
|
QByteArray objectName;
|
|
|
|
foreach ( JSAgentWatchData data, client.break_locals)
|
|
{
|
|
if( data.name == "details")
|
|
{
|
|
objectId = data.objectId;
|
|
objectName = data.name;
|
|
//TEST LINE
|
|
client.setProperty(data.name, 123, "category", data.name + ".category = 'comic characters'");
|
|
}
|
|
}
|
|
|
|
client.continueExecution();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
client.expandObjectById(objectName,objectId);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded())));
|
|
|
|
QCOMPARE(client.object_name,QByteArray("details"));
|
|
QCOMPARE(client.object_children.at(0).name,QByteArray("category"));
|
|
QCOMPARE(client.object_children.at(0).type,QByteArray("String"));
|
|
QCOMPARE(client.object_children.at(0).value,QByteArray("Superheroes"));
|
|
QCOMPARE(client.object_children.at(1).name,QByteArray("names"));
|
|
QCOMPARE(client.object_children.at(1).type,QByteArray("Array"));
|
|
QCOMPARE(client.object_children.at(2).name,QByteArray("aliases"));
|
|
QCOMPARE(client.object_children.at(2).type,QByteArray("Array"));
|
|
|
|
// foreach ( JSAgentWatchData data, client.object_children)
|
|
// {
|
|
// qDebug() << data.name << data.type << data.value;
|
|
// }
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::activateFrame2()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1, bp2;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded();
|
|
bp1.lineNumber = 4;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
client.stepInto();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
//TEST LINE
|
|
client.activateFrame(5);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(watchTriggered())));
|
|
|
|
QCOMPARE(client.break_locals.length(),0);
|
|
|
|
// foreach ( JSAgentWatchData data, client.break_locals)
|
|
// {
|
|
// qDebug() << data.name << data.type << data.value;
|
|
// }
|
|
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::verifyQMLOptimizerDisabled()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
QJSDebugClient client(&connection);
|
|
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
JSAgentBreakpointData bp1;
|
|
bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded();
|
|
bp1.lineNumber = 21;
|
|
|
|
client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped())));
|
|
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::testCoverageCompleted()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QJSDebugClient client(&connection);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
client.startCoverageCompleted();
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(coverageCompleted())));
|
|
}
|
|
|
|
void tst_QDeclarativeDebugJS::testCoverageRun()
|
|
{
|
|
QJSDebugProcess process;
|
|
process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml"));
|
|
QVERIFY(process.waitForStarted());
|
|
|
|
QDeclarativeDebugConnection connection;
|
|
connection.connectToHost("127.0.0.1", 3771);
|
|
QVERIFY(connection.waitForConnected());
|
|
|
|
QJSDebugClient client(&connection);
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
if (client.status() == QJSDebugClient::Unavailable)
|
|
QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
|
|
QCOMPARE(client.status(), QJSDebugClient::Enabled);
|
|
|
|
client.startCoverageRun();
|
|
client.startCoverageCompleted();
|
|
|
|
// The app might get "COVERAGE false" before anything is actually executed
|
|
//QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(coverageScriptLoaded())));
|
|
//QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(coveragePosChanged())));
|
|
//QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(coverageFuncEntered())));
|
|
//QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(coverageFuncExited())));
|
|
}
|
|
|
|
QTEST_MAIN(tst_QDeclarativeDebugJS)
|
|
|
|
#include "tst_qdeclarativedebugjs.moc"
|