sdktool: Change tests to use QTest

* Moved all sdktool code into a static library, allowing us to link against the actual functionality in unittests
* Convert all tests to proper unittests

Change-Id: I5c93be0faecbd8b68e0923655483c870a2f408b5
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Marcus Tillmanns
2022-04-04 14:31:22 +02:00
parent 055de08524
commit c246caf7a9
47 changed files with 1273 additions and 1081 deletions

View File

@@ -35,6 +35,14 @@
#include <iostream>
#ifdef WITH_TESTS
#include <QTest>
#endif
#include <QLoggingCategory>
Q_LOGGING_CATEGORY(addtoolchainlog, "qtc.sdktool.operations.addtoolchain", QtWarningMsg)
// ToolChain file stuff:
const char COUNT[] = "ToolChain.Count";
const char PREFIX[] = "ToolChain.";
@@ -64,13 +72,13 @@ QString AddToolChainOperation::helpText() const
QString AddToolChainOperation::argumentsHelpText() const
{
return QString(
" --id <ID> id of the new tool chain (required).\n"
" --language <ID> input language id of the new tool chain (required).\n"
" --name <NAME> display name of the new tool chain (required).\n"
" --path <PATH> path to the compiler (required).\n"
" --abi <ABI STRING> ABI of the compiler (required).\n"
" --supportedAbis <ABI STRING>,<ABI STRING> list of ABIs supported by the compiler.\n"
" <KEY> <TYPE:VALUE> extra key value pairs\n");
" --id <ID> id of the new tool chain (required).\n"
" --language <ID> input language id of the new tool chain (required).\n"
" --name <NAME> display name of the new tool chain (required).\n"
" --path <PATH> path to the compiler (required).\n"
" --abi <ABI STRING> ABI of the compiler (required).\n"
" --supportedAbis <ABI STRING>,<ABI STRING> list of ABIs supported by the compiler.\n"
" <KEY> <TYPE:VALUE> extra key value pairs\n");
}
bool AddToolChainOperation::setArguments(const QStringList &args)
@@ -80,7 +88,9 @@ bool AddToolChainOperation::setArguments(const QStringList &args)
const QString next = ((i + 1) < args.count()) ? args.at(i + 1) : QString();
if (next.isNull() && current.startsWith("--")) {
std::cerr << "No parameter for option '" << qPrintable(current) << "' given." << std::endl << std::endl;
std::cerr << "No parameter for option '" << qPrintable(current) << "' given."
<< std::endl
<< std::endl;
return false;
}
@@ -149,7 +159,8 @@ bool AddToolChainOperation::setArguments(const QStringList &args)
if (m_targetAbi.isEmpty())
std::cerr << "No target abi given for tool chain." << std::endl;
return !m_id.isEmpty() && !m_displayName.isEmpty() && !m_path.isEmpty() && !m_targetAbi.isEmpty();
return !m_id.isEmpty() && !m_displayName.isEmpty() && !m_path.isEmpty()
&& !m_targetAbi.isEmpty();
}
int AddToolChainOperation::execute() const
@@ -166,66 +177,87 @@ int AddToolChainOperation::execute() const
}
#ifdef WITH_TESTS
bool AddToolChainOperation::test() const
void AddToolChainOperation::unittest()
{
QVariantMap map = initializeToolChains();
// Add toolchain:
map = AddToolChainData{"testId", "langId", "name", "/tmp/test", "test-abi", "test-abi,test-abi2",
{{"ExtraKey", QVariant("ExtraValue")}}}.addToolChain(map);
if (map.value(COUNT).toInt() != 1
|| !map.contains(QString::fromLatin1(PREFIX) + '0'))
return false;
AddToolChainData d;
d.m_id = "testId";
d.m_languageId = "langId";
d.m_displayName = "name";
d.m_path = "/tmp/test";
d.m_targetAbi = "test-abi";
d.m_supportedAbis = "test-abi,test-abi2";
d.m_extra = {{"ExtraKey", QVariant("ExtraValue")}};
map = d.addToolChain(map);
QCOMPARE(map.value(COUNT).toInt(), 1);
QVERIFY(map.contains(QString::fromLatin1(PREFIX) + '0'));
QVariantMap tcData = map.value(QString::fromLatin1(PREFIX) + '0').toMap();
if (tcData.count() != 8
|| tcData.value(ID).toString() != "testId"
|| tcData.value(LANGUAGE_KEY_V2).toString() != "langId"
|| tcData.value(DISPLAYNAME).toString() != "name"
|| tcData.value(AUTODETECTED).toBool() != true
|| tcData.value(PATH).toString() != "/tmp/test"
|| tcData.value(TARGET_ABI).toString() != "test-abi"
|| tcData.value(SUPPORTED_ABIS).toList().count() != 2
|| tcData.value("ExtraKey").toString() != "ExtraValue")
return false;
QCOMPARE(tcData.count(), 8);
QCOMPARE(tcData.value(ID).toString(), "testId");
QCOMPARE(tcData.value(LANGUAGE_KEY_V2).toString(), "langId");
QCOMPARE(tcData.value(DISPLAYNAME).toString(), "name");
QCOMPARE(tcData.value(AUTODETECTED).toBool(), true);
QCOMPARE(tcData.value(PATH).toString(), "/tmp/test");
QCOMPARE(tcData.value(TARGET_ABI).toString(), "test-abi");
QCOMPARE(tcData.value(SUPPORTED_ABIS).toList().count(), 2);
QCOMPARE(tcData.value("ExtraKey").toString(), "ExtraValue");
// Ignore same Id:
QVariantMap unchanged = AddToolChainData{"testId", "langId", "name2", "/tmp/test2", "test-abi2",
"test-abi2,test-abi3",
{{"ExtraKey", QVariant("ExtraValue2")}}}.addToolChain(map);
if (!unchanged.isEmpty())
return false;
AddToolChainData ud;
ud.m_id = "testId";
ud.m_languageId = "langId";
ud.m_displayName = "name2";
ud.m_path = "/tmp/test2";
ud.m_targetAbi = "test-abi2";
ud.m_supportedAbis = "test-abi2,test-abi3";
ud.m_extra = {{"ExtraKey", QVariant("ExtraValue")}};
QTest::ignoreMessage(QtCriticalMsg,
QRegularExpression("Error: Id .* already defined for tool chains."));
QVariantMap unchanged = ud.addToolChain(map);
QVERIFY(unchanged.isEmpty());
// add 2nd tool chain:
map = AddToolChainData{"{some-tc-id}", "langId2", "name", "/tmp/test", "test-abi", "test-abi,test-abi2",
{{"ExtraKey", QVariant("ExtraValue")}}}.addToolChain(map);
if (map.value(COUNT).toInt() != 2
|| !map.contains(QString::fromLatin1(PREFIX) + '0')
|| !map.contains(QString::fromLatin1(PREFIX) + '1'))
return false;
tcData = map.value(QString::fromLatin1(PREFIX) + '0').toMap();
if (tcData.count() != 8
|| tcData.value(ID).toString() != "testId"
|| tcData.value(LANGUAGE_KEY_V2).toString() != "langId"
|| tcData.value(DISPLAYNAME).toString() != "name"
|| tcData.value(AUTODETECTED).toBool() != true
|| tcData.value(PATH).toString() != "/tmp/test"
|| tcData.value(TARGET_ABI).toString() != "test-abi"
|| tcData.value(SUPPORTED_ABIS).toList().count() != 2
|| tcData.value("ExtraKey").toString() != "ExtraValue")
return false;
tcData = map.value(QString::fromLatin1(PREFIX) + '1').toMap();
if (tcData.count() != 8
|| tcData.value(ID).toString() != "{some-tc-id}"
|| tcData.value(LANGUAGE_KEY_V2).toString() != "langId2"
|| tcData.value(DISPLAYNAME).toString() != "name"
|| tcData.value(AUTODETECTED).toBool() != true
|| tcData.value(PATH).toString() != "/tmp/test"
|| tcData.value(TARGET_ABI).toString() != "test-abi"
|| tcData.value(SUPPORTED_ABIS).toList().count() != 2
|| tcData.value("ExtraKey").toString() != "ExtraValue")
return false;
AddToolChainData d2;
d2.m_id = "{some-tc-id}";
d2.m_languageId = "langId2";
d2.m_displayName = "name";
d2.m_path = "/tmp/test";
d2.m_targetAbi = "test-abi";
d2.m_supportedAbis = "test-abi,test-abi2";
d2.m_extra = {{"ExtraKey", QVariant("ExtraValue")}};
return true;
map = d2.addToolChain(map);
QCOMPARE(map.value(COUNT).toInt(), 2);
QVERIFY(map.contains(QString::fromLatin1(PREFIX) + '0'));
QVERIFY(map.contains(QString::fromLatin1(PREFIX) + '1'));
tcData = map.value(QString::fromLatin1(PREFIX) + '0').toMap();
QCOMPARE(tcData.count(), 8);
QCOMPARE(tcData.value(ID).toString(), "testId");
QCOMPARE(tcData.value(LANGUAGE_KEY_V2).toString(), "langId");
QCOMPARE(tcData.value(DISPLAYNAME).toString(), "name");
QVERIFY(tcData.value(AUTODETECTED).toBool());
QCOMPARE(tcData.value(PATH).toString(), "/tmp/test");
QCOMPARE(tcData.value(TARGET_ABI).toString(), "test-abi");
QCOMPARE(tcData.value(SUPPORTED_ABIS).toList().count(), 2);
QCOMPARE(tcData.value("ExtraKey").toString(), "ExtraValue");
tcData = map.value(QString::fromLatin1(PREFIX) + '1').toMap();
QCOMPARE(tcData.count(), 8);
QCOMPARE(tcData.value(ID).toString(), "{some-tc-id}");
QCOMPARE(tcData.value(LANGUAGE_KEY_V2).toString(), "langId2");
QCOMPARE(tcData.value(DISPLAYNAME).toString(), "name");
QVERIFY(tcData.value(AUTODETECTED).toBool());
QCOMPARE(tcData.value(PATH).toString(), "/tmp/test");
QCOMPARE(tcData.value(TARGET_ABI).toString(), "test-abi");
QCOMPARE(tcData.value(SUPPORTED_ABIS).toList().count(), 2);
QCOMPARE(tcData.value("ExtraKey").toString(), "ExtraValue");
}
#endif
@@ -233,7 +265,8 @@ QVariantMap AddToolChainData::addToolChain(const QVariantMap &map) const
{
// Sanity check: Does the Id already exist?
if (exists(map, m_id)) {
std::cerr << "Error: Id " << qPrintable(m_id) << " already defined for tool chains." << std::endl;
qCCritical(addtoolchainlog)
<< "Error: Id" << qPrintable(m_id) << "already defined for tool chains.";
return QVariantMap();
}
@@ -241,7 +274,7 @@ QVariantMap AddToolChainData::addToolChain(const QVariantMap &map) const
bool ok;
int count = GetOperation::get(map, COUNT).toInt(&ok);
if (!ok || count < 0) {
std::cerr << "Error: Count found in toolchains file seems wrong." << std::endl;
qCCritical(addtoolchainlog) << "Error: Count found in toolchains file seems wrong.";
return QVariantMap();
}
@@ -261,9 +294,9 @@ QVariantMap AddToolChainData::addToolChain(const QVariantMap &map) const
} else if (m_languageId == "1" || m_languageId == "C") {
newLang = "C";
} else if (ok) {
std::cerr << "Error: Language ID must be 1 for C, 2 for Cxx "
<< "or a string like \"C\", \"Cxx\", \"Nim\" (was \""
<< qPrintable(m_languageId) << "\")" << std::endl;
qCCritical(addtoolchainlog) << "Error: Language ID must be 1 for C, 2 for Cxx "
<< "or a string like \"C\", \"Cxx\", \"Nim\" (was \""
<< qPrintable(m_languageId) << "\")";
return {};
} else if (!ok) {
newLang = m_languageId;