summaryrefslogtreecommitdiffstats
path: root/old/libqsystemtest/desktoptestcontrol.h
diff options
context:
space:
mode:
Diffstat (limited to 'old/libqsystemtest/desktoptestcontrol.h')
-rw-r--r--old/libqsystemtest/desktoptestcontrol.h120
1 files changed, 120 insertions, 0 deletions
diff --git a/old/libqsystemtest/desktoptestcontrol.h b/old/libqsystemtest/desktoptestcontrol.h
new file mode 100644
index 0000000..9b1a301
--- /dev/null
+++ b/old/libqsystemtest/desktoptestcontrol.h
@@ -0,0 +1,120 @@
+#ifndef DESKTOPTESTCONTROL_H
+#define DESKTOPTESTCONTROL_H
+
+#include "testcontrol.h"
+#include "qsystemtest.h"
+
+#include <QProcess>
+
+namespace Qt4Test {
+
+class TestProcess : public QProcess
+{
+ Q_OBJECT
+ public:
+ TestProcess(QObject *parent = 0)
+ : QProcess(parent)
+ , env()
+ , test(0)
+ {
+ connect(this,SIGNAL(readyReadStandardError()),this,SLOT(error()));
+ connect(this,SIGNAL(readyReadStandardOutput()),this,SLOT(output()));
+ connect(this,SIGNAL(finished(int,QProcess::ExitStatus)),
+ this,SLOT(deleteLater()));
+ }
+
+ QStringList env;
+ QSystemTest* test;
+
+ private slots:
+ void output()
+ {
+ QByteArray text = readAllStandardOutput();
+ if (!test) return;
+
+ while (text.endsWith("\n")) text.chop(1);
+ QList<QByteArray> lines = text.split('\n');
+ test->applicationStandardOutput(lines);
+ }
+
+ void error()
+ {
+ QByteArray text = readAllStandardError();
+ if (!test) return;
+
+ while (text.endsWith("\n")) text.chop(1);
+ QList<QByteArray> lines = text.split('\n');
+ test->applicationStandardError(lines);
+ }
+
+ protected:
+ virtual void setupChildProcess()
+ {
+ foreach (QString const& e, env) {
+ int equals = e.indexOf('=');
+ if (equals == -1) continue;
+ QString key = e.left(equals);
+ QString value = e.mid(equals+1);
+ prependToEnv(key.toLocal8Bit(), value.toLocal8Bit());
+ }
+ }
+
+ private:
+ void prependToEnv(QByteArray const& key, QByteArray const& value)
+ {
+ // Environment variables which are a colon-separated list (like PATH)
+ static const QList<QByteArray> pathlike = QList<QByteArray>()
+ << "LD_LIBRARY_PATH"
+ ;
+
+ // Environment variables which can be silently clobbered
+ static const QList<QByteArray> clobber = QList<QByteArray>()
+ << "DISPLAY"
+ ;
+
+ QByteArray current = qgetenv(key.constData());
+ QByteArray set = value;
+ if (!current.isEmpty()) {
+ if (pathlike.contains(key)) {
+ set = set + ":" + current;
+ } else if (clobber.contains(key)) {
+ } else {
+ // Cannot use qWarning because we are in a child process and we will pass
+ // through message handlers twice
+ fprintf(stderr, "Environment variable %s is already set (to \"%s\"); "
+ "qtuitestrunner will clobber it (with \"%s\") when starting test "
+ "process!"
+ ,key.constData()
+ ,current.constData()
+ ,set.constData()
+ );
+ }
+ }
+#ifndef Q_OS_WIN
+ setenv(key.constData(), set.constData(), 1);
+#endif
+ }
+};
+
+
+class DesktopTestControl : public TestControl
+{
+ Q_OBJECT
+public:
+ static DesktopTestControl* instance();
+ DesktopTestControl();
+ virtual ~DesktopTestControl();
+
+ bool deviceConfiguration( QString &reply );
+
+ bool startApplication( const QString &application, const QStringList &arguments,
+ bool styleQtUITest, const QStringList &environment, QString &reply );
+ bool killApplication( const QString &application, QString &reply );
+
+private:
+ TestProcess* proc;
+};
+
+}
+
+#endif // DESKTOPTESTCONTROL_H