From 422409bf261c3653f98b4fc3163829eee393d6ef Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 29 Apr 2021 15:38:01 +0200 Subject: [PATCH] Add TestStringTable test The TestStringTable tests the fix provided for a crash in StringTable on shutdown. Amends: f4ab1279fd55a00e2bede18ec9ad283c668b46bd Task-number: QTCREATORBUG-25417 Change-Id: I5a4a7e4a20e1b9611682a976d38dee17d4603c5c Reviewed-by: Qt CI Bot Reviewed-by: hjk --- src/app/main.cpp | 5 +++++ src/libs/extensionsystem/pluginmanager.cpp | 10 ++++++++++ src/libs/extensionsystem/pluginmanager.h | 9 +++++++++ src/libs/extensionsystem/pluginmanager_p.h | 3 +++ src/plugins/autotest/autotestunittests.cpp | 9 +++++++++ src/plugins/autotest/autotestunittests.h | 1 + 6 files changed, 37 insertions(+) diff --git a/src/app/main.cpp b/src/app/main.cpp index 248fa8efef5..57b4281c51f 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -435,7 +435,9 @@ public: void setArguments(const QStringList &args) { m_args = args; } + QString executable() const { return m_executable; } QStringList arguments() const { return m_args; } + QString workingPath() const { return m_workingPath; } int restartOrExit(int exitCode) { @@ -696,6 +698,9 @@ int main(int argc, char **argv) } restarter.setArguments(options.preAppArguments + PluginManager::argumentsForRestart() + lastSessionArgument()); + const PluginManager::ProcessData processData = { restarter.executable(), + options.preAppArguments + PluginManager::argumentsForRestart(), restarter.workingPath() }; + PluginManager::setCreatorProcessData(processData); const PluginSpecSet plugins = PluginManager::plugins(); PluginSpec *coreplugin = nullptr; diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp index 823ea97f174..7e6693ea2d9 100644 --- a/src/libs/extensionsystem/pluginmanager.cpp +++ b/src/libs/extensionsystem/pluginmanager.cpp @@ -881,6 +881,16 @@ void PluginManager::waitForScenarioFullyInitialized() } #endif +void PluginManager::setCreatorProcessData(const PluginManager::ProcessData &data) +{ + d->m_creatorProcessData = data; +} + +PluginManager::ProcessData PluginManager::creatorProcessData() +{ + return d->m_creatorProcessData; +} + /*! \internal */ diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h index 341a35411ee..17be0dbfbe5 100644 --- a/src/libs/extensionsystem/pluginmanager.h +++ b/src/libs/extensionsystem/pluginmanager.h @@ -133,6 +133,15 @@ public: // void scenarioPointTriggered(const QVariant pointData); // ?? e.g. in StringTable::GC() -> post a call to quit into main thread and sleep for 5 seconds in the GC thread #endif + struct ProcessData { + QString m_executable; + QStringList m_args; + QString m_workingPath; + }; + + static void setCreatorProcessData(const ProcessData &data); + static ProcessData creatorProcessData(); + static void profilingReport(const char *what, const PluginSpec *spec = nullptr); static QString platformName(); diff --git a/src/libs/extensionsystem/pluginmanager_p.h b/src/libs/extensionsystem/pluginmanager_p.h index 077fd7bdb13..66875570ee2 100644 --- a/src/libs/extensionsystem/pluginmanager_p.h +++ b/src/libs/extensionsystem/pluginmanager_p.h @@ -26,6 +26,7 @@ #pragma once #include "pluginspec.h" +#include "pluginmanager.h" #include @@ -153,6 +154,8 @@ public: QMutex m_scenarioMutex; QWaitCondition m_scenarioWaitCondition; + PluginManager::ProcessData m_creatorProcessData; + private: PluginManager *q; diff --git a/src/plugins/autotest/autotestunittests.cpp b/src/plugins/autotest/autotestunittests.cpp index b65fb25c3d4..6ae27bd70d6 100644 --- a/src/plugins/autotest/autotestunittests.cpp +++ b/src/plugins/autotest/autotestunittests.cpp @@ -34,6 +34,8 @@ #include #include +#include + #include #include #include @@ -46,6 +48,7 @@ #include using namespace Core; +using namespace ExtensionSystem; using namespace ProjectExplorer; using namespace Utils; @@ -304,5 +307,11 @@ void AutoTestUnitTests::testCodeParserBoostTest_data() << QString(m_tmpDir->path() + "/simple_boost/simple_boost.qbs") << QString(".qbs"); } +void AutoTestUnitTests::testStringTable() +{ + const PluginManager::ProcessData data = PluginManager::creatorProcessData(); + QCOMPARE(QProcess::execute(data.m_executable, data.m_args + QStringList({ "-scenario", "TestStringTable" })), 0); +} + } // namespace Internal } // namespace Autotest diff --git a/src/plugins/autotest/autotestunittests.h b/src/plugins/autotest/autotestunittests.h index 0c43432a5bb..dcb4fe8657e 100644 --- a/src/plugins/autotest/autotestunittests.h +++ b/src/plugins/autotest/autotestunittests.h @@ -55,6 +55,7 @@ private slots: void testCodeParserGTest_data(); void testCodeParserBoostTest(); void testCodeParserBoostTest_data(); + void testStringTable(); private: TestTreeModel *m_model = nullptr;