diff options
author | Kai Koehne <kai.koehne@qt.io> | 2016-04-27 12:40:10 +0200 |
---|---|---|
committer | Kai Koehne <kai.koehne@qt.io> | 2016-08-05 12:10:46 +0000 |
commit | acb38b386969a9e03faa117fabc6c82e59003de5 (patch) | |
tree | 90391efd659d202915a3db439cb399ac8d33af95 /tests/auto/qtattributionsscanner | |
parent | 517d8268eb3b96fa7e43ef406c9d1999614418c5 (diff) |
Add qtattributionsscanner tool
qtattributionsscanner generates qdoc documentation about third
party licenses in Qt sources. It scans recursively for
qt_attribution.json files in the directory given on the
command line.
The qt_attribution.json file format is also documented under
http://wiki.qt.io/Qt_attribution.json
Task-number: QTBUG-55139
Change-Id: Ie8d9115beb9457c9f60a79e11c1c13dd19184d1c
Reviewed-by: Topi Reiniƶ <topi.reinio@theqtcompany.com>
Diffstat (limited to 'tests/auto/qtattributionsscanner')
12 files changed, 252 insertions, 0 deletions
diff --git a/tests/auto/qtattributionsscanner/qtattributionsscanner.pro b/tests/auto/qtattributionsscanner/qtattributionsscanner.pro new file mode 100644 index 000000000..aa8442a88 --- /dev/null +++ b/tests/auto/qtattributionsscanner/qtattributionsscanner.pro @@ -0,0 +1,18 @@ +CONFIG += testcase +QT = core testlib + +DISTFILES += \ + testdata/good/minimal/qt_attribution.json \ + testdata/good/complete/qt_attribution.json \ + testdata/good/expected.json \ + testdata/good/expected.error \ + testdata/warnings/incomplete/qt_attribution.json \ + testdata/warnings/incomplete/expected.json \ + testdata/warnings/incomplete/expected.error \ + testdata/warnings/unknown/qt_attribution.json \ + testdata/warnings/unknown/expected.json \ + testdata/warnings/unknown/expected.error + +TARGET = tst_qtattributionsscanner + +SOURCES += tst_qtattributionsscanner.cpp diff --git a/tests/auto/qtattributionsscanner/testdata/good/complete/qt_attribution.json b/tests/auto/qtattributionsscanner/testdata/good/complete/qt_attribution.json new file mode 100644 index 000000000..56ed8ca79 --- /dev/null +++ b/tests/auto/qtattributionsscanner/testdata/good/complete/qt_attribution.json @@ -0,0 +1,19 @@ +{ + "Id": "complete", + "Name": "Complete", + + "License": "License", + "Copyright": "Copyright", + + "Description": "Multi +Line +Description", + "QtUsage": "Multi +Line +Usage", + "Homepage": "www.qt.io", + "Version": "1.0", + "DownloadLocation": "www.qt.io/1.0", + "LicenseId": "xxx", + "LicenseFile": "LICENSE" +} diff --git a/tests/auto/qtattributionsscanner/testdata/good/expected.error b/tests/auto/qtattributionsscanner/testdata/good/expected.error new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/auto/qtattributionsscanner/testdata/good/expected.error diff --git a/tests/auto/qtattributionsscanner/testdata/good/expected.json b/tests/auto/qtattributionsscanner/testdata/good/expected.json new file mode 100644 index 000000000..7c11eb30f --- /dev/null +++ b/tests/auto/qtattributionsscanner/testdata/good/expected.json @@ -0,0 +1,30 @@ +[ + { + "Copyright": "Copyright", + "Description": "Multi\nLine\nDescription", + "Homepage": "www.qt.io", + "Id": "complete", + "License": "License", + "LicenseFile": "%{PWD}/complete/LICENSE", + "LicenseId": "xxx", + "Name": "Complete", + "Path": "%{PWD}/complete", + "QtUsage": "Multi\nLine\nUsage", + "Version": "1.0", + "DownloadLocation": "www.qt.io/1.0" + }, + { + "Copyright": "Copyright", + "Description": "", + "Homepage": "", + "Id": "minimal", + "License": "License", + "LicenseFile": "", + "LicenseId": "", + "Name": "Minimal", + "Path": "%{PWD}/minimal", + "QtUsage": "Usage", + "Version": "", + "DownloadLocation": "" + } +] diff --git a/tests/auto/qtattributionsscanner/testdata/good/minimal/qt_attribution.json b/tests/auto/qtattributionsscanner/testdata/good/minimal/qt_attribution.json new file mode 100644 index 000000000..65b43fbf9 --- /dev/null +++ b/tests/auto/qtattributionsscanner/testdata/good/minimal/qt_attribution.json @@ -0,0 +1,8 @@ +{ + "Id": "minimal", + "Name": "Minimal", + + "QtUsage": "Usage", + "License": "License", + "Copyright": "Copyright" +} diff --git a/tests/auto/qtattributionsscanner/testdata/warnings/incomplete/expected.error b/tests/auto/qtattributionsscanner/testdata/warnings/incomplete/expected.error new file mode 100644 index 000000000..8c08de783 --- /dev/null +++ b/tests/auto/qtattributionsscanner/testdata/warnings/incomplete/expected.error @@ -0,0 +1,5 @@ +File %{PWD}/qt_attribution.json: Missing mandatory property 'Name'. +File %{PWD}/qt_attribution.json: Missing mandatory property 'Id'. +File %{PWD}/qt_attribution.json: Missing mandatory property 'QtUsage'. +File %{PWD}/qt_attribution.json: Missing mandatory property 'License'. +File %{PWD}/qt_attribution.json: Missing mandatory property 'Copyright'. diff --git a/tests/auto/qtattributionsscanner/testdata/warnings/incomplete/expected.json b/tests/auto/qtattributionsscanner/testdata/warnings/incomplete/expected.json new file mode 100644 index 000000000..afe702bc0 --- /dev/null +++ b/tests/auto/qtattributionsscanner/testdata/warnings/incomplete/expected.json @@ -0,0 +1,16 @@ +[ + { + "Copyright": "", + "Description": "", + "Homepage": "", + "Id": "", + "License": "", + "LicenseFile": "", + "LicenseId": "", + "Name": "", + "Path": "%{PWD}", + "QtUsage": "", + "Version": "", + "DownloadLocation": "" + } +] diff --git a/tests/auto/qtattributionsscanner/testdata/warnings/incomplete/qt_attribution.json b/tests/auto/qtattributionsscanner/testdata/warnings/incomplete/qt_attribution.json new file mode 100644 index 000000000..2c63c0851 --- /dev/null +++ b/tests/auto/qtattributionsscanner/testdata/warnings/incomplete/qt_attribution.json @@ -0,0 +1,2 @@ +{ +} diff --git a/tests/auto/qtattributionsscanner/testdata/warnings/unknown/expected.error b/tests/auto/qtattributionsscanner/testdata/warnings/unknown/expected.error new file mode 100644 index 000000000..89b48074b --- /dev/null +++ b/tests/auto/qtattributionsscanner/testdata/warnings/unknown/expected.error @@ -0,0 +1 @@ +File %{PWD}/qt_attribution.json: Unknown key Unknown. diff --git a/tests/auto/qtattributionsscanner/testdata/warnings/unknown/expected.json b/tests/auto/qtattributionsscanner/testdata/warnings/unknown/expected.json new file mode 100644 index 000000000..38b3fe720 --- /dev/null +++ b/tests/auto/qtattributionsscanner/testdata/warnings/unknown/expected.json @@ -0,0 +1,16 @@ +[ + { + "Copyright": "Copyright", + "Description": "", + "Homepage": "", + "Id": "unknown", + "License": "License", + "LicenseFile": "", + "LicenseId": "", + "Name": "Unknown", + "Path": "%{PWD}", + "QtUsage": "Usage", + "Version": "", + "DownloadLocation": "" + } +] diff --git a/tests/auto/qtattributionsscanner/testdata/warnings/unknown/qt_attribution.json b/tests/auto/qtattributionsscanner/testdata/warnings/unknown/qt_attribution.json new file mode 100644 index 000000000..b2e56503b --- /dev/null +++ b/tests/auto/qtattributionsscanner/testdata/warnings/unknown/qt_attribution.json @@ -0,0 +1,9 @@ +{ + "Id": "unknown", + "Name": "Unknown", + + "QtUsage": "Usage", + "License": "License", + "Copyright": "Copyright", + "Unknown": "Unknown" +} diff --git a/tests/auto/qtattributionsscanner/tst_qtattributionsscanner.cpp b/tests/auto/qtattributionsscanner/tst_qtattributionsscanner.cpp new file mode 100644 index 000000000..c3e8bb9b6 --- /dev/null +++ b/tests/auto/qtattributionsscanner/tst_qtattributionsscanner.cpp @@ -0,0 +1,128 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Linguist of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtCore/qdir.h> +#include <QtCore/qdebug.h> +#include <QtCore/qfile.h> +#include <QtCore/qbytearray.h> +#include <QtCore/qjsondocument.h> +#include <QtCore/qlibraryinfo.h> +#include <QtCore/qprocess.h> + +#include <QtTest/qtest.h> + +class tst_qtattributionsscanner : public QObject +{ + Q_OBJECT +public: + tst_qtattributionsscanner(); + +private slots: + void test_data(); + void test(); + +private: + QString m_cmd; + QString m_basePath; +}; + + +tst_qtattributionsscanner::tst_qtattributionsscanner() +{ + QString binPath = QLibraryInfo::location(QLibraryInfo::BinariesPath); + m_cmd = binPath + QLatin1String("/qtattributionsscanner"); + m_basePath = QFINDTESTDATA("testdata"); +} + + +void tst_qtattributionsscanner::test_data() +{ + QTest::addColumn<QString>("directory"); + QTest::newRow("good") << QStringLiteral("good"); + QTest::newRow("warnings (incomplete)") << QStringLiteral("warnings/incomplete"); + QTest::newRow("warnings (unknown attribute)") << QStringLiteral("warnings/unknown"); +} + +static void readExpectedFile(const QString &dir, const QString &fileName, QByteArray *content) +{ + QFile file(QDir(dir).absoluteFilePath(fileName)); + QVERIFY2(file.open(QIODevice::ReadOnly | QIODevice::Text), "Could not open " + file.fileName().toLocal8Bit()); + *content = file.readAll(); + content->replace("%{PWD}", dir.toUtf8()); +} + +void tst_qtattributionsscanner::test() +{ + QFETCH(QString, directory); + + QString dir = QDir(m_basePath).absoluteFilePath(directory); + + QProcess proc; + QString command = m_cmd + " " + dir + " --output-format json"; + proc.start(command, QIODevice::ReadWrite | QIODevice::Text); + + QVERIFY2(proc.waitForStarted(), qPrintable(command + QLatin1String(" :") + proc.errorString())); + QVERIFY2(proc.waitForFinished(30000), qPrintable(command)); + + QVERIFY2(proc.exitStatus() == QProcess::NormalExit, + "\"qtattributionsscanner " + m_cmd.toLatin1() + "\" crashed"); + QVERIFY2(!proc.exitCode(), + "\"qtattributionsscanner " + m_cmd.toLatin1() + "\" exited with code " + + QByteArray::number(proc.exitCode())); + + { // compare error output + QByteArray stdErr = proc.readAllStandardError(); + stdErr.replace(QDir::separator(), "/"); + + QByteArray expectedErrorOutput; + readExpectedFile(dir, "expected.error", &expectedErrorOutput); + + QCOMPARE(stdErr, expectedErrorOutput); + } + + { // compare json output + QByteArray stdOut = proc.readAllStandardOutput(); + + QJsonParseError jsonError; + QJsonDocument actualJson = QJsonDocument::fromJson(stdOut, &jsonError); + QVERIFY2(!actualJson.isNull(), "Invalid output: " + jsonError.errorString().toLatin1()); + + QByteArray expectedOutput; + readExpectedFile(dir, "expected.json", &expectedOutput); + QJsonDocument expectedJson = QJsonDocument::fromJson(expectedOutput); + + if (!QTest::qCompare(actualJson, expectedJson, "actualJson", "expectedJson", __FILE__, __LINE__)) { + qWarning() << "Actual (actualJson) :" << actualJson; + qWarning() << "Expected (expectedJson):" << expectedJson; + return; + } + } +} + +QTEST_MAIN(tst_qtattributionsscanner) +#include "tst_qtattributionsscanner.moc" |