From f3c1751965e0321f3b5b980162d03f994da1cb5f Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 26 Mar 2020 09:21:25 +0100 Subject: [PATCH] Autotest: Move Test{FrameWorkManager,Runner} singletons Make them plugin-pimpl data members, removing some indirections. Change-Id: Ie441ac94a27f07342513b0b5b1437ccfe4b5d7d2 Reviewed-by: Christian Stenger --- src/plugins/autotest/autotestplugin.cpp | 39 ++++++++----------- src/plugins/autotest/testframeworkmanager.cpp | 6 +-- src/plugins/autotest/testframeworkmanager.h | 10 ++--- src/plugins/autotest/testrunner.cpp | 7 ++-- src/plugins/autotest/testrunner.h | 8 ++-- 5 files changed, 31 insertions(+), 39 deletions(-) diff --git a/src/plugins/autotest/autotestplugin.cpp b/src/plugins/autotest/autotestplugin.cpp index 9e37f7bb0f4..a0084ee65cf 100644 --- a/src/plugins/autotest/autotestplugin.cpp +++ b/src/plugins/autotest/autotestplugin.cpp @@ -89,7 +89,6 @@ public: AutotestPluginPrivate(); ~AutotestPluginPrivate() override; - TestFrameworkManager *m_frameworkManager = nullptr; TestNavigationWidgetFactory *m_navigationWidgetFactory = nullptr; TestResultsPane *m_resultsPane = nullptr; QMap m_runconfigCache; @@ -105,6 +104,8 @@ public: TestCodeParser m_testCodeParser; TestTreeModel m_testTreeModel{&m_testCodeParser}; + TestRunner m_testRunner; + TestFrameworkManager m_frameworkManager; }; static AutotestPluginPrivate *dd = nullptr; @@ -127,14 +128,13 @@ AutotestPlugin::~AutotestPlugin() AutotestPluginPrivate::AutotestPluginPrivate() { dd = this; // Needed as the code below access it via the static plugin interface - m_frameworkManager = TestFrameworkManager::instance(); initializeMenuEntries(); - m_frameworkManager->registerTestFramework(new QtTestFramework); - m_frameworkManager->registerTestFramework(new QuickTestFramework); - m_frameworkManager->registerTestFramework(new GTestFramework); - m_frameworkManager->registerTestFramework(new BoostTestFramework); + m_frameworkManager.registerTestFramework(new QtTestFramework); + m_frameworkManager.registerTestFramework(new QuickTestFramework); + m_frameworkManager.registerTestFramework(new GTestFramework); + m_frameworkManager.registerTestFramework(new BoostTestFramework); - m_frameworkManager->synchronizeSettings(ICore::settings()); + m_frameworkManager.synchronizeSettings(ICore::settings()); m_navigationWidgetFactory = new TestNavigationWidgetFactory; m_resultsPane = TestResultsPane::instance(); @@ -147,7 +147,7 @@ AutotestPluginPrivate::AutotestPluginPrivate() }); ProjectExplorer::ProjectPanelFactory::registerFactory(panelFactory); - m_frameworkManager->activateFrameworksFromSettings(&m_settings); + m_frameworkManager.activateFrameworksFromSettings(&m_settings); m_testTreeModel.synchronizeTestFrameworks(); auto sessionManager = ProjectExplorer::SessionManager::instance(); @@ -173,7 +173,6 @@ AutotestPluginPrivate::~AutotestPluginPrivate() delete m_navigationWidgetFactory; delete m_resultsPane; - delete m_frameworkManager; } TestSettings *AutotestPlugin::settings() @@ -298,16 +297,14 @@ ExtensionSystem::IPlugin::ShutdownFlag AutotestPlugin::aboutToShutdown() void AutotestPluginPrivate::onRunAllTriggered() { - TestRunner *runner = TestRunner::instance(); - runner->setSelectedTests(m_testTreeModel.getAllTestCases()); - runner->prepareToRunTests(TestRunMode::Run); + m_testRunner.setSelectedTests(m_testTreeModel.getAllTestCases()); + m_testRunner.prepareToRunTests(TestRunMode::Run); } void AutotestPluginPrivate::onRunSelectedTriggered() { - TestRunner *runner = TestRunner::instance(); - runner->setSelectedTests(m_testTreeModel.getSelectedTests()); - runner->prepareToRunTests(TestRunMode::Run); + m_testRunner.setSelectedTests(m_testTreeModel.getSelectedTests()); + m_testRunner.prepareToRunTests(TestRunMode::Run); } void AutotestPluginPrivate::onRunFileTriggered() @@ -324,9 +321,8 @@ void AutotestPluginPrivate::onRunFileTriggered() if (tests.isEmpty()) return; - TestRunner *runner = TestRunner::instance(); - runner->setSelectedTests(tests); - runner->prepareToRunTests(TestRunMode::Run); + m_testRunner.setSelectedTests(tests); + m_testRunner.prepareToRunTests(TestRunMode::Run); } static QList testItemsToTestConfigurations(const QList &items, @@ -368,16 +364,15 @@ void AutotestPluginPrivate::onRunUnderCursorTriggered(TestRunMode mode) return; } - auto runner = TestRunner::instance(); - runner->setSelectedTests(testsToRun); - runner->prepareToRunTests(mode); + m_testRunner.setSelectedTests(testsToRun); + m_testRunner.prepareToRunTests(mode); } void AutotestPlugin::updateMenuItemsEnabledState() { const ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject(); const ProjectExplorer::Target *target = project ? project->activeTarget() : nullptr; - const bool canScan = !TestRunner::instance()->isTestRunning() + const bool canScan = !dd->m_testRunner.isTestRunning() && dd->m_testCodeParser.state() == TestCodeParser::Idle; const bool hasTests = dd->m_testTreeModel.hasTests(); // avoid expensive call to PE::canRunStartupProject() - limit to minimum necessary checks diff --git a/src/plugins/autotest/testframeworkmanager.cpp b/src/plugins/autotest/testframeworkmanager.cpp index be00dde54af..6531a2b8ae7 100644 --- a/src/plugins/autotest/testframeworkmanager.cpp +++ b/src/plugins/autotest/testframeworkmanager.cpp @@ -28,7 +28,6 @@ #include "autotestplugin.h" #include "iframeworksettings.h" #include "itestparser.h" -#include "testrunner.h" #include "testsettings.h" #include "testtreeitem.h" #include "testtreemodel.h" @@ -51,21 +50,18 @@ static TestFrameworkManager *s_instance = nullptr; TestFrameworkManager::TestFrameworkManager() { - m_testRunner = Internal::TestRunner::instance(); s_instance = this; } TestFrameworkManager *TestFrameworkManager::instance() { - if (!s_instance) - return new TestFrameworkManager; return s_instance; } TestFrameworkManager::~TestFrameworkManager() { - delete m_testRunner; qDeleteAll(m_registeredFrameworks); + s_instance = nullptr; } bool TestFrameworkManager::registerTestFramework(ITestFramework *framework) diff --git a/src/plugins/autotest/testframeworkmanager.h b/src/plugins/autotest/testframeworkmanager.h index 40b86902fc0..549d772c570 100644 --- a/src/plugins/autotest/testframeworkmanager.h +++ b/src/plugins/autotest/testframeworkmanager.h @@ -37,18 +37,20 @@ namespace Core { class Id; } namespace Autotest { namespace Internal { -class TestRunner; struct TestSettings; } class IFrameworkSettings; class ITestParser; -class TestFrameworkManager +class TestFrameworkManager final { + public: + TestFrameworkManager(); + ~TestFrameworkManager(); + static TestFrameworkManager *instance(); - virtual ~TestFrameworkManager(); static ITestFramework *frameworkForId(Core::Id frameworkId); @@ -65,10 +67,8 @@ public: private: TestFrameworks activeFrameworks() const; - explicit TestFrameworkManager(); TestFrameworks m_registeredFrameworks; - Internal::TestRunner *m_testRunner; }; } // namespace Autotest diff --git a/src/plugins/autotest/testrunner.cpp b/src/plugins/autotest/testrunner.cpp index 1e32b8dbea5..ac3a4333046 100644 --- a/src/plugins/autotest/testrunner.cpp +++ b/src/plugins/autotest/testrunner.cpp @@ -82,14 +82,13 @@ static TestRunner *s_instance = nullptr; TestRunner *TestRunner::instance() { - if (!s_instance) - s_instance = new TestRunner; return s_instance; } -TestRunner::TestRunner(QObject *parent) : - QObject(parent) +TestRunner::TestRunner() { + s_instance = this; + connect(&m_futureWatcher, &QFutureWatcher::resultReadyAt, this, [this](int index) { emit testResultReady(m_futureWatcher.resultAt(index)); }); connect(&m_futureWatcher, &QFutureWatcher::finished, diff --git a/src/plugins/autotest/testrunner.h b/src/plugins/autotest/testrunner.h index a33f6248e1a..52e11d5e205 100644 --- a/src/plugins/autotest/testrunner.h +++ b/src/plugins/autotest/testrunner.h @@ -53,14 +53,17 @@ enum class TestRunMode; namespace Internal { -class AUTOTESTSHARED_EXPORT TestRunner : public QObject +class AUTOTESTSHARED_EXPORT TestRunner final : public QObject { Q_OBJECT + public: + TestRunner(); + ~TestRunner() final; + enum CancelReason { UserCanceled, Timeout, KitChanged }; static TestRunner* instance(); - ~TestRunner() override; void setSelectedTests(const QList &selected); void runTest(TestRunMode mode, const TestTreeItem *item); @@ -92,7 +95,6 @@ private: void debugTests(); void runOrDebugTests(); void reportResult(ResultType type, const QString &description); - explicit TestRunner(QObject *parent = nullptr); bool postponeTestRunWithEmptyExecutable(ProjectExplorer::Project *project); void onBuildSystemUpdated();