diff options
author | dac <qt-info@nokia.com> | 2010-08-04 10:29:59 +1000 |
---|---|---|
committer | dac <qt-info@nokia.com> | 2010-08-04 10:29:59 +1000 |
commit | 566ebf5793235758f168f54c798f970bff8f8e5b (patch) | |
tree | 720dbffb2ee2874e51ca41d3ff649d3e350814e1 | |
parent | 2793b135c6faec221cf8e63d76b6e6cc31c6717e (diff) |
Fix: when running test more than once, the QtScript plugins (and additional
stuff) get reloaded into engine, which results in test failures. Now the
engine is reused when re-running same script, or recreated properly if
running a new script. Also reactivate QTUITEST_DEFAULT_AUT_ARGS to allow
running tests in Xephyr.
-rw-r--r-- | interpreter/qscriptsystemtest.cpp | 132 | ||||
-rw-r--r-- | interpreter/qscriptsystemtest.h | 9 | ||||
-rw-r--r-- | interpreter/qtscript_bindings.cpp | 3 | ||||
-rw-r--r-- | interpreter/scriptpreprocessor.cpp | 2 | ||||
-rw-r--r-- | libqsystemtest/desktoptestcontrol.cpp | 5 |
5 files changed, 84 insertions, 67 deletions
diff --git a/interpreter/qscriptsystemtest.cpp b/interpreter/qscriptsystemtest.cpp index 5e67c22..ffa8a5c 100644 --- a/interpreter/qscriptsystemtest.cpp +++ b/interpreter/qscriptsystemtest.cpp @@ -235,19 +235,59 @@ static QScriptValue setFlags QScriptSystemTest::QScriptSystemTest() - : m_agent(new QtUiTestEngineAgent(&m_engine, this)), + : m_engine(0), + m_agent(0), m_contextDepth(0), testObject(0), m_checkOnly(false) { - // Ensure we process events periodically. - m_engine.setProcessEventsInterval(100); } QScriptSystemTest::~QScriptSystemTest() { } +void QScriptSystemTest::initEngine(bool createNewEngine) +{ + if (m_engine) { + if (createNewEngine) { + delete m_engine; + } else { + return; + } + } + + m_engine = new QScriptEngine(); + m_agent = new QtUiTestEngineAgent(m_engine, this); + + // Ensure we process events periodically. + m_engine->setProcessEventsInterval(100); + + m_engine->importExtension("qt.core"); + setupEnums(m_engine); + + // include() imports scripts directly into the parent script. + m_engine->globalObject().setProperty + ("include", m_engine->newFunction(includeFunction, 1)); + m_engine->globalObject().setProperty + ("setFlags", m_engine->newFunction(setFlags, 3)); + + + m_engine->globalObject().setProperty("_dateToString", m_engine->newFunction(dateToString)); + m_engine->evaluate("_old_date_toString = Date.prototype.toString;" + "Date.prototype.toString = function() {" + " if (arguments[0] == undefined)" + " return _old_date_toString.apply(this, arguments);" + " return _dateToString.apply(this, arguments);" + "}"); + + m_engine->globalObject().setProperty("ParentTestObject", m_engine->newQObject(this)); + m_engine->globalObject().setProperty("ParentTestMetaObject", m_engine->newQMetaObject(metaObject())); + + loadBuiltins(m_engine); + importIntoGlobalNamespace(m_engine, "ParentTestObject"); +} + QString QScriptSystemTest::testCaseName() const { if (testObject) @@ -255,19 +295,19 @@ QString QScriptSystemTest::testCaseName() const return QAbstractTest::testCaseName(); } -void QScriptSystemTest::loadBuiltins(QScriptEngine &engine) +void QScriptSystemTest::loadBuiltins(QScriptEngine *engine) { QScriptEngine configEngine; - QScriptSystemTest::loadInternalScript("config.js", configEngine); + QScriptSystemTest::loadInternalScript("config.js", &configEngine); for (int i = 0; i < configEngine.globalObject().property("builtin_files").property("length").toInt32(); ++i) { QString file = configEngine.globalObject().property("builtin_files").property(i).toString(); QtScript::addInternalFile( QScriptSystemTest::loadInternalScript(file, engine, true) ); } } -void QScriptSystemTest::importIntoGlobalNamespace(QScriptEngine& engine, QString const& object) +void QScriptSystemTest::importIntoGlobalNamespace(QScriptEngine *engine, QString const& object) { - QScriptValue obj = engine.globalObject().property(object); + QScriptValue obj = engine->globalObject().property(object); QScriptValueIterator it(obj); while (it.hasNext()) { @@ -281,21 +321,21 @@ void QScriptSystemTest::importIntoGlobalNamespace(QScriptEngine& engine, QString // Import this property into the global object iff one doesn't already // exist with this name - if (engine.globalObject().property(name).isValid()) continue; + if (engine->globalObject().property(name).isValid()) continue; // For functions, to keep the QObject slot resolution working right, we // must wrap the property instead of simply copying it. if (it.value().isFunction()) { - engine.evaluate(QString("%1 = function(){ return %2.%1.apply(this, arguments); };") + engine->evaluate(QString("%1 = function(){ return %2.%1.apply(this, arguments); };") .arg(name) .arg(object)); } else { - engine.globalObject().setProperty(name, it.value()); + engine->globalObject().setProperty(name, it.value()); } } } -QString QScriptSystemTest::loadInternalScript(QString const &name, QScriptEngine &engine, bool withParentObject) +QString QScriptSystemTest::loadInternalScript(QString const &name, QScriptEngine *engine, bool withParentObject) { QString filename = QFileInfo(QString::fromAscii(__FILE__)).absolutePath() + "/" + name; if (!QFileInfo(filename).exists()) filename = ":/" + name; @@ -311,9 +351,9 @@ QString QScriptSystemTest::loadInternalScript(QString const &name, QScriptEngine data.append("\n}"); } - QScriptValue e = engine.evaluate(data, filename); + QScriptValue e = engine->evaluate(data, filename); if (e.isError()) { - QString backtrace = engine.uncaughtExceptionBacktrace().join("\n"); + QString backtrace = engine->uncaughtExceptionBacktrace().join("\n"); qWarning("In QtUiTest config file %s:\n%s\n%s", qPrintable(filename), qPrintable(e.toString()), qPrintable(backtrace)); } @@ -350,7 +390,7 @@ QString QScriptSystemTest::currentFile() QString fileName = QString(); int lineNumber = 0; - QtScript::getLocation(m_engine.currentContext(), &fileName, &lineNumber); + QtScript::getLocation(m_engine->currentContext(), &fileName, &lineNumber); return fileName; } @@ -360,14 +400,14 @@ int QScriptSystemTest::currentLine() QString fileName = QString(); int lineNumber = 0; - QtScript::getLocation(m_engine.currentContext(), &fileName, &lineNumber); + QtScript::getLocation(m_engine->currentContext(), &fileName, &lineNumber); return lineNumber; } void QScriptSystemTest::outputBacktrace() { - QScriptContext *ctx = m_engine.currentContext(); + QScriptContext *ctx = m_engine->currentContext(); QString bt("Backtrace:"); while (ctx) { QScriptContextInfo ctxInfo(ctx); @@ -383,7 +423,7 @@ void QScriptSystemTest::outputBacktrace() void QScriptSystemTest::skip(QString const &message, QSystemTest::SkipMode mode) { QSystemTest::skip(message, mode); - m_engine.evaluate("throw new QTestFailure('QSKIP');"); + m_engine->evaluate("throw new QTestFailure('QSKIP');"); } bool QScriptSystemTest::fail(QString const &message) @@ -391,7 +431,7 @@ bool QScriptSystemTest::fail(QString const &message) bool ret = QSystemTest::fail( message ); if (!ret) { outputBacktrace(); - m_engine.evaluate("throw new QTestFailure('QFAIL');"); + m_engine->evaluate("throw new QTestFailure('QFAIL');"); } return ret; } @@ -400,7 +440,7 @@ void QScriptSystemTest::verify(bool statement, QString const &message) { if (!QTest::qVerify(statement, "<statement>", qPrintable(message), qPrintable(currentFile()), currentLine() )) { outputBacktrace(); - m_engine.evaluate("throw new QTestFailure('QFAIL');"); + m_engine->evaluate("throw new QTestFailure('QFAIL');"); } } @@ -419,7 +459,7 @@ void QScriptSystemTest::compare(const QString &actual, const QString &expected) if (!QTest::qCompare( actual, expected, qPrintable(actual), qPrintable(expected), qPrintable(currentFile()), currentLine() )) { outputBacktrace(); - m_engine.evaluate("throw new QTestFailure('QFAIL');"); + m_engine->evaluate("throw new QTestFailure('QFAIL');"); } } @@ -434,14 +474,14 @@ void QScriptSystemTest::compare(const QStringList &actual, const QStringList &ex if (!QTest::qCompare( actual.count(), expected.count(), qPrintable(actual.join("\n")), qPrintable(expected.join("\n")), qPrintable(currentFile()), currentLine() )) { outputBacktrace(); - m_engine.evaluate("throw new QTestFailure('QFAIL');"); + m_engine->evaluate("throw new QTestFailure('QFAIL');"); return; } for (int i=0; i<actual.count(); i++) { if (!QTest::qCompare( actual[i], expected[i], qPrintable(actual[i]), qPrintable(expected[i]), qPrintable(currentFile()), currentLine() )) { outputBacktrace(); - m_engine.evaluate("throw new QTestFailure('QFAIL');"); + m_engine->evaluate("throw new QTestFailure('QFAIL');"); } } } @@ -466,7 +506,7 @@ void QScriptSystemTest::expectFail( const QString &reason ) QTest::TestFailMode(1),//mode), qPrintable(currentFile()), line); if (!ok) - m_engine.evaluate("throw new QTestFailure('QFAIL');"); + m_engine->evaluate("throw new QTestFailure('QFAIL');"); } bool QScriptSystemTest::setQueryError( const QTestMessage &message ) @@ -485,7 +525,7 @@ bool QScriptSystemTest::setQueryError( const QString &errString ) QSystemTest::setQueryError(errString); bool ret = fail(errString); if (!ret) { - m_engine.evaluate("throw new QTestFailure('QFAIL');"); + m_engine->evaluate("throw new QTestFailure('QFAIL');"); } return ret; } @@ -507,35 +547,15 @@ int QScriptSystemTest::runTest(const QString &fname, const QStringList ¶mete ScriptPreprocessor().preprocess(script); - setupEnums(&m_engine); - - // include() imports scripts directly into the parent script. - m_engine.globalObject().setProperty - ("include", m_engine.newFunction(includeFunction, 1)); - m_engine.globalObject().setProperty - ("setFlags", m_engine.newFunction(setFlags, 3)); - - - m_engine.globalObject().setProperty("_dateToString", m_engine.newFunction(dateToString)); - m_engine.evaluate("_old_date_toString = Date.prototype.toString;" - "Date.prototype.toString = function() {" - " if (arguments[0] == undefined)" - " return _old_date_toString.apply(this, arguments);" - " return _dateToString.apply(this, arguments);" - "}"); - - m_engine.globalObject().setProperty("ParentTestObject", m_engine.newQObject(this)); - m_engine.globalObject().setProperty("ParentTestMetaObject", m_engine.newQMetaObject(metaObject())); - - loadBuiltins(m_engine); - importIntoGlobalNamespace(m_engine, "ParentTestObject"); + initEngine(fname != filename); +// m_engine->setGlobalObject(QScriptValue()); // Allow shebangs without giving syntax errors. if (script.startsWith("#!")) script.prepend("//"); script.prepend("with(ParentTestMetaObject){"); script.append("\n}"); - QtScriptTest tc(filename, script, &m_engine); + QtScriptTest tc(filename, script, m_engine); if (tc.status() != QtScriptTest::StatusNormal) { return -1; @@ -543,8 +563,8 @@ int QScriptSystemTest::runTest(const QString &fname, const QStringList ¶mete testObject = &tc; - qScriptRegisterMetaType(&m_engine, variantToScriptValue, variantFromScriptValue); - qScriptRegisterSequenceMetaType<QList<qint64> >(&m_engine); + qScriptRegisterMetaType(m_engine, variantToScriptValue, variantFromScriptValue); + qScriptRegisterSequenceMetaType<QList<qint64> >(m_engine); // Only set up the test data path if not explicitly set by user if (!QCoreApplication::arguments().contains("-data")) { @@ -560,7 +580,7 @@ int QScriptSystemTest::runTest(const QString &fname, const QStringList ¶mete // If an IDE is connected, set the agent to enable script debugging if (QTestIDE::instance()->isConnected()) { - m_engine.setAgent(m_agent); + m_engine->setAgent(m_agent); } int retval = QTest::qExec(&tc, parameters); @@ -718,7 +738,7 @@ void QScriptSystemTest::dumpEngine() QString state; { - QScriptContext* ctx = m_engine.currentContext(); + QScriptContext* ctx = m_engine->currentContext(); state += "context: {"; int i = 0; QString sep; @@ -734,7 +754,7 @@ void QScriptSystemTest::dumpEngine() state += "\n};\n"; } - state += qDumpScriptValue("global", m_engine.globalObject()); + state += qDumpScriptValue("global", m_engine->globalObject()); state += ";"; fprintf(stderr, "%s\n", qPrintable(state)); @@ -753,8 +773,8 @@ void QScriptSystemTest::processMessage(const QTestMessage& message) map[key] = message[key]; QScriptValueList args; - args << m_engine.toScriptValue(message.event()); - args << m_engine.toScriptValue(map); + args << m_engine->toScriptValue(message.event()); + args << m_engine->toScriptValue(map); for (int i = 0; i < m_messageHandlers.count(); ++i) { QScriptValue out = m_messageHandlers[i].call(QScriptValue(), args); @@ -791,7 +811,7 @@ void QScriptSystemTest::scriptPositionChange(qint64 scriptId, int line, int colu Q_UNUSED(line); Q_UNUSED(column); - QScriptContextInfo ctxInfo(m_engine.currentContext()); + QScriptContextInfo ctxInfo(m_engine->currentContext()); if (!ctxInfo.fileName().isEmpty() && !builtins.contains(ctxInfo.fileName())) { QString functionName; if (ctxInfo.functionName().isEmpty()) { @@ -800,7 +820,7 @@ void QScriptSystemTest::scriptPositionChange(qint64 scriptId, int line, int colu functionName = ctxInfo.functionName(); } if (QTestIDE::instance()->queryBreakpoint(ctxInfo.fileName(), ctxInfo.lineNumber(), functionName, m_contextDepth)) { - QTestIDE::instance()->breakpointContext(m_engine.currentContext()); + QTestIDE::instance()->breakpointContext(m_engine->currentContext()); } } } diff --git a/interpreter/qscriptsystemtest.h b/interpreter/qscriptsystemtest.h index 9624fd0..bc270af 100644 --- a/interpreter/qscriptsystemtest.h +++ b/interpreter/qscriptsystemtest.h @@ -57,9 +57,9 @@ public: QScriptSystemTest(); virtual ~QScriptSystemTest(); - static QString loadInternalScript(QString const &name, QScriptEngine &engine, bool withParentObject = false); - static void loadBuiltins(QScriptEngine &engine); - static void importIntoGlobalNamespace(QScriptEngine&, QString const&); + static QString loadInternalScript(QString const &name, QScriptEngine *engine, bool withParentObject = false); + static void loadBuiltins(QScriptEngine *engine); + static void importIntoGlobalNamespace(QScriptEngine*, QString const&); virtual QString testCaseName() const; void scriptPositionChange(qint64, int, int); @@ -82,6 +82,7 @@ public slots: void dumpEngine(); protected: + virtual void initEngine(bool); virtual QString currentFile(); virtual int currentLine(); virtual void outputBacktrace(); @@ -98,7 +99,7 @@ protected: private: QString filename; - QScriptEngine m_engine; + QScriptEngine *m_engine; QScriptEngineAgent *m_agent; int m_contextDepth; QList<QScriptValue> m_messageHandlers; diff --git a/interpreter/qtscript_bindings.cpp b/interpreter/qtscript_bindings.cpp index b53d664..7692290 100644 --- a/interpreter/qtscript_bindings.cpp +++ b/interpreter/qtscript_bindings.cpp @@ -204,8 +204,7 @@ QtScriptTest::QtScriptTest(QString const &testFilePath, QString const &scriptDat if (m_testFilePath.isEmpty()) m_testFilePath="testcase.js"; - if (!m_engine) m_engine = new QScriptEngine(this); - m_engine->importExtension("qt.core"); +// m_engine->importExtension("qt.core"); QScriptValue qtestObject = m_engine->newObject(); qtestObject.setProperty("SkipSingle", QScriptValue(m_engine, QTest::SkipSingle)); diff --git a/interpreter/scriptpreprocessor.cpp b/interpreter/scriptpreprocessor.cpp index d89f176..42a413b 100644 --- a/interpreter/scriptpreprocessor.cpp +++ b/interpreter/scriptpreprocessor.cpp @@ -50,7 +50,7 @@ ScriptPreprocessor::ScriptPreprocessor() { QScriptEngine engine; - QScriptSystemTest::loadInternalScript("config.js", engine); + QScriptSystemTest::loadInternalScript("config.js", &engine); QScriptValue settings = engine.globalObject().property("preprocess"); if (!settings.isObject()) return; diff --git a/libqsystemtest/desktoptestcontrol.cpp b/libqsystemtest/desktoptestcontrol.cpp index 085a220..f41559a 100644 --- a/libqsystemtest/desktoptestcontrol.cpp +++ b/libqsystemtest/desktoptestcontrol.cpp @@ -40,7 +40,7 @@ bool DesktopTestControl::startApplication( const QString &application, const QSt args << "-style"; args << "qtuitest"; } -/* + QByteArray defArgs = qgetenv("QTUITEST_DEFAULT_AUT_ARGS"); if (defArgs.length()) { QList<QByteArray> defaultArgs = defArgs.split(' '); @@ -48,9 +48,6 @@ bool DesktopTestControl::startApplication( const QString &application, const QSt args << arg; } } - // For WinCE it does not support env variables - args << "-autport" << QString::number(m_aut_port); -*/ proc->start(application, args); if (!proc->waitForStarted()) { |