1 |
commit: 6052789c154452e2198ddf57983d626ba870c321 |
2 |
Author: zongyu <zzy2529420793 <AT> gmail <DOT> com> |
3 |
AuthorDate: Mon Aug 3 13:16:36 2020 +0000 |
4 |
Commit: Miroslav Šulc <fordfrog <AT> gentoo <DOT> org> |
5 |
CommitDate: Mon Aug 3 14:42:52 2020 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/java-ebuilder.git/commit/?id=6052789c |
7 |
|
8 |
initial effort to support multiple testing frameworks |
9 |
|
10 |
Signed-off-by: zongyu <zzy2529420793 <AT> gmail.com> |
11 |
|
12 |
src/main/java/org/gentoo/java/ebuilder/Config.java | 40 +++++++ |
13 |
src/main/java/org/gentoo/java/ebuilder/Main.java | 17 ++- |
14 |
.../gentoo/java/ebuilder/maven/MavenEbuilder.java | 128 +++++++++++++++------ |
15 |
.../gentoo/java/ebuilder/maven/MavenParser.java | 5 + |
16 |
.../gentoo/java/ebuilder/maven/MavenProject.java | 9 ++ |
17 |
src/main/resources/usage.txt | 1 + |
18 |
6 files changed, 161 insertions(+), 39 deletions(-) |
19 |
|
20 |
diff --git a/src/main/java/org/gentoo/java/ebuilder/Config.java b/src/main/java/org/gentoo/java/ebuilder/Config.java |
21 |
index 27dbc7c..dbfa30b 100644 |
22 |
--- a/src/main/java/org/gentoo/java/ebuilder/Config.java |
23 |
+++ b/src/main/java/org/gentoo/java/ebuilder/Config.java |
24 |
@@ -98,6 +98,14 @@ public class Config { |
25 |
* Writer for standard output. |
26 |
*/ |
27 |
private final PrintWriter stdoutWriter; |
28 |
+ /** |
29 |
+ * URI that goes to *-test-sources.jar distributed by maven central |
30 |
+ */ |
31 |
+ private URI testSrcUri; |
32 |
+ /** |
33 |
+ * whether testSrcUri is set and whether the pkg is from maven central. |
34 |
+ */ |
35 |
+ private boolean testSrcUriExists; |
36 |
/** |
37 |
* Path to workdir. |
38 |
*/ |
39 |
@@ -377,6 +385,35 @@ public class Config { |
40 |
return stdoutWriter; |
41 |
} |
42 |
|
43 |
+ /** |
44 |
+ * Getter for {@link #testSrcUri}. |
45 |
+ * |
46 |
+ * @return {@link #testSrcUri} |
47 |
+ */ |
48 |
+ public URI getTestSrcUri() { |
49 |
+ return testSrcUri; |
50 |
+ } |
51 |
+ |
52 |
+ /** |
53 |
+ * Getter for {@link #testSrcUriExists}. |
54 |
+ * |
55 |
+ * @return {@link #testSrcUriExists} |
56 |
+ */ |
57 |
+ public boolean hasTestSrcUri() { |
58 |
+ return testSrcUriExists; |
59 |
+ } |
60 |
+ |
61 |
+ /** |
62 |
+ * Setter for {@link #testSrcUri}. |
63 |
+ * |
64 |
+ * @param testSrcUri {@link #testSrcUri} |
65 |
+ */ |
66 |
+ public void setTestSrcUri(final URI testSrcUri) { |
67 |
+ this.testSrcUri = testSrcUri; |
68 |
+ if (isFromMavenCentral()) { |
69 |
+ this.testSrcUriExists = true; |
70 |
+ } |
71 |
+ } |
72 |
/** |
73 |
* Getter for {@link #workdir}. |
74 |
* |
75 |
@@ -429,6 +466,9 @@ public class Config { |
76 |
*/ |
77 |
public void setFromMavenCentral(final boolean fromMavenCentral) { |
78 |
this.fromMavenCentral = fromMavenCentral; |
79 |
+ if (getTestSrcUri() != null) { |
80 |
+ this.testSrcUriExists = true; |
81 |
+ } |
82 |
} |
83 |
|
84 |
/** |
85 |
|
86 |
diff --git a/src/main/java/org/gentoo/java/ebuilder/Main.java b/src/main/java/org/gentoo/java/ebuilder/Main.java |
87 |
index 72e0a04..49f6a49 100644 |
88 |
--- a/src/main/java/org/gentoo/java/ebuilder/Main.java |
89 |
+++ b/src/main/java/org/gentoo/java/ebuilder/Main.java |
90 |
@@ -219,7 +219,9 @@ public class Main { |
91 |
try { |
92 |
config.setBinjarUri(new URI(args[i])); |
93 |
} catch (final URISyntaxException ex) { |
94 |
- config.getErrorWriter().println("ERROR: BINJAR_URI " + args[i] |
95 |
+ config.getErrorWriter().println( |
96 |
+ "ERROR: URI goes to binary jar " |
97 |
+ + args[i] |
98 |
+ " is not valid."); |
99 |
} |
100 |
|
101 |
@@ -291,6 +293,19 @@ public class Main { |
102 |
case "-s": |
103 |
i++; |
104 |
config.setSlot(args[i]); |
105 |
+ break; |
106 |
+ case "--test-src-uri": |
107 |
+ i++; |
108 |
+ |
109 |
+ try { |
110 |
+ config.setTestSrcUri(new URI(args[i])); |
111 |
+ } catch (final URISyntaxException ex) { |
112 |
+ config.getErrorWriter().println( |
113 |
+ "ERROR: URI that goes to src code for testing" |
114 |
+ + args[i] |
115 |
+ + " is not valid."); |
116 |
+ } |
117 |
+ |
118 |
break; |
119 |
case "--workdir": |
120 |
case "-w": |
121 |
|
122 |
diff --git a/src/main/java/org/gentoo/java/ebuilder/maven/MavenEbuilder.java b/src/main/java/org/gentoo/java/ebuilder/maven/MavenEbuilder.java |
123 |
index 857d6c1..b9778ef 100644 |
124 |
--- a/src/main/java/org/gentoo/java/ebuilder/maven/MavenEbuilder.java |
125 |
+++ b/src/main/java/org/gentoo/java/ebuilder/maven/MavenEbuilder.java |
126 |
@@ -6,9 +6,11 @@ import java.io.PrintWriter; |
127 |
import java.nio.file.Path; |
128 |
import java.time.LocalDate; |
129 |
import java.util.ArrayList; |
130 |
+import java.util.HashSet; |
131 |
import java.util.List; |
132 |
import java.util.regex.Matcher; |
133 |
import java.util.regex.Pattern; |
134 |
+import java.util.Set; |
135 |
import org.gentoo.java.ebuilder.Config; |
136 |
|
137 |
/** |
138 |
@@ -29,6 +31,14 @@ public class MavenEbuilder { |
139 |
private static final String defaultHomepage |
140 |
= "https://wiki.gentoo.org/wiki/No_homepage"; |
141 |
|
142 |
+ /** |
143 |
+ * The extra dependency for framework "pkgdiff" |
144 |
+ */ |
145 |
+ private static final String dependencyForPkgdiff |
146 |
+ = "\n\t\tamd64? (\n\t\t\tdev-util/pkgdiff" |
147 |
+ + "\n\t\t\tdev-util/japi-compliance-checker" |
148 |
+ + "\n\t\t)"; |
149 |
+ |
150 |
/** |
151 |
* EAPI version. |
152 |
*/ |
153 |
@@ -42,7 +52,13 @@ public class MavenEbuilder { |
154 |
* Pattern for checking whether download tarball name matches expected name. |
155 |
*/ |
156 |
private static final Pattern PATTERN_TARBALL_NAME |
157 |
- = Pattern.compile("^.*/\\$\\{P\\}-sources.((?:\\.tar)\\.\\S+|(?:\\.jar))$"); |
158 |
+ = Pattern.compile("^.*/\\$\\{P\\}-sources((?:\\.tar)\\.\\S+|(?:\\.jar))$"); |
159 |
+ |
160 |
+ /** |
161 |
+ * Pattern for checking whether download tarball for testing name matches expected name. |
162 |
+ */ |
163 |
+ private static final Pattern PATTERN_TEST_TARBALL_NAME |
164 |
+ = Pattern.compile("^.*/\\$\\{P\\}-test-sources\\.jar$"); |
165 |
|
166 |
/** |
167 |
* Pattern for checking whether the dependency is specifying versions. |
168 |
@@ -139,9 +155,10 @@ public class MavenEbuilder { |
169 |
* @return testing framework name or null |
170 |
*/ |
171 |
private String determineTestingFramework( |
172 |
- final List<MavenProject> mavenProjects) { |
173 |
+ final List<MavenProject> mavenProjects, final Config config) { |
174 |
for (final MavenProject mavenProject : mavenProjects) { |
175 |
- final String result = determineTestingFramework(mavenProject); |
176 |
+ final String result |
177 |
+ = determineTestingFramework(mavenProject, config); |
178 |
|
179 |
if (result != null) { |
180 |
return result; |
181 |
@@ -158,24 +175,61 @@ public class MavenEbuilder { |
182 |
* |
183 |
* @return testing framework name or null |
184 |
*/ |
185 |
- private String determineTestingFramework(final MavenProject mavenProject) { |
186 |
+ private String determineTestingFramework( |
187 |
+ final MavenProject mavenProject, final Config config) { |
188 |
+ Set<String> frameworks = new HashSet<>(10); |
189 |
+ |
190 |
for (final MavenDependency dependency : mavenProject. |
191 |
getTestDependencies()) { |
192 |
- if ("junit".equals(dependency.getGroupId()) |
193 |
- && "junit".equals(dependency.getArtifactId())) { |
194 |
- return "junit"; |
195 |
- } |
196 |
+ frameworks.add(determineTestingFrameworkByDependency(dependency)); |
197 |
} |
198 |
|
199 |
for (final MavenDependency dependency : mavenProject. |
200 |
getCommonDependencies()) { |
201 |
- if ("junit".equals(dependency.getGroupId()) |
202 |
- && "junit".equals(dependency.getArtifactId())) { |
203 |
- return "junit"; |
204 |
- } |
205 |
+ frameworks.add(determineTestingFrameworkByDependency(dependency)); |
206 |
} |
207 |
|
208 |
- return null; |
209 |
+ if (config.hasBinjarUri()) { |
210 |
+ frameworks.add("pkgdiff"); |
211 |
+ } |
212 |
+ |
213 |
+ frameworks.remove(null); |
214 |
+ |
215 |
+ if (frameworks.size() == 0) { |
216 |
+ return null; |
217 |
+ } else { |
218 |
+ return String.join(" ", frameworks); |
219 |
+ } |
220 |
+ } |
221 |
+ |
222 |
+ /** |
223 |
+ * Determines the testing framework based on project dependencies. |
224 |
+ * |
225 |
+ * @param mavenProject maven project |
226 |
+ * |
227 |
+ * @return testing framework name or null |
228 |
+ */ |
229 |
+ private String determineTestingFrameworkByDependency( |
230 |
+ final MavenDependency dependency) { |
231 |
+ /** TODO: missing support for |
232 |
+ * "org.junit.vintage:junit-vintage-engine" tests |
233 |
+ * "POJO" tests |
234 |
+ * "spock" tests |
235 |
+ * "cucumber" tests |
236 |
+ */ |
237 |
+ if ("junit".equals(dependency.getGroupId()) |
238 |
+ && "junit".equals(dependency.getArtifactId())) { |
239 |
+ return "junit"; |
240 |
+ } else if ("org.testng".equals(dependency.getGroupId()) |
241 |
+ && "testng".equals(dependency.getArtifactId())) { |
242 |
+ return "testng"; |
243 |
+ } else if ("org.junit.jupiter".equals(dependency.getGroupId()) |
244 |
+ && "junit-jupiter-engine". |
245 |
+ equals(dependency.getArtifactId())) { |
246 |
+ return "junit-5"; |
247 |
+ } else { |
248 |
+ return null; |
249 |
+ } |
250 |
} |
251 |
|
252 |
/** |
253 |
@@ -275,40 +329,23 @@ public class MavenEbuilder { |
254 |
} |
255 |
|
256 |
/** |
257 |
- * If the tarball name does not match pattern ${P}-test.ext then we will update |
258 |
- * it to store the tarball as ${P}-test.ext. |
259 |
+ * If the tarball name does not match pattern ${P}-test-sources.jar |
260 |
+ * we will update it to store the tarball as ${P}-test-sources.jar. |
261 |
+ * Note that we only need it for Maven central artifacts, so it is |
262 |
+ * safe to assume that the extension should be ".jar". |
263 |
* |
264 |
* @param TestSrcUri source test URI |
265 |
* |
266 |
* @return either original source test URI or updated source test URI |
267 |
+ */ |
268 |
private String improveTestSrcUri(final String TestSrcUri) { |
269 |
if (PATTERN_TEST_TARBALL_NAME.matcher(TestSrcUri).matches()) { |
270 |
return TestSrcUri; |
271 |
} |
272 |
|
273 |
- final Matcher matcher = PATTERN_TARBALL_EXTENSION.matcher(TestSrcUri); |
274 |
- |
275 |
- /** |
276 |
- * We do not know how to get the extension so we will leave the tarball |
277 |
- * name as it is. |
278 |
- / |
279 |
- if (!matcher.matches()) { |
280 |
- return TestSrcUri; |
281 |
- } |
282 |
- |
283 |
- return TestSrcUri + " -> " + "${P}-test" + matcher.group(1); |
284 |
+ return TestSrcUri + " -> " + "${P}-test-sources.jar"; |
285 |
} |
286 |
- */ |
287 |
|
288 |
- /** |
289 |
- * Merges maven project system dependencies of specified type and removed |
290 |
- * duplicates. |
291 |
- * |
292 |
- * @param mavenProjects list of maven projects |
293 |
- * @param type type of dependencies ("common", "compile", "runtime" |
294 |
- * and "test") |
295 |
- * |
296 |
- * @return list of merged dependencies |
297 |
/** |
298 |
* Merges maven project system dependencies of specified type and removed |
299 |
* duplicates. |
300 |
@@ -401,6 +438,11 @@ public class MavenEbuilder { |
301 |
writer.print(config.getBinjarUri()); |
302 |
} |
303 |
|
304 |
+ if (config.hasTestSrcUri()) { |
305 |
+ writer.print(" --test-src-uri "); |
306 |
+ writer.print(config.getTestSrcUri()); |
307 |
+ } |
308 |
+ |
309 |
if (config.getLicense() != null) { |
310 |
writer.print(" --license "); |
311 |
writer.print(config.getLicense()); |
312 |
@@ -526,7 +568,7 @@ public class MavenEbuilder { |
313 |
writer.println("\t)"); |
314 |
} |
315 |
|
316 |
- if (!testDependencies.isEmpty()) { |
317 |
+ if (!testDependencies.isEmpty() || config.hasBinjarUri()) { |
318 |
writer.println("\ttest? ("); |
319 |
|
320 |
testDependencies.stream().forEach((dependency) -> { |
321 |
@@ -534,6 +576,11 @@ public class MavenEbuilder { |
322 |
writer.println(dependency); |
323 |
}); |
324 |
|
325 |
+ // TODO: check whether amd64 is inside KEYWORDS |
326 |
+ if (config.hasBinjarUri()) { |
327 |
+ writer.println(dependencyForPkgdiff); |
328 |
+ } |
329 |
+ |
330 |
writer.println("\t)"); |
331 |
} |
332 |
|
333 |
@@ -734,6 +781,10 @@ public class MavenEbuilder { |
334 |
writer.print("\n\t" + improveBinjarUri( |
335 |
replaceWithVars(config.getBinjarUri().toString(), config))); |
336 |
} |
337 |
+ if (config.hasTestSrcUri()) { |
338 |
+ writer.print("\n\t" + improveTestSrcUri( |
339 |
+ replaceWithVars(config.getTestSrcUri().toString(), config))); |
340 |
+ } |
341 |
writer.println('"'); |
342 |
|
343 |
writer.print("LICENSE=\""); |
344 |
@@ -838,7 +889,8 @@ public class MavenEbuilder { |
345 |
writer.println("JAVA_BINJAR_FILENAME=\"${P}-bin.jar\""); |
346 |
} |
347 |
|
348 |
- final String testingFramework = determineTestingFramework(mavenProject); |
349 |
+ final String testingFramework |
350 |
+ = determineTestingFramework(mavenProject, config); |
351 |
boolean firstTestVar = true; |
352 |
|
353 |
if (testingFramework != null) { |
354 |
|
355 |
diff --git a/src/main/java/org/gentoo/java/ebuilder/maven/MavenParser.java b/src/main/java/org/gentoo/java/ebuilder/maven/MavenParser.java |
356 |
index d487024..73acd6e 100644 |
357 |
--- a/src/main/java/org/gentoo/java/ebuilder/maven/MavenParser.java |
358 |
+++ b/src/main/java/org/gentoo/java/ebuilder/maven/MavenParser.java |
359 |
@@ -44,6 +44,7 @@ public class MavenParser { |
360 |
final MavenProject mavenProject = parsePom(config, mavenCache, |
361 |
pomFile, effectivePom); |
362 |
|
363 |
+ // TODO: I suppose they should go to "POJO" tests |
364 |
if (mavenProject.hasTests() |
365 |
&& mavenProject.getTestDependencies().isEmpty()) { |
366 |
mavenProject.addDependency(new MavenDependency( |
367 |
@@ -51,6 +52,10 @@ public class MavenParser { |
368 |
mavenCache.getDependency("junit", "junit", "4.11"))); |
369 |
} |
370 |
|
371 |
+ if (config.hasTestSrcUri()) { |
372 |
+ mavenProject.setHasTests(true); |
373 |
+ } |
374 |
+ |
375 |
result.add(mavenProject); |
376 |
}); |
377 |
|
378 |
|
379 |
diff --git a/src/main/java/org/gentoo/java/ebuilder/maven/MavenProject.java b/src/main/java/org/gentoo/java/ebuilder/maven/MavenProject.java |
380 |
index 2fd88de..4ce11b8 100644 |
381 |
--- a/src/main/java/org/gentoo/java/ebuilder/maven/MavenProject.java |
382 |
+++ b/src/main/java/org/gentoo/java/ebuilder/maven/MavenProject.java |
383 |
@@ -560,6 +560,15 @@ public class MavenProject { |
384 |
return hasTests; |
385 |
} |
386 |
|
387 |
+ /** |
388 |
+ * Setter for {@link #hasTests} |
389 |
+ * |
390 |
+ * @param hasTests {@link #hasTests} |
391 |
+ */ |
392 |
+ public void setHasTests(boolean hasTests) { |
393 |
+ this.hasTests = hasTests; |
394 |
+ } |
395 |
+ |
396 |
/** |
397 |
* Returns dependencies based on the specified scopes. |
398 |
* |
399 |
|
400 |
diff --git a/src/main/resources/usage.txt b/src/main/resources/usage.txt |
401 |
index 78ab745..1ceceeb 100644 |
402 |
--- a/src/main/resources/usage.txt |
403 |
+++ b/src/main/resources/usage.txt |
404 |
@@ -3,6 +3,7 @@ Usage: java-ebuilder <args> |
405 |
Generating ebuild: |
406 |
--download-uri|-u <uri> uri that goes to SRC_URI |
407 |
--binjar-uri <uri> uri that goes to binary jar |
408 |
+--test-src-uri <uri> uri that goes to test-sources from Maven Central |
409 |
--dump-projects|-d outputs information about parsed projects |
410 |
(useful for debugging) |
411 |
--ebuild|-e <file> path to ebuild that should be created |