From 39441654d8dab11a83d4c06586baeb396c782498 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 12 Oct 2022 13:41:17 +0200 Subject: [PATCH] Squish: Correct handling of global scripts Global scripts get registered to the server. If we have valid squish settings we are able to automatically re-open them. Change-Id: Iaeed2629dac30b786b6e8faf371bc6987a4a5681 Reviewed-by: David Schulz --- src/plugins/squish/squishfilehandler.cpp | 18 +++++++++++++ src/plugins/squish/squishfilehandler.h | 2 ++ src/plugins/squish/squishplugin.cpp | 31 +++++++++++++++++++++- src/plugins/squish/squishplugin.h | 1 + src/plugins/squish/squishtesttreemodel.cpp | 3 +++ src/plugins/squish/squishtools.cpp | 27 +++++++++++++++++-- src/plugins/squish/squishtools.h | 5 ++++ 7 files changed, 84 insertions(+), 3 deletions(-) diff --git a/src/plugins/squish/squishfilehandler.cpp b/src/plugins/squish/squishfilehandler.cpp index 115086bc742..ec267106e5b 100644 --- a/src/plugins/squish/squishfilehandler.cpp +++ b/src/plugins/squish/squishfilehandler.cpp @@ -444,6 +444,24 @@ void SquishFileHandler::addSharedFolder() emit testTreeItemCreated(item); } +void SquishFileHandler::setSharedFolders(const Utils::FilePaths &folders) +{ + emit clearedSharedFolders(); + m_sharedFolders.clear(); + + for (const Utils::FilePath &folder : folders) { + if (m_sharedFolders.contains(folder)) + continue; + + m_sharedFolders.append(folder); + SquishTestTreeItem *item = new SquishTestTreeItem(folder.toUserOutput(), + SquishTestTreeItem::SquishSharedFolder); + item->setFilePath(folder); + addAllEntriesRecursively(item); + emit testTreeItemCreated(item); + } +} + bool SquishFileHandler::removeSharedFolder(const Utils::FilePath &folder) { if (m_sharedFolders.contains(folder)) diff --git a/src/plugins/squish/squishfilehandler.h b/src/plugins/squish/squishfilehandler.h index 0a23f918efc..b7ceeebc1ea 100644 --- a/src/plugins/squish/squishfilehandler.h +++ b/src/plugins/squish/squishfilehandler.h @@ -29,11 +29,13 @@ public: void runTestSuite(const QString &suiteName); void recordTestCase(const QString &suiteName, const QString &testCaseName); void addSharedFolder(); + void setSharedFolders(const Utils::FilePaths &folders); bool removeSharedFolder(const Utils::FilePath &folder); void removeAllSharedFolders(); void openObjectsMap(const QString &suiteName); signals: + void clearedSharedFolders(); void testTreeItemCreated(SquishTestTreeItem *item); void suiteTreeItemRemoved(const QString &suiteName); void suiteTreeItemModified(SquishTestTreeItem *item, const QString &displayName); diff --git a/src/plugins/squish/squishplugin.cpp b/src/plugins/squish/squishplugin.cpp index ced619fbca5..ce9fdffbc6c 100644 --- a/src/plugins/squish/squishplugin.cpp +++ b/src/plugins/squish/squishplugin.cpp @@ -4,7 +4,7 @@ #include "squishplugin.h" #include "objectsmapeditor.h" -#include "squish/squishwizardpages.h" +#include "squishfilehandler.h" #include "squishnavigationwidget.h" #include "squishoutputpane.h" #include "squishresultmodel.h" @@ -12,6 +12,7 @@ #include "squishtesttreemodel.h" #include "squishtools.h" #include "squishtr.h" +#include "squishwizardpages.h" #include #include @@ -21,6 +22,7 @@ #include +#include #include #include @@ -39,6 +41,7 @@ public: ~SquishPluginPrivate(); void initializeMenuEntries(); + bool initializeGlobalScripts(); SquishSettings m_squishSettings; SquishSettingsPage m_settingsPage{&m_squishSettings}; @@ -102,6 +105,27 @@ void SquishPluginPrivate::initializeMenuEntries() toolsMenu->addMenu(menu); } +bool SquishPluginPrivate::initializeGlobalScripts() +{ + QTC_ASSERT(dd->m_squishTools, return false); + + const Utils::FilePath squishserver = dd->m_squishSettings.squishPath.filePath().pathAppended( + Utils::HostOsInfo::withExecutableSuffix("bin/squishserver")); + if (!squishserver.isExecutableFile()) + return false; + + dd->m_squishTools->queryGlobalScripts([](const QString &output, const QString &error) { + if (output.isEmpty() || !error.isEmpty()) + return; // ignore (for now?) + + // FIXME? comma, special characters in paths + const Utils::FilePaths globalDirs = Utils::transform( + output.trimmed().split(',', Qt::SkipEmptyParts), &Utils::FilePath::fromString); + SquishFileHandler::instance()->setSharedFolders(globalDirs); + }); + return true; +} + bool SquishPlugin::initialize(const QStringList &, QString *) { dd = new SquishPluginPrivate; @@ -109,6 +133,11 @@ bool SquishPlugin::initialize(const QStringList &, QString *) return true; } +bool SquishPlugin::delayedInitialize() +{ + return dd->initializeGlobalScripts(); +} + ExtensionSystem::IPlugin::ShutdownFlag SquishPlugin::aboutToShutdown() { if (dd->m_squishTools) { diff --git a/src/plugins/squish/squishplugin.h b/src/plugins/squish/squishplugin.h index 44e49c2ab43..3373bbf2d62 100644 --- a/src/plugins/squish/squishplugin.h +++ b/src/plugins/squish/squishplugin.h @@ -23,6 +23,7 @@ public: static SquishSettings *squishSettings(); bool initialize(const QStringList &arguments, QString *errorString) override; + bool delayedInitialize() override; ShutdownFlag aboutToShutdown() override; }; diff --git a/src/plugins/squish/squishtesttreemodel.cpp b/src/plugins/squish/squishtesttreemodel.cpp index 8df29777363..3733d10f8fb 100644 --- a/src/plugins/squish/squishtesttreemodel.cpp +++ b/src/plugins/squish/squishtesttreemodel.cpp @@ -186,6 +186,9 @@ SquishTestTreeModel::SquishTestTreeModel(QObject *parent) &SquishFileHandler::suiteTreeItemRemoved, this, &SquishTestTreeModel::onSuiteTreeItemRemoved); + connect(m_squishFileHandler, + &SquishFileHandler::clearedSharedFolders, + this, [this]() { m_squishSharedFolders->removeChildren(); }); m_instance = this; } diff --git a/src/plugins/squish/squishtools.cpp b/src/plugins/squish/squishtools.cpp index df63485fcc0..0cfb16d1c84 100644 --- a/src/plugins/squish/squishtools.cpp +++ b/src/plugins/squish/squishtools.cpp @@ -260,11 +260,22 @@ void SquishTools::runTestCases(const FilePath &suitePath, startSquishServer(RunTestRequested); } +void SquishTools::queryGlobalScripts(QueryCallback callback) +{ + m_queryCallback = callback; + queryServer(GetGlobalScriptDirs); +} + void SquishTools::queryServerSettings(QueryCallback callback) +{ + m_queryCallback = callback; + queryServer(ServerInfo); +} + +void SquishTools::queryServer(RunnerQuery query) { if (m_shutdownInitiated) return; - m_queryCallback = callback; if (m_state != Idle) { QMessageBox::critical(Core::ICore::dialogParent(), @@ -276,6 +287,7 @@ void SquishTools::queryServerSettings(QueryCallback callback) } m_perspective.setPerspectiveMode(SquishPerspective::Querying); m_fullRunnerOutput.clear(); + m_query = query; startSquishServer(RunnerQueryRequested); } @@ -663,7 +675,18 @@ void SquishTools::executeRunnerQuery() if (!isValidToStartRunner() || !setupRunnerPath()) return; - setupAndStartSquishRunnerProcess({ "--port", QString::number(m_serverPort), "--info", "all"}); + QStringList arguments = { "--port", QString::number(m_serverPort) }; + switch (m_query) { + case ServerInfo: + arguments << "--info" << "all"; + break; + case GetGlobalScriptDirs: + arguments << "--config" << "getGlobalScriptDirs"; + break; + default: + QTC_ASSERT(false, return); + } + setupAndStartSquishRunnerProcess(arguments); } Environment SquishTools::squishEnvironment() diff --git a/src/plugins/squish/squishtools.h b/src/plugins/squish/squishtools.h index d9400f7ad07..8992a8a8990 100644 --- a/src/plugins/squish/squishtools.h +++ b/src/plugins/squish/squishtools.h @@ -68,6 +68,7 @@ public: const QStringList &testCases = QStringList()); void recordTestCase(const Utils::FilePath &suitePath, const QString &testCaseName, const SuiteConf &suiteConf); + void queryGlobalScripts(QueryCallback callback); void queryServerSettings(QueryCallback callback); void writeServerSettingsChanges(const QList &changes); void requestExpansion(const QString &name); @@ -98,6 +99,8 @@ private: KillOldBeforeQueryRunner }; + enum RunnerQuery { ServerInfo, GetGlobalScriptDirs }; + void setState(State state); void handleSetStateStartAppRunner(); void handleSetStateQueryRunner(); @@ -107,6 +110,7 @@ private: void startSquishRunner(); void setupAndStartRecorder(); void stopRecorder(); + void queryServer(RunnerQuery query); void executeRunnerQuery(); static Utils::Environment squishEnvironment(); void onServerFinished(); @@ -163,6 +167,7 @@ private: qint64 m_readResultsCount; int m_autId = 0; QueryCallback m_queryCallback; + RunnerQuery m_query = ServerInfo; bool m_shutdownInitiated = false; bool m_closeRunnerOnEndRecord = false; bool m_licenseIssues = false;