tst_qprocess: Instantiate QProcess objects on the stack.
Instantiate the QProcess object on the stack to ensure resource cleanup and remove the QProcess * member variable. Use qobject_cast<QProcess *>(QObject::sender()) instead of the member variable in the helpers slots to ensure that signals from a leaked QProcess do not interfere with other tests. Task-number: QTBUG-47370 Change-Id: Ifc0dccb7e4b18069d236df53bccdcb6a47df6346 Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
This commit is contained in:
parent
f322e2aa08
commit
3cbb89fa5a
@ -73,6 +73,7 @@ class tst_QProcess : public QObject
|
|||||||
public slots:
|
public slots:
|
||||||
void initTestCase();
|
void initTestCase();
|
||||||
void cleanupTestCase();
|
void cleanupTestCase();
|
||||||
|
void init();
|
||||||
|
|
||||||
#ifndef QT_NO_PROCESS
|
#ifndef QT_NO_PROCESS
|
||||||
private slots:
|
private slots:
|
||||||
@ -178,7 +179,6 @@ protected slots:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QProcess *process;
|
|
||||||
qint64 bytesAvailable;
|
qint64 bytesAvailable;
|
||||||
#endif //QT_NO_PROCESS
|
#endif //QT_NO_PROCESS
|
||||||
};
|
};
|
||||||
@ -201,6 +201,11 @@ void tst_QProcess::cleanupTestCase()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QProcess::init()
|
||||||
|
{
|
||||||
|
bytesAvailable = 0;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef QT_NO_PROCESS
|
#ifndef QT_NO_PROCESS
|
||||||
|
|
||||||
// Testing get/set functions
|
// Testing get/set functions
|
||||||
@ -261,10 +266,10 @@ void tst_QProcess::simpleStart()
|
|||||||
{
|
{
|
||||||
qRegisterMetaType<QProcess::ProcessState>("QProcess::ProcessState");
|
qRegisterMetaType<QProcess::ProcessState>("QProcess::ProcessState");
|
||||||
|
|
||||||
process = new QProcess;
|
QScopedPointer<QProcess> process(new QProcess);
|
||||||
QSignalSpy spy(process, &QProcess::stateChanged);
|
QSignalSpy spy(process.data(), &QProcess::stateChanged);
|
||||||
QVERIFY(spy.isValid());
|
QVERIFY(spy.isValid());
|
||||||
connect(process, &QIODevice::readyRead, this, &tst_QProcess::readFromProcess);
|
connect(process.data(), &QIODevice::readyRead, this, &tst_QProcess::readFromProcess);
|
||||||
|
|
||||||
/* valgrind dislike SUID binaries(those that have the `s'-flag set), which
|
/* valgrind dislike SUID binaries(those that have the `s'-flag set), which
|
||||||
* makes it fail to start the process. For this reason utilities like `ping' won't
|
* makes it fail to start the process. For this reason utilities like `ping' won't
|
||||||
@ -276,8 +281,7 @@ void tst_QProcess::simpleStart()
|
|||||||
QCOMPARE(process->state(), QProcess::Running);
|
QCOMPARE(process->state(), QProcess::Running);
|
||||||
QTRY_COMPARE(process->state(), QProcess::NotRunning);
|
QTRY_COMPARE(process->state(), QProcess::NotRunning);
|
||||||
|
|
||||||
delete process;
|
process.reset();
|
||||||
process = 0;
|
|
||||||
|
|
||||||
QCOMPARE(spy.count(), 3);
|
QCOMPARE(spy.count(), 3);
|
||||||
QCOMPARE(qvariant_cast<QProcess::ProcessState>(spy.at(0).at(0)), QProcess::Starting);
|
QCOMPARE(qvariant_cast<QProcess::ProcessState>(spy.at(0).at(0)), QProcess::Starting);
|
||||||
@ -340,18 +344,20 @@ void tst_QProcess::startDetached()
|
|||||||
|
|
||||||
void tst_QProcess::readFromProcess()
|
void tst_QProcess::readFromProcess()
|
||||||
{
|
{
|
||||||
|
QProcess *process = qobject_cast<QProcess *>(sender());
|
||||||
|
QVERIFY(process);
|
||||||
int lines = 0;
|
int lines = 0;
|
||||||
while (process->canReadLine()) {
|
while (process->canReadLine()) {
|
||||||
++lines;
|
++lines;
|
||||||
QByteArray line = process->readLine();
|
process->readLine();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QProcess::crashTest()
|
void tst_QProcess::crashTest()
|
||||||
{
|
{
|
||||||
qRegisterMetaType<QProcess::ProcessState>("QProcess::ProcessState");
|
qRegisterMetaType<QProcess::ProcessState>("QProcess::ProcessState");
|
||||||
process = new QProcess;
|
QScopedPointer<QProcess> process(new QProcess);
|
||||||
QSignalSpy stateSpy(process, &QProcess::stateChanged);
|
QSignalSpy stateSpy(process.data(), &QProcess::stateChanged);
|
||||||
QVERIFY(stateSpy.isValid());
|
QVERIFY(stateSpy.isValid());
|
||||||
process->start("testProcessCrash/testProcessCrash");
|
process->start("testProcessCrash/testProcessCrash");
|
||||||
QVERIFY(process->waitForStarted(5000));
|
QVERIFY(process->waitForStarted(5000));
|
||||||
@ -359,9 +365,9 @@ void tst_QProcess::crashTest()
|
|||||||
qRegisterMetaType<QProcess::ProcessError>("QProcess::ProcessError");
|
qRegisterMetaType<QProcess::ProcessError>("QProcess::ProcessError");
|
||||||
qRegisterMetaType<QProcess::ExitStatus>("QProcess::ExitStatus");
|
qRegisterMetaType<QProcess::ExitStatus>("QProcess::ExitStatus");
|
||||||
|
|
||||||
QSignalSpy spy(process, &QProcess::errorOccurred);
|
QSignalSpy spy(process.data(), &QProcess::errorOccurred);
|
||||||
QSignalSpy spy2(process, static_cast<QProcessErrorSignal>(&QProcess::error));
|
QSignalSpy spy2(process.data(), static_cast<QProcessErrorSignal>(&QProcess::error));
|
||||||
QSignalSpy spy3(process, static_cast<QProcessFinishedSignal2>(&QProcess::finished));
|
QSignalSpy spy3(process.data(), static_cast<QProcessFinishedSignal2>(&QProcess::finished));
|
||||||
|
|
||||||
QVERIFY(spy.isValid());
|
QVERIFY(spy.isValid());
|
||||||
QVERIFY(spy2.isValid());
|
QVERIFY(spy2.isValid());
|
||||||
@ -380,8 +386,8 @@ void tst_QProcess::crashTest()
|
|||||||
|
|
||||||
QCOMPARE(process->exitStatus(), QProcess::CrashExit);
|
QCOMPARE(process->exitStatus(), QProcess::CrashExit);
|
||||||
|
|
||||||
delete process;
|
// delete process;
|
||||||
process = 0;
|
process.reset();
|
||||||
|
|
||||||
QCOMPARE(stateSpy.count(), 3);
|
QCOMPARE(stateSpy.count(), 3);
|
||||||
QCOMPARE(qvariant_cast<QProcess::ProcessState>(stateSpy.at(0).at(0)), QProcess::Starting);
|
QCOMPARE(qvariant_cast<QProcess::ProcessState>(stateSpy.at(0).at(0)), QProcess::Starting);
|
||||||
@ -391,20 +397,20 @@ void tst_QProcess::crashTest()
|
|||||||
|
|
||||||
void tst_QProcess::crashTest2()
|
void tst_QProcess::crashTest2()
|
||||||
{
|
{
|
||||||
process = new QProcess;
|
QProcess process;
|
||||||
process->start("testProcessCrash/testProcessCrash");
|
process.start("testProcessCrash/testProcessCrash");
|
||||||
QVERIFY(process->waitForStarted(5000));
|
QVERIFY(process.waitForStarted(5000));
|
||||||
|
|
||||||
qRegisterMetaType<QProcess::ProcessError>("QProcess::ProcessError");
|
qRegisterMetaType<QProcess::ProcessError>("QProcess::ProcessError");
|
||||||
qRegisterMetaType<QProcess::ExitStatus>("QProcess::ExitStatus");
|
qRegisterMetaType<QProcess::ExitStatus>("QProcess::ExitStatus");
|
||||||
|
|
||||||
QSignalSpy spy(process, static_cast<QProcessErrorSignal>(&QProcess::errorOccurred));
|
QSignalSpy spy(&process, static_cast<QProcessErrorSignal>(&QProcess::errorOccurred));
|
||||||
QSignalSpy spy2(process, static_cast<QProcessFinishedSignal2>(&QProcess::finished));
|
QSignalSpy spy2(&process, static_cast<QProcessFinishedSignal2>(&QProcess::finished));
|
||||||
|
|
||||||
QVERIFY(spy.isValid());
|
QVERIFY(spy.isValid());
|
||||||
QVERIFY(spy2.isValid());
|
QVERIFY(spy2.isValid());
|
||||||
|
|
||||||
QObject::connect(process, static_cast<QProcessFinishedSignal1>(&QProcess::finished),
|
QObject::connect(&process, static_cast<QProcessFinishedSignal1>(&QProcess::finished),
|
||||||
this, &tst_QProcess::exitLoopSlot);
|
this, &tst_QProcess::exitLoopSlot);
|
||||||
|
|
||||||
QTestEventLoop::instance().enterLoop(30);
|
QTestEventLoop::instance().enterLoop(30);
|
||||||
@ -417,10 +423,7 @@ void tst_QProcess::crashTest2()
|
|||||||
QCOMPARE(spy2.count(), 1);
|
QCOMPARE(spy2.count(), 1);
|
||||||
QCOMPARE(*static_cast<const QProcess::ExitStatus *>(spy2.at(0).at(1).constData()), QProcess::CrashExit);
|
QCOMPARE(*static_cast<const QProcess::ExitStatus *>(spy2.at(0).at(1).constData()), QProcess::CrashExit);
|
||||||
|
|
||||||
QCOMPARE(process->exitStatus(), QProcess::CrashExit);
|
QCOMPARE(process.exitStatus(), QProcess::CrashExit);
|
||||||
|
|
||||||
delete process;
|
|
||||||
process = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef Q_OS_WINCE
|
#ifndef Q_OS_WINCE
|
||||||
@ -443,24 +446,24 @@ void tst_QProcess::echoTest()
|
|||||||
{
|
{
|
||||||
QFETCH(QByteArray, input);
|
QFETCH(QByteArray, input);
|
||||||
|
|
||||||
process = new QProcess;
|
QProcess process;
|
||||||
connect(process, &QIODevice::readyRead, this, &tst_QProcess::exitLoopSlot);
|
connect(&process, &QIODevice::readyRead, this, &tst_QProcess::exitLoopSlot);
|
||||||
|
|
||||||
process->start("testProcessEcho/testProcessEcho");
|
process.start("testProcessEcho/testProcessEcho");
|
||||||
QVERIFY(process->waitForStarted(5000));
|
QVERIFY(process.waitForStarted(5000));
|
||||||
|
|
||||||
process->write(input);
|
process.write(input);
|
||||||
|
|
||||||
QTime stopWatch;
|
QTime stopWatch;
|
||||||
stopWatch.start();
|
stopWatch.start();
|
||||||
do {
|
do {
|
||||||
QVERIFY(process->isOpen());
|
QVERIFY(process.isOpen());
|
||||||
QTestEventLoop::instance().enterLoop(2);
|
QTestEventLoop::instance().enterLoop(2);
|
||||||
} while (stopWatch.elapsed() < 60000 && process->bytesAvailable() < input.size());
|
} while (stopWatch.elapsed() < 60000 && process.bytesAvailable() < input.size());
|
||||||
if (stopWatch.elapsed() >= 60000)
|
if (stopWatch.elapsed() >= 60000)
|
||||||
QFAIL("Timed out");
|
QFAIL("Timed out");
|
||||||
|
|
||||||
QByteArray message = process->readAll();
|
QByteArray message = process.readAll();
|
||||||
QCOMPARE(message.size(), input.size());
|
QCOMPARE(message.size(), input.size());
|
||||||
|
|
||||||
char *c1 = message.data();
|
char *c1 = message.data();
|
||||||
@ -473,13 +476,9 @@ void tst_QProcess::echoTest()
|
|||||||
}
|
}
|
||||||
QCOMPARE(*c1, *c2);
|
QCOMPARE(*c1, *c2);
|
||||||
|
|
||||||
process->write("", 1);
|
process.write("", 1);
|
||||||
|
|
||||||
QVERIFY(process->waitForFinished(5000));
|
QVERIFY(process.waitForFinished(5000));
|
||||||
|
|
||||||
|
|
||||||
delete process;
|
|
||||||
process = 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -493,17 +492,17 @@ void tst_QProcess::exitLoopSlot()
|
|||||||
void tst_QProcess::echoTest2()
|
void tst_QProcess::echoTest2()
|
||||||
{
|
{
|
||||||
|
|
||||||
process = new QProcess;
|
QProcess process;
|
||||||
connect(process, &QIODevice::readyRead, this, &tst_QProcess::exitLoopSlot);
|
connect(&process, &QIODevice::readyRead, this, &tst_QProcess::exitLoopSlot);
|
||||||
|
|
||||||
process->start("testProcessEcho2/testProcessEcho2");
|
process.start("testProcessEcho2/testProcessEcho2");
|
||||||
QVERIFY(process->waitForStarted(5000));
|
QVERIFY(process.waitForStarted(5000));
|
||||||
QVERIFY(!process->waitForReadyRead(250));
|
QVERIFY(!process.waitForReadyRead(250));
|
||||||
QCOMPARE(process->error(), QProcess::Timedout);
|
QCOMPARE(process.error(), QProcess::Timedout);
|
||||||
|
|
||||||
process->write("Hello");
|
process.write("Hello");
|
||||||
QSignalSpy spy1(process, &QProcess::readyReadStandardOutput);
|
QSignalSpy spy1(&process, &QProcess::readyReadStandardOutput);
|
||||||
QSignalSpy spy2(process, &QProcess::readyReadStandardError);
|
QSignalSpy spy2(&process, &QProcess::readyReadStandardError);
|
||||||
|
|
||||||
QVERIFY(spy1.isValid());
|
QVERIFY(spy1.isValid());
|
||||||
QVERIFY(spy2.isValid());
|
QVERIFY(spy2.isValid());
|
||||||
@ -514,11 +513,11 @@ void tst_QProcess::echoTest2()
|
|||||||
QTestEventLoop::instance().enterLoop(1);
|
QTestEventLoop::instance().enterLoop(1);
|
||||||
if (stopWatch.elapsed() >= 30000)
|
if (stopWatch.elapsed() >= 30000)
|
||||||
QFAIL("Timed out");
|
QFAIL("Timed out");
|
||||||
process->setReadChannel(QProcess::StandardOutput);
|
process.setReadChannel(QProcess::StandardOutput);
|
||||||
qint64 baso = process->bytesAvailable();
|
qint64 baso = process.bytesAvailable();
|
||||||
|
|
||||||
process->setReadChannel(QProcess::StandardError);
|
process.setReadChannel(QProcess::StandardError);
|
||||||
qint64 base = process->bytesAvailable();
|
qint64 base = process.bytesAvailable();
|
||||||
if (baso == 5 && base == 5)
|
if (baso == 5 && base == 5)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -526,14 +525,11 @@ void tst_QProcess::echoTest2()
|
|||||||
QVERIFY(spy1.count() > 0);
|
QVERIFY(spy1.count() > 0);
|
||||||
QVERIFY(spy2.count() > 0);
|
QVERIFY(spy2.count() > 0);
|
||||||
|
|
||||||
QCOMPARE(process->readAllStandardOutput(), QByteArray("Hello"));
|
QCOMPARE(process.readAllStandardOutput(), QByteArray("Hello"));
|
||||||
QCOMPARE(process->readAllStandardError(), QByteArray("Hello"));
|
QCOMPARE(process.readAllStandardError(), QByteArray("Hello"));
|
||||||
|
|
||||||
process->write("", 1);
|
process.write("", 1);
|
||||||
QVERIFY(process->waitForFinished(5000));
|
QVERIFY(process.waitForFinished(5000));
|
||||||
|
|
||||||
delete process;
|
|
||||||
process = 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -621,21 +617,18 @@ void tst_QProcess::exitStatus_data()
|
|||||||
|
|
||||||
void tst_QProcess::exitStatus()
|
void tst_QProcess::exitStatus()
|
||||||
{
|
{
|
||||||
process = new QProcess;
|
QProcess process;
|
||||||
QFETCH(QStringList, processList);
|
QFETCH(QStringList, processList);
|
||||||
QFETCH(QList<QProcess::ExitStatus>, exitStatus);
|
QFETCH(QList<QProcess::ExitStatus>, exitStatus);
|
||||||
|
|
||||||
QCOMPARE(exitStatus.count(), processList.count());
|
QCOMPARE(exitStatus.count(), processList.count());
|
||||||
for (int i = 0; i < processList.count(); ++i) {
|
for (int i = 0; i < processList.count(); ++i) {
|
||||||
process->start(processList.at(i));
|
process.start(processList.at(i));
|
||||||
QVERIFY(process->waitForStarted(5000));
|
QVERIFY(process.waitForStarted(5000));
|
||||||
QVERIFY(process->waitForFinished(30000));
|
QVERIFY(process.waitForFinished(30000));
|
||||||
|
|
||||||
QCOMPARE(process->exitStatus(), exitStatus.at(i));
|
QCOMPARE(process.exitStatus(), exitStatus.at(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
process->deleteLater();
|
|
||||||
process = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef Q_OS_WINCE
|
#ifndef Q_OS_WINCE
|
||||||
@ -643,23 +636,20 @@ void tst_QProcess::exitStatus()
|
|||||||
void tst_QProcess::loopBackTest()
|
void tst_QProcess::loopBackTest()
|
||||||
{
|
{
|
||||||
|
|
||||||
process = new QProcess;
|
QProcess process;
|
||||||
process->start("testProcessEcho/testProcessEcho");
|
process.start("testProcessEcho/testProcessEcho");
|
||||||
QVERIFY(process->waitForStarted(5000));
|
QVERIFY(process.waitForStarted(5000));
|
||||||
|
|
||||||
for (int i = 0; i < 100; ++i) {
|
for (int i = 0; i < 100; ++i) {
|
||||||
process->write("Hello");
|
process.write("Hello");
|
||||||
do {
|
do {
|
||||||
QVERIFY(process->waitForReadyRead(5000));
|
QVERIFY(process.waitForReadyRead(5000));
|
||||||
} while (process->bytesAvailable() < 5);
|
} while (process.bytesAvailable() < 5);
|
||||||
QCOMPARE(process->readAll(), QByteArray("Hello"));
|
QCOMPARE(process.readAll(), QByteArray("Hello"));
|
||||||
}
|
}
|
||||||
|
|
||||||
process->write("", 1);
|
process.write("", 1);
|
||||||
QVERIFY(process->waitForFinished(5000));
|
QVERIFY(process.waitForFinished(5000));
|
||||||
|
|
||||||
delete process;
|
|
||||||
process = 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -668,35 +658,32 @@ void tst_QProcess::loopBackTest()
|
|||||||
void tst_QProcess::readTimeoutAndThenCrash()
|
void tst_QProcess::readTimeoutAndThenCrash()
|
||||||
{
|
{
|
||||||
|
|
||||||
process = new QProcess;
|
QProcess process;
|
||||||
process->start("testProcessEcho/testProcessEcho");
|
process.start("testProcessEcho/testProcessEcho");
|
||||||
if (process->state() != QProcess::Starting)
|
if (process.state() != QProcess::Starting)
|
||||||
QCOMPARE(process->state(), QProcess::Running);
|
QCOMPARE(process.state(), QProcess::Running);
|
||||||
|
|
||||||
QVERIFY(process->waitForStarted(5000));
|
QVERIFY(process.waitForStarted(5000));
|
||||||
QCOMPARE(process->state(), QProcess::Running);
|
QCOMPARE(process.state(), QProcess::Running);
|
||||||
|
|
||||||
QVERIFY(!process->waitForReadyRead(5000));
|
QVERIFY(!process.waitForReadyRead(5000));
|
||||||
QCOMPARE(process->error(), QProcess::Timedout);
|
QCOMPARE(process.error(), QProcess::Timedout);
|
||||||
|
|
||||||
qRegisterMetaType<QProcess::ProcessError>("QProcess::ProcessError");
|
qRegisterMetaType<QProcess::ProcessError>("QProcess::ProcessError");
|
||||||
QSignalSpy spy(process, &QProcess::errorOccurred);
|
QSignalSpy spy(&process, &QProcess::errorOccurred);
|
||||||
QSignalSpy spy2(process, static_cast<QProcessErrorSignal>(&QProcess::error));
|
QSignalSpy spy2(&process, static_cast<QProcessErrorSignal>(&QProcess::error));
|
||||||
QVERIFY(spy.isValid());
|
QVERIFY(spy.isValid());
|
||||||
QVERIFY(spy2.isValid());
|
QVERIFY(spy2.isValid());
|
||||||
|
|
||||||
process->kill();
|
process.kill();
|
||||||
|
|
||||||
QVERIFY(process->waitForFinished(5000));
|
QVERIFY(process.waitForFinished(5000));
|
||||||
QCOMPARE(process->state(), QProcess::NotRunning);
|
QCOMPARE(process.state(), QProcess::NotRunning);
|
||||||
|
|
||||||
QCOMPARE(spy.count(), 1);
|
QCOMPARE(spy.count(), 1);
|
||||||
QCOMPARE(*static_cast<const QProcess::ProcessError *>(spy.at(0).at(0).constData()), QProcess::Crashed);
|
QCOMPARE(*static_cast<const QProcess::ProcessError *>(spy.at(0).at(0).constData()), QProcess::Crashed);
|
||||||
QCOMPARE(spy2.count(), 1);
|
QCOMPARE(spy2.count(), 1);
|
||||||
QCOMPARE(*static_cast<const QProcess::ProcessError *>(spy2.at(0).at(0).constData()), QProcess::Crashed);
|
QCOMPARE(*static_cast<const QProcess::ProcessError *>(spy2.at(0).at(0).constData()), QProcess::Crashed);
|
||||||
|
|
||||||
delete process;
|
|
||||||
process = 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -754,24 +741,25 @@ void tst_QProcess::restartProcessDeadlock()
|
|||||||
// The purpose of this test is to detect whether restarting a
|
// The purpose of this test is to detect whether restarting a
|
||||||
// process in the finished() connected slot causes a deadlock
|
// process in the finished() connected slot causes a deadlock
|
||||||
// because of the way QProcessManager uses its locks.
|
// because of the way QProcessManager uses its locks.
|
||||||
QProcess proc;
|
QProcess process;
|
||||||
process = &proc;
|
connect(&process, static_cast<QProcessFinishedSignal1>(&QProcess::finished),
|
||||||
connect(process, static_cast<QProcessFinishedSignal1>(&QProcess::finished),
|
|
||||||
this, &tst_QProcess::restartProcess);
|
this, &tst_QProcess::restartProcess);
|
||||||
|
|
||||||
process->start("testProcessEcho/testProcessEcho");
|
process.start("testProcessEcho/testProcessEcho");
|
||||||
|
|
||||||
QCOMPARE(process->write("", 1), qlonglong(1));
|
QCOMPARE(process.write("", 1), qlonglong(1));
|
||||||
QVERIFY(process->waitForFinished(5000));
|
QVERIFY(process.waitForFinished(5000));
|
||||||
|
|
||||||
QObject::disconnect(process, static_cast<QProcessFinishedSignal1>(&QProcess::finished), Q_NULLPTR, Q_NULLPTR);
|
QObject::disconnect(&process, static_cast<QProcessFinishedSignal1>(&QProcess::finished), Q_NULLPTR, Q_NULLPTR);
|
||||||
|
|
||||||
QCOMPARE(process->write("", 1), qlonglong(1));
|
QCOMPARE(process.write("", 1), qlonglong(1));
|
||||||
QVERIFY(process->waitForFinished(5000));
|
QVERIFY(process.waitForFinished(5000));
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QProcess::restartProcess()
|
void tst_QProcess::restartProcess()
|
||||||
{
|
{
|
||||||
|
QProcess *process = qobject_cast<QProcess *>(sender());
|
||||||
|
QVERIFY(process);
|
||||||
process->start("testProcessEcho/testProcessEcho");
|
process->start("testProcessEcho/testProcessEcho");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1245,19 +1233,16 @@ void tst_QProcess::processesInMultipleThreads()
|
|||||||
// Reading and writing to a process is not supported on Qt/CE
|
// Reading and writing to a process is not supported on Qt/CE
|
||||||
void tst_QProcess::waitForFinishedWithTimeout()
|
void tst_QProcess::waitForFinishedWithTimeout()
|
||||||
{
|
{
|
||||||
process = new QProcess(this);
|
QProcess process;
|
||||||
|
|
||||||
process->start("testProcessEcho/testProcessEcho");
|
process.start("testProcessEcho/testProcessEcho");
|
||||||
|
|
||||||
QVERIFY(process->waitForStarted(5000));
|
QVERIFY(process.waitForStarted(5000));
|
||||||
QVERIFY(!process->waitForFinished(1));
|
QVERIFY(!process.waitForFinished(1));
|
||||||
|
|
||||||
process->write("", 1);
|
process.write("", 1);
|
||||||
|
|
||||||
QVERIFY(process->waitForFinished());
|
QVERIFY(process.waitForFinished());
|
||||||
|
|
||||||
delete process;
|
|
||||||
process = 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1265,28 +1250,26 @@ void tst_QProcess::waitForFinishedWithTimeout()
|
|||||||
// Reading and writing to a process is not supported on Qt/CE
|
// Reading and writing to a process is not supported on Qt/CE
|
||||||
void tst_QProcess::waitForReadyReadInAReadyReadSlot()
|
void tst_QProcess::waitForReadyReadInAReadyReadSlot()
|
||||||
{
|
{
|
||||||
process = new QProcess(this);
|
QProcess process;
|
||||||
connect(process, &QIODevice::readyRead, this, &tst_QProcess::waitForReadyReadInAReadyReadSlotSlot);
|
connect(&process, &QIODevice::readyRead, this, &tst_QProcess::waitForReadyReadInAReadyReadSlotSlot);
|
||||||
connect(process, static_cast<QProcessFinishedSignal1>(&QProcess::finished),
|
connect(&process, static_cast<QProcessFinishedSignal1>(&QProcess::finished),
|
||||||
this, &tst_QProcess::exitLoopSlot);
|
this, &tst_QProcess::exitLoopSlot);
|
||||||
bytesAvailable = 0;
|
bytesAvailable = 0;
|
||||||
|
|
||||||
process->start("testProcessEcho/testProcessEcho");
|
process.start("testProcessEcho/testProcessEcho");
|
||||||
QVERIFY(process->waitForStarted(5000));
|
QVERIFY(process.waitForStarted(5000));
|
||||||
|
|
||||||
QSignalSpy spy(process, &QProcess::readyRead);
|
QSignalSpy spy(&process, &QProcess::readyRead);
|
||||||
QVERIFY(spy.isValid());
|
QVERIFY(spy.isValid());
|
||||||
process->write("foo");
|
process.write("foo");
|
||||||
QTestEventLoop::instance().enterLoop(30);
|
QTestEventLoop::instance().enterLoop(30);
|
||||||
QVERIFY(!QTestEventLoop::instance().timeout());
|
QVERIFY(!QTestEventLoop::instance().timeout());
|
||||||
|
|
||||||
QCOMPARE(spy.count(), 1);
|
QCOMPARE(spy.count(), 1);
|
||||||
|
|
||||||
process->disconnect();
|
process.disconnect();
|
||||||
QVERIFY(process->waitForFinished(5000));
|
QVERIFY(process.waitForFinished(5000));
|
||||||
QVERIFY(process->bytesAvailable() > bytesAvailable);
|
QVERIFY(process.bytesAvailable() > bytesAvailable);
|
||||||
delete process;
|
|
||||||
process = 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1294,6 +1277,8 @@ void tst_QProcess::waitForReadyReadInAReadyReadSlot()
|
|||||||
// Reading and writing to a process is not supported on Qt/CE
|
// Reading and writing to a process is not supported on Qt/CE
|
||||||
void tst_QProcess::waitForReadyReadInAReadyReadSlotSlot()
|
void tst_QProcess::waitForReadyReadInAReadyReadSlotSlot()
|
||||||
{
|
{
|
||||||
|
QProcess *process = qobject_cast<QProcess *>(sender());
|
||||||
|
QVERIFY(process);
|
||||||
bytesAvailable = process->bytesAvailable();
|
bytesAvailable = process->bytesAvailable();
|
||||||
process->write("bar", 4);
|
process->write("bar", 4);
|
||||||
QVERIFY(process->waitForReadyRead(5000));
|
QVERIFY(process->waitForReadyRead(5000));
|
||||||
@ -1305,25 +1290,23 @@ void tst_QProcess::waitForReadyReadInAReadyReadSlotSlot()
|
|||||||
// Reading and writing to a process is not supported on Qt/CE
|
// Reading and writing to a process is not supported on Qt/CE
|
||||||
void tst_QProcess::waitForBytesWrittenInABytesWrittenSlot()
|
void tst_QProcess::waitForBytesWrittenInABytesWrittenSlot()
|
||||||
{
|
{
|
||||||
process = new QProcess(this);
|
QProcess process;
|
||||||
connect(process, &QIODevice::bytesWritten, this, &tst_QProcess::waitForBytesWrittenInABytesWrittenSlotSlot);
|
connect(&process, &QIODevice::bytesWritten, this, &tst_QProcess::waitForBytesWrittenInABytesWrittenSlotSlot);
|
||||||
bytesAvailable = 0;
|
bytesAvailable = 0;
|
||||||
|
|
||||||
process->start("testProcessEcho/testProcessEcho");
|
process.start("testProcessEcho/testProcessEcho");
|
||||||
QVERIFY(process->waitForStarted(5000));
|
QVERIFY(process.waitForStarted(5000));
|
||||||
|
|
||||||
QSignalSpy spy(process, &QProcess::bytesWritten);
|
QSignalSpy spy(&process, &QProcess::bytesWritten);
|
||||||
QVERIFY(spy.isValid());
|
QVERIFY(spy.isValid());
|
||||||
process->write("f");
|
process.write("f");
|
||||||
QTestEventLoop::instance().enterLoop(30);
|
QTestEventLoop::instance().enterLoop(30);
|
||||||
QVERIFY(!QTestEventLoop::instance().timeout());
|
QVERIFY(!QTestEventLoop::instance().timeout());
|
||||||
|
|
||||||
QCOMPARE(spy.count(), 1);
|
QCOMPARE(spy.count(), 1);
|
||||||
process->write("", 1);
|
process.write("", 1);
|
||||||
process->disconnect();
|
process.disconnect();
|
||||||
QVERIFY(process->waitForFinished());
|
QVERIFY(process.waitForFinished());
|
||||||
delete process;
|
|
||||||
process = 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1331,6 +1314,8 @@ void tst_QProcess::waitForBytesWrittenInABytesWrittenSlot()
|
|||||||
// Reading and writing to a process is not supported on Qt/CE
|
// Reading and writing to a process is not supported on Qt/CE
|
||||||
void tst_QProcess::waitForBytesWrittenInABytesWrittenSlotSlot()
|
void tst_QProcess::waitForBytesWrittenInABytesWrittenSlotSlot()
|
||||||
{
|
{
|
||||||
|
QProcess *process = qobject_cast<QProcess *>(sender());
|
||||||
|
QVERIFY(process);
|
||||||
process->write("b");
|
process->write("b");
|
||||||
QVERIFY(process->waitForBytesWritten(5000));
|
QVERIFY(process->waitForBytesWritten(5000));
|
||||||
QTestEventLoop::instance().exitLoop();
|
QTestEventLoop::instance().exitLoop();
|
||||||
@ -1399,11 +1384,11 @@ void tst_QProcess::spaceArgsTest()
|
|||||||
<< QString::fromLatin1("testProcessSpacesArgs/one space")
|
<< QString::fromLatin1("testProcessSpacesArgs/one space")
|
||||||
<< QString::fromLatin1("testProcessSpacesArgs/two space s");
|
<< QString::fromLatin1("testProcessSpacesArgs/two space s");
|
||||||
|
|
||||||
process = new QProcess(this);
|
QProcess process;
|
||||||
|
|
||||||
for (int i = 0; i < programs.size(); ++i) {
|
for (int i = 0; i < programs.size(); ++i) {
|
||||||
QString program = programs.at(i);
|
QString program = programs.at(i);
|
||||||
process->start(program, args);
|
process.start(program, args);
|
||||||
|
|
||||||
#if defined(Q_OS_WINCE)
|
#if defined(Q_OS_WINCE)
|
||||||
const int timeOutMS = 10000;
|
const int timeOutMS = 10000;
|
||||||
@ -1411,14 +1396,14 @@ void tst_QProcess::spaceArgsTest()
|
|||||||
const int timeOutMS = 5000;
|
const int timeOutMS = 5000;
|
||||||
#endif
|
#endif
|
||||||
QByteArray errorMessage;
|
QByteArray errorMessage;
|
||||||
bool started = process->waitForStarted(timeOutMS);
|
bool started = process.waitForStarted(timeOutMS);
|
||||||
if (!started)
|
if (!started)
|
||||||
errorMessage = startFailMessage(program, *process);
|
errorMessage = startFailMessage(program, process);
|
||||||
QVERIFY2(started, errorMessage.constData());
|
QVERIFY2(started, errorMessage.constData());
|
||||||
QVERIFY(process->waitForFinished(timeOutMS));
|
QVERIFY(process.waitForFinished(timeOutMS));
|
||||||
|
|
||||||
#if !defined(Q_OS_WINCE)
|
#if !defined(Q_OS_WINCE)
|
||||||
QStringList actual = QString::fromLatin1(process->readAll()).split("|");
|
QStringList actual = QString::fromLatin1(process.readAll()).split("|");
|
||||||
#endif
|
#endif
|
||||||
#if !defined(Q_OS_WINCE)
|
#if !defined(Q_OS_WINCE)
|
||||||
QVERIFY(!actual.isEmpty());
|
QVERIFY(!actual.isEmpty());
|
||||||
@ -1435,16 +1420,16 @@ void tst_QProcess::spaceArgsTest()
|
|||||||
program += QString::fromLatin1(" ") + stringArgs;
|
program += QString::fromLatin1(" ") + stringArgs;
|
||||||
|
|
||||||
errorMessage.clear();
|
errorMessage.clear();
|
||||||
process->start(program);
|
process.start(program);
|
||||||
started = process->waitForStarted(5000);
|
started = process.waitForStarted(5000);
|
||||||
if (!started)
|
if (!started)
|
||||||
errorMessage = startFailMessage(program, *process);
|
errorMessage = startFailMessage(program, process);
|
||||||
|
|
||||||
QVERIFY2(started, errorMessage.constData());
|
QVERIFY2(started, errorMessage.constData());
|
||||||
QVERIFY(process->waitForFinished(5000));
|
QVERIFY(process.waitForFinished(5000));
|
||||||
|
|
||||||
#if !defined(Q_OS_WINCE)
|
#if !defined(Q_OS_WINCE)
|
||||||
actual = QString::fromLatin1(process->readAll()).split("|");
|
actual = QString::fromLatin1(process.readAll()).split("|");
|
||||||
#endif
|
#endif
|
||||||
#if !defined(Q_OS_WINCE)
|
#if !defined(Q_OS_WINCE)
|
||||||
QVERIFY(!actual.isEmpty());
|
QVERIFY(!actual.isEmpty());
|
||||||
@ -1454,9 +1439,6 @@ void tst_QProcess::spaceArgsTest()
|
|||||||
QCOMPARE(actual, args);
|
QCOMPARE(actual, args);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
delete process;
|
|
||||||
process = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(Q_OS_WIN)
|
#if defined(Q_OS_WIN)
|
||||||
@ -2230,38 +2212,32 @@ void tst_QProcess::discardUnwantedOutput()
|
|||||||
// Windows CE does not support working directory logic
|
// Windows CE does not support working directory logic
|
||||||
void tst_QProcess::setWorkingDirectory()
|
void tst_QProcess::setWorkingDirectory()
|
||||||
{
|
{
|
||||||
process = new QProcess;
|
QProcess process;
|
||||||
process->setWorkingDirectory("test");
|
process.setWorkingDirectory("test");
|
||||||
|
|
||||||
// use absolute path because on Windows, the executable is relative to the parent's CWD
|
// use absolute path because on Windows, the executable is relative to the parent's CWD
|
||||||
// while on Unix with fork it's relative to the child's (with posix_spawn, it could be either).
|
// while on Unix with fork it's relative to the child's (with posix_spawn, it could be either).
|
||||||
process->start(QFileInfo("testSetWorkingDirectory/testSetWorkingDirectory").absoluteFilePath());
|
process.start(QFileInfo("testSetWorkingDirectory/testSetWorkingDirectory").absoluteFilePath());
|
||||||
|
|
||||||
QVERIFY2(process->waitForFinished(), process->errorString().toLocal8Bit());
|
QVERIFY2(process.waitForFinished(), process.errorString().toLocal8Bit());
|
||||||
|
|
||||||
QByteArray workingDir = process->readAllStandardOutput();
|
QByteArray workingDir = process.readAllStandardOutput();
|
||||||
QCOMPARE(QDir("test").canonicalPath(), QDir(workingDir.constData()).canonicalPath());
|
QCOMPARE(QDir("test").canonicalPath(), QDir(workingDir.constData()).canonicalPath());
|
||||||
|
|
||||||
delete process;
|
|
||||||
process = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QProcess::setNonExistentWorkingDirectory()
|
void tst_QProcess::setNonExistentWorkingDirectory()
|
||||||
{
|
{
|
||||||
process = new QProcess;
|
QProcess process;
|
||||||
process->setWorkingDirectory("this/directory/should/not/exist/for/sure");
|
process.setWorkingDirectory("this/directory/should/not/exist/for/sure");
|
||||||
|
|
||||||
// use absolute path because on Windows, the executable is relative to the parent's CWD
|
// use absolute path because on Windows, the executable is relative to the parent's CWD
|
||||||
// while on Unix with fork it's relative to the child's (with posix_spawn, it could be either).
|
// while on Unix with fork it's relative to the child's (with posix_spawn, it could be either).
|
||||||
process->start(QFileInfo("testSetWorkingDirectory/testSetWorkingDirectory").absoluteFilePath());
|
process.start(QFileInfo("testSetWorkingDirectory/testSetWorkingDirectory").absoluteFilePath());
|
||||||
QVERIFY(!process->waitForFinished());
|
QVERIFY(!process.waitForFinished());
|
||||||
#ifdef QPROCESS_USE_SPAWN
|
#ifdef QPROCESS_USE_SPAWN
|
||||||
QEXPECT_FAIL("", "QProcess cannot detect failure to start when using posix_spawn()", Continue);
|
QEXPECT_FAIL("", "QProcess cannot detect failure to start when using posix_spawn()", Continue);
|
||||||
#endif
|
#endif
|
||||||
QCOMPARE(int(process->error()), int(QProcess::FailedToStart));
|
QCOMPARE(int(process.error()), int(QProcess::FailedToStart));
|
||||||
|
|
||||||
delete process;
|
|
||||||
process = 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user