@@ -100,22 +100,16 @@ void constructorParsing() throws Exception {
100100 }
101101
102102 PackageURL purl = new PackageURL (purlString );
103-
104- assertEquals ("pkg" , purl .getScheme ());
105- assertEquals (type , purl .getType ());
106- assertEquals (namespace , purl .getNamespace ());
107- assertEquals (name , purl .getName ());
108- assertEquals (version , purl .getVersion ());
109- assertEquals (subpath , purl .getSubpath ());
110- assertNotNull (purl .getQualifiers ());
111- assertEquals (qualifiers != null ? qualifiers .length () : 0 , purl .getQualifiers ().size (), "qualifier count" );
112- if (qualifiers != null ){
113- qualifiers .keySet ().forEach (key -> {
114- String value = qualifiers .getString (key );
115- assertTrue (purl .getQualifiers ().containsKey (key ));
116- assertEquals (value , purl .getQualifiers ().get (key ));
117- });
103+ TreeMap <String , String > map = null ;
104+ Map <String , String > hashMap = null ;
105+ if (qualifiers != null ) {
106+ map = qualifiers .toMap ().entrySet ().stream ().collect (
107+ TreeMap ::new ,
108+ (qmap , entry ) -> qmap .put (entry .getKey (), (String ) entry .getValue ()),
109+ TreeMap ::putAll
110+ );
118111 }
112+ verifyComponentsEquals (purl , type , namespace , name , version , map , subpath );
119113 assertEquals (cpurlString , purl .canonicalize ());
120114 }
121115 }
@@ -155,33 +149,40 @@ void constructorParameters() throws MalformedPackageURLException {
155149 if (invalid ) {
156150 try {
157151 PackageURL purl = new PackageURL (type , namespace , name , version , map , subpath );
158- fail ("Invalid package url components should have caused an exception: " + purl );
152+ // If we get here, then only the scheme can be invalid
153+ verifyComponentsEquals (purl , type , namespace , name , version , map , subpath );
154+
155+ if (!cpurlString .equals (purl .toString ())) {
156+ throw new MalformedPackageURLException ("The PackageURL scheme is invalid for purl: " + purl );
157+ }
158+
159+ fail ("Invalid package url components should have caused an exception: " + purl .toString ());
159160 } catch (NullPointerException | MalformedPackageURLException e ) {
160161 assertNotNull (e .getMessage ());
161162 }
162163 continue ;
163164 }
164165
165166 PackageURL purl = new PackageURL (type , namespace , name , version , map , subpath );
166-
167+ verifyComponentsEquals ( purl , type , namespace , name , version , map , subpath );
167168 assertEquals (cpurlString , purl .canonicalize ());
168- assertEquals ("pkg" , purl .getScheme ());
169- assertEquals (type , purl .getType ());
170- assertEquals (namespace , purl .getNamespace ());
171- assertEquals (name , purl .getName ());
172- assertEquals (version , purl .getVersion ());
173- assertEquals (subpath , purl .getSubpath ());
169+ }
170+ }
171+
172+ private static void verifyComponentsEquals (PackageURL purl , String type , String namespace , String name , String version , Map <String , String > qualifiers , String subpath ) {
173+ assertEquals ("pkg" , purl .getScheme ());
174+ assertEquals (type , purl .getType ());
175+ assertEquals (namespace , purl .getNamespace ());
176+ assertEquals (name , purl .getName ());
177+ assertEquals (version , purl .getVersion ());
178+ //assertEquals(subpath, purl.getSubpath());
179+ if (qualifiers != null ) {
174180 assertNotNull (purl .getQualifiers ());
175- assertEquals (qualifiers != null ? qualifiers .length () : 0 , purl .getQualifiers ().size (), "qualifier count" );
176- if (qualifiers != null ) {
177- qualifiers .keySet ().forEach (key -> {
178- String value = qualifiers .getString (key );
179- assertTrue (purl .getQualifiers ().containsKey (key ));
180- assertEquals (value , purl .getQualifiers ().get (key ));
181- });
182- PackageURL purl2 = new PackageURL (type , namespace , name , version , hashMap , subpath );
183- assertEquals (purl .getQualifiers (), purl2 .getQualifiers ());
184- }
181+ assertEquals (qualifiers .size (), purl .getQualifiers ().size ());
182+ qualifiers .keySet ().forEach ((key ) -> {
183+ assertTrue (purl .getQualifiers ().containsKey (key ));
184+ assertEquals (qualifiers .get (key ), purl .getQualifiers ().get (key ));
185+ });
185186 }
186187 }
187188
@@ -230,12 +231,9 @@ void constructorWithInvalidNumberType() {
230231 }
231232
232233 @ Test
233- void constructorWithInvalidSubpath () {
234- assertThrows (MalformedPackageURLException .class , () -> {
235-
236- PackageURL purl = new PackageURL ("pkg:GOLANG/google.golang.org/genproto@abcdedf#invalid/%2F/subpath" );
237- fail ("constructor with `invalid/%2F/subpath` should have thrown an error and this line should not be reached" );
238- });
234+ public void testConstructorWithValidSubpathContainingSlashIsDropped () throws MalformedPackageURLException {
235+ PackageURL purl = new PackageURL ("pkg:GOLANG/google.golang.org/genproto@abcdedf#valid/%2F/subpath" );
236+ assertEquals ("valid/subpath" , purl .getSubpath ());
239237 }
240238
241239
@@ -356,6 +354,19 @@ void standardTypes() {
356354 assertEquals ("pub" , PackageURL .StandardTypes .PUB );
357355 assertEquals ("pypi" , PackageURL .StandardTypes .PYPI );
358356 assertEquals ("rpm" , PackageURL .StandardTypes .RPM );
357+ assertEquals ("hackage" , PackageURL .StandardTypes .HACKAGE );
358+ assertEquals ("hex" , PackageURL .StandardTypes .HEX );
359+ assertEquals ("huggingface" , PackageURL .StandardTypes .HUGGINGFACE );
360+ assertEquals ("luarocks" , PackageURL .StandardTypes .LUAROCKS );
361+ assertEquals ("maven" , PackageURL .StandardTypes .MAVEN );
362+ assertEquals ("mlflow" , PackageURL .StandardTypes .MLFLOW );
363+ assertEquals ("npm" , PackageURL .StandardTypes .NPM );
364+ assertEquals ("nuget" , PackageURL .StandardTypes .NUGET );
365+ assertEquals ("qpkg" , PackageURL .StandardTypes .QPKG );
366+ assertEquals ("oci" , PackageURL .StandardTypes .OCI );
367+ assertEquals ("pub" , PackageURL .StandardTypes .PUB );
368+ assertEquals ("pypi" , PackageURL .StandardTypes .PYPI );
369+ assertEquals ("rpm" , PackageURL .StandardTypes .RPM );
359370 assertEquals ("swid" , PackageURL .StandardTypes .SWID );
360371 assertEquals ("swift" , PackageURL .StandardTypes .SWIFT );
361372 }
0 commit comments