3030
3131import java .io .IOException ;
3232import java .io .InputStream ;
33- import java .util .HashMap ;
33+ import java .util .Collections ;
3434import java .util .Locale ;
3535import java .util .Map ;
3636import java .util .TreeMap ;
37+ import java .util .stream .IntStream ;
38+ import java .util .stream .Stream ;
39+
3740import org .json .JSONArray ;
3841import org .json .JSONObject ;
3942import org .json .JSONTokener ;
4043import org .junit .jupiter .api .AfterAll ;
4144import org .junit .jupiter .api .BeforeAll ;
45+ import org .junit .jupiter .api .DisplayName ;
4246import org .junit .jupiter .api .Test ;
47+ import org .junit .jupiter .params .ParameterizedTest ;
48+ import org .junit .jupiter .params .provider .Arguments ;
49+ import org .junit .jupiter .params .provider .MethodSource ;
4350
4451/**
4552 * Test cases for PackageURL parsing
5057 * @author Steve Springett
5158 */
5259class PackageURLTest {
53-
54- private static JSONArray json = new JSONArray ();
55-
56- private static Locale defaultLocale ;
60+ private static final Locale DEFAULT_LOCALE = Locale .getDefault ();
5761
5862 @ BeforeAll
59- static void setup () throws IOException {
60- try (InputStream is = PackageURLTest .class .getResourceAsStream ("/test-suite-data.json" )) {
61- assertNotNull (is );
62- json = new JSONArray (new JSONTokener (is ));
63- }
64-
65- defaultLocale = Locale .getDefault ();
63+ static void setup () {
6664 Locale .setDefault (new Locale ("tr" ));
6765 }
6866
6967 @ AfterAll
7068 static void resetLocale () {
71- Locale .setDefault (defaultLocale );
69+ Locale .setDefault (DEFAULT_LOCALE );
70+ }
71+
72+ private static Stream <Arguments > getTestData () throws IOException {
73+ return getTestDataFromFile ("test-suite-data.json" );
74+ }
75+
76+ private static Stream <Arguments > getTestDataFromFile (String name ) throws IOException {
77+ try (InputStream is = PackageURLTest .class .getResourceAsStream ("/" + name )) {
78+ assertNotNull (is );
79+ JSONArray jsonArray = new JSONArray (new JSONTokener (is ));
80+ return IntStream .range (0 , jsonArray .length ()).mapToObj (jsonArray ::getJSONObject ).map (PackageURLTest ::createTestDefinition );
81+ }
7282 }
7383
7484 @ Test
@@ -83,131 +93,87 @@ void validPercentEncoding() throws MalformedPackageURLException {
8393 @ SuppressWarnings ("deprecation" )
8494 @ Test
8595 void invalidPercentEncoding () throws MalformedPackageURLException {
86- assertThrows (MalformedPackageURLException .class , () -> new PackageURL ("pkg:maven/com.google.summit/summit-ast@2.2.0%" ));
87- assertThrows (MalformedPackageURLException .class , () -> new PackageURL ("pkg:maven/com.google.summit/summit-ast@2.2.0%0" ));
96+ assertThrowsExactly (MalformedPackageURLException .class , () -> new PackageURL ("pkg:maven/com.google.summit/summit-ast@2.2.0%" ));
97+ assertThrowsExactly (MalformedPackageURLException .class , () -> new PackageURL ("pkg:maven/com.google.summit/summit-ast@2.2.0%0" ));
8898 PackageURL purl = new PackageURL ("pkg:maven/com.google.summit/summit-ast@2.2.0" );
89- Throwable t1 = assertThrows (ValidationException .class , () -> purl .uriDecode ("%" ));
99+ Throwable t1 = assertThrowsExactly (ValidationException .class , () -> purl .uriDecode ("%" ));
90100 assertEquals ("Incomplete percent encoding at offset 0 with value '%'" , t1 .getMessage ());
91- Throwable t2 = assertThrows (ValidationException .class , () -> purl .uriDecode ("a%0" ));
101+ Throwable t2 = assertThrowsExactly (ValidationException .class , () -> purl .uriDecode ("a%0" ));
92102 assertEquals ("Incomplete percent encoding at offset 1 with value '%0'" , t2 .getMessage ());
93- Throwable t3 = assertThrows (ValidationException .class , () -> purl .uriDecode ("aaaa%%0A" ));
103+ Throwable t3 = assertThrowsExactly (ValidationException .class , () -> purl .uriDecode ("aaaa%%0A" ));
94104 assertEquals ("Invalid percent encoding char 1 at offset 5 with value '%'" , t3 .getMessage ());
95- Throwable t4 = assertThrows (ValidationException .class , () -> purl .uriDecode ("%0G" ));
105+ Throwable t4 = assertThrowsExactly (ValidationException .class , () -> purl .uriDecode ("%0G" ));
96106 assertEquals ("Invalid percent encoding char 2 at offset 2 with value 'G'" , t4 .getMessage ());
97107 }
98108
99- @ Test
100- void constructorParsing () throws Exception {
101- for (int i = 0 ; i < json .length (); i ++) {
102- JSONObject testDefinition = json .getJSONObject (i );
103-
104- final String purlString = testDefinition .getString ("purl" );
105- final String cpurlString = testDefinition .optString ("canonical_purl" );
106- final boolean invalid = testDefinition .getBoolean ("is_invalid" );
107-
108- System .out .println ("Running test on: " + purlString );
109-
110- final String type = testDefinition .optString ("type" , null );
111- final String namespace = testDefinition .optString ("namespace" , null );
112- final String name = testDefinition .optString ("name" , null );
113- final String version = testDefinition .optString ("version" , null );
114- final JSONObject qualifiers = testDefinition .optJSONObject ("qualifiers" );
115- final String subpath = testDefinition .optString ("subpath" , null );
116-
117- if (invalid ) {
118- try {
119- PackageURL purl = new PackageURL (purlString );
120- fail ("Invalid purl should have caused an exception: " + purl );
121- } catch (MalformedPackageURLException e ) {
122- assertNotNull (e .getMessage ());
123- }
124- continue ;
125- }
126-
127- PackageURL purl = new PackageURL (purlString );
128-
129- assertEquals ("pkg" , purl .getScheme ());
130- assertEquals (type , purl .getType ());
131- assertEquals (namespace , purl .getNamespace ());
132- assertEquals (name , purl .getName ());
133- assertEquals (version , purl .getVersion ());
134- assertEquals (subpath , purl .getSubpath ());
135- assertNotNull (purl .getQualifiers ());
136- assertEquals (qualifiers != null ? qualifiers .length () : 0 , purl .getQualifiers ().size (), "qualifier count" );
137- if (qualifiers != null ){
138- qualifiers .keySet ().forEach (key -> {
139- String value = qualifiers .getString (key );
140- assertTrue (purl .getQualifiers ().containsKey (key ));
141- assertEquals (value , purl .getQualifiers ().get (key ));
142- });
143- }
144- assertEquals (cpurlString , purl .canonicalize ());
145- }
109+ private static Arguments createTestDefinition (JSONObject testDefinition ) {
110+ JSONObject jsonQualifiers = testDefinition .optJSONObject ("qualifiers" );
111+ Map <String , Object > qualifiers = (jsonQualifiers != null && !jsonQualifiers .isEmpty ()) ? jsonQualifiers .toMap () : Collections .emptyMap ();
112+ return Arguments .of (
113+ testDefinition .getString ("description" ),
114+ testDefinition .getString ("purl" ),
115+ testDefinition .optString ("canonical_purl" ),
116+ testDefinition .optString ("type" ),
117+ testDefinition .optString ("namespace" , null ),
118+ testDefinition .optString ("name" , null ),
119+ testDefinition .optString ("version" , null ),
120+ qualifiers ,
121+ testDefinition .optString ("subpath" , null ),
122+ testDefinition .getBoolean ("is_invalid" ));
146123 }
147124
148- @ Test
149- @ SuppressWarnings ("unchecked" )
150- void constructorParameters () throws MalformedPackageURLException {
151- for (int i = 0 ; i < json .length (); i ++) {
152- JSONObject testDefinition = json .getJSONObject (i );
153-
154- final String purlString = testDefinition .getString ("purl" );
155- final String cpurlString = testDefinition .optString ("canonical_purl" );
156- final boolean invalid = testDefinition .getBoolean ("is_invalid" );
157-
158- System .out .println ("Running test on: " + purlString );
159-
160- final String type = testDefinition .optString ("type" , null );
161- final String namespace = testDefinition .optString ("namespace" , null );
162- final String name = testDefinition .optString ("name" , null );
163- final String version = testDefinition .optString ("version" , null );
164- final JSONObject qualifiers = testDefinition .optJSONObject ("qualifiers" );
165- final String subpath = testDefinition .optString ("subpath" , null );
166-
167- Map <String , String > map = null ;
168- Map <String , String > hashMap = null ;
169- if (qualifiers != null ) {
170- map = qualifiers .toMap ().entrySet ().stream ().collect (
171- TreeMap ::new ,
172- (qmap , entry ) -> qmap .put (entry .getKey (), (String ) entry .getValue ()),
173- TreeMap ::putAll
174- );
175- hashMap = new HashMap <>(map );
125+ @ DisplayName ("Test constructor parsing" )
126+ @ ParameterizedTest (name = "{0}: ''{1}''" )
127+ @ MethodSource ("getTestData" )
128+ 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+ if (invalid ) {
130+ try {
131+ PackageURL purl = new PackageURL (purlString );
132+ fail ("Invalid purl should have caused an exception: " + purl );
133+ } catch (MalformedPackageURLException e ) {
134+ assertNotNull (e .getMessage ());
176135 }
177136
137+ return ;
138+ }
178139
140+ PackageURL purl = new PackageURL (purlString );
179141
180- if ( invalid ) {
181- try {
182- PackageURL purl = new PackageURL ( type , namespace , name , version , map , subpath );
183- fail ( "Invalid package url components should have caused an exception: " + purl );
184- } catch ( NullPointerException | MalformedPackageURLException e ) {
185- assertNotNull ( e . getMessage ());
186- }
187- continue ;
188- }
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 ());
149+ assertEquals ( cpurlString , purl . canonicalize ()) ;
150+ }
189151
190- PackageURL purl = new PackageURL (type , namespace , name , version , map , subpath );
191-
192- assertEquals (cpurlString , purl .canonicalize ());
193- assertEquals ("pkg" , purl .getScheme ());
194- assertEquals (type , purl .getType ());
195- assertEquals (namespace , purl .getNamespace ());
196- assertEquals (name , purl .getName ());
197- assertEquals (version , purl .getVersion ());
198- assertEquals (subpath , purl .getSubpath ());
199- assertNotNull (purl .getQualifiers ());
200- assertEquals (qualifiers != null ? qualifiers .length () : 0 , purl .getQualifiers ().size (), "qualifier count" );
201- if (qualifiers != null ) {
202- qualifiers .keySet ().forEach (key -> {
203- String value = qualifiers .getString (key );
204- assertTrue (purl .getQualifiers ().containsKey (key ));
205- assertEquals (value , purl .getQualifiers ().get (key ));
206- });
207- PackageURL purl2 = new PackageURL (type , namespace , name , version , hashMap , subpath );
208- assertEquals (purl .getQualifiers (), purl2 .getQualifiers ());
152+ @ DisplayName ("Test constructor parameters" )
153+ @ ParameterizedTest (name = "{0}: ({3}, {4}, {5}, {6}, {7}, {8})" )
154+ @ MethodSource ("getTestData" )
155+ void constructorParameters (String description , String purlString , String cpurlString , String type , String namespace , String name , String version , Map <String , String > qualifiers , String subpath , boolean invalid ) throws MalformedPackageURLException {
156+ if (invalid ) {
157+ try {
158+ PackageURL purl = new PackageURL (type , namespace , name , version , qualifiers , subpath );
159+ fail ("Invalid package url components should have caused an exception: " + purl );
160+ } catch (NullPointerException | MalformedPackageURLException e ) {
161+ assertNotNull (e .getMessage ());
209162 }
163+
164+ return ;
210165 }
166+
167+ PackageURL purl = new PackageURL (type , namespace , name , version , qualifiers , subpath );
168+
169+ 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 ());
211177 }
212178
213179 @ Test
0 commit comments