Gentoo Archives: gentoo-commits

From: "Miroslav Šulc" <fordfrog@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/java-ebuilder:master commit in: src/main/java/org/gentoo/java/ebuilder/maven/, ...
Date: Wed, 05 Aug 2020 14:31:54
Message-Id: 1596465772.6052789c154452e2198ddf57983d626ba870c321.fordfrog@gentoo
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