Autotest: Adapt to changed settings access pattern again

Settings are created on first access now, even though this
doesn't matter much here as this happens unconditionally in
AutotestPluginPrivate ctor via m_frameworkManager.synchronizeSettings()

Change-Id: I340927cf107d7e4b2268e842d23f1a89898e8a92
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2023-07-06 17:46:57 +02:00
parent 60fb0fd902
commit 694d81ad63
18 changed files with 43 additions and 51 deletions

View File

@@ -94,7 +94,6 @@ public:
void onRunFileTriggered(); void onRunFileTriggered();
void onRunUnderCursorTriggered(TestRunMode mode); void onRunUnderCursorTriggered(TestRunMode mode);
TestSettings m_settings;
TestSettingsPage m_testSettingPage; TestSettingsPage m_testSettingPage;
TestCodeParser m_testCodeParser; TestCodeParser m_testCodeParser;
@@ -149,7 +148,7 @@ AutotestPluginPrivate::AutotestPluginPrivate()
}); });
ProjectExplorer::ProjectPanelFactory::registerFactory(panelFactory); ProjectExplorer::ProjectPanelFactory::registerFactory(panelFactory);
TestFrameworkManager::activateFrameworksAndToolsFromSettings(&m_settings); TestFrameworkManager::activateFrameworksAndToolsFromSettings();
m_testTreeModel.synchronizeTestFrameworks(); m_testTreeModel.synchronizeTestFrameworks();
m_testTreeModel.synchronizeTestTools(); m_testTreeModel.synchronizeTestTools();

View File

@@ -88,17 +88,17 @@ QStringList BoostTestConfiguration::argumentsForTestRunner(QStringList *omitted)
{ {
auto boostSettings = static_cast<BoostTestSettings *>(framework()->testSettings()); auto boostSettings = static_cast<BoostTestSettings *>(framework()->testSettings());
QStringList arguments; QStringList arguments;
arguments << "-l" << BoostTestSettings::logLevelToOption(LogLevel(boostSettings->logLevel.value())); arguments << "-l" << BoostTestSettings::logLevelToOption(LogLevel(boostSettings->logLevel()));
arguments << "-r" << BoostTestSettings::reportLevelToOption(ReportLevel(boostSettings->reportLevel.value())); arguments << "-r" << BoostTestSettings::reportLevelToOption(ReportLevel(boostSettings->reportLevel()));
if (boostSettings->randomize.value()) if (boostSettings->randomize())
arguments << QString("--random=").append(QString::number(boostSettings->seed.value())); arguments << QString("--random=").append(QString::number(boostSettings->seed()));
if (boostSettings->systemErrors.value()) if (boostSettings->systemErrors())
arguments << "-s"; arguments << "-s";
if (boostSettings->fpExceptions.value()) if (boostSettings->fpExceptions())
arguments << "--detect_fp_exceptions"; arguments << "--detect_fp_exceptions";
if (!boostSettings->memLeaks.value()) if (!boostSettings->memLeaks())
arguments << "--detect_memory_leaks=0"; arguments << "--detect_memory_leaks=0";
// TODO improve the test case gathering and arguments building to avoid too long command lines // TODO improve the test case gathering and arguments building to avoid too long command lines
@@ -110,7 +110,7 @@ QStringList BoostTestConfiguration::argumentsForTestRunner(QStringList *omitted)
arguments << "-t" << "\"" + test + "\""; arguments << "-t" << "\"" + test + "\"";
} }
if (TestSettings::instance()->processArgs()) { if (testSettings().processArgs()) {
arguments << filterInterfering(runnable().command.arguments().split( arguments << filterInterfering(runnable().command.arguments().split(
' ', Qt::SkipEmptyParts), omitted); ' ', Qt::SkipEmptyParts), omitted);
} }

View File

@@ -79,7 +79,7 @@ QStringList CatchConfiguration::argumentsForTestRunner(QStringList *omitted) con
arguments << "\"" + testCases().join("\", \"") + "\""; arguments << "\"" + testCases().join("\", \"") + "\"";
arguments << "--reporter" << "xml"; arguments << "--reporter" << "xml";
if (TestSettings::instance()->processArgs()) { if (testSettings().processArgs()) {
arguments << filterInterfering(runnable().command.arguments().split( arguments << filterInterfering(runnable().command.arguments().split(
' ', Qt::SkipEmptyParts), omitted); ' ', Qt::SkipEmptyParts), omitted);
} }

View File

@@ -88,7 +88,7 @@ QList<ITestConfiguration *> CTestTreeItem::testConfigurationsFor(const QStringLi
return {}; return {};
const ProjectExplorer::BuildSystem *buildSystem = target->buildSystem(); const ProjectExplorer::BuildSystem *buildSystem = target->buildSystem();
QStringList options{"--timeout", QString::number(TestSettings::instance()->timeout() / 1000)}; QStringList options{"--timeout", QString::number(testSettings().timeout() / 1000)};
auto ctestSettings = static_cast<CTestSettings *>(testBase()->testSettings()); auto ctestSettings = static_cast<CTestSettings *>(testBase()->testSettings());
options << ctestSettings->activeSettingsAsOptions(); options << ctestSettings->activeSettingsAsOptions();
CommandLine command = buildSystem->commandLineForTests(selected, options); CommandLine command = buildSystem->commandLineForTests(selected, options);

View File

@@ -54,7 +54,7 @@ QStringList filterInterfering(const QStringList &provided, QStringList *omitted)
QStringList GTestConfiguration::argumentsForTestRunner(QStringList *omitted) const QStringList GTestConfiguration::argumentsForTestRunner(QStringList *omitted) const
{ {
QStringList arguments; QStringList arguments;
if (TestSettings::instance()->processArgs()) { if (testSettings().processArgs()) {
arguments << filterInterfering(runnable().command.arguments().split( arguments << filterInterfering(runnable().command.arguments().split(
' ', Qt::SkipEmptyParts), omitted); ' ', Qt::SkipEmptyParts), omitted);
} }

View File

@@ -137,7 +137,7 @@ Environment prepareBasicEnvironment(const Environment &env)
result.set("QT_FORCE_STDERR_LOGGING", "1"); result.set("QT_FORCE_STDERR_LOGGING", "1");
result.set("QT_LOGGING_TO_CONSOLE", "1"); result.set("QT_LOGGING_TO_CONSOLE", "1");
} }
const int timeout = TestSettings::instance()->timeout(); const int timeout = testSettings().timeout();
if (timeout > 5 * 60 * 1000) // Qt5.5 introduced hard limit, Qt5.6.1 added env var to raise this if (timeout > 5 * 60 * 1000) // Qt5.5 introduced hard limit, Qt5.6.1 added env var to raise this
result.set("QTEST_FUNCTION_TIMEOUT", QString::number(timeout)); result.set("QTEST_FUNCTION_TIMEOUT", QString::number(timeout));
return result; return result;

View File

@@ -39,7 +39,7 @@ TestOutputReader *QtTestConfiguration::createOutputReader(Process *app) const
QStringList QtTestConfiguration::argumentsForTestRunner(QStringList *omitted) const QStringList QtTestConfiguration::argumentsForTestRunner(QStringList *omitted) const
{ {
QStringList arguments; QStringList arguments;
if (TestSettings::instance()->processArgs()) { if (testSettings().processArgs()) {
arguments.append(QTestUtils::filterInterfering( arguments.append(QTestUtils::filterInterfering(
runnable().command.arguments().split(' ', Qt::SkipEmptyParts), runnable().command.arguments().split(' ', Qt::SkipEmptyParts),
omitted, false)); omitted, false));

View File

@@ -32,7 +32,7 @@ TestOutputReader *QuickTestConfiguration::createOutputReader(Process *app) const
QStringList QuickTestConfiguration::argumentsForTestRunner(QStringList *omitted) const QStringList QuickTestConfiguration::argumentsForTestRunner(QStringList *omitted) const
{ {
QStringList arguments; QStringList arguments;
if (TestSettings::instance()->processArgs()) { if (testSettings().processArgs()) {
arguments.append(QTestUtils::filterInterfering arguments.append(QTestUtils::filterInterfering
(runnable().command.arguments().split(' ', Qt::SkipEmptyParts), (runnable().command.arguments().split(' ', Qt::SkipEmptyParts),
omitted, true)); omitted, true));

View File

@@ -361,7 +361,7 @@ void TestCodeParser::scanForTests(const QSet<FilePath> &filePaths,
using namespace Tasking; using namespace Tasking;
int limit = TestSettings::instance()->scanThreadLimit(); int limit = testSettings().scanThreadLimit();
if (limit == 0) if (limit == 0)
limit = std::max(QThread::idealThreadCount() / 4, 1); limit = std::max(QThread::idealThreadCount() / 4, 1);
qCDebug(LOG) << "Using" << limit << "threads for scan."; qCDebug(LOG) << "Using" << limit << "threads for scan.";

View File

@@ -45,15 +45,15 @@ bool TestFrameworkManager::registerTestTool(ITestTool *testTool)
return true; return true;
} }
void TestFrameworkManager::activateFrameworksAndToolsFromSettings( void TestFrameworkManager::activateFrameworksAndToolsFromSettings()
const Internal::TestSettings *settings)
{ {
const Internal::TestSettings &settings = Internal::testSettings();
for (ITestFramework *framework : std::as_const(s_instance->m_registeredFrameworks)) { for (ITestFramework *framework : std::as_const(s_instance->m_registeredFrameworks)) {
framework->setActive(settings->frameworks.value(framework->id(), false)); framework->setActive(settings.frameworks.value(framework->id(), false));
framework->setGrouping(settings->frameworksGrouping.value(framework->id(), false)); framework->setGrouping(settings.frameworksGrouping.value(framework->id(), false));
} }
for (ITestTool *testTool : std::as_const(s_instance->m_registeredTestTools)) for (ITestTool *testTool : std::as_const(s_instance->m_registeredTestTools))
testTool->setActive(settings->tools.value(testTool->id(), false)); testTool->setActive(settings.tools.value(testTool->id(), false));
} }
const TestFrameworks TestFrameworkManager::registeredFrameworks() const TestFrameworks TestFrameworkManager::registeredFrameworks()
@@ -95,7 +95,7 @@ ITestTool *TestFrameworkManager::testToolForBuildSystemId(Id buildSystemId)
void TestFrameworkManager::synchronizeSettings() void TestFrameworkManager::synchronizeSettings()
{ {
Internal::TestSettings::instance()->fromSettings(); Internal::testSettings().fromSettings();
for (ITestFramework *framework : std::as_const(m_registeredFrameworks)) { for (ITestFramework *framework : std::as_const(m_registeredFrameworks)) {
if (ITestSettings *fSettings = framework->testSettings()) if (ITestSettings *fSettings = framework->testSettings())
fSettings->readSettings(); fSettings->readSettings();

View File

@@ -6,9 +6,6 @@
#include "itestframework.h" #include "itestframework.h"
namespace Autotest { namespace Autotest {
namespace Internal {
class TestSettings;
}
class TestFrameworkManager final class TestFrameworkManager final
{ {
@@ -24,7 +21,7 @@ public:
static ITestFramework *frameworkForId(Utils::Id frameworkId); static ITestFramework *frameworkForId(Utils::Id frameworkId);
static ITestTool *testToolForId(Utils::Id testToolId); static ITestTool *testToolForId(Utils::Id testToolId);
static ITestTool *testToolForBuildSystemId(Utils::Id buildSystemId); static ITestTool *testToolForBuildSystemId(Utils::Id buildSystemId);
static void activateFrameworksAndToolsFromSettings(const Internal::TestSettings *settings); static void activateFrameworksAndToolsFromSettings();
static const TestFrameworks registeredFrameworks(); static const TestFrameworks registeredFrameworks();
static const TestTools registeredTestTools(); static const TestTools registeredTestTools();

View File

@@ -161,10 +161,10 @@ void TestResultDelegate::clearCache()
void TestResultDelegate::limitTextOutput(QString &output) const void TestResultDelegate::limitTextOutput(QString &output) const
{ {
int maxLineCount = Internal::TestSettings::instance()->resultDescriptionMaxSize(); int maxLineCount = testSettings().resultDescriptionMaxSize();
bool limited = false; bool limited = false;
if (Internal::TestSettings::instance()->limitResultDescription() && maxLineCount > 0) { if (testSettings().limitResultDescription() && maxLineCount > 0) {
int index = -1; int index = -1;
int lastChar = output.size() - 1; int lastChar = output.size() - 1;
@@ -182,7 +182,7 @@ void TestResultDelegate::limitTextOutput(QString &output) const
} }
} }
if (TestSettings::instance()->limitResultOutput() && output.length() > outputLimit) { if (testSettings().limitResultOutput() && output.length() > outputLimit) {
output = output.left(outputLimit); output = output.left(outputLimit);
limited = true; limited = true;
} }

View File

@@ -284,7 +284,7 @@ void TestResultModel::addTestResult(const TestResult &testResult, bool autoExpan
TestResultItem *newItem = new TestResultItem(testResult); TestResultItem *newItem = new TestResultItem(testResult);
TestResultItem *root = nullptr; TestResultItem *root = nullptr;
if (TestSettings::instance()->displayApplication()) { if (testSettings().displayApplication()) {
const QString application = testResult.id(); const QString application = testResult.id();
if (!application.isEmpty()) { if (!application.isEmpty()) {
root = rootItem()->findFirstLevelChild([&application](TestResultItem *child) { root = rootItem()->findFirstLevelChild([&application](TestResultItem *child) {

View File

@@ -291,7 +291,7 @@ void TestResultsPane::clearContents()
setIconBadgeNumber(0); setIconBadgeNumber(0);
navigateStateChanged(); navigateStateChanged();
m_summaryWidget->setVisible(false); m_summaryWidget->setVisible(false);
m_autoScroll = TestSettings::instance()->autoScroll(); m_autoScroll = testSettings().autoScroll();
connect(m_treeView->verticalScrollBar(), &QScrollBar::rangeChanged, connect(m_treeView->verticalScrollBar(), &QScrollBar::rangeChanged,
this, &TestResultsPane::onScrollBarRangeChanged, Qt::UniqueConnection); this, &TestResultsPane::onScrollBarRangeChanged, Qt::UniqueConnection);
m_textOutput->clear(); m_textOutput->clear();
@@ -437,7 +437,7 @@ void TestResultsPane::onRunSelectedTriggered()
void TestResultsPane::initializeFilterMenu() void TestResultsPane::initializeFilterMenu()
{ {
const bool omitIntern = TestSettings::instance()->omitInternalMsg(); const bool omitIntern = testSettings().omitInternalMsg();
// FilterModel has all messages enabled by default // FilterModel has all messages enabled by default
if (omitIntern) if (omitIntern)
m_filterModel->toggleTestResultType(ResultType::MessageInternal); m_filterModel->toggleTestResultType(ResultType::MessageInternal);
@@ -553,8 +553,7 @@ void TestResultsPane::onTestRunFinished()
m_model->removeCurrentTestMessage(); m_model->removeCurrentTestMessage();
disconnect(m_treeView->verticalScrollBar(), &QScrollBar::rangeChanged, disconnect(m_treeView->verticalScrollBar(), &QScrollBar::rangeChanged,
this, &TestResultsPane::onScrollBarRangeChanged); this, &TestResultsPane::onScrollBarRangeChanged);
if (TestSettings::instance()->popupOnFinish() if (testSettings().popupOnFinish() && (!testSettings().popupOnFail() || hasFailedTests(m_model))) {
&& (!TestSettings::instance()->popupOnFail() || hasFailedTests(m_model))) {
popup(IOutputPane::NoModeSwitch); popup(IOutputPane::NoModeSwitch);
} }
createMarks(); createMarks();

View File

@@ -258,7 +258,7 @@ static RunConfiguration *getRunConfiguration(const QString &buildTargetKey)
int TestRunner::precheckTestConfigurations() int TestRunner::precheckTestConfigurations()
{ {
const bool omitWarnings = TestSettings::instance()->omitRunConfigWarn(); const bool omitWarnings = testSettings().omitRunConfigWarn();
int testCaseCount = 0; int testCaseCount = 0;
for (ITestConfiguration *itc : std::as_const(m_selectedTests)) { for (ITestConfiguration *itc : std::as_const(m_selectedTests)) {
if (itc->testBase()->type() == ITestBase::Tool) { if (itc->testBase()->type() == ITestBase::Tool) {
@@ -402,7 +402,7 @@ void TestRunner::runTestsHelper()
} }
process.setEnvironment(environment); process.setEnvironment(environment);
m_cancelTimer.setInterval(TestSettings::instance()->timeout()); m_cancelTimer.setInterval(testSettings().timeout());
m_cancelTimer.start(); m_cancelTimer.start();
qCInfo(runnerLog) << "Command:" << process.commandLine().executable(); qCInfo(runnerLog) << "Command:" << process.commandLine().executable();
@@ -468,7 +468,7 @@ void TestRunner::runTestsHelper()
cancelCurrent(UserCanceled); cancelCurrent(UserCanceled);
}); });
if (TestSettings::instance()->popupOnStart()) if (testSettings().popupOnStart())
AutotestPlugin::popupResultsPane(); AutotestPlugin::popupResultsPane();
m_taskTree->start(); m_taskTree->start();
@@ -590,7 +590,7 @@ void TestRunner::debugTests()
connect(runControl, &RunControl::stopped, this, &TestRunner::onFinished); connect(runControl, &RunControl::stopped, this, &TestRunner::onFinished);
ProjectExplorerPlugin::startRunControl(runControl); ProjectExplorerPlugin::startRunControl(runControl);
if (useOutputProcessor && TestSettings::instance()->popupOnStart()) if (useOutputProcessor && testSettings().popupOnStart())
AutotestPlugin::popupResultsPane(); AutotestPlugin::popupResultsPane();
} }
@@ -671,10 +671,10 @@ static RunAfterBuildMode runAfterBuild()
return RunAfterBuildMode::None; return RunAfterBuildMode::None;
if (!project->namedSettings(Constants::SK_USE_GLOBAL).isValid()) if (!project->namedSettings(Constants::SK_USE_GLOBAL).isValid())
return TestSettings::instance()->runAfterBuildMode(); return testSettings().runAfterBuildMode();
TestProjectSettings *projectSettings = AutotestPlugin::projectSettings(project); TestProjectSettings *projectSettings = AutotestPlugin::projectSettings(project);
return projectSettings->useGlobalSettings() ? TestSettings::instance()->runAfterBuildMode() return projectSettings->useGlobalSettings() ? testSettings().runAfterBuildMode()
: projectSettings->runAfterBuild(); : projectSettings->runAfterBuild();
} }

View File

@@ -15,17 +15,14 @@ static const char groupSuffix[] = ".group";
constexpr int defaultTimeout = 60000; constexpr int defaultTimeout = 60000;
static TestSettings *s_instance; TestSettings &testSettings()
TestSettings *TestSettings::instance()
{ {
return s_instance; static TestSettings theSettings;
return theSettings;
} }
TestSettings::TestSettings() TestSettings::TestSettings()
{ {
s_instance = this;
setSettingsGroup(Constants::SETTINGSGROUP); setSettingsGroup(Constants::SETTINGSGROUP);
scanThreadLimit.setSettingsKey("ScanThreadLimit"); scanThreadLimit.setSettingsKey("ScanThreadLimit");

View File

@@ -27,8 +27,6 @@ class TestSettings : public Utils::AspectContainer, public NonAspectSettings
public: public:
TestSettings(); TestSettings();
static TestSettings *instance();
void toSettings() const; void toSettings() const;
void fromSettings(); void fromSettings();
@@ -50,4 +48,6 @@ public:
RunAfterBuildMode runAfterBuildMode() const; RunAfterBuildMode runAfterBuildMode() const;
}; };
TestSettings &testSettings();
} // Autotest::Internal } // Autotest::Internal

View File

@@ -80,7 +80,7 @@ TestSettingsWidget::TestSettingsWidget()
onClicked([] { AutotestPlugin::clearChoiceCache(); }, this) onClicked([] { AutotestPlugin::clearChoiceCache(); }, this)
}; };
TestSettings &s = *TestSettings::instance(); TestSettings &s = Internal::testSettings();
Group generalGroup { Group generalGroup {
title(Tr::tr("General")), title(Tr::tr("General")),
Column { Column {
@@ -123,7 +123,7 @@ TestSettingsWidget::TestSettingsWidget()
populateFrameworksListWidget(s.frameworks, s.tools); populateFrameworksListWidget(s.frameworks, s.tools);
setOnApply([this] { setOnApply([this] {
TestSettings &s = *TestSettings::instance(); TestSettings &s = Internal::testSettings();
NonAspectSettings tmp; NonAspectSettings tmp;
testSettings(tmp); testSettings(tmp);