From 07cb8876db7f2a7856f5fce6cc7854c4e6ff8b7f Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 14 Jul 2022 15:05:18 +0200 Subject: [PATCH] deviceshell: Fix racecondition and long running tests When writing to stdout and stderr from two processes, their output could become interleaved. To work around that, we write stdout and stderr to different files and later combine them together in the shell script. Since tst_deviceshell tests could run for a long time if /usr folder is too big, added a check that first tests the runtime once. Since we currently only support linux containers, limit the tests to only run if the container platform is linux as well. Change-Id: I4b313596cdf9acc839d54d7cc77c66fd53ac23bf Reviewed-by: hjk --- .gitignore | 1 + src/libs/utils/deviceshell.cpp | 7 ++++-- .../utils/deviceshell/tst_deviceshell.cpp | 24 +++++++++++++++---- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 0bfdb066a7e..de76458a885 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ tags ui_*.h wrapper.bat wrapper.sh +debug_toolchain.cmake # qtcreator generated files *.creator.user* diff --git a/src/libs/utils/deviceshell.cpp b/src/libs/utils/deviceshell.cpp index 2d6227be688..75a8cbb2604 100644 --- a/src/libs/utils/deviceshell.cpp +++ b/src/libs/utils/deviceshell.cpp @@ -62,8 +62,11 @@ finalOutput() { local fileInputBuffer while read fileInputBuffer do + if test -f "$fileInputBuffer.err"; then + cat $fileInputBuffer.err + fi cat $fileInputBuffer - rm $fileInputBuffer + rm -f $fileInputBuffer.err $fileInputBuffer done } @@ -117,7 +120,7 @@ executeAndMark() # Mark the app's output streams readAndMark $PID 'O' < "$stdoutenc" >> $TMPFILE & - readAndMark $PID 'E' < "$stderrenc" >> $TMPFILE & + readAndMark $PID 'E' < "$stderrenc" >> $TMPFILE.err & # Start the app ... if [ -z "$INDATA" ] diff --git a/tests/auto/utils/deviceshell/tst_deviceshell.cpp b/tests/auto/utils/deviceshell/tst_deviceshell.cpp index 2c209b94a1f..399a76e1ca6 100644 --- a/tests/auto/utils/deviceshell/tst_deviceshell.cpp +++ b/tests/auto/utils/deviceshell/tst_deviceshell.cpp @@ -60,9 +60,10 @@ private: bool testDocker(const FilePath &executable) { QtcProcess p; - p.setCommand({executable, {"info"}}); + p.setCommand({executable, {"info", "--format", "{{.OSType}}"}}); p.runBlocking(); - return p.result() == ProcessResult::FinishedWithSuccess; + const QString platform = p.cleanedStdOut().trimmed(); + return p.result() == ProcessResult::FinishedWithSuccess && platform == "linux"; } class tst_DeviceShell : public QObject @@ -336,10 +337,25 @@ private slots: QList runs{1,2,3,4,5,6,7,8,9}; - QList results = Utils::mapped(runs, [&shell](const int i) -> QByteArray{ + int maxDepth = 4; + int numMs = 0; + + while (true) { QElapsedTimer t; t.start(); - DeviceShell::RunResult result = shell.outputForRunInShell({"find", {"/usr", "-maxdepth", "4"}}); + DeviceShell::RunResult result = shell.outputForRunInShell({"find", {"/usr", "-maxdepth", QString::number(maxDepth)}}); + numMs = t.elapsed(); + qDebug() << "adjusted maxDepth" << maxDepth << "took" << numMs << "ms"; + if (numMs < 100 || maxDepth == 1) { + break; + } + maxDepth--; + } + + QList results = Utils::mapped(runs, [&shell, maxDepth](const int i) -> QByteArray{ + QElapsedTimer t; + t.start(); + DeviceShell::RunResult result = shell.outputForRunInShell({"find", {"/usr", "-maxdepth", QString::number(maxDepth)}}); qDebug() << i << "took" << t.elapsed() << "ms"; return result.stdOut; });