/******************************************************************************* * Copyright (c) 2007, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Jesper S Moller - Bug 421938: [1.8] ExecutionEnvironmentDescription#getVMArguments does not preserve VM arguments *******************************************************************************/ package org.eclipse.jdt.debug.tests.core; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.Map; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.debug.testplugin.JavaTestPlugin; import org.eclipse.jdt.debug.tests.AbstractDebugTest; import org.eclipse.jdt.internal.launching.EEVMType; import org.eclipse.jdt.launching.IVMInstall; import org.eclipse.jdt.launching.IVMInstallType; import org.eclipse.jdt.launching.JavaRuntime; import org.eclipse.jdt.launching.LibraryLocation; import org.eclipse.jdt.launching.VMStandin; import org.eclipse.jdt.launching.environments.ExecutionEnvironmentDescription; import org.eclipse.jdt.launching.environments.IExecutionEnvironment; import org.eclipse.jdt.launching.environments.IExecutionEnvironmentsManager; /** * Tests for ".ee" files - installed JRE definition files */ public class EEDefinitionTests extends AbstractDebugTest { public static IPath TEST_EE_FILE = null; { if (Platform.OS_WIN32.equals(Platform.getOS())) { TEST_EE_FILE = new Path("testfiles/test-jre/bin/test-foundation11-win32.ee"); } else { TEST_EE_FILE = new Path("testfiles/test-jre/bin/test-foundation11.ee"); } } public EEDefinitionTests(String name) { super(name); } /** * Tests that the EE file is a valid file */ public void testValidateDefinitionFile() throws CoreException { File file = getEEFile(); assertNotNull("Missing EE file", file); ExecutionEnvironmentDescription description = new ExecutionEnvironmentDescription(file); IStatus status = EEVMType.validateDefinitionFile(description); assertTrue("Invalid install location", status.isOK()); } /** * Tests that the EE install location validation returns an INFO status. */ public void testValidateInstallLocation() { File file = getEEFile(); IVMInstallType vmType = getVMInstallType(); assertNotNull("Missing EE file", file); assertNotNull("Missing EE VM type", vmType); IStatus status = vmType.validateInstallLocation(file); assertTrue("Invalid install location", status.getSeverity() == IStatus.INFO); } /** * Tests libraries for the EE file */ public void testLibraries() throws CoreException { File file = getEEFile(); assertNotNull("Missing EE file", file); ExecutionEnvironmentDescription description = new ExecutionEnvironmentDescription(file); LibraryLocation[] libs = description.getLibraryLocations(); String[] expected = new String[]{"end.jar", "classes.txt", "others.txt", "add.jar", "ext1.jar", "ext2.jar", "opt-ext.jar"}; assertEquals("Wrong number of libraries", expected.length, libs.length); for (int i = 0; i < expected.length; i++) { if (i == 4) { // ext1 and ext2 can be in either order due to file system ordering assertTrue("Wrong library", expected[i].equals(libs[i].getSystemLibraryPath().lastSegment()) || expected[i].equals(libs[i+1].getSystemLibraryPath().lastSegment())); } else if (i == 5) { // ext1 and ext2 can be in either order due to file system ordering assertTrue("Wrong library", expected[i].equals(libs[i].getSystemLibraryPath().lastSegment()) || expected[i].equals(libs[i-1].getSystemLibraryPath().lastSegment())); } else { assertEquals("Wrong library", expected[i], libs[i].getSystemLibraryPath().lastSegment()); } if ("classes.txt".equals(expected[i])) { assertEquals("source.txt", libs[i].getSystemLibrarySourcePath().lastSegment()); } } } /** * Tests source attachments */ public void testSourceAttachments() throws CoreException { File file = getEEFile(); assertNotNull("Missing EE file", file); ExecutionEnvironmentDescription description = new ExecutionEnvironmentDescription(file); LibraryLocation[] libs = description.getLibraryLocations(); String[] expected = new String[]{"end.txt", "source.txt", "source.txt", "sourceaddsource.jar", "extra1-src.txt", "extra2-src.txt", ""}; assertEquals("Wrong number of libraries", expected.length, libs.length); for (int i = 0; i < expected.length; i++) { if (i == 4) { // ext1 and ext2 can be in either order due to file system ordering assertTrue("Wrong attachment", expected[i].equals(libs[i].getSystemLibrarySourcePath().lastSegment()) || expected[i].equals(libs[i+1].getSystemLibrarySourcePath().lastSegment())); } else if (i == 5) { // ext1 and ext2 can be in either order due to file system ordering assertTrue("Wrong attachment", expected[i].equals(libs[i].getSystemLibrarySourcePath().lastSegment()) || expected[i].equals(libs[i-1].getSystemLibrarySourcePath().lastSegment())); } else if (i == 6){ assertEquals("Wrong attachment", Path.EMPTY, libs[i].getSystemLibrarySourcePath()); } else { assertEquals("Wrong attachment", expected[i], libs[i].getSystemLibrarySourcePath().lastSegment()); } } } /** * Tests default libraries for an EE VM type are empty. */ public void testDefaultLibraries() { File file = getEEFile(); IVMInstallType vmType = getVMInstallType(); assertNotNull("Missing EE file", file); assertNotNull("Missing EE VM type", vmType); LibraryLocation[] libs = vmType.getDefaultLibraryLocations(file); assertEquals("Wrong number of libraries", 0, libs.length); } /** * Tests that a javadoc location can be specified. */ public void testJavadocLocation() throws CoreException { File file = getEEFile(); assertNotNull("Missing EE file", file); ExecutionEnvironmentDescription ee = new ExecutionEnvironmentDescription(file); URL location = EEVMType.getJavadocLocation(ee.getProperties()); URL expectedLocation = null; try { expectedLocation = new URL("http://a.javadoc.location"); } catch (MalformedURLException e) { fail(); } assertEquals("Incorrect javadoc location", expectedLocation, location); } /** * Tests asking for the index from the EE file * * @throws Exception * @since 3.9.0 */ public void testIndexLocation() throws Exception { File file = getEEFile(); assertNotNull("Missing EE file", file); ExecutionEnvironmentDescription ee = new ExecutionEnvironmentDescription(file); URL location = EEVMType.getIndexLocation(ee.getProperties()); URL expectedLocation = null; try { expectedLocation = new URL("http://a.index.location"); } catch (MalformedURLException e) { fail(); } assertEquals("Incorrect index location", expectedLocation, location); } /** * Tests that a name with spaces can be specified. */ public void testVMName() throws CoreException { File file = getEEFile(); assertNotNull("Missing EE file", file); ExecutionEnvironmentDescription ee = new ExecutionEnvironmentDescription(file); String name = ee.getProperty(ExecutionEnvironmentDescription.EE_NAME); assertEquals("Incorrect vm name", "Eclipse JDT Test JRE Definition", name); } /** * Tests default VM arguments. All arguments from the EE file should get passed through in the * same order to the command line. */ public void testVMArguments() throws CoreException { File file = getEEFile(); assertNotNull("Missing EE file", file); ExecutionEnvironmentDescription description = new ExecutionEnvironmentDescription(file); String defaultVMArguments = description.getVMArguments(); String[] expected = new String[] { "-XspecialArg:123", "-XspecialArg2=456", "-XspecialArg3=789" }; int prev = -1; for (int i = 0; i < expected.length; i++) { int next = defaultVMArguments.indexOf(expected[i]); assertTrue("Missing argument: " + expected[i] + ": was: " + defaultVMArguments, next >= 0); assertTrue("Wrong argument order: " + expected[i] + ": " + defaultVMArguments, next > prev); prev = next; } } /** * Test compatible environments */ public void testCompatibleEEs() throws CoreException { IVMInstall install = null; EEVMType vmType = (EEVMType) getVMInstallType(); try { File file = getEEFile(); assertNotNull("Missing EE file", file); assertNotNull("Missing EE VM type", vmType); VMStandin standin = JavaRuntime.createVMFromDefinitionFile(file, "test-ee-file", "test-ee-file-id"); install = standin.convertToRealVM(); IExecutionEnvironmentsManager manager = JavaRuntime.getExecutionEnvironmentsManager(); IExecutionEnvironment[] envs = manager.getExecutionEnvironments(); boolean found11 = false; for (int i = 0; i < envs.length; i++) { IExecutionEnvironment env = envs[i]; if (env.getId().equals("CDC-1.1/Foundation-1.1")) { found11 = true; assertTrue("Should be strictly compatible with " + env.getId(), env.isStrictlyCompatible(install)); } else if (env.getId().indexOf("jdt.debug.tests") < 0) { assertFalse("Should *not* be strictly compatible with " + env.getId(), env.isStrictlyCompatible(install)); } } assertTrue("Did not find foundation 1.1 environment", found11); } finally { if (install != null && vmType != null) { vmType.disposeVMInstall(install.getId()); } } } protected File getEEFile() { return JavaTestPlugin.getDefault().getFileInPlugin(TEST_EE_FILE); } protected IVMInstallType getVMInstallType() { return JavaRuntime.getVMInstallType(EEVMType.ID_EE_VM_TYPE); } /** * Tests raw EE properties map. * * @throws CoreException */ public void testParseProperties() throws CoreException { File file = getEEFile(); assertNotNull("Missing EE file", file); ExecutionEnvironmentDescription desc = new ExecutionEnvironmentDescription(file); Map<String, String> map = desc.getProperties(); // validate expected properties validateProperty(ExecutionEnvironmentDescription.EXECUTABLE, "jrew.txt" , map); validateProperty(ExecutionEnvironmentDescription.EXECUTABLE_CONSOLE, "jre.txt", map); validateProperty("-XspecialArg:123", "", map); validateProperty("-XspecialArg2", "456", map); } protected void validateProperty(String key, String value, Map<String, String> properties) { assertEquals("Unexpeted value for: " + key, value, properties.get(key)); } /** * Tests that a name with spaces can be specified. */ public void testEmptyProperty() throws CoreException { File file = getEEFile(); assertNotNull("Missing EE file", file); ExecutionEnvironmentDescription ee = new ExecutionEnvironmentDescription(file); validateProperty("-Dee.empty", "", ee.getProperties()); } }