From a3f2ddc230b874b2e83d62eb702b3611a13761f6 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 19 Sep 2023 15:25:05 -0700 Subject: [PATCH] tst_QProcess::startStopStartStopBuffers: depend less on OS configuration The comment in this function made it clear that it really depended on the size of the pipe buffer in the OS. I don't see a way to make a pipe default to a different size on Linux -- it always defaults to PIPE_DEF_BUFFERS (16) and that value is only increased as a result of fcntl(F_SETPIPE_SZ), which we don't do. But we can be defensive and simply write until the OS can't take any more data. Drive-by update the comment on Windows to be clear that bytesToWrite() does work, but only while the child process is still running. Pick-to: 6.6 Task-number: QTBUG-80953 Change-Id: I9d43e5b91eb142d6945cfffd17866d22a4127e5e Reviewed-by: Marc Mutz --- .../auto/corelib/io/qprocess/tst_qprocess.cpp | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp index 030dcb7993..3c16bc1938 100644 --- a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp +++ b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp @@ -2889,14 +2889,18 @@ void tst_QProcess::startStopStartStopBuffers() } // We want to test that the write buffer still has bytes after the child - // exiting. We do that by writing to a child process that never reads. We - // just have to write more data than a pipe can hold, so that even if - // QProcess finds the pipe writable (during waitForFinished() or in the - // QWindowsPipeWriter thread), some data will remain. The worst case I know - // of is Linux, which defaults to 64 kB of buffer. + // exits. We can do that by writing data until the OS stops consuming data, + // indicating that the pipe buffers are full. The initial value of 128 kB + // should make this loop typicall run only once; the worst case I know of + // is Linux, which defaults to 64 kB of buffer. - process.write(QByteArray(128 * 1024, 'a')); - QVERIFY(process.bytesToWrite() > 0); + QByteArray chunk(128 * 1024, 'a'); + do { + process.write(chunk); + QVERIFY(process.bytesToWrite() > 0); + process.waitForBytesWritten(1); + } while (process.bytesToWrite() == 0); + chunk = {}; process.kill(); QVERIFY(process.waitForFinished()); @@ -2904,7 +2908,8 @@ void tst_QProcess::startStopStartStopBuffers() #ifndef Q_OS_WIN // confirm that our buffers are still full // Note: this doesn't work on Windows because our buffers are drained into - // QWindowsPipeWriter before being sent to the child process. + // QWindowsPipeWriter before being sent to the child process and are lost + // in waitForFinished() -> processFinished() -> cleanup(). QVERIFY(process.bytesToWrite() > 0); QVERIFY(process.bytesAvailable() > 0); // channelMode1 is not ForwardedChannels if (channelMode1 == QProcess::SeparateChannels || channelMode1 == QProcess::ForwardedOutputChannel) {