Autotest: Move Test{FrameWorkManager,Runner} singletons

Make them plugin-pimpl data members, removing some indirections.

Change-Id: Ie441ac94a27f07342513b0b5b1437ccfe4b5d7d2
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2020-03-26 09:21:25 +01:00
parent bac32dc740
commit f3c1751965
5 changed files with 31 additions and 39 deletions

View File

@@ -89,7 +89,6 @@ public:
AutotestPluginPrivate(); AutotestPluginPrivate();
~AutotestPluginPrivate() override; ~AutotestPluginPrivate() override;
TestFrameworkManager *m_frameworkManager = nullptr;
TestNavigationWidgetFactory *m_navigationWidgetFactory = nullptr; TestNavigationWidgetFactory *m_navigationWidgetFactory = nullptr;
TestResultsPane *m_resultsPane = nullptr; TestResultsPane *m_resultsPane = nullptr;
QMap<QString, ChoicePair> m_runconfigCache; QMap<QString, ChoicePair> m_runconfigCache;
@@ -105,6 +104,8 @@ public:
TestCodeParser m_testCodeParser; TestCodeParser m_testCodeParser;
TestTreeModel m_testTreeModel{&m_testCodeParser}; TestTreeModel m_testTreeModel{&m_testCodeParser};
TestRunner m_testRunner;
TestFrameworkManager m_frameworkManager;
}; };
static AutotestPluginPrivate *dd = nullptr; static AutotestPluginPrivate *dd = nullptr;
@@ -127,14 +128,13 @@ AutotestPlugin::~AutotestPlugin()
AutotestPluginPrivate::AutotestPluginPrivate() AutotestPluginPrivate::AutotestPluginPrivate()
{ {
dd = this; // Needed as the code below access it via the static plugin interface dd = this; // Needed as the code below access it via the static plugin interface
m_frameworkManager = TestFrameworkManager::instance();
initializeMenuEntries(); initializeMenuEntries();
m_frameworkManager->registerTestFramework(new QtTestFramework); m_frameworkManager.registerTestFramework(new QtTestFramework);
m_frameworkManager->registerTestFramework(new QuickTestFramework); m_frameworkManager.registerTestFramework(new QuickTestFramework);
m_frameworkManager->registerTestFramework(new GTestFramework); m_frameworkManager.registerTestFramework(new GTestFramework);
m_frameworkManager->registerTestFramework(new BoostTestFramework); m_frameworkManager.registerTestFramework(new BoostTestFramework);
m_frameworkManager->synchronizeSettings(ICore::settings()); m_frameworkManager.synchronizeSettings(ICore::settings());
m_navigationWidgetFactory = new TestNavigationWidgetFactory; m_navigationWidgetFactory = new TestNavigationWidgetFactory;
m_resultsPane = TestResultsPane::instance(); m_resultsPane = TestResultsPane::instance();
@@ -147,7 +147,7 @@ AutotestPluginPrivate::AutotestPluginPrivate()
}); });
ProjectExplorer::ProjectPanelFactory::registerFactory(panelFactory); ProjectExplorer::ProjectPanelFactory::registerFactory(panelFactory);
m_frameworkManager->activateFrameworksFromSettings(&m_settings); m_frameworkManager.activateFrameworksFromSettings(&m_settings);
m_testTreeModel.synchronizeTestFrameworks(); m_testTreeModel.synchronizeTestFrameworks();
auto sessionManager = ProjectExplorer::SessionManager::instance(); auto sessionManager = ProjectExplorer::SessionManager::instance();
@@ -173,7 +173,6 @@ AutotestPluginPrivate::~AutotestPluginPrivate()
delete m_navigationWidgetFactory; delete m_navigationWidgetFactory;
delete m_resultsPane; delete m_resultsPane;
delete m_frameworkManager;
} }
TestSettings *AutotestPlugin::settings() TestSettings *AutotestPlugin::settings()
@@ -298,16 +297,14 @@ ExtensionSystem::IPlugin::ShutdownFlag AutotestPlugin::aboutToShutdown()
void AutotestPluginPrivate::onRunAllTriggered() void AutotestPluginPrivate::onRunAllTriggered()
{ {
TestRunner *runner = TestRunner::instance(); m_testRunner.setSelectedTests(m_testTreeModel.getAllTestCases());
runner->setSelectedTests(m_testTreeModel.getAllTestCases()); m_testRunner.prepareToRunTests(TestRunMode::Run);
runner->prepareToRunTests(TestRunMode::Run);
} }
void AutotestPluginPrivate::onRunSelectedTriggered() void AutotestPluginPrivate::onRunSelectedTriggered()
{ {
TestRunner *runner = TestRunner::instance(); m_testRunner.setSelectedTests(m_testTreeModel.getSelectedTests());
runner->setSelectedTests(m_testTreeModel.getSelectedTests()); m_testRunner.prepareToRunTests(TestRunMode::Run);
runner->prepareToRunTests(TestRunMode::Run);
} }
void AutotestPluginPrivate::onRunFileTriggered() void AutotestPluginPrivate::onRunFileTriggered()
@@ -324,9 +321,8 @@ void AutotestPluginPrivate::onRunFileTriggered()
if (tests.isEmpty()) if (tests.isEmpty())
return; return;
TestRunner *runner = TestRunner::instance(); m_testRunner.setSelectedTests(tests);
runner->setSelectedTests(tests); m_testRunner.prepareToRunTests(TestRunMode::Run);
runner->prepareToRunTests(TestRunMode::Run);
} }
static QList<TestConfiguration *> testItemsToTestConfigurations(const QList<TestTreeItem *> &items, static QList<TestConfiguration *> testItemsToTestConfigurations(const QList<TestTreeItem *> &items,
@@ -368,16 +364,15 @@ void AutotestPluginPrivate::onRunUnderCursorTriggered(TestRunMode mode)
return; return;
} }
auto runner = TestRunner::instance(); m_testRunner.setSelectedTests(testsToRun);
runner->setSelectedTests(testsToRun); m_testRunner.prepareToRunTests(mode);
runner->prepareToRunTests(mode);
} }
void AutotestPlugin::updateMenuItemsEnabledState() void AutotestPlugin::updateMenuItemsEnabledState()
{ {
const ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject(); const ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject();
const ProjectExplorer::Target *target = project ? project->activeTarget() : nullptr; 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; && dd->m_testCodeParser.state() == TestCodeParser::Idle;
const bool hasTests = dd->m_testTreeModel.hasTests(); const bool hasTests = dd->m_testTreeModel.hasTests();
// avoid expensive call to PE::canRunStartupProject() - limit to minimum necessary checks // avoid expensive call to PE::canRunStartupProject() - limit to minimum necessary checks

View File

@@ -28,7 +28,6 @@
#include "autotestplugin.h" #include "autotestplugin.h"
#include "iframeworksettings.h" #include "iframeworksettings.h"
#include "itestparser.h" #include "itestparser.h"
#include "testrunner.h"
#include "testsettings.h" #include "testsettings.h"
#include "testtreeitem.h" #include "testtreeitem.h"
#include "testtreemodel.h" #include "testtreemodel.h"
@@ -51,21 +50,18 @@ static TestFrameworkManager *s_instance = nullptr;
TestFrameworkManager::TestFrameworkManager() TestFrameworkManager::TestFrameworkManager()
{ {
m_testRunner = Internal::TestRunner::instance();
s_instance = this; s_instance = this;
} }
TestFrameworkManager *TestFrameworkManager::instance() TestFrameworkManager *TestFrameworkManager::instance()
{ {
if (!s_instance)
return new TestFrameworkManager;
return s_instance; return s_instance;
} }
TestFrameworkManager::~TestFrameworkManager() TestFrameworkManager::~TestFrameworkManager()
{ {
delete m_testRunner;
qDeleteAll(m_registeredFrameworks); qDeleteAll(m_registeredFrameworks);
s_instance = nullptr;
} }
bool TestFrameworkManager::registerTestFramework(ITestFramework *framework) bool TestFrameworkManager::registerTestFramework(ITestFramework *framework)

View File

@@ -37,18 +37,20 @@ namespace Core { class Id; }
namespace Autotest { namespace Autotest {
namespace Internal { namespace Internal {
class TestRunner;
struct TestSettings; struct TestSettings;
} }
class IFrameworkSettings; class IFrameworkSettings;
class ITestParser; class ITestParser;
class TestFrameworkManager class TestFrameworkManager final
{ {
public: public:
TestFrameworkManager();
~TestFrameworkManager();
static TestFrameworkManager *instance(); static TestFrameworkManager *instance();
virtual ~TestFrameworkManager();
static ITestFramework *frameworkForId(Core::Id frameworkId); static ITestFramework *frameworkForId(Core::Id frameworkId);
@@ -65,10 +67,8 @@ public:
private: private:
TestFrameworks activeFrameworks() const; TestFrameworks activeFrameworks() const;
explicit TestFrameworkManager();
TestFrameworks m_registeredFrameworks; TestFrameworks m_registeredFrameworks;
Internal::TestRunner *m_testRunner;
}; };
} // namespace Autotest } // namespace Autotest

View File

@@ -82,14 +82,13 @@ static TestRunner *s_instance = nullptr;
TestRunner *TestRunner::instance() TestRunner *TestRunner::instance()
{ {
if (!s_instance)
s_instance = new TestRunner;
return s_instance; return s_instance;
} }
TestRunner::TestRunner(QObject *parent) : TestRunner::TestRunner()
QObject(parent)
{ {
s_instance = this;
connect(&m_futureWatcher, &QFutureWatcher<TestResultPtr>::resultReadyAt, connect(&m_futureWatcher, &QFutureWatcher<TestResultPtr>::resultReadyAt,
this, [this](int index) { emit testResultReady(m_futureWatcher.resultAt(index)); }); this, [this](int index) { emit testResultReady(m_futureWatcher.resultAt(index)); });
connect(&m_futureWatcher, &QFutureWatcher<TestResultPtr>::finished, connect(&m_futureWatcher, &QFutureWatcher<TestResultPtr>::finished,

View File

@@ -53,14 +53,17 @@ enum class TestRunMode;
namespace Internal { namespace Internal {
class AUTOTESTSHARED_EXPORT TestRunner : public QObject class AUTOTESTSHARED_EXPORT TestRunner final : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
TestRunner();
~TestRunner() final;
enum CancelReason { UserCanceled, Timeout, KitChanged }; enum CancelReason { UserCanceled, Timeout, KitChanged };
static TestRunner* instance(); static TestRunner* instance();
~TestRunner() override;
void setSelectedTests(const QList<TestConfiguration *> &selected); void setSelectedTests(const QList<TestConfiguration *> &selected);
void runTest(TestRunMode mode, const TestTreeItem *item); void runTest(TestRunMode mode, const TestTreeItem *item);
@@ -92,7 +95,6 @@ private:
void debugTests(); void debugTests();
void runOrDebugTests(); void runOrDebugTests();
void reportResult(ResultType type, const QString &description); void reportResult(ResultType type, const QString &description);
explicit TestRunner(QObject *parent = nullptr);
bool postponeTestRunWithEmptyExecutable(ProjectExplorer::Project *project); bool postponeTestRunWithEmptyExecutable(ProjectExplorer::Project *project);
void onBuildSystemUpdated(); void onBuildSystemUpdated();