diff options
-rw-r--r-- | src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp | 24 | ||||
-rw-r--r-- | tests/auto/dbus/qdbusabstractinterface/org.qtproject.QtDBus.Pinger.xml | 2 | ||||
-rw-r--r-- | tests/auto/tools/qdbusxml2cpp/tst_qdbusxml2cpp.cpp | 134 |
3 files changed, 113 insertions, 47 deletions
diff --git a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp index ccfd3f3990..c79baf66d6 100644 --- a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp +++ b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp @@ -175,12 +175,9 @@ static QString classNameForInterface(const QString &interface, ClassType classTy return retval; } -// ### Qt6 Remove the two isSignal ifs -// They are only here because before signal arguments where previously searched as "In" so to maintain compatibility -// we first search for "Out" and if not found we search for "In" static QByteArray qtTypeName(const QString &where, const QString &signature, const QDBusIntrospection::Annotations &annotations, qsizetype paramId = -1, - const char *direction = "Out", bool isSignal = false) + const char *direction = "Out") { int type = QDBusMetaType::signatureToMetaType(signature.toLatin1()).id(); if (type == QMetaType::UnknownType) { @@ -197,17 +194,12 @@ static QByteArray qtTypeName(const QString &where, const QString &signature, qttype = annotations.value(oldAnnotationName); if (qttype.isEmpty()) { - if (!isSignal || qstrcmp(direction, "Out") == 0) { - fprintf(stderr, "%s: Got unknown type `%s' processing '%s'\n", - PROGRAMNAME, qPrintable(signature), qPrintable(inputFile)); - fprintf(stderr, - "You should add <annotation name=\"%s\" value=\"<type>\"/> to the XML " - "description for '%s'\n", - qPrintable(annotationName), qPrintable(where)); - } - - if (isSignal) - return qtTypeName(where, signature, annotations, paramId, "In", isSignal); + fprintf(stderr, "%s: Got unknown type `%s' processing '%s'\n", + PROGRAMNAME, qPrintable(signature), qPrintable(inputFile)); + fprintf(stderr, + "You should add <annotation name=\"%s\" value=\"<type>\"/> to the XML " + "description for '%s'\n", + qPrintable(annotationName), qPrintable(where)); exit(1); } @@ -318,7 +310,7 @@ static void writeSignalArgList(QTextStream &ts, const QStringList &argNames, for (qsizetype i = 0; i < outputArgs.size(); ++i) { const QDBusIntrospection::Argument &arg = outputArgs.at(i); QString type = constRefArg( - qtTypeName(arg.name, arg.type, annotations, i, "Out", true /* isSignal */)); + qtTypeName(arg.name, arg.type, annotations, i, "Out")); if (!first) ts << ", "; diff --git a/tests/auto/dbus/qdbusabstractinterface/org.qtproject.QtDBus.Pinger.xml b/tests/auto/dbus/qdbusabstractinterface/org.qtproject.QtDBus.Pinger.xml index ad61351cb2..70d5a4e9c3 100644 --- a/tests/auto/dbus/qdbusabstractinterface/org.qtproject.QtDBus.Pinger.xml +++ b/tests/auto/dbus/qdbusabstractinterface/org.qtproject.QtDBus.Pinger.xml @@ -12,7 +12,7 @@ </signal> <signal name="complexSignal"> <arg name="" type="(s)"/> - <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="RegisteredType"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="RegisteredType"/> </signal> <method name="voidMethod" /> <method name="sleepMethod"> diff --git a/tests/auto/tools/qdbusxml2cpp/tst_qdbusxml2cpp.cpp b/tests/auto/tools/qdbusxml2cpp/tst_qdbusxml2cpp.cpp index db0c8af0fd..918fa1d711 100644 --- a/tests/auto/tools/qdbusxml2cpp/tst_qdbusxml2cpp.cpp +++ b/tests/auto/tools/qdbusxml2cpp/tst_qdbusxml2cpp.cpp @@ -21,6 +21,8 @@ private slots: void process(); void includeStyle_data(); void includeStyle(); + void missingAnnotation_data(); + void missingAnnotation(); }; struct BasicTypeList { @@ -57,6 +59,44 @@ static QString stripHeader(QString output) return output.remove(header); } +static void runTool(QProcess &process, const QByteArray &data) +{ + // test both interface and adaptor generation + QFETCH_GLOBAL(QString, commandLineArg); + + // Run the tool + const QString binpath = QLibraryInfo::path(QLibraryInfo::BinariesPath); + QStringList arguments = { commandLineArg, "-", "-N" }; + process.setArguments(arguments); + process.setProgram(binpath + QLatin1String("/qdbusxml2cpp")); + process.start(QIODevice::Text | QIODevice::ReadWrite); + QVERIFY2(process.waitForStarted(), qPrintable(process.errorString())); + + // feed it our XML data + static const char xmlHeader[] = + "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE // \n is included + "<node>\n" + " <interface name=\"local.name.is.not.important\">\n" + " <!-- begin data -->\n"; + static const char xmlFooter[] = "\n" + " <!-- end data -->\n" + " </interface>\n" + "</node>\n"; + + process.write(xmlHeader, sizeof(xmlHeader) - 1); + process.write(data); + process.write(xmlFooter, sizeof(xmlFooter) - 1); + + while (process.bytesToWrite()) + QVERIFY2(process.waitForBytesWritten(), qPrintable(process.errorString())); + // fprintf(stderr, "%s%s%s", xmlHeader, xmlSnippet.toLatin1().constData(), xmlFooter); + + process.closeWriteChannel(); + QVERIFY2(process.waitForFinished(), qPrintable(process.errorString())); + QCOMPARE(process.exitStatus(), QProcess::NormalExit); +} + void tst_qdbusxml2cpp::initTestCase_data() { QTest::addColumn<int>("outputMode"); @@ -181,6 +221,15 @@ void tst_qdbusxml2cpp::process_data() .arg(basicTypeList[i].dbusType) << rx << rx; } + + QRegularExpression rx(R"(Q_SIGNALS:.*\b\Qvoid Signal(const QVariantMap &map);\E)", + QRegularExpression::DotMatchesEverythingOption); + QTest::newRow("signal-complex") + << R"(<signal name="Signal"> + <arg type="a{sv}" name="map"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QVariantMap"/>" + </signal>)" + << rx << rx; } void tst_qdbusxml2cpp::process() @@ -191,38 +240,10 @@ void tst_qdbusxml2cpp::process() QVERIFY2(interfaceSearch.isValid(), qPrintable(interfaceSearch.errorString())); QVERIFY2(adaptorSearch.isValid(), qPrintable(adaptorSearch.errorString())); - // test both interface and adaptor generation QFETCH_GLOBAL(int, outputMode); - QFETCH_GLOBAL(QString, commandLineArg); - - // Run the tool - const QString binpath = QLibraryInfo::path(QLibraryInfo::BinariesPath); - const QString command = binpath + QLatin1String("/qdbusxml2cpp"); QProcess process; - process.start(command, QStringList() << commandLineArg << "-" << "-N"); - QVERIFY2(process.waitForStarted(), qPrintable(process.errorString())); - - // feed it our XML data - static const char xmlHeader[] = - "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" - DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE // \n is included - "<node>\n" - " <interface name=\"local.name.is.not.important\">\n" - " <!-- begin data -->\n"; - static const char xmlFooter[] = "\n" - " <!-- end data -->\n" - " </interface>\n" - "</node>\n"; - - process.write(xmlHeader, int(sizeof xmlHeader) - 1); - process.write(xmlSnippet.toLatin1()); - process.write(xmlFooter, int(sizeof xmlFooter) - 1); - while (process.bytesToWrite()) - QVERIFY2(process.waitForBytesWritten(), qPrintable(process.errorString())); - // fprintf(stderr, "%s%s%s", xmlHeader, xmlSnippet.toLatin1().constData(), xmlFooter); - - process.closeWriteChannel(); - QVERIFY2(process.waitForFinished(), qPrintable(process.errorString())); + runTool(process, xmlSnippet.toLatin1()); + if (QTest::currentTestFailed()) return; QByteArray errOutput = process.readAllStandardError(); QVERIFY2(errOutput.isEmpty(), errOutput); @@ -284,6 +305,59 @@ void tst_qdbusxml2cpp::includeStyle() QVERIFY(fullOutput.contains(expected)); } +void tst_qdbusxml2cpp::missingAnnotation_data() +{ + QTest::addColumn<QString>("xmlSnippet"); + QTest::addColumn<QString>("annotationName"); + + QTest::newRow("property") + << R"(<property type="%1" name="name" access="readwrite"/>)" + << "org.qtproject.QtDBus.QtTypeName"; + QTest::newRow("method-in") + << R"(<method name="Method"> + <arg type="%1" name="name" direction="in"/> + </method>)" + << "org.qtproject.QtDBus.QtTypeName.In0"; + QTest::newRow("method-out") + << R"(<method name="Method"> + <arg type="%1" name="name" direction="out"/> + </method>)" + << "org.qtproject.QtDBus.QtTypeName.Out0"; + QTest::newRow("signal") + << R"(<signal name="Signal"> + <arg type="%1" name="name"/> + </signal>)" + << "org.qtproject.QtDBus.QtTypeName.Out0"; + QTest::newRow("signal-out") + << R"(<signal name="Signal"> + <arg type="%1" name="name" direction="out"/> + </signal>)" + << "org.qtproject.QtDBus.QtTypeName.Out0"; +} + +void tst_qdbusxml2cpp::missingAnnotation() +{ + QFETCH(QString, xmlSnippet); + QFETCH(QString, annotationName); + + QString type = "(ii)"; + QProcess process; + runTool(process, xmlSnippet.arg(type).toLatin1()); + if (QTest::currentTestFailed()) return; + + // it must have failed + QString errOutput = QString::fromLatin1(process.readAllStandardError().trimmed()); + QCOMPARE(process.exitCode(), 1); + QCOMPARE(process.readAllStandardOutput(), QByteArray()); + QVERIFY(!errOutput.isEmpty()); + + // check it did suggest the right annotation + QString expected = R"(qdbusxml2cpp: Got unknown type `%1' processing '' +You should add <annotation name="%2" value="<type>"/> to the XML description for 'name')"; + expected = expected.arg(type, annotationName); + QCOMPARE(errOutput, expected); +} + QTEST_MAIN(tst_qdbusxml2cpp) #include "tst_qdbusxml2cpp.moc" |