summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2023-09-19 15:25:05 -0700
committerThiago Macieira <thiago.macieira@intel.com>2023-10-18 12:40:54 -0700
commita3f2ddc230b874b2e83d62eb702b3611a13761f6 (patch)
tree5214fb1bec01ad1c4674f648cfcd02f9b7811bf0
parent5a2aa12147577b1747704bf06928a95e7c9ce80b (diff)
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 <marc.mutz@qt.io>
-rw-r--r--tests/auto/corelib/io/qprocess/tst_qprocess.cpp21
1 files 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) {