Skip to content

Commit 3f59d0e

Browse files
authored
Test for known license range matches. (#1483)
1 parent 0a976fb commit 3f59d0e

File tree

2 files changed

+229
-2
lines changed

2 files changed

+229
-2
lines changed

lib/src/license_detection/license_detector.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ const _defaultSpdxLicenseDir = 'lib/src/third_party/spdx/licenses';
2525

2626
// Load corpus licenses.
2727
List<License>? _cachedLicenses;
28-
Future<List<License>> _getDefaultLicenses() async {
28+
@visibleForTesting
29+
Future<List<License>> listDefaultLicenses() async {
2930
if (_cachedLicenses == null) {
3031
final uri = await Isolate.resolvePackageUri(
3132
Uri.parse(_defaultSpdxLicenseDir.replaceFirst('lib/', 'package:pana/')),
@@ -69,7 +70,7 @@ Future<Result> detectLicense(String text, double threshold) async {
6970

7071
final possibleLicenses = filter(
7172
unknownLicense.tokenFrequency,
72-
await _getDefaultLicenses(),
73+
await listDefaultLicenses(),
7374
).map((e) => LicenseWithNGrams.parse(e, granularity));
7475
var result = <LicenseMatch>[];
7576

Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:pana/src/license.dart';
6+
import 'package:pana/src/license_detection/license_detector.dart';
7+
import 'package:test/test.dart';
8+
9+
void main() {
10+
group('License coverage', () {
11+
test('Coverage of all reference text', () async {
12+
final allLicenses = await listDefaultLicenses();
13+
expect(allLicenses, hasLength(greaterThan(30)));
14+
for (final license in allLicenses) {
15+
final detected = await detectLicenseInContent(
16+
license.content,
17+
relativePath: 'LICENSE',
18+
);
19+
// TODO: fix detection and return at least one match (https://github.com/dart-lang/pana/issues/1484)
20+
if (license.identifier == 'SSH-OpenSSH') {
21+
continue;
22+
}
23+
final match = detected
24+
.where((l) => l.spdxIdentifier == license.identifier)
25+
.single;
26+
27+
// TODO: fix coverage calculation as 1:1 matches shouldn't have too many ranges (https://github.com/dart-lang/pana/issues/1481)
28+
final excessiveLicenses = [
29+
'AFL-2.0',
30+
'AFL-2.1',
31+
'AFL-3.0',
32+
'AGPL-1.0',
33+
'AGPL-3.0',
34+
'AGPL-3.0',
35+
'APL-1.0',
36+
'APSL-1.0',
37+
'APSL-1.1',
38+
'APSL-1.2',
39+
'APSL-2.0',
40+
'Aladdin',
41+
'Apache-2.0',
42+
'Apache-2.0',
43+
'Arphic-1999',
44+
'Artistic-1.0',
45+
'Artistic-1.0-Perl',
46+
'Artistic-1.0-cl8',
47+
'Artistic-2.0',
48+
'BSD-Protection',
49+
'BitTorrent-1.0',
50+
'BitTorrent-1.1',
51+
'CAL-1.0-Combined-Work-Exception',
52+
'CC-BY-1.0',
53+
'CC-BY-2.0',
54+
'CC-BY-2.5',
55+
'CC-BY-2.5-AU',
56+
'CC-BY-3.0',
57+
'CC-BY-3.0-AT',
58+
'CC-BY-3.0-DE',
59+
'CC-BY-3.0-NL',
60+
'CC-BY-3.0-US',
61+
'CC-BY-4.0',
62+
'CC-BY-NC-1.0',
63+
'CC-BY-NC-2.0',
64+
'CC-BY-NC-2.5',
65+
'CC-BY-NC-3.0',
66+
'CC-BY-NC-3.0-DE',
67+
'CC-BY-NC-4.0',
68+
'CC-BY-NC-ND-1.0',
69+
'CC-BY-NC-ND-2.0',
70+
'CC-BY-NC-ND-2.5',
71+
'CC-BY-NC-ND-3.0',
72+
'CC-BY-NC-ND-3.0-DE',
73+
'CC-BY-NC-ND-3.0-IGO',
74+
'CC-BY-NC-ND-4.0',
75+
'CC-BY-NC-SA-1.0',
76+
'CC-BY-NC-SA-2.0',
77+
'CC-BY-NC-SA-2.0-FR',
78+
'CC-BY-NC-SA-2.0-UK',
79+
'CC-BY-NC-SA-2.5',
80+
'CC-BY-NC-SA-3.0',
81+
'CC-BY-NC-SA-3.0-DE',
82+
'CC-BY-NC-SA-3.0-IGO',
83+
'CC-BY-NC-SA-4.0',
84+
'CC-BY-ND-1.0',
85+
'CC-BY-ND-2.0',
86+
'CC-BY-ND-2.5',
87+
'CC-BY-ND-3.0',
88+
'CC-BY-ND-3.0-DE',
89+
'CC-BY-ND-4.0',
90+
'CC-BY-SA-1.0',
91+
'CC-BY-SA-2.0',
92+
'CC-BY-SA-2.0-UK',
93+
'CC-BY-SA-2.5',
94+
'CC-BY-SA-3.0',
95+
'CC-BY-SA-3.0-AT',
96+
'CC-BY-SA-3.0-DE',
97+
'CC-BY-SA-4.0',
98+
'CDDL-1.0',
99+
'CDDL-1.1',
100+
'CDL-1.0',
101+
'CDLA-Permissive-1.0',
102+
'CDLA-Sharing-1.0',
103+
'CECILL-1.0',
104+
'CECILL-1.1',
105+
'CECILL-2.1',
106+
'CERN-OHL-1.2',
107+
'CERN-OHL-S-2.0',
108+
'CERN-OHL-W-2.0',
109+
'CPAL-1.0',
110+
'CPL-1.0',
111+
'CPOL-1.02',
112+
'CUA-OPL-1.0',
113+
'ClArtistic',
114+
'Community-Spec-1.0',
115+
'D-FSL-1.0',
116+
'DL-DE-BY-2.0',
117+
'ECL-2.0',
118+
'ECL-2.0',
119+
'EPL-1.0',
120+
'EPL-2.0',
121+
'EUPL-1.0',
122+
'EUPL-1.2',
123+
'ErlPL-1.1',
124+
'FTL',
125+
'Frameworx-1.0',
126+
'FreeImage',
127+
'GFDL-1.1',
128+
'GFDL-1.2',
129+
'GFDL-1.3',
130+
'GPL-1.0',
131+
'GPL-2.0',
132+
'GPL-2.0',
133+
'GPL-3.0',
134+
'GPL-3.0',
135+
'Glide',
136+
'IPA',
137+
'IPL-1.0',
138+
'Interbase-1.0',
139+
'LAL-1.2',
140+
'LAL-1.3',
141+
'LGPL-2.0',
142+
'LGPL-2.0',
143+
'LGPL-2.1',
144+
'LGPL-2.1',
145+
'LGPL-3.0',
146+
'LGPLLR',
147+
'LGPLLR',
148+
'LPL-1.0',
149+
'LPL-1.02',
150+
'LPPL-1.0',
151+
'LPPL-1.1',
152+
'LPPL-1.2',
153+
'LPPL-1.3a',
154+
'LPPL-1.3c',
155+
'LiLiQ-P-1.1',
156+
'LiLiQ-R-1.1',
157+
'LiLiQ-Rplus-1.1',
158+
'MPL-1.0',
159+
'MPL-1.1',
160+
'MPL-2.0',
161+
'Motosoto',
162+
'MulanPSL-1.0',
163+
'MulanPSL-2.0',
164+
'NASA-1.3',
165+
'NBPL-1.0',
166+
'NOSL',
167+
'NPL-1.0',
168+
'NPL-1.1',
169+
'NPOSL-3.0',
170+
'Nokia',
171+
'OCCT-PL',
172+
'ODC-By-1.0',
173+
'ODbL-1.0',
174+
'OGDL-Taiwan-1.0',
175+
'OLDAP-1.1',
176+
'OLDAP-1.2',
177+
'OLDAP-1.3',
178+
'OLDAP-1.4',
179+
'OPL-1.0',
180+
'OPUBL-1.0',
181+
'OSET-PL-2.1',
182+
'OSL-1.0',
183+
'OSL-1.1',
184+
'OSL-2.0',
185+
'OSL-2.1',
186+
'OSL-3.0',
187+
'PDDL-1.0',
188+
'Parity-7.0.0',
189+
'Python-2.0',
190+
'RHeCos-1.1',
191+
'RPL-1.1',
192+
'RPL-1.5',
193+
'RPSL-1.0',
194+
'RSCPL',
195+
'SCEA',
196+
'SGI-B-1.0',
197+
'SGI-B-1.1',
198+
'SHL-0.5',
199+
'SHL-0.5',
200+
'SHL-0.51',
201+
'SHL-0.51',
202+
'SISSL',
203+
'SNIA',
204+
'SPL-1.0',
205+
'SSPL-1.0',
206+
'SSPL-1.0',
207+
'Sendmail',
208+
'Sendmail-8.23',
209+
'SugarCRM-1.1.3',
210+
'TAPR-OHL-1.0',
211+
'UCL-1.0',
212+
'Unicode-TOU',
213+
'Watcom-1.0',
214+
'copyleft-next-0.3.0',
215+
'copyleft-next-0.3.1',
216+
'etalab-2.0',
217+
'gSOAP-1.3b',
218+
];
219+
if (excessiveLicenses.contains(license.identifier)) {
220+
continue;
221+
}
222+
expect(match.range!.coverages, hasLength(lessThan(50)));
223+
}
224+
});
225+
});
226+
}

0 commit comments

Comments
 (0)