summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordac <qt-info@nokia.com>2010-08-04 10:29:59 +1000
committerdac <qt-info@nokia.com>2010-08-04 10:29:59 +1000
commit566ebf5793235758f168f54c798f970bff8f8e5b (patch)
tree720dbffb2ee2874e51ca41d3ff649d3e350814e1
parent2793b135c6faec221cf8e63d76b6e6cc31c6717e (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.cpp132
-rw-r--r--interpreter/qscriptsystemtest.h9
-rw-r--r--interpreter/qtscript_bindings.cpp3
-rw-r--r--interpreter/scriptpreprocessor.cpp2
-rw-r--r--libqsystemtest/desktoptestcontrol.cpp5
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 &paramete
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 &paramete
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 &paramete
// 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()) {