@@ -122,14 +122,24 @@ private static Arguments createTestDefinition(JSONObject testDefinition) {
122
122
testDefinition .getBoolean ("is_invalid" ));
123
123
}
124
124
125
+ private void verifyComponentsEquals (PackageURL purl , String type , String namespace , String name , String version , Map <String , String > qualifiers , String subpath ) {
126
+ assertEquals ("pkg" , purl .getScheme ());
127
+ assertEquals (type , purl .getType ());
128
+ assertEquals (namespace , purl .getNamespace ());
129
+ assertEquals (name , purl .getName ());
130
+ assertEquals (version , purl .getVersion ());
131
+ assertEquals (qualifiers , purl .getQualifiers ());
132
+ //assertEquals(subpath, purl.getSubpath());
133
+ }
134
+
125
135
@ DisplayName ("Test constructor parsing" )
126
136
@ ParameterizedTest (name = "{0}: ''{1}''" )
127
137
@ MethodSource ("getTestData" )
128
138
void constructorParsing (String description , String purlString , String cpurlString , String type , String namespace , String name , String version , Map <String , String > qualifiers , String subpath , boolean invalid ) throws Exception {
129
139
if (invalid ) {
130
140
try {
131
141
PackageURL purl = new PackageURL (purlString );
132
- fail ("Invalid purl should have caused an exception: " + purl );
142
+ fail ("Invalid package url components of '" + purl + "' should have caused an exception because " + description );
133
143
} catch (MalformedPackageURLException e ) {
134
144
assertNotNull (e .getMessage ());
135
145
}
@@ -138,14 +148,7 @@ void constructorParsing(String description, String purlString, String cpurlStrin
138
148
}
139
149
140
150
PackageURL purl = new PackageURL (purlString );
141
-
142
- assertEquals ("pkg" , purl .getScheme ());
143
- assertEquals (type , purl .getType ());
144
- assertEquals (namespace , purl .getNamespace ());
145
- assertEquals (name , purl .getName ());
146
- assertEquals (version , purl .getVersion ());
147
- assertEquals (qualifiers , purl .getQualifiers ());
148
- assertEquals (subpath , purl .getSubpath ());
151
+ verifyComponentsEquals (purl , type , namespace , name , version , qualifiers , subpath );
149
152
assertEquals (cpurlString , purl .canonicalize ());
150
153
}
151
154
@@ -156,7 +159,15 @@ void constructorParameters(String description, String purlString, String cpurlSt
156
159
if (invalid ) {
157
160
try {
158
161
PackageURL purl = new PackageURL (type , namespace , name , version , qualifiers , subpath );
159
- fail ("Invalid package url components should have caused an exception: " + purl );
162
+
163
+ // If we get here, then only the scheme can be invalid
164
+ verifyComponentsEquals (purl , type , namespace , name , version , qualifiers , subpath );
165
+
166
+ if (!cpurlString .equals (purl .toString ())) {
167
+ throw new MalformedPackageURLException ("The PackageURL scheme is invalid for purl: " + purl );
168
+ }
169
+
170
+ fail ("Invalid package url components of '" + purl + "' should have caused an exception because " + description );
160
171
} catch (NullPointerException | MalformedPackageURLException e ) {
161
172
assertNotNull (e .getMessage ());
162
173
}
@@ -165,15 +176,8 @@ void constructorParameters(String description, String purlString, String cpurlSt
165
176
}
166
177
167
178
PackageURL purl = new PackageURL (type , namespace , name , version , qualifiers , subpath );
168
-
179
+ verifyComponentsEquals ( purl , type , namespace , name , version , qualifiers , subpath );
169
180
assertEquals (cpurlString , purl .canonicalize ());
170
- assertEquals ("pkg" , purl .getScheme ());
171
- assertEquals (type , purl .getType ());
172
- assertEquals (namespace , purl .getNamespace ());
173
- assertEquals (name , purl .getName ());
174
- assertEquals (version , purl .getVersion ());
175
- assertEquals (qualifiers , purl .getQualifiers ());
176
- assertEquals (subpath , purl .getSubpath ());
177
181
}
178
182
179
183
@ Test
@@ -190,7 +194,6 @@ void constructor() throws MalformedPackageURLException {
190
194
191
195
purl = new PackageURL ("validtype" , "name" );
192
196
assertNotNull (purl );
193
-
194
197
}
195
198
196
199
@ Test
@@ -208,9 +211,9 @@ void constructorWithInvalidNumberType() {
208
211
assertThrowsExactly (MalformedPackageURLException .class , () -> new PackageURL ("0invalid" , "name" ), "constructor with `0invalid` should have thrown an error and this line should not be reached" );
209
212
}
210
213
211
- @ Test
212
- void constructorWithInvalidSubpath () {
213
- assertThrowsExactly ( MalformedPackageURLException . class , () -> new PackageURL ( "pkg:GOLANG/google.golang.org/genproto@abcdedf#invalid/%2F/ subpath"), "constructor with `invalid/%2F/subpath` should have thrown an error and this line should not be reached" );
214
+ void constructorWithValidSubpathContainingSlashIsDropped () throws MalformedPackageURLException {
215
+ PackageURL purl = new PackageURL ( "pkg:GOLANG/google.golang.org/genproto@abcdedf#valid/%2F/subpath" );
216
+ assertEquals ( "valid/ subpath", purl . getSubpath () );
214
217
}
215
218
216
219
@@ -305,6 +308,19 @@ void standardTypes() {
305
308
assertEquals ("pub" , PackageURL .StandardTypes .PUB );
306
309
assertEquals ("pypi" , PackageURL .StandardTypes .PYPI );
307
310
assertEquals ("rpm" , PackageURL .StandardTypes .RPM );
311
+ assertEquals ("hackage" , PackageURL .StandardTypes .HACKAGE );
312
+ assertEquals ("hex" , PackageURL .StandardTypes .HEX );
313
+ assertEquals ("huggingface" , PackageURL .StandardTypes .HUGGINGFACE );
314
+ assertEquals ("luarocks" , PackageURL .StandardTypes .LUAROCKS );
315
+ assertEquals ("maven" , PackageURL .StandardTypes .MAVEN );
316
+ assertEquals ("mlflow" , PackageURL .StandardTypes .MLFLOW );
317
+ assertEquals ("npm" , PackageURL .StandardTypes .NPM );
318
+ assertEquals ("nuget" , PackageURL .StandardTypes .NUGET );
319
+ assertEquals ("qpkg" , PackageURL .StandardTypes .QPKG );
320
+ assertEquals ("oci" , PackageURL .StandardTypes .OCI );
321
+ assertEquals ("pub" , PackageURL .StandardTypes .PUB );
322
+ assertEquals ("pypi" , PackageURL .StandardTypes .PYPI );
323
+ assertEquals ("rpm" , PackageURL .StandardTypes .RPM );
308
324
assertEquals ("swid" , PackageURL .StandardTypes .SWID );
309
325
assertEquals ("swift" , PackageURL .StandardTypes .SWIFT );
310
326
}
0 commit comments