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() override;
TestFrameworkManager *m_frameworkManager = nullptr;
TestNavigationWidgetFactory *m_navigationWidgetFactory = nullptr;
TestResultsPane *m_resultsPane = nullptr;
QMap<QString, ChoicePair> 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<TestConfiguration *> testItemsToTestConfigurations(const QList<TestTreeItem *> &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

View File

@@ -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)

View File

@@ -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

View File

@@ -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<TestResultPtr>::resultReadyAt,
this, [this](int index) { emit testResultReady(m_futureWatcher.resultAt(index)); });
connect(&m_futureWatcher, &QFutureWatcher<TestResultPtr>::finished,

View File

@@ -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<TestConfiguration *> &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();