diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-04-30 15:31:46 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-05-07 15:02:34 +0200 |
commit | 28ee554b37be39c03c231e7b857f71163dc6ea73 (patch) | |
tree | 4ec16a30d8bda651b585d2af526abe479d708f2e /tests | |
parent | 36b7c3cd2bee59964ea07e9677a5a789676f2eae (diff) |
QProcess/Win: drain output pipes on process finish
If a process dies before all output is read into the internal buffer
of QProcess, we might lose data. Therefore we must drain the output
pipes like we already do in the synchronous wait functions.
Task-number: QTBUG-30843
Change-Id: I8bbc5265275c9ebd33218ba600267ae87d93ed61
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/corelib/io/qprocess/tst_qprocess.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp index f01e319872..613bfd5c17 100644 --- a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp +++ b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp @@ -152,6 +152,7 @@ private slots: void invalidProgramString_data(); void invalidProgramString(); void onlyOneStartedSignal(); + void finishProcessBeforeReadingDone(); // keep these at the end, since they use lots of processes and sometimes // caused obscure failures to occur in tests that followed them (esp. on the Mac) @@ -2168,6 +2169,39 @@ void tst_QProcess::onlyOneStartedSignal() QCOMPARE(spyFinished.count(), 1); } +//----------------------------------------------------------------------------- + +class BlockOnReadStdOut : public QObject +{ + Q_OBJECT +public: + BlockOnReadStdOut(QProcess *process) + { + connect(process, SIGNAL(readyReadStandardOutput()), SLOT(block())); + } + +public slots: + void block() + { + QThread::sleep(1); + } +}; + +void tst_QProcess::finishProcessBeforeReadingDone() +{ + QProcess process; + BlockOnReadStdOut blocker(&process); + QEventLoop loop; + connect(&process, SIGNAL(finished(int)), &loop, SLOT(quit())); + process.start("testProcessOutput/testProcessOutput"); + QVERIFY(process.waitForStarted()); + loop.exec(); + QStringList lines = QString::fromLocal8Bit(process.readAllStandardOutput()).split( + QRegExp(QStringLiteral("[\r\n]")), QString::SkipEmptyParts); + QVERIFY(!lines.isEmpty()); + QCOMPARE(lines.last(), QStringLiteral("10239 -this is a number")); +} + #endif //QT_NO_PROCESS QTEST_MAIN(tst_QProcess) |