@@ -122,14 +122,24 @@ private static Arguments createTestDefinition(JSONObject testDefinition) {
122122 testDefinition .getBoolean ("is_invalid" ));
123123 }
124124
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+
125135 @ DisplayName ("Test constructor parsing" )
126136 @ ParameterizedTest (name = "{0}: ''{1}''" )
127137 @ MethodSource ("getTestData" )
128138 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 {
129139 if (invalid ) {
130140 try {
131141 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 );
133143 } catch (MalformedPackageURLException e ) {
134144 assertNotNull (e .getMessage ());
135145 }
@@ -138,14 +148,7 @@ void constructorParsing(String description, String purlString, String cpurlStrin
138148 }
139149
140150 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 );
149152 assertEquals (cpurlString , purl .canonicalize ());
150153 }
151154
@@ -156,7 +159,15 @@ void constructorParameters(String description, String purlString, String cpurlSt
156159 if (invalid ) {
157160 try {
158161 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 );
160171 } catch (NullPointerException | MalformedPackageURLException e ) {
161172 assertNotNull (e .getMessage ());
162173 }
@@ -165,15 +176,8 @@ void constructorParameters(String description, String purlString, String cpurlSt
165176 }
166177
167178 PackageURL purl = new PackageURL (type , namespace , name , version , qualifiers , subpath );
168-
179+ verifyComponentsEquals ( purl , type , namespace , name , version , qualifiers , subpath );
169180 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 ());
177181 }
178182
179183 @ Test
@@ -190,7 +194,6 @@ void constructor() throws MalformedPackageURLException {
190194
191195 purl = new PackageURL ("validtype" , "name" );
192196 assertNotNull (purl );
193-
194197 }
195198
196199 @ Test
@@ -208,9 +211,9 @@ void constructorWithInvalidNumberType() {
208211 assertThrowsExactly (MalformedPackageURLException .class , () -> new PackageURL ("0invalid" , "name" ), "constructor with `0invalid` should have thrown an error and this line should not be reached" );
209212 }
210213
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 () );
214217 }
215218
216219
@@ -305,6 +308,19 @@ void standardTypes() {
305308 assertEquals ("pub" , PackageURL .StandardTypes .PUB );
306309 assertEquals ("pypi" , PackageURL .StandardTypes .PYPI );
307310 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 );
308324 assertEquals ("swid" , PackageURL .StandardTypes .SWID );
309325 assertEquals ("swift" , PackageURL .StandardTypes .SWIFT );
310326 }
0 commit comments