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 onRunUnderCursorTriggered(TestRunMode mode);
TestSettings m_settings;
TestSettingsPage m_testSettingPage;
TestCodeParser m_testCodeParser;
@@ -149,7 +148,7 @@ AutotestPluginPrivate::AutotestPluginPrivate()
});
ProjectExplorer::ProjectPanelFactory::registerFactory(panelFactory);
TestFrameworkManager::activateFrameworksAndToolsFromSettings(&m_settings);
TestFrameworkManager::activateFrameworksAndToolsFromSettings();
m_testTreeModel.synchronizeTestFrameworks();
m_testTreeModel.synchronizeTestTools();

View File

@@ -88,17 +88,17 @@ QStringList BoostTestConfiguration::argumentsForTestRunner(QStringList *omitted)
{
auto boostSettings = static_cast<BoostTestSettings *>(framework()->testSettings());
QStringList arguments;
arguments << "-l" << BoostTestSettings::logLevelToOption(LogLevel(boostSettings->logLevel.value()));
arguments << "-r" << BoostTestSettings::reportLevelToOption(ReportLevel(boostSettings->reportLevel.value()));
arguments << "-l" << BoostTestSettings::logLevelToOption(LogLevel(boostSettings->logLevel()));
arguments << "-r" << BoostTestSettings::reportLevelToOption(ReportLevel(boostSettings->reportLevel()));
if (boostSettings->randomize.value())
arguments << QString("--random=").append(QString::number(boostSettings->seed.value()));
if (boostSettings->randomize())
arguments << QString("--random=").append(QString::number(boostSettings->seed()));
if (boostSettings->systemErrors.value())
if (boostSettings->systemErrors())
arguments << "-s";
if (boostSettings->fpExceptions.value())
if (boostSettings->fpExceptions())
arguments << "--detect_fp_exceptions";
if (!boostSettings->memLeaks.value())
if (!boostSettings->memLeaks())
arguments << "--detect_memory_leaks=0";
// 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 + "\"";
}
if (TestSettings::instance()->processArgs()) {
if (testSettings().processArgs()) {
arguments << filterInterfering(runnable().command.arguments().split(
' ', Qt::SkipEmptyParts), omitted);
}

View File

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

View File

@@ -88,7 +88,7 @@ QList<ITestConfiguration *> CTestTreeItem::testConfigurationsFor(const QStringLi
return {};
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());
options << ctestSettings->activeSettingsAsOptions();
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 arguments;
if (TestSettings::instance()->processArgs()) {
if (testSettings().processArgs()) {
arguments << filterInterfering(runnable().command.arguments().split(
' ', Qt::SkipEmptyParts), omitted);
}

View File

@@ -137,7 +137,7 @@ Environment prepareBasicEnvironment(const Environment &env)
result.set("QT_FORCE_STDERR_LOGGING", "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
result.set("QTEST_FUNCTION_TIMEOUT", QString::number(timeout));
return result;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -161,10 +161,10 @@ void TestResultDelegate::clearCache()
void TestResultDelegate::limitTextOutput(QString &output) const
{
int maxLineCount = Internal::TestSettings::instance()->resultDescriptionMaxSize();
int maxLineCount = testSettings().resultDescriptionMaxSize();
bool limited = false;
if (Internal::TestSettings::instance()->limitResultDescription() && maxLineCount > 0) {
if (testSettings().limitResultDescription() && maxLineCount > 0) {
int index = -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);
limited = true;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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