1414package org .eclipse .jdt .debug .tests .core ;
1515
1616import java .io .StringReader ;
17+ import java .util .ArrayList ;
18+ import java .util .Collection ;
19+ import java .util .Iterator ;
20+ import java .util .List ;
1721import java .util .Properties ;
1822
1923import org .eclipse .debug .core .DebugPlugin ;
2327import org .eclipse .jdt .core .IJavaProject ;
2428import org .eclipse .jdt .debug .core .IJavaDebugTarget ;
2529import org .eclipse .jdt .debug .tests .ui .AbstractDebugUiTests ;
30+ import org .eclipse .jdt .launching .IVMInstall ;
31+ import org .eclipse .jdt .launching .IVMInstall2 ;
32+ import org .eclipse .jdt .launching .IVMInstallType ;
33+ import org .eclipse .jdt .launching .JavaRuntime ;
2634import org .eclipse .jface .text .IDocument ;
2735import org .eclipse .ui .console .IConsole ;
2836import org .eclipse .ui .console .TextConsole ;
2937
38+ /**
39+ * <b>IMPORTANT</b> This test requires some different JVM installs to be present (see {@link #JAVA_11}, {@link #JAVA_17}, {@link #JAVA_21})) if such
40+ * JVMs can not be found, the test will fail!
41+ */
3042public class MultiReleaseLaunchTests extends AbstractDebugUiTests {
3143
44+ private static final RequiredJavaVersion JAVA_11 = new RequiredJavaVersion (11 , 16 );
45+ private static final RequiredJavaVersion JAVA_17 = new RequiredJavaVersion (17 , 20 );
46+ private static final RequiredJavaVersion JAVA_21 = new RequiredJavaVersion (21 , Integer .MAX_VALUE );
47+
3248 public MultiReleaseLaunchTests (String name ) {
3349 super (name );
3450 }
3551
52+ @ Override
53+ protected void setUp () throws Exception {
54+ super .setUp ();
55+ List <RequiredJavaVersion > requiredJavaVersions = new ArrayList <>(List .of (JAVA_11 , JAVA_17 , JAVA_21 ));
56+ removeExistingJavaVersions (requiredJavaVersions );
57+ assertTrue ("The following java versions are required by this test but can not be found: "
58+ + requiredJavaVersions , requiredJavaVersions .isEmpty ());
59+ }
60+
3661 @ Override
3762 protected IJavaProject getProjectContext () {
3863 return getMultireleaseProject ();
@@ -41,14 +66,17 @@ protected IJavaProject getProjectContext() {
4166 public void testMultiReleaseLaunch () throws Exception {
4267 ILaunchConfiguration config = getLaunchConfiguration ("p.Main" );
4368 Properties result = launchAndReadResult (config , 11 );
69+ assertTrue ("Was not launched with a proper Java installation " + result , JAVA_11 .matches (result .getProperty ("Java" )));
4470 assertEquals ("X should be executed from Java 11 version: " + result , "11" , result .get ("X" ));
4571 assertNull ("Y should not be executed from Java 11 version: " + result , result .get ("Y" ));
4672 assertNull ("Z should not be executed from Java 11 version: " + result , result .get ("Z" ));
4773 Properties result17 = launchAndReadResult (config , 17 );
74+ assertTrue ("Was not launched with a proper Java installation " + result17 , JAVA_17 .matches (result17 .getProperty ("Java" )));
4875 assertEquals ("X should be executed from Java 17 version: " + result17 , "17" , result17 .get ("X" ));
4976 assertEquals ("Y should be executed from Java 11 version: " + result17 , "11" , result17 .get ("Y" ));
5077 assertNull ("Z should not be executed from Java 17 version: " + result17 , result17 .get ("Z" ));
5178 Properties result21 = launchAndReadResult (config , 21 );
79+ assertTrue ("Was not launched with a proper Java installation " + result21 , JAVA_21 .matches (result21 .getProperty ("Java" )));
5280 assertEquals ("X should be executed from Java 17 version: " + result21 , "17" , result21 .get ("X" ));
5381 assertEquals ("Y should be executed from Java 21 version: " + result21 , "21" , result21 .get ("Y" ));
5482 assertEquals ("Z should be executed from Java 17 version: " + result21 , "17" , result21 .get ("Z" ));
@@ -70,4 +98,46 @@ private Properties launchAndReadResult(ILaunchConfiguration config, int javaVers
7098 return properties ;
7199 }
72100
101+ private static int getJavaVersion (IVMInstall install ) {
102+ if (install instanceof IVMInstall2 vm ) {
103+ try {
104+ String javaVersion = vm .getJavaVersion ().split ("\\ ." )[0 ]; //$NON-NLS-1$
105+ return Integer .parseInt (javaVersion );
106+ } catch (RuntimeException rte ) {
107+ // can't know then...
108+ }
109+ }
110+ return -1 ;
111+ }
112+
113+ private static void removeExistingJavaVersions (Collection <RequiredJavaVersion > requiredJavaVersions ) {
114+ IVMInstallType [] installTypes = JavaRuntime .getVMInstallTypes ();
115+ for (IVMInstallType installType : installTypes ) {
116+ IVMInstall [] vmInstalls = installType .getVMInstalls ();
117+ for (IVMInstall install : vmInstalls ) {
118+ if (requiredJavaVersions .isEmpty ()) {
119+ return ;
120+ }
121+ int javaVersion = getJavaVersion (install );
122+ for (Iterator <RequiredJavaVersion > iterator = requiredJavaVersions .iterator (); iterator .hasNext ();) {
123+ if (iterator .next ().matches (javaVersion )) {
124+ iterator .remove ();
125+ break ;
126+ }
127+ }
128+ }
129+ }
130+ }
131+
132+ private static record RequiredJavaVersion (int from , int to ) {
133+
134+ public boolean matches (int version ) {
135+ return (version >= from () && version <= to ());
136+ }
137+
138+ public boolean matches (String v ) {
139+ return matches (Integer .parseInt (v ));
140+ }
141+ }
142+
73143}
0 commit comments