aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/fuzzy-test/commandlineparser.cpp39
-rw-r--r--tests/fuzzy-test/commandlineparser.h3
-rw-r--r--tests/fuzzy-test/fuzzytester.cpp23
-rw-r--r--tests/fuzzy-test/fuzzytester.h2
-rw-r--r--tests/fuzzy-test/main.cpp17
5 files changed, 70 insertions, 14 deletions
diff --git a/tests/fuzzy-test/commandlineparser.cpp b/tests/fuzzy-test/commandlineparser.cpp
index 199956226..8972e4f4d 100644
--- a/tests/fuzzy-test/commandlineparser.cpp
+++ b/tests/fuzzy-test/commandlineparser.cpp
@@ -31,8 +31,11 @@
#include <QFileInfo>
+#include <cctype>
+
static QString profileOption() { return "--profile"; }
static QString startCommitOption() { return "--start-commit"; }
+static QString maxDurationoption() { return "--max-duration"; }
CommandLineParser::CommandLineParser()
{
@@ -42,6 +45,7 @@ void CommandLineParser::parse(const QStringList &commandLine)
{
m_profile.clear();
m_startCommit.clear();
+ m_maxDuration = 0;
m_commandLine = commandLine;
Q_ASSERT(!m_commandLine.isEmpty());
m_command = m_commandLine.takeFirst();
@@ -51,6 +55,8 @@ void CommandLineParser::parse(const QStringList &commandLine)
assignOptionArgument(arg, m_profile);
else if (arg == startCommitOption())
assignOptionArgument(arg, m_startCommit);
+ else if (arg == maxDurationoption())
+ parseDuration();
else
throw ParseException(QString::fromLocal8Bit("Unknown parameter '%1'").arg(arg));
}
@@ -62,8 +68,9 @@ void CommandLineParser::parse(const QStringList &commandLine)
QString CommandLineParser::usageString() const
{
- return QString::fromLocal8Bit("%1 %2 <profile> %3 <start commit>")
- .arg(QFileInfo(m_command).fileName(), profileOption(), startCommitOption());
+ return QString::fromLocal8Bit("%1 %2 <profile> %3 <start commit> [%4 <duration>]")
+ .arg(QFileInfo(m_command).fileName(), profileOption(), startCommitOption(),
+ maxDurationoption());
}
void CommandLineParser::assignOptionArgument(const QString &option, QString &argument)
@@ -76,3 +83,31 @@ void CommandLineParser::assignOptionArgument(const QString &option, QString &arg
.arg(option));
}
}
+
+void CommandLineParser::parseDuration()
+{
+ QString durationString;
+ QString choppedDurationString;
+ assignOptionArgument(maxDurationoption(), durationString);
+ choppedDurationString = durationString;
+ const char suffix = durationString.at(durationString.count() - 1).toLatin1();
+ const bool hasSuffix = !std::isdigit(suffix);
+ if (hasSuffix)
+ choppedDurationString.chop(1);
+ bool ok;
+ m_maxDuration = choppedDurationString.toInt(&ok);
+ if (!ok) {
+ throw ParseException(QString::fromLocal8Bit("Invalid duration argument '%1'.")
+ .arg(durationString));
+ }
+ if (hasSuffix) {
+ switch (suffix) {
+ case 'm': break;
+ case 'd': m_maxDuration *= 24; // Fall-through.
+ case 'h': m_maxDuration *= 60; break;
+ default:
+ throw ParseException(QString::fromLocal8Bit("Invalid duration suffix '%1'.")
+ .arg(suffix));
+ }
+ }
+}
diff --git a/tests/fuzzy-test/commandlineparser.h b/tests/fuzzy-test/commandlineparser.h
index 32f0d9cc6..31ea474e0 100644
--- a/tests/fuzzy-test/commandlineparser.h
+++ b/tests/fuzzy-test/commandlineparser.h
@@ -55,16 +55,19 @@ public:
QString profile() const { return m_profile; }
QString startCommit() const { return m_startCommit; }
+ int maxDurationInMinutes() const { return m_maxDuration; }
QString usageString() const;
private:
void assignOptionArgument(const QString &option, QString &argument);
+ void parseDuration();
QStringList m_commandLine;
QString m_command;
QString m_profile;
QString m_startCommit;
+ int m_maxDuration;
};
#endif // Include guard.
diff --git a/tests/fuzzy-test/fuzzytester.cpp b/tests/fuzzy-test/fuzzytester.cpp
index 0fb31d431..4aee4193b 100644
--- a/tests/fuzzy-test/fuzzytester.cpp
+++ b/tests/fuzzy-test/fuzzytester.cpp
@@ -30,6 +30,7 @@
#include "fuzzytester.h"
#include <QDir>
+#include <QElapsedTimer>
#include <QProcess>
#include <algorithm>
@@ -40,7 +41,8 @@ FuzzyTester::FuzzyTester()
{
}
-void FuzzyTester::runTest(const QString &profile, const QString &startCommit)
+void FuzzyTester::runTest(const QString &profile, const QString &startCommit,
+ int maxDurationInMinutes)
{
m_profile = profile;
@@ -61,12 +63,20 @@ void FuzzyTester::runTest(const QString &profile, const QString &startCommit)
quint64 run = 0;
QStringList buildSequence(workingStartCommit);
+ QElapsedTimer timer;
+ const qint64 maxDurationInMillis = maxDurationInMinutes * 60 * 1000;
+ if (maxDurationInMillis != 0)
+ timer.start();
- // This is in effect an infinite loop for all but the tiniest commit sets.
- // That's not a problem -- if you want the application to finish early, just kill it.
- while (std::next_permutation(allCommits.begin(), allCommits.end())) {
+ bool timerHasExpired = false;
+ while (std::next_permutation(allCommits.begin(), allCommits.end()) && !timerHasExpired) {
qDebug("Testing permutation %llu...", ++run);
foreach (const QString &currentCommit, allCommits) {
+ if (timer.isValid() && timer.hasExpired(maxDurationInMillis)) {
+ timerHasExpired = true;
+ break;
+ }
+
buildSequence << currentCommit;
checkoutCommit(currentCommit);
qDebug("Testing incremental build #%d (%s)", buildSequence.count() - 1,
@@ -99,6 +109,11 @@ void FuzzyTester::runTest(const QString &profile, const QString &startCommit)
}
}
}
+
+ if (timerHasExpired)
+ qDebug("Maximum duration reached.");
+ else
+ qDebug("All possible permutations were tried.");
}
void FuzzyTester::checkoutCommit(const QString &commit)
diff --git a/tests/fuzzy-test/fuzzytester.h b/tests/fuzzy-test/fuzzytester.h
index 366a5d0b4..eb06dc470 100644
--- a/tests/fuzzy-test/fuzzytester.h
+++ b/tests/fuzzy-test/fuzzytester.h
@@ -55,7 +55,7 @@ class FuzzyTester
public:
FuzzyTester();
- void runTest(const QString &profile, const QString &startCommit);
+ void runTest(const QString &profile, const QString &startCommit, int maxDurationInMinutes);
private:
void checkoutCommit(const QString &commit);
diff --git a/tests/fuzzy-test/main.cpp b/tests/fuzzy-test/main.cpp
index 0251c21e9..818d87553 100644
--- a/tests/fuzzy-test/main.cpp
+++ b/tests/fuzzy-test/main.cpp
@@ -37,8 +37,8 @@
#include <iostream>
static bool parseCommandLine(const QStringList &commandLine, QString &profile,
- QString &startCommit);
-static bool runTest(const QString &profile, const QString &startCommit);
+ QString &startCommi, int &maxDuration);
+static bool runTest(const QString &profile, const QString &startCommit, int maxDuration);
int main(int argc, char *argv[])
{
@@ -46,15 +46,17 @@ int main(int argc, char *argv[])
QString profile;
QString startCommit;
- if (!parseCommandLine(app.arguments(), profile, startCommit))
+ int maxDuration;
+ if (!parseCommandLine(app.arguments(), profile, startCommit, maxDuration))
return EXIT_FAILURE;
- if (!runTest(profile, startCommit))
+ if (!runTest(profile, startCommit, maxDuration))
return EXIT_FAILURE;
std::cout << "Test finished successfully." << std::endl;
return EXIT_SUCCESS;
}
-bool parseCommandLine(const QStringList &commandLine, QString &profile, QString &startCommit)
+bool parseCommandLine(const QStringList &commandLine, QString &profile, QString &startCommit,
+ int &maxDuration)
{
CommandLineParser cmdParser;
try {
@@ -66,13 +68,14 @@ bool parseCommandLine(const QStringList &commandLine, QString &profile, QString
}
profile = cmdParser.profile();
startCommit = cmdParser.startCommit();
+ maxDuration = cmdParser.maxDurationInMinutes();
return true;
}
-bool runTest(const QString &profile, const QString &startCommit)
+bool runTest(const QString &profile, const QString &startCommit, int maxDuration)
{
try {
- FuzzyTester().runTest(profile, startCommit);
+ FuzzyTester().runTest(profile, startCommit, maxDuration);
} catch (const TestError &e) {
std::cerr << qPrintable(e.errorMessage) << std::endl;
return false;