File indexing completed on 2024-05-05 10:06:49
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);