From 3d3e5b7552d69da7f8d24a0bcfa53655133487e2 Mon Sep 17 00:00:00 2001 From: Katja Marttila Date: Mon, 6 Apr 2020 11:28:38 +0300 Subject: Initialize user arguments earlier User can give arguments from command line, for example AllUsers=true, which can affect to other core values. Initialize user arguments in core constructor so we an utilize the user given values when defining other core values. Added also unit test for overwriting core data values. Note that some values belong to QSettings such as MaintenanceToolName which cannot be overwritten. Task-number: QTIFW-576 QTIFW-1730 Change-Id: I82a05f9f4bc8498f4e0e2af407ba29f6dabbf030 Reviewed-by: Iikka Eklund --- src/libs/installer/packagemanagercore.cpp | 7 ++-- src/libs/installer/packagemanagercore.h | 4 ++- src/libs/installer/packagemanagercore_p.cpp | 1 - src/libs/installer/packagemanagercoredata.cpp | 7 +++- src/sdk/sdkapp.h | 36 ++++++++++++-------- .../packagemanagercore/installer-config/config.xml | 8 +++++ .../packagemanagercore/packagemanagercore.pro | 2 +- .../auto/installer/packagemanagercore/settings.qrc | 6 ++++ .../packagemanagercore/tst_packagemanagercore.cpp | 39 ++++++++++++++++++++++ 9 files changed, 90 insertions(+), 20 deletions(-) create mode 100644 tests/auto/installer/packagemanagercore/installer-config/config.xml create mode 100644 tests/auto/installer/packagemanagercore/settings.qrc diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 0a5eec513..02f12bd90 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -1027,14 +1027,17 @@ PackageManagerCore::PackageManagerCore() and \a mode to set the server side authorization key. */ PackageManagerCore::PackageManagerCore(qint64 magicmaker, const QList &operations, - const QString &socketName, const QString &key, Protocol::Mode mode) + const QString &socketName, const QString &key, Protocol::Mode mode, + const QHash ¶ms, const bool commandLineInstance) : d(new PackageManagerCorePrivate(this, magicmaker, operations)) { + setCommandLineInstance(commandLineInstance); Repository::registerMetaType(); // register, cause we stream the type as QVariant qRegisterMetaType("QInstaller::PackageManagerCore::Status"); qRegisterMetaType("QInstaller::PackageManagerCore::WizardPage"); - d->initialize(QHash()); + d->initialize(params); + // Creates and initializes a remote client, makes us get admin rights for QFile, QSettings // and QProcess operations. Init needs to called to set the server side authorization key. if (!d->isUpdater()) { diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h index 979ff50e6..eb4220072 100644 --- a/src/libs/installer/packagemanagercore.h +++ b/src/libs/installer/packagemanagercore.h @@ -62,7 +62,9 @@ public: PackageManagerCore(qint64 magicmaker, const QList &ops, const QString &socketName = QString(), const QString &key = QLatin1String(Protocol::DefaultAuthorizationKey), - Protocol::Mode mode = Protocol::Mode::Production); + Protocol::Mode mode = Protocol::Mode::Production, + const QHash ¶ms = QHash(), + const bool commandLineInstance = false); ~PackageManagerCore(); // status diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index 54eace77a..dba96c222 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -592,7 +592,6 @@ void PackageManagerCorePrivate::initialize(const QHash ¶ms #endif } processFilesForDelayedDeletion(); - m_data.setDynamicPredefinedVariables(); disconnect(this, &PackageManagerCorePrivate::installationStarted, ProgressCoordinator::instance(), &ProgressCoordinator::reset); diff --git a/src/libs/installer/packagemanagercoredata.cpp b/src/libs/installer/packagemanagercoredata.cpp index b985487c9..df6d96a55 100644 --- a/src/libs/installer/packagemanagercoredata.cpp +++ b/src/libs/installer/packagemanagercoredata.cpp @@ -46,7 +46,6 @@ namespace QInstaller PackageManagerCoreData::PackageManagerCoreData(const QHash &variables) { - m_variables = variables; setDynamicPredefinedVariables(); // Set some common variables that may used e.g. as placeholder in some of the settings variables or @@ -86,6 +85,12 @@ PackageManagerCoreData::PackageManagerCoreData(const QHash &va m_variables.insert(scTargetDir, replaceVariables(m_settings.targetDir())); m_variables.insert(scRemoveTargetDir, replaceVariables(m_settings.removeTargetDir())); + + // Iterate over user defined parameters. If those are found, add to table or + // replace existing values. + QHash::const_iterator it; + for (it = variables.begin(); it != variables.end(); ++it) + m_variables.insert(it.key(), it.value()); } void PackageManagerCoreData::clear() diff --git a/src/sdk/sdkapp.h b/src/sdk/sdkapp.h index d7905f1f0..ab0b9eb2f 100644 --- a/src/sdk/sdkapp.h +++ b/src/sdk/sdkapp.h @@ -132,10 +132,10 @@ public: binary.close(); QString loggingRules(QLatin1String("ifw.* = false")); // disable all by default - bool isCliInterface = false; + bool isCommandLineInterface = false; foreach (const QString &option, CommandLineOptions::scCommandLineInterfaceOptions) { if (m_parser.positionalArguments().contains(option)) { - isCliInterface = true; + isCommandLineInterface = true; break; } } @@ -144,7 +144,7 @@ public: loggingRules = m_parser.value(CommandLineOptions::scLoggingRulesLong) .split(QLatin1Char(','), QString::SkipEmptyParts) .join(QLatin1Char('\n')); // take rules from command line - } else if (isCliInterface) { + } else if (isCommandLineInterface) { loggingRules = QLatin1String("ifw.* = false\n" "ifw.installer.* = true\n" "ifw.server = true\n" @@ -163,6 +163,8 @@ public: QLoggingCategory::setFilterRules(loggingRules); SDKApp::registerMetaResources(manager.collectionByName("QResources")); + + const QHash userArgs = userArguments(); if (m_parser.isSet(CommandLineOptions::scStartClientLong)) { const QStringList arguments = m_parser.value(CommandLineOptions::scStartClientLong) .split(QLatin1Char(','), QString::SkipEmptyParts); @@ -170,11 +172,11 @@ public: magicMarker, oldOperations, arguments.value(0, QLatin1String(QInstaller::Protocol::DefaultSocket)), arguments.value(1, QLatin1String(QInstaller::Protocol::DefaultAuthorizationKey)), - QInstaller::Protocol::Mode::Debug); + QInstaller::Protocol::Mode::Debug, userArgs, isCommandLineInterface); } else { m_core = new QInstaller::PackageManagerCore(magicMarker, oldOperations, - QUuid::createUuid().toString(), QUuid::createUuid().toString()); - m_core->setCommandLineInstance(isCliInterface); + QUuid::createUuid().toString(), QUuid::createUuid().toString(), + QInstaller::Protocol::Mode::Production, userArgs, isCommandLineInterface); } { @@ -272,14 +274,6 @@ public: .isSet(CommandLineOptions::scCreateLocalRepositoryLong) || m_core->settings().createLocalRepository()); - const QStringList positionalArguments = m_parser.positionalArguments(); - foreach (const QString &argument, positionalArguments) { - if (argument.contains(QLatin1Char('='))) { - const QString name = argument.section(QLatin1Char('='), 0, 0); - const QString value = argument.section(QLatin1Char('='), 1, 1); - m_core->setValue(name, value); - } - } return true; } @@ -372,6 +366,20 @@ public: return items; } + QHash userArguments() + { + QHash params; + const QStringList positionalArguments = m_parser.positionalArguments(); + foreach (const QString &argument, positionalArguments) { + if (argument.contains(QLatin1Char('='))) { + const QString name = argument.section(QLatin1Char('='), 0, 0); + const QString value = argument.section(QLatin1Char('='), 1, 1); + params.insert(name, value); + } + } + return params; + } + private: QList m_resourceMappings; diff --git a/tests/auto/installer/packagemanagercore/installer-config/config.xml b/tests/auto/installer/packagemanagercore/installer-config/config.xml new file mode 100644 index 000000000..5826308e1 --- /dev/null +++ b/tests/auto/installer/packagemanagercore/installer-config/config.xml @@ -0,0 +1,8 @@ + + + Unit Test Application + Unit Test Application Title + 1.0.0 + The Qt Company + UnitTestMaintenancetool + diff --git a/tests/auto/installer/packagemanagercore/packagemanagercore.pro b/tests/auto/installer/packagemanagercore/packagemanagercore.pro index 3dfefbab6..6e9e387fa 100644 --- a/tests/auto/installer/packagemanagercore/packagemanagercore.pro +++ b/tests/auto/installer/packagemanagercore/packagemanagercore.pro @@ -5,4 +5,4 @@ QT += qml SOURCES += tst_packagemanagercore.cpp RESOURCES += \ - ..\shared\config.qrc + settings.qrc diff --git a/tests/auto/installer/packagemanagercore/settings.qrc b/tests/auto/installer/packagemanagercore/settings.qrc new file mode 100644 index 000000000..d7dfb5ddd --- /dev/null +++ b/tests/auto/installer/packagemanagercore/settings.qrc @@ -0,0 +1,6 @@ + + + installer-config/config.xml + + + diff --git a/tests/auto/installer/packagemanagercore/tst_packagemanagercore.cpp b/tests/auto/installer/packagemanagercore/tst_packagemanagercore.cpp index 40e8d5a1b..9a8c7c4b6 100644 --- a/tests/auto/installer/packagemanagercore/tst_packagemanagercore.cpp +++ b/tests/auto/installer/packagemanagercore/tst_packagemanagercore.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include #include @@ -319,6 +321,43 @@ private slots: QVERIFY(QDir().rmdir(testDirectory)); } + + void testCoreDataValues() + { + QHash userValues; + + PackageManagerCore *core = new PackageManagerCore(BinaryContent::MagicInstallerMarker, QList (), + QString(), Protocol::DefaultAuthorizationKey, Protocol::Mode::Production, + userValues, true); + QCOMPARE(core->value("AllUsers"), ""); + QCOMPARE(core->value("ProductName"), "Unit Test Application"); + QCOMPARE(core->value("ProductVersion"), "1.0.0"); + QCOMPARE(core->value("Title"), "Unit Test Application Title"); + QCOMPARE(core->value("RootDir"), QDir::rootPath()); + + core->deleteLater(); + core->deleteLater(); + } + + void testOverwrittenCoreDataValues() + { + QHash userValues; + userValues.insert("AllUsers", "true"); + userValues.insert("ProductName", "Overwritten ProductName"); + userValues.insert("ProductVersion", "2.0.0"); + userValues.insert("Title", "Overwritten Title"); + userValues.insert("RootDir", "Overwritten RootDir"); + + PackageManagerCore *core = new PackageManagerCore(BinaryContent::MagicInstallerMarker, QList (), + QString(), Protocol::DefaultAuthorizationKey, Protocol::Mode::Production, + userValues, true); + QCOMPARE(core->value("AllUsers"), "true"); + QCOMPARE(core->value("ProductName"), "Overwritten ProductName"); + QCOMPARE(core->value("ProductVersion"), "2.0.0"); + QCOMPARE(core->value("Title"), "Overwritten Title"); + QCOMPARE(core->value("RootDir"), "Overwritten RootDir"); + core->deleteLater(); + } }; -- cgit v1.2.3