Fail tests early when Syncthing exists unexpectedly or cannot be started at all
Before tests ran until a timeout was reached and failed not with a clear error message stating the root cause. This is now the case and can be tested by setting `SYNCTHING_PATH` to e.g. false/true or a non-existing binary. This may help with the test issue mentioned in https://github.com/Martchus/syncthingtray/issues/144 although I could never reproduce the concrete error message myself.
This commit is contained in:
parent
99f8442567
commit
037c5a309b
|
@ -2,13 +2,18 @@
|
||||||
#include "./helper.h"
|
#include "./helper.h"
|
||||||
|
|
||||||
#include <c++utilities/conversion/conversionexception.h>
|
#include <c++utilities/conversion/conversionexception.h>
|
||||||
|
#include <c++utilities/conversion/stringbuilder.h>
|
||||||
#include <c++utilities/conversion/stringconversion.h>
|
#include <c++utilities/conversion/stringconversion.h>
|
||||||
#include <c++utilities/tests/testutils.h>
|
#include <c++utilities/tests/testutils.h>
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
using namespace std::placeholders;
|
||||||
|
|
||||||
namespace CppUtilities {
|
namespace CppUtilities {
|
||||||
|
|
||||||
|
@ -19,7 +24,12 @@ SyncthingTestInstance::SyncthingTestInstance()
|
||||||
: m_apiKey(QStringLiteral("syncthingtestinstance"))
|
: m_apiKey(QStringLiteral("syncthingtestinstance"))
|
||||||
, m_app(dummy1, &dummy2)
|
, m_app(dummy1, &dummy2)
|
||||||
, m_interleavedOutput(false)
|
, m_interleavedOutput(false)
|
||||||
|
, m_processSupposedToRun(false)
|
||||||
{
|
{
|
||||||
|
QObject::connect(&m_syncthingProcess, &Data::SyncthingProcess::errorOccurred, &m_syncthingProcess,
|
||||||
|
std::bind(&SyncthingTestInstance::handleError, this, _1), Qt::QueuedConnection);
|
||||||
|
QObject::connect(&m_syncthingProcess, &Data::SyncthingProcess::finished, &m_syncthingProcess,
|
||||||
|
std::bind(&SyncthingTestInstance::handleFinished, this, _1, _2), Qt::QueuedConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -85,6 +95,7 @@ void SyncthingTestInstance::start()
|
||||||
cerr << "\n - Launching Syncthing: "
|
cerr << "\n - Launching Syncthing: "
|
||||||
<< syncthingPath.toStdString()
|
<< syncthingPath.toStdString()
|
||||||
<< ' ' << args.join(QChar(' ')).toStdString() << endl;
|
<< ' ' << args.join(QChar(' ')).toStdString() << endl;
|
||||||
|
m_processSupposedToRun = true;
|
||||||
m_syncthingProcess.start(syncthingPath, args);
|
m_syncthingProcess.start(syncthingPath, args);
|
||||||
// clang-format on
|
// clang-format on
|
||||||
}
|
}
|
||||||
|
@ -94,6 +105,7 @@ void SyncthingTestInstance::start()
|
||||||
*/
|
*/
|
||||||
void SyncthingTestInstance::stop()
|
void SyncthingTestInstance::stop()
|
||||||
{
|
{
|
||||||
|
m_processSupposedToRun = false;
|
||||||
if (m_syncthingProcess.isRunning()) {
|
if (m_syncthingProcess.isRunning()) {
|
||||||
cerr << "\n - Waiting for Syncthing to terminate ..." << endl;
|
cerr << "\n - Waiting for Syncthing to terminate ..." << endl;
|
||||||
m_syncthingProcess.terminate();
|
m_syncthingProcess.terminate();
|
||||||
|
@ -135,4 +147,25 @@ void SyncthingTestInstance::setInterleavedOutputEnabledFromEnv()
|
||||||
setInterleavedOutputEnabled(true);
|
setInterleavedOutputEnabled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Throws an exception to abort testing when the process cannot be started.
|
||||||
|
*/
|
||||||
|
void SyncthingTestInstance::handleError(QProcess::ProcessError error)
|
||||||
|
{
|
||||||
|
Q_UNUSED(error)
|
||||||
|
throw std::runtime_error(argsToString("Unable to start Syncthing ("sv, m_syncthingProcess.errorString().toStdString(), ')'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Throws an exception to abort testing when the process exists unexpectedly.
|
||||||
|
*/
|
||||||
|
void SyncthingTestInstance::handleFinished(int exitCode, QProcess::ExitStatus exitStatus)
|
||||||
|
{
|
||||||
|
if (m_processSupposedToRun) {
|
||||||
|
throw std::runtime_error(argsToString("Syncthing exited unexpectedly ("sv,
|
||||||
|
exitStatus == QProcess::NormalExit ? "normal exit"sv : "exited with error"sv, ", exit code: "sv, exitCode, ')'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace CppUtilities
|
} // namespace CppUtilities
|
||||||
|
|
|
@ -34,12 +34,17 @@ public:
|
||||||
void setInterleavedOutputEnabled(bool interleavedOutputEnabled);
|
void setInterleavedOutputEnabled(bool interleavedOutputEnabled);
|
||||||
void setInterleavedOutputEnabledFromEnv();
|
void setInterleavedOutputEnabledFromEnv();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void handleError(QProcess::ProcessError error);
|
||||||
|
void handleFinished(int exitCode, QProcess::ExitStatus exitStatus);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_apiKey;
|
QString m_apiKey;
|
||||||
QString m_syncthingPort;
|
QString m_syncthingPort;
|
||||||
QCoreApplication m_app;
|
QCoreApplication m_app;
|
||||||
Data::SyncthingProcess m_syncthingProcess;
|
Data::SyncthingProcess m_syncthingProcess;
|
||||||
bool m_interleavedOutput;
|
bool m_interleavedOutput;
|
||||||
|
bool m_processSupposedToRun;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline const QString &SyncthingTestInstance::apiKey() const
|
inline const QString &SyncthingTestInstance::apiKey() const
|
||||||
|
|
Loading…
Reference in New Issue