diff options
author | Sunil Thaha <sunil.thaha@nokia.com> | 2012-08-21 15:11:48 +1000 |
---|---|---|
committer | Sunil Thaha <sunil.thaha+qt@gmail.com> | 2012-08-21 07:29:26 +0200 |
commit | 8b3982051badc30d387366bea517cbaaf0a44455 (patch) | |
tree | 56de6eb123760620910f5360407ee0929224777f /src/interpreter/runner/qstrunnerbootstrap.cpp | |
parent | eeb6f6284e40dd0182070b11f2e106437a31b7e1 (diff) |
QtSystemTest rocks
Initial version of QtSystemTest based on the former QtUiTest
Change-Id: I99b72d26dc623ce5e4a665d3dda380b9fe4eef9d
Reviewed-by: Shane Bradley <shane.bradley@nokia.com>
Reviewed-by: Sunil Thaha <sunil.thaha+qt@gmail.com>
Reviewed-by: David Clark <dac@dclark.org.uk>
Diffstat (limited to 'src/interpreter/runner/qstrunnerbootstrap.cpp')
-rw-r--r-- | src/interpreter/runner/qstrunnerbootstrap.cpp | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/src/interpreter/runner/qstrunnerbootstrap.cpp b/src/interpreter/runner/qstrunnerbootstrap.cpp new file mode 100644 index 0000000..0c44c56 --- /dev/null +++ b/src/interpreter/runner/qstrunnerbootstrap.cpp @@ -0,0 +1,229 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of QtSystemTest. +** +** $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 "qstrunnerbootstrap.h" +#include "qstrunnercore.h" +#include <QtCore/QFileInfo> +#include <QtCore/QStringList> +#include <QtCore/QCoreApplication> +#include <QtCore/QDebug> +#include <QtCore/QDir> +#include <QtScript/QScriptEngine> +#include <QtScript/QScriptContext> +#include <QtScript/QScriptValue> +#include <QtScript/QScriptContextInfo> +#include <QDeclarativeEngine> +#include <QDeclarativeComponent> + +static const int InternalError = 1 << 6; + + +static QScriptValue isRelativePath(QScriptContext *ctx, QScriptEngine *) +{ + QUrl url = ctx->argument(0).toString(); + return url.isRelative(); +} + +static QScriptValue relativeToCurrentPath(QScriptContext *ctx, QScriptEngine *) +{ + QUrl url = ctx->argument(0).toString(); + if (url.isLocalFile()) + return QDir::current().relativeFilePath(url.toLocalFile()); + return url.toString(); +} + + +static QScriptValue qscriptengine_stack(QScriptContext *ctx, QScriptEngine *e) +{ + QVariantList stack; + + qint32 frame = 0; + bool framesSpecified = ctx->argumentCount() > 0; + if (framesSpecified) { + frame = ctx->argument(0).toInt32(); + } + + while (ctx) { + // count down if user has requested for certain number of frames + if ( framesSpecified && frame-- <= 0 ) + break; + ctx = ctx->parentContext(); + QScriptContextInfo info(ctx); + QVariantMap callsite; + callsite["fileName"] = info.fileName(); + callsite["lineNumber"] = info.lineNumber(); + callsite["functionName"] = info.functionName(); + stack << callsite; + } + return qScriptValueFromSequence(e, stack); +} + +// Copied from qdeclarativedebughelper_p.h in Qt +class Q_DECLARATIVE_EXPORT QDeclarativeDebugHelper +{ +public: + static QScriptEngine *getScriptEngine(QDeclarativeEngine *engine); +}; + +bool QstRunnerBootstrap::setupScriptEngine(QDeclarativeEngine *declarativeEngine) +{ + QScriptEngine *e = QDeclarativeDebugHelper::getScriptEngine(declarativeEngine); + QScriptValue qst = e->newObject(); + qst.setProperty(QLatin1String("stack"), e->newFunction(qscriptengine_stack)); + qst.setProperty(QLatin1String("isRelativePath"), e->newFunction(isRelativePath)); + qst.setProperty(QLatin1String("relativeToCurrentPath"), e->newFunction(relativeToCurrentPath)); + + QScriptValue qtObject = e->globalObject().property(QLatin1String("Qt")); + qtObject.setProperty(QLatin1String("qst"), qst); + return true; +} + +QstRunnerBootstrap::QstRunnerBootstrap(QCoreApplication *app) + : QObject(app) + , m_app(app) + , m_qmlRunner(0) +{ + QStringList args = app->arguments(); + // Skips executable + args.removeAt(0); + + if (args.count() == 0) { + qDebug() << "No arguments passed, failing back to qmlunit Test Suite (" << app->applicationDirPath() << ")\n"; + args = QStringList(app->applicationDirPath() + "/test"); + } + + foreach (const QString &arg, args) { + findTests(arg); + } +} + + +bool QstRunnerBootstrap::setup() +{ + qmlRegisterType<QstRunnerCore>("QstRunner", 1, 0, "Runner"); + QDeclarativeEngine *engine = new QDeclarativeEngine(this); + engine->setOfflineStoragePath(QDir::currentPath() + "/storage"); + setupScriptEngine(engine); + + qDebug()<< "Loading Runner"; + QUrl runnerPath = QUrl::fromLocalFile( + m_app->applicationDirPath() + "/scripts/QstRunner.qml"); + + QDeclarativeComponent runnerCom(engine, runnerPath); + if (!runnerCom.errors().isEmpty()) { + qDebug() << "Internal error in Qml runner" + << runnerCom.errors(); + return false; // may be exit 2 + } + m_qmlRunner = qobject_cast<QstRunnerCore *>(runnerCom.create()); + if (!m_qmlRunner) { + qDebug() << "Internal Error: qmlRunner creation failed" + << runnerCom.errors(); + return false; // may be exit 2 + } + + if ( !m_qmlRunner->setup(engine, qApp->arguments()) ) { + return false; + } + + qDebug()<< "Loading test file"; + QDeclarativeComponent com(engine, QUrl::fromLocalFile(m_testFile.first())); + if (!com.errors().isEmpty()) { + qDebug() << "Errors in testcase \n" + << com.errors(); + return false; // may be exit 1 + } + QObject *test = com.create(); + if (!test ) { + qDebug() << "Internal Error testcase object creation \n" + << com.errors(); + return false; // may be exit 1 + } + m_qmlRunner->setTest(test); + return true; +} + +int QstRunnerBootstrap::run() +{ + if (!setup()) { + return InternalError; + } + qDebug() << Q_FUNC_INFO << "---------------[setup is ok]-------------------"; + return m_qmlRunner->exec(); +} + +void QstRunnerBootstrap::findTests(const QString &path) +{ + if (isTest(path)) { + m_testFile << QDir(path).absolutePath(); + return; + } + + QStringList filters; filters << "*"; + QDir dir = QDir(QDir(path).absolutePath()); + + QListIterator<QFileInfo> files(dir.entryInfoList(filters, QDir::AllEntries | QDir::NoDotAndDotDot)); + while(files.hasNext()) { + QFileInfo file = files.next(); + if (file.fileName() == "." || file.fileName() == "..") continue; + + if (isTest(file)) + m_testFile << file.absoluteFilePath(); + else if (isDir(file)) + findTests(file.absoluteFilePath()); + } +} + +bool QstRunnerBootstrap::isTest(const QFileInfo &file) +{ + return isTest(file.fileName()); +} + +bool QstRunnerBootstrap::isTest(const QString &filePath) +{ + return filePath.endsWith("Test.qml") + || filePath.endsWith("Tests.qml"); +} + +bool QstRunnerBootstrap::isDir(const QFileInfo &file) +{ + return QDir(file.absoluteFilePath()).exists(); +} |