diff options
-rw-r--r-- | tests/fuzzy-test/commandlineparser.cpp | 39 | ||||
-rw-r--r-- | tests/fuzzy-test/commandlineparser.h | 3 | ||||
-rw-r--r-- | tests/fuzzy-test/fuzzytester.cpp | 23 | ||||
-rw-r--r-- | tests/fuzzy-test/fuzzytester.h | 2 | ||||
-rw-r--r-- | tests/fuzzy-test/main.cpp | 17 |
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 ¤tCommit, 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; |