#include "./syncthingtestinstance.h" #include "./helper.h" #include #include #include #include #include using namespace std; namespace CppUtilities { static int dummy1 = 0; static char *dummy2; SyncthingTestInstance::SyncthingTestInstance() : m_apiKey(QStringLiteral("syncthingtestinstance")) , m_app(dummy1, &dummy2) , m_interleavedOutput(false) { } /*! * \brief Starts the Syncthing test instance. */ void SyncthingTestInstance::start() { cerr << "\n - Setup configuration for Syncthing tests ..." << endl; // set timeout factor for helper const QByteArray timeoutFactorEnv(qgetenv("SYNCTHING_TEST_TIMEOUT_FACTOR")); if (!timeoutFactorEnv.isEmpty()) { try { timeoutFactor = stringToNumber(string(timeoutFactorEnv.data())); cerr << " - Using timeout factor " << timeoutFactor << endl; } catch (const ConversionException &) { cerr << " - Specified SYNCTHING_TEST_TIMEOUT_FACTOR \"" << timeoutFactorEnv.data() << "\" is no valid double and hence ignored\n (defaulting to " << timeoutFactor << ')' << endl; } } else { cerr << " - No timeout factor set, defaulting to " << timeoutFactor << ("\n (set environment variable SYNCTHING_TEST_TIMEOUT_FACTOR to specify a factor to run tests on a slow machine)") << endl; } // setup st config const string configFilePath = workingCopyPath("testconfig/config.xml"); if (configFilePath.empty()) { throw runtime_error("Unable to setup Syncthing config directory."); } const QFileInfo configFile(QString::fromLocal8Bit(configFilePath.data())); // clean config dir const QDir configDir(configFile.dir()); for (QFileInfo &configEntry : configDir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot)) { if (configEntry.isDir()) { QDir(configEntry.absoluteFilePath()).removeRecursively(); } else if (configEntry.fileName() != QStringLiteral("config.xml")) { QFile::remove(configEntry.absoluteFilePath()); } } // ensure dirs exist const QDir parentDir(QStringLiteral("/tmp/some/path")); parentDir.mkpath(QStringLiteral("1")); parentDir.mkpath(QStringLiteral("2")); // determine st path const QByteArray syncthingPathFromEnv(qgetenv("SYNCTHING_PATH")); const QString syncthingPath(syncthingPathFromEnv.isEmpty() ? QStringLiteral("syncthing") : QString::fromLocal8Bit(syncthingPathFromEnv)); // determine st port const int syncthingPortFromEnv(qEnvironmentVariableIntValue("SYNCTHING_PORT")); m_syncthingPort = !syncthingPortFromEnv ? QStringLiteral("4001") : QString::number(syncthingPortFromEnv); // start st // clang-format off const QStringList args{ QStringLiteral("-gui-address=http://localhost:") + m_syncthingPort, QStringLiteral("-gui-apikey=") + m_apiKey, QStringLiteral("-home=") + configFile.absolutePath(), QStringLiteral("-no-browser"), QStringLiteral("-verbose"), }; cerr << "\n - Launching Syncthing: " << syncthingPath.toStdString() << ' ' << args.join(QChar(' ')).toStdString() << endl; m_syncthingProcess.start(syncthingPath, args); // clang-format on } /*! * \brief Terminates Syncthing and prints stdout/stderr from Syncthing. */ void SyncthingTestInstance::stop() { if (m_syncthingProcess.isRunning()) { cerr << "\n - Waiting for Syncthing to terminate ..." << endl; m_syncthingProcess.terminate(); m_syncthingProcess.waitForFinished(); } if (m_syncthingProcess.isOpen()) { cerr << "\n - Syncthing terminated with exit code " << m_syncthingProcess.exitCode() << ".\n"; /* const auto stdOut(m_syncthingProcess.readAllStandardOutput()); if (!stdOut.isEmpty()) { cerr << "\n - Syncthing stdout during the testrun:\n" << stdOut.data(); } const auto stdErr(m_syncthingProcess.readAllStandardError()); if (!stdErr.isEmpty()) { cerr << "\n - Syncthing stderr during the testrun:\n" << stdErr.data(); } if (!stdOut.isEmpty()) { cerr << "\n - Syncthing (re)started: " << stdOut.count("INFO: Starting syncthing") << " times"; cerr << "\n - Syncthing exited: " << stdOut.count("INFO: Syncthing exited: exit status") << " times"; cerr << "\n - Syncthing panicked: " << stdOut.count("WARNING: Panic detected") << " times"; } */ } } /*! * \brief Sets whether Syncthing's output should be forwarded to see what Syncthing and the test is doing at the same time. */ void SyncthingTestInstance::setInterleavedOutputEnabled(bool interleavedOutputEnabled) { if (interleavedOutputEnabled == m_interleavedOutput) { return; } m_interleavedOutput = interleavedOutputEnabled; //m_syncthingProcess.setProcessChannelMode(interleavedOutputEnabled ? QProcess::ForwardedChannels : QProcess::SeparateChannels); } /*! * \brief Applies the default for isInterleavedOutputEnabled() considering environment variable SYNCTHING_TEST_NO_INTERLEAVED_OUTPUT. */ void SyncthingTestInstance::setInterleavedOutputEnabledFromEnv() { if (qEnvironmentVariableIsEmpty("SYNCTHING_TEST_NO_INTERLEAVED_OUTPUT")) { setInterleavedOutputEnabled(true); } } } // namespace CppUtilities