Skip to content

Commit fa53857

Browse files
committed
Use parameterized tests for json data
1 parent dd5f743 commit fa53857

File tree

2 files changed

+113
-114
lines changed

2 files changed

+113
-114
lines changed

pom.xml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
<com.github.spotbugs.version>4.8.3</com.github.spotbugs.version>
7676
<!-- Dependency versions -->
7777
<junit.version>5.12.0</junit.version>
78+
<maven-surefire-junit5-tree-reporter.version>1.4.0</maven-surefire-junit5-tree-reporter.version>
7879
</properties>
7980

8081
<scm>
@@ -144,6 +145,16 @@
144145
<artifactId>junit-jupiter-api</artifactId>
145146
<scope>test</scope>
146147
</dependency>
148+
<dependency>
149+
<groupId>org.junit.jupiter</groupId>
150+
<artifactId>junit-jupiter-params</artifactId>
151+
<scope>test</scope>
152+
</dependency>
153+
<dependency>
154+
<groupId>com.google.errorprone</groupId>
155+
<artifactId>error_prone_core</artifactId>
156+
<version>${error.prone.core.version}</version>
157+
</dependency>
147158
</dependencies>
148159

149160
<build>
@@ -158,6 +169,8 @@
158169
<groupId>org.apache.maven.plugins</groupId>
159170
<artifactId>maven-compiler-plugin</artifactId>
160171
<version>${maven.compiler.plugin.version}</version>
172+
<dependencies>
173+
</dependencies>
161174
</plugin>
162175
<plugin>
163176
<groupId>org.apache.maven.plugins</groupId>
@@ -382,6 +395,22 @@
382395
</configuration>
383396
</execution>
384397
</executions>
398+
<dependencies>
399+
<dependency>
400+
<groupId>me.fabriciorby</groupId>
401+
<artifactId>maven-surefire-junit5-tree-reporter</artifactId>
402+
<version>${maven-surefire-junit5-tree-reporter.version}</version>
403+
</dependency>
404+
</dependencies>
405+
<configuration>
406+
<reportFormat>plain</reportFormat>
407+
<consoleOutputReporter>
408+
<disable>true</disable>
409+
</consoleOutputReporter>
410+
<statelessTestsetInfoReporter
411+
implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporter">
412+
</statelessTestsetInfoReporter>
413+
</configuration>
385414
</plugin>
386415
</plugins>
387416
</build>

src/test/java/com/github/packageurl/PackageURLTest.java

Lines changed: 84 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,23 @@
3030

3131
import java.io.IOException;
3232
import java.io.InputStream;
33-
import java.util.HashMap;
33+
import java.util.Collections;
3434
import java.util.Locale;
3535
import java.util.Map;
3636
import java.util.TreeMap;
37+
import java.util.stream.IntStream;
38+
import java.util.stream.Stream;
39+
3740
import org.json.JSONArray;
3841
import org.json.JSONObject;
3942
import org.json.JSONTokener;
4043
import org.junit.jupiter.api.AfterAll;
4144
import org.junit.jupiter.api.BeforeAll;
45+
import org.junit.jupiter.api.DisplayName;
4246
import 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
@@ -50,139 +57,102 @@
5057
* @author Steve Springett
5158
*/
5259
class 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);
7270
}
7371

74-
@Test
75-
void constructorParsing() throws Exception {
76-
for (int i = 0; i < json.length(); i++) {
77-
JSONObject testDefinition = json.getJSONObject(i);
78-
79-
final String purlString = testDefinition.getString("purl");
80-
final String cpurlString = testDefinition.optString("canonical_purl");
81-
final boolean invalid = testDefinition.getBoolean("is_invalid");
82-
83-
System.out.println("Running test on: " + purlString);
84-
85-
final String type = testDefinition.optString("type", null);
86-
final String namespace = testDefinition.optString("namespace", null);
87-
final String name = testDefinition.optString("name", null);
88-
final String version = testDefinition.optString("version", null);
89-
final JSONObject qualifiers = testDefinition.optJSONObject("qualifiers");
90-
final String subpath = testDefinition.optString("subpath", null);
91-
92-
if (invalid) {
93-
try {
94-
PackageURL purl = new PackageURL(purlString);
95-
fail("Invalid purl should have caused an exception: " + purl);
96-
} catch (MalformedPackageURLException e) {
97-
assertNotNull(e.getMessage());
98-
}
99-
continue;
100-
}
72+
private static Stream<Arguments> getTestData() throws IOException {
73+
return getTestDataFromFile("test-suite-data.json");
74+
}
10175

102-
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-
});
118-
}
119-
assertEquals(cpurlString, purl.canonicalize());
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);
12081
}
82+
}
83+
84+
private static Arguments createTestDefinition(JSONObject testDefinition) {
85+
JSONObject jsonQualifiers = testDefinition.optJSONObject("qualifiers");
86+
Map<String, Object> qualifiers = (jsonQualifiers != null && !jsonQualifiers.isEmpty()) ? jsonQualifiers.toMap() : Collections.emptyMap();
87+
return Arguments.of(
88+
testDefinition.getString("description"),
89+
testDefinition.getString("purl"),
90+
testDefinition.optString("canonical_purl"),
91+
testDefinition.optString("type"),
92+
testDefinition.optString("namespace", null),
93+
testDefinition.optString("name", null),
94+
testDefinition.optString("version", null),
95+
qualifiers,
96+
testDefinition.optString("subpath", null),
97+
testDefinition.getBoolean("is_invalid"));
12198
}
12299

123-
@Test
124-
@SuppressWarnings("unchecked")
125-
void constructorParameters() throws MalformedPackageURLException {
126-
for (int i = 0; i < json.length(); i++) {
127-
JSONObject testDefinition = json.getJSONObject(i);
128-
129-
final String purlString = testDefinition.getString("purl");
130-
final String cpurlString = testDefinition.optString("canonical_purl");
131-
final boolean invalid = testDefinition.getBoolean("is_invalid");
132-
133-
System.out.println("Running test on: " + purlString);
134-
135-
final String type = testDefinition.optString("type", null);
136-
final String namespace = testDefinition.optString("namespace", null);
137-
final String name = testDefinition.optString("name", null);
138-
final String version = testDefinition.optString("version", null);
139-
final JSONObject qualifiers = testDefinition.optJSONObject("qualifiers");
140-
final String subpath = testDefinition.optString("subpath", null);
141-
142-
Map<String, String> map = null;
143-
Map<String, String> hashMap = null;
144-
if (qualifiers != null) {
145-
map = qualifiers.toMap().entrySet().stream().collect(
146-
TreeMap::new,
147-
(qmap, entry) -> qmap.put(entry.getKey(), (String) entry.getValue()),
148-
TreeMap::putAll
149-
);
150-
hashMap = new HashMap<>(map);
151-
}
152100

153101

102+
@DisplayName("Parse")
103+
@ParameterizedTest(name = "{1}: {0}")
104+
@MethodSource("getTestData")
105+
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 {
106+
System.out.println("Running test on: " + purlString + ": " + description);
154107

155-
if (invalid) {
156-
try {
157-
PackageURL purl = new PackageURL(type, namespace, name, version, map, subpath);
158-
fail("Invalid package url components should have caused an exception: " + purl);
159-
} catch (NullPointerException | MalformedPackageURLException e) {
160-
assertNotNull(e.getMessage());
161-
}
162-
continue;
108+
if (invalid) {
109+
try {
110+
PackageURL purl = new PackageURL(purlString);
111+
fail("Invalid purl should have caused an exception: " + purl);
112+
} catch (MalformedPackageURLException e) {
113+
assertNotNull(e.getMessage());
163114
}
115+
return;
116+
}
117+
118+
PackageURL purl = new PackageURL(purlString);
164119

165-
PackageURL purl = new PackageURL(type, namespace, name, version, map, subpath);
166-
167-
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());
174-
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());
120+
assertEquals("pkg", purl.getScheme());
121+
assertEquals(type, purl.getType());
122+
assertEquals(namespace, purl.getNamespace());
123+
assertEquals(name, purl.getName());
124+
assertEquals(version, purl.getVersion());
125+
assertEquals(qualifiers, purl.getQualifiers());
126+
assertEquals(subpath, purl.getSubpath());
127+
assertEquals(cpurlString, purl.canonicalize());
128+
}
129+
130+
@DisplayName("Components")
131+
@ParameterizedTest(name = "{1}: {0}")
132+
@MethodSource("getTestData")
133+
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 {
134+
System.out.println("Running test on: " + purlString + ": " + description);
135+
136+
if (invalid) {
137+
try {
138+
PackageURL purl = new PackageURL(type, namespace, name, version, qualifiers, subpath);
139+
fail("Invalid package url components should have caused an exception: " + purl);
140+
} catch (NullPointerException | MalformedPackageURLException e) {
141+
assertNotNull(e.getMessage());
184142
}
143+
return;
185144
}
145+
146+
PackageURL purl = new PackageURL(type, namespace, name, version, qualifiers, subpath);
147+
148+
assertEquals(cpurlString, purl.canonicalize());
149+
assertEquals("pkg", purl.getScheme());
150+
assertEquals(type, purl.getType());
151+
assertEquals(namespace, purl.getNamespace());
152+
assertEquals(name, purl.getName());
153+
assertEquals(version, purl.getVersion());
154+
assertEquals(qualifiers, purl.getQualifiers());
155+
assertEquals(subpath, purl.getSubpath());
186156
}
187157

188158
@Test

0 commit comments

Comments
 (0)