Process: Add a test for waitForReadyRead on error channel

Currently it works only in case of ProcessLaucher implementation.
The issue with QProcess implementation is that we need to
select the active channel in advance with QProcess::setReadChannel(),
what really doesn't make sense, since we can't predict on which
channel we will receive the data.

Currently we don't have setReadChannel() method inside Process API.

Change-Id: I23592e37f2ed5e3326bead445a9c6c6500d0e615
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Jarek Kobus
2023-12-06 16:19:54 +01:00
parent 2304dbb395
commit db4486e915

View File

@@ -120,6 +120,7 @@ private slots:
QCOMPARE(output.size() > 0, qoutput.size() > 0); QCOMPARE(output.size() > 0, qoutput.size() > 0);
} }
void multiRead_data();
void multiRead(); void multiRead();
void splitArgs_data(); void splitArgs_data();
void splitArgs(); void splitArgs();
@@ -182,7 +183,7 @@ private:
void tst_Process::initTestCase() void tst_Process::initTestCase()
{ {
msgHandler = new MessageHandler; msgHandler = new MessageHandler;
Utils::TemporaryDirectory::setMasterTemporaryDirectory(QDir::tempPath() + "/" TemporaryDirectory::setMasterTemporaryDirectory(QDir::tempPath() + "/"
+ Core::Constants::IDE_CASED_ID + "-XXXXXX"); + Core::Constants::IDE_CASED_ID + "-XXXXXX");
const QString libExecPath(qApp->applicationDirPath() + '/' const QString libExecPath(qApp->applicationDirPath() + '/'
+ QLatin1String(TEST_RELATIVE_LIBEXEC_PATH)); + QLatin1String(TEST_RELATIVE_LIBEXEC_PATH));
@@ -232,7 +233,7 @@ void tst_Process::initTestCase()
void tst_Process::cleanupTestCase() void tst_Process::cleanupTestCase()
{ {
Utils::Singleton::deleteAll(); Singleton::deleteAll();
const int destroyCount = msgHandler->destroyCount(); const int destroyCount = msgHandler->destroyCount();
delete msgHandler; delete msgHandler;
if (destroyCount) if (destroyCount)
@@ -241,32 +242,51 @@ void tst_Process::cleanupTestCase()
} }
Q_DECLARE_METATYPE(ProcessArgs::SplitError) Q_DECLARE_METATYPE(ProcessArgs::SplitError)
Q_DECLARE_METATYPE(Utils::OsType) Q_DECLARE_METATYPE(OsType)
Q_DECLARE_METATYPE(Utils::ProcessResult) Q_DECLARE_METATYPE(ProcessResult)
void tst_Process::multiRead_data()
{
QTest::addColumn<QProcess::ProcessChannel>("processChannel");
QTest::newRow("StandardOutput") << QProcess::StandardOutput;
QTest::newRow("StandardError") << QProcess::StandardError;
}
static QByteArray readData(Process *process, QProcess::ProcessChannel processChannel)
{
QByteArray buffer = processChannel == QProcess::StandardOutput
? process->readAllRawStandardOutput() : process->readAllRawStandardError();
buffer.replace("\r\n", "\n"); // Needed for Windows only
return buffer;
}
void tst_Process::multiRead() void tst_Process::multiRead()
{ {
SubProcessConfig subConfig(ProcessTestApp::ChannelEchoer::envVar(), {}); QFETCH(QProcess::ProcessChannel, processChannel);
SubProcessConfig subConfig(ProcessTestApp::ChannelEchoer::envVar(),
QString::number(int(processChannel)));
QByteArray buffer; QByteArray buffer;
Process process; Process process;
subConfig.setupSubProcess(&process); subConfig.setupSubProcess(&process);
process.setProcessMode(Utils::ProcessMode::Writer); // TODO: Fix ProcessImpl::QProcess
process.setProcessImpl(ProcessImpl::ProcessLauncher);
process.setProcessMode(ProcessMode::Writer);
process.start(); process.start();
QVERIFY(process.waitForStarted()); QVERIFY(process.waitForStarted());
process.writeRaw("hi\n"); process.writeRaw("hi\n");
QVERIFY(process.waitForReadyRead(1000)); QVERIFY(process.waitForReadyRead(1000));
buffer = process.readAllRawStandardOutput(); buffer = readData(&process, processChannel);
buffer.replace("\r\n", "\n"); // Needed for Windows only
QCOMPARE(buffer, QByteArray("hi\n")); QCOMPARE(buffer, QByteArray("hi\n"));
process.writeRaw("you\n"); process.writeRaw("you\n");
QVERIFY(process.waitForReadyRead(1000)); QVERIFY(process.waitForReadyRead(1000));
buffer = process.readAllRawStandardOutput(); buffer = readData(&process, processChannel);
buffer.replace("\r\n", "\n"); // Needed for Windows only
QCOMPARE(buffer, QByteArray("you\n")); QCOMPARE(buffer, QByteArray("you\n"));
process.writeRaw("exit\n"); process.writeRaw("exit\n");
@@ -278,7 +298,7 @@ void tst_Process::splitArgs_data()
QTest::addColumn<QString>("in"); QTest::addColumn<QString>("in");
QTest::addColumn<QString>("out"); QTest::addColumn<QString>("out");
QTest::addColumn<ProcessArgs::SplitError>("err"); QTest::addColumn<ProcessArgs::SplitError>("err");
QTest::addColumn<Utils::OsType>("os"); QTest::addColumn<OsType>("os");
static const struct { static const struct {
const char * const in; const char * const in;
@@ -335,7 +355,7 @@ void tst_Process::splitArgs()
QFETCH(QString, in); QFETCH(QString, in);
QFETCH(QString, out); QFETCH(QString, out);
QFETCH(ProcessArgs::SplitError, err); QFETCH(ProcessArgs::SplitError, err);
QFETCH(Utils::OsType, os); QFETCH(OsType, os);
ProcessArgs::SplitError outerr; ProcessArgs::SplitError outerr;
QString outstr = ProcessArgs::joinArgs(ProcessArgs::splitArgs(in, os, false, &outerr), os); QString outstr = ProcessArgs::joinArgs(ProcessArgs::splitArgs(in, os, false, &outerr), os);