File indexing completed on 2024-04-21 05:44:40

0001 /*
0002  *  SPDX-FileCopyrightText: 2019  Andreas Cord-Landwehr <cordlandwehr@kde.org>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include "test_headerdetection.h"
0008 #include "../licenseregistry.h"
0009 #include "../directoryparser.h"
0010 #include "../skipparser.h"
0011 #include <QTest>
0012 #include <QDebug>
0013 #include <QDir>
0014 #include <QDirIterator>
0015 
0016 void TestHeaderDetection::detectForIdentifierRegExpParser(const QString &spdxMarker)
0017 {
0018     const QString testdataDir { ":/testdata/" + spdxMarker };
0019 
0020     // read comparison headers
0021     LicenseRegistry registry;
0022 
0023     QVERIFY(registry.expressions().contains(spdxMarker));
0024     QVERIFY(registry.headerTexts(spdxMarker).size() > 0);
0025 
0026     // load test data
0027     QVERIFY(QDir().exists(testdataDir));
0028     QVERIFY(QDir(testdataDir).count() > 0);
0029     QDirIterator testdataIter(testdataDir);
0030     while (testdataIter.hasNext()) {
0031         QFile file(testdataIter.next());
0032         file.open(QIODevice::ReadOnly);
0033         const QString fileContents { file.readAll() };
0034         QVERIFY(!fileContents.isEmpty());
0035         bool result = false;
0036         for (auto regexp: registry.headerTextRegExps(spdxMarker)) {
0037             result = fileContents.contains(regexp);
0038             if (result) {
0039                 break;
0040             }
0041         }
0042 
0043         if (!result) {
0044             qWarning() << "Could not detect" << spdxMarker << ":" << testdataIter.filePath();
0045         }
0046         QVERIFY(result);
0047     }
0048 }
0049 
0050 void TestHeaderDetection::detectForIdentifierSkipParser(const QString &spdxMarker)
0051 {
0052     SkipParser parser;
0053     const QString testdataDir { ":/testdata/" + spdxMarker };
0054 
0055     // read comparison headers
0056     LicenseRegistry registry;
0057     // load test data
0058     QVERIFY(QDir().exists(testdataDir));
0059     QVERIFY(QDir(testdataDir).count() > 0);
0060     QDirIterator testdataIter(testdataDir);
0061     while (testdataIter.hasNext()) {
0062         QFile file(testdataIter.next());
0063         file.open(QIODevice::ReadOnly);
0064         const QString fileContents { file.readAll() };
0065         QVERIFY(!fileContents.isEmpty());
0066 
0067         auto match = parser.findMatch(fileContents, registry.headerTexts(spdxMarker));
0068 
0069         if (!match) {
0070             qWarning() << "Could not detect" << spdxMarker << ":" << testdataIter.filePath();
0071             qDebug() << fileContents;
0072         }
0073         QVERIFY(match);
0074     }
0075 }
0076 
0077 void TestHeaderDetection::detectLGPL20orlater()
0078 {
0079     detectForIdentifierRegExpParser("LGPL-2.0-or-later");
0080     detectForIdentifierSkipParser("LGPL-2.0-or-later");
0081 }
0082 
0083 void TestHeaderDetection::detectLGPL21orlater()
0084 {
0085     detectForIdentifierRegExpParser("LGPL-2.1-or-later");
0086     detectForIdentifierSkipParser("LGPL-2.1-or-later");
0087 }
0088 
0089 void TestHeaderDetection::detectLGPL20only()
0090 {
0091     detectForIdentifierRegExpParser("LGPL-2.0-only");
0092     detectForIdentifierSkipParser("LGPL-2.0-only");
0093 }
0094 
0095 void TestHeaderDetection::detectLGPL21onlyOrLGPL30only()
0096 {
0097     detectForIdentifierRegExpParser("LGPL-2.1-only_OR_LGPL-3.0-only");
0098     detectForIdentifierSkipParser("LGPL-2.1-only_OR_LGPL-3.0-only");
0099 }
0100 
0101 void TestHeaderDetection::detectLGPL20onlyWithQtCommercialException()
0102 {
0103     detectForIdentifierRegExpParser("LGPL-2.0-only_WITH_Qt-Commercial-exception-1.0");
0104     detectForIdentifierSkipParser("LGPL-2.0-only_WITH_Qt-Commercial-exception-1.0");
0105 }
0106 
0107 void TestHeaderDetection::detectGPL20only()
0108 {
0109     detectForIdentifierRegExpParser("GPL-2.0-only");
0110     detectForIdentifierSkipParser("GPL-2.0-only");
0111 }
0112 
0113 void TestHeaderDetection::detectGPL20orlater()
0114 {
0115     detectForIdentifierRegExpParser("GPL-2.0-or-later");
0116     detectForIdentifierSkipParser("GPL-2.0-or-later");
0117 }
0118 
0119 void TestHeaderDetection::detectGPL30orlater()
0120 {
0121     detectForIdentifierRegExpParser("GPL-3.0-or-later");
0122     detectForIdentifierSkipParser("GPL-3.0-or-later");
0123 }
0124 
0125 void TestHeaderDetection::detectGPL2orlaterwithQtCommercialException()
0126 {
0127     detectForIdentifierRegExpParser("GPL-2.0-or-later_WITH_Qt-Commercial-exception-1.0");
0128     detectForIdentifierSkipParser("GPL-2.0-or-later_WITH_Qt-Commercial-exception-1.0");
0129 }
0130 
0131 void TestHeaderDetection::detectGPL30_or_KDE()
0132 {
0133     detectForIdentifierRegExpParser("GPL-3.0-only_OR_LicenseRef-KDE-Accepted-GPL");
0134     detectForIdentifierSkipParser("GPL-3.0-only_OR_LicenseRef-KDE-Accepted-GPL");
0135 }
0136 
0137 void TestHeaderDetection::detectGPL20_or_GPL30_or_KDE()
0138 {
0139     detectForIdentifierRegExpParser("GPL-2.0-only_OR_GPL-3.0-only_OR_LicenseRef-KDE-Accepted-GPL");
0140     detectForIdentifierSkipParser("GPL-2.0-only_OR_GPL-3.0-only_OR_LicenseRef-KDE-Accepted-GPL");
0141 }
0142 
0143 void TestHeaderDetection::detectLGPL21only()
0144 {
0145     detectForIdentifierRegExpParser("LGPL-2.1-only");
0146     detectForIdentifierSkipParser("LGPL-2.1-only");
0147 }
0148 
0149 void TestHeaderDetection::detectLGPL20_or_LGPL30()
0150 {
0151     detectForIdentifierRegExpParser("LGPL-2.0-only_OR_LGPL-3.0-only");
0152     detectForIdentifierSkipParser("LGPL-2.0-only_OR_LGPL-3.0-only");
0153 }
0154 
0155 void TestHeaderDetection::detectLGPL21_or_LGPL30_or_KDE()
0156 {
0157     detectForIdentifierRegExpParser("LGPL-2.1-only_OR_LGPL-3.0-only_OR_LicenseRef-KDE-Accepted-LGPL");
0158     detectForIdentifierSkipParser("LGPL-2.1-only_OR_LGPL-3.0-only_OR_LicenseRef-KDE-Accepted-LGPL");
0159 }
0160 
0161 void TestHeaderDetection::detectLGPL30orlater()
0162 {
0163     detectForIdentifierRegExpParser("LGPL-3.0-or-later");
0164     detectForIdentifierSkipParser("LGPL-3.0-or-later");
0165 }
0166 
0167 void TestHeaderDetection::detectLGPL30onlyOrGPL20orlater()
0168 {
0169     detectForIdentifierRegExpParser("LGPL-3.0-only_OR_GPL-2.0-or-later");
0170     detectForIdentifierSkipParser("LGPL-3.0-only_OR_GPL-2.0-or-later");
0171 }
0172 
0173 void TestHeaderDetection::detectBSD2Clause()
0174 {
0175     detectForIdentifierRegExpParser("BSD-2-Clause");
0176     detectForIdentifierSkipParser("BSD-2-Clause");
0177 }
0178 
0179 void TestHeaderDetection::detectBSD3Clause()
0180 {
0181     detectForIdentifierRegExpParser("BSD-3-Clause");
0182     detectForIdentifierSkipParser("BSD-3-Clause");
0183 }
0184 
0185 void TestHeaderDetection::detectMIT()
0186 {
0187     detectForIdentifierRegExpParser("MIT");
0188     detectForIdentifierSkipParser("MIT");
0189 }
0190 
0191 void TestHeaderDetection::detectX11()
0192 {
0193     detectForIdentifierRegExpParser("X11");
0194     detectForIdentifierSkipParser("X11");
0195 }
0196 
0197 void TestHeaderDetection::detectLGPL21withQtLGPLexception_or_QtCommercial()
0198 {
0199     detectForIdentifierRegExpParser("LGPL-2.1-only_WITH_Qt-LGPL-exception-1.1_OR_LicenseRef-Qt-Commercial");
0200     detectForIdentifierSkipParser("LGPL-2.1-only_WITH_Qt-LGPL-exception-1.1_OR_LicenseRef-Qt-Commercial");
0201 }
0202 
0203 void TestHeaderDetection::detectLGPL21withQtLGPLexceptionOrLGPL30withQtLGPLexception()
0204 {
0205     detectForIdentifierRegExpParser("LGPL-2.1-only_WITH_Qt-LGPL-exception-1.1_OR_LGPL-3.0-only_WITH_Qt-LGPL-exception-1.1_OR_LicenseRef-Qt-Commercial");
0206     detectForIdentifierSkipParser("LGPL-2.1-only_WITH_Qt-LGPL-exception-1.1_OR_LGPL-3.0-only_WITH_Qt-LGPL-exception-1.1_OR_LicenseRef-Qt-Commercial");
0207 }
0208 
0209 void TestHeaderDetection::detectLGPL30_or_GPL20_or_GPL30_or_GPLKFQF_or_QtCommercial()
0210 {
0211     detectForIdentifierRegExpParser("LGPL-3.0-only_OR_GPL-2.0-only_OR_GPL-3.0-only_OR_LicenseRef-KFQF-Accepted-GPL_OR_LicenseRef-Qt-Commercial");
0212     detectForIdentifierSkipParser("LGPL-3.0-only_OR_GPL-2.0-only_OR_GPL-3.0-only_OR_LicenseRef-KFQF-Accepted-GPL_OR_LicenseRef-Qt-Commercial");
0213 }
0214 
0215 void TestHeaderDetection::detectSpdxExpressions()
0216 {
0217     // read comparison headers
0218     LicenseRegistry registry;
0219     DirectoryParser parser;
0220 
0221     const QString spdxMarker = "GPL-2.0-only_OR_GPL-3.0-only_OR_LicenseRef-KDE-Accepted-GPL";
0222 
0223     QVERIFY(registry.expressions().contains(spdxMarker));
0224     QVERIFY(registry.headerTexts(spdxMarker).size() > 0);
0225 
0226     const QString fileContents { "SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL" };
0227     auto results = parser.detectLicenses(fileContents);
0228 
0229     QCOMPARE(results.count(), 1);
0230     QCOMPARE(results.first(), "GPL-2.0-only_OR_GPL-3.0-only_OR_LicenseRef-KDE-Accepted-GPL");
0231 }
0232 
0233 QTEST_GUILESS_MAIN(TestHeaderDetection);