Limit result output by default

For huge amount of output the processing takes much too long
and blocks QC. So, limiting it to a reasonable value seems
appropriate. Additionally provide a setting to be still able
to get the full output if you need to.

Change-Id: I811d69be33c77830049f64fcf291681f05011966
Reviewed-by: Riitta-Leena Miettinen <riitta-leena.miettinen@theqtcompany.com>
Reviewed-by: David Schulz <david.schulz@theqtcompany.com>
This commit is contained in:
Christian Stenger
2015-04-09 15:51:42 +02:00
parent 178318d077
commit 475c6cea1e
5 changed files with 40 additions and 4 deletions

View File

@@ -17,8 +17,10 @@
** **
****************************************************************************/ ****************************************************************************/
#include "autotestplugin.h"
#include "testresultdelegate.h" #include "testresultdelegate.h"
#include "testresultmodel.h" #include "testresultmodel.h"
#include "testsettings.h"
#include <QAbstractItemView> #include <QAbstractItemView>
#include <QDebug> #include <QDebug>
@@ -28,6 +30,8 @@
namespace Autotest { namespace Autotest {
namespace Internal { namespace Internal {
const static int outputLimit = 100000;
TestResultDelegate::TestResultDelegate(QObject *parent) TestResultDelegate::TestResultDelegate(QObject *parent)
: QStyledItemDelegate(parent) : QStyledItemDelegate(parent)
{ {
@@ -124,6 +128,11 @@ void TestResultDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op
int leading = fm.leading(); int leading = fm.leading();
int fontHeight = fm.height(); int fontHeight = fm.height();
output.replace(QLatin1Char('\n'), QChar::LineSeparator); output.replace(QLatin1Char('\n'), QChar::LineSeparator);
if (AutotestPlugin::instance()->settings()->limitResultOutput
&& output.length() > outputLimit)
output = output.left(outputLimit).append(QLatin1String("..."));
QTextLayout tl(output); QTextLayout tl(output);
tl.setFont(painter->font()); tl.setFont(painter->font());
QTextOption txtOption; QTextOption txtOption;
@@ -143,8 +152,9 @@ void TestResultDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op
tl.draw(painter, QPoint(positions.textAreaLeft(), positions.top())); tl.draw(painter, QPoint(positions.textAreaLeft(), positions.top()));
} else { } else {
painter->setClipRect(positions.textArea()); painter->setClipRect(positions.textArea());
// cut output before generating elided text as this takes quite long for exhaustive output
painter->drawText(positions.textAreaLeft(), positions.top() + fm.ascent(), painter->drawText(positions.textAreaLeft(), positions.top() + fm.ascent(),
fm.elidedText(output, Qt::ElideRight, positions.textAreaWidth())); fm.elidedText(output.left(2000), Qt::ElideRight, positions.textAreaWidth()));
} }
QString file = testResult.fileName(); QString file = testResult.fileName();
@@ -222,6 +232,11 @@ QSize TestResultDelegate::sizeHint(const QStyleOptionViewItem &option, const QMo
int height = 0; int height = 0;
int leading = fm.leading(); int leading = fm.leading();
if (AutotestPlugin::instance()->settings()->limitResultOutput
&& output.length() > outputLimit)
output = output.left(outputLimit).append(QLatin1String("..."));
QTextLayout tl(output); QTextLayout tl(output);
tl.setFont(opt.font); tl.setFont(opt.font);
QTextOption txtOption; QTextOption txtOption;

View File

@@ -29,10 +29,12 @@ static const char timeoutKey[] = "Timeout";
static const char metricsKey[] = "Metrics"; static const char metricsKey[] = "Metrics";
static const char omitInternalKey[] = "OmitInternal"; static const char omitInternalKey[] = "OmitInternal";
static const char omitRunConfigWarnKey[] = "OmitRCWarnings"; static const char omitRunConfigWarnKey[] = "OmitRCWarnings";
static const char limitResultOutputKey[] = "LimitResultOutput";
static const int defaultTimeout = 60000; static const int defaultTimeout = 60000;
TestSettings::TestSettings() TestSettings::TestSettings()
: timeout(defaultTimeout), metrics(Walltime), omitInternalMssg(true), omitRunConfigWarn(false) : timeout(defaultTimeout), metrics(Walltime), omitInternalMssg(true), omitRunConfigWarn(false),
limitResultOutput(true)
{ {
} }
@@ -43,6 +45,7 @@ void TestSettings::toSettings(QSettings *s) const
s->setValue(QLatin1String(metricsKey), metrics); s->setValue(QLatin1String(metricsKey), metrics);
s->setValue(QLatin1String(omitInternalKey), omitInternalMssg); s->setValue(QLatin1String(omitInternalKey), omitInternalMssg);
s->setValue(QLatin1String(omitRunConfigWarnKey), omitRunConfigWarn); s->setValue(QLatin1String(omitRunConfigWarnKey), omitRunConfigWarn);
s->setValue(QLatin1String(limitResultOutputKey), limitResultOutput);
s->endGroup(); s->endGroup();
} }
@@ -71,13 +74,15 @@ void TestSettings::fromSettings(const QSettings *s)
metrics = intToMetrics(s->value(root + QLatin1String(metricsKey), Walltime).toInt()); metrics = intToMetrics(s->value(root + QLatin1String(metricsKey), Walltime).toInt());
omitInternalMssg = s->value(root + QLatin1String(omitInternalKey), true).toBool(); omitInternalMssg = s->value(root + QLatin1String(omitInternalKey), true).toBool();
omitRunConfigWarn = s->value(root + QLatin1String(omitRunConfigWarnKey), false).toBool(); omitRunConfigWarn = s->value(root + QLatin1String(omitRunConfigWarnKey), false).toBool();
limitResultOutput = s->value(root + QLatin1String(limitResultOutputKey), true).toBool();
} }
bool TestSettings::equals(const TestSettings &rhs) const bool TestSettings::equals(const TestSettings &rhs) const
{ {
return timeout == rhs.timeout && metrics == rhs.metrics return timeout == rhs.timeout && metrics == rhs.metrics
&& omitInternalMssg == rhs.omitInternalMssg && omitInternalMssg == rhs.omitInternalMssg
&& omitRunConfigWarn == rhs.omitRunConfigWarn; && omitRunConfigWarn == rhs.omitRunConfigWarn
&& limitResultOutput == rhs.limitResultOutput;
} }
QString TestSettings::metricsTypeToOption(const MetricsType type) QString TestSettings::metricsTypeToOption(const MetricsType type)

View File

@@ -49,6 +49,7 @@ struct TestSettings
MetricsType metrics; MetricsType metrics;
bool omitInternalMssg; bool omitInternalMssg;
bool omitRunConfigWarn; bool omitRunConfigWarn;
bool limitResultOutput;
}; };
inline bool operator==(const TestSettings &s1, const TestSettings &s2) { return s1.equals(s2); } inline bool operator==(const TestSettings &s1, const TestSettings &s2) { return s1.equals(s2); }

View File

@@ -41,6 +41,7 @@ void TestSettingsWidget::setSettings(const TestSettings &settings)
m_ui.timeoutSpin->setValue(settings.timeout / 1000); // we store milliseconds m_ui.timeoutSpin->setValue(settings.timeout / 1000); // we store milliseconds
m_ui.omitInternalMsgCB->setChecked(settings.omitInternalMssg); m_ui.omitInternalMsgCB->setChecked(settings.omitInternalMssg);
m_ui.omitRunConfigWarnCB->setChecked(settings.omitRunConfigWarn); m_ui.omitRunConfigWarnCB->setChecked(settings.omitRunConfigWarn);
m_ui.limitResultOutputCB->setChecked(settings.limitResultOutput);
switch (settings.metrics) { switch (settings.metrics) {
case MetricsType::Walltime: case MetricsType::Walltime:
@@ -69,6 +70,7 @@ TestSettings TestSettingsWidget::settings() const
result.timeout = m_ui.timeoutSpin->value() * 1000; // we display seconds result.timeout = m_ui.timeoutSpin->value() * 1000; // we display seconds
result.omitInternalMssg = m_ui.omitInternalMsgCB->isChecked(); result.omitInternalMssg = m_ui.omitInternalMsgCB->isChecked();
result.omitRunConfigWarn = m_ui.omitRunConfigWarnCB->isChecked(); result.omitRunConfigWarn = m_ui.omitRunConfigWarnCB->isChecked();
result.limitResultOutput = m_ui.limitResultOutputCB->isChecked();
if (m_ui.walltimeRB->isChecked()) if (m_ui.walltimeRB->isChecked())
result.metrics = MetricsType::Walltime; result.metrics = MetricsType::Walltime;

View File

@@ -13,7 +13,7 @@
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<widget class="QWidget" name=""> <widget class="QWidget" name="layoutWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>9</x> <x>9</x>
@@ -103,6 +103,19 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QCheckBox" name="limitResultOutputCB">
<property name="toolTip">
<string>Limit result output to 100000 characters.</string>
</property>
<property name="text">
<string>Limit result output</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>