| /******************************************************************************* |
| * Copyright (c) 2004, 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 |
| *******************************************************************************/ |
| package org.eclipse.jdt.debug.tests.core; |
| |
| import java.io.File; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.core.variables.IStringVariableManager; |
| import org.eclipse.core.variables.IValueVariable; |
| import org.eclipse.core.variables.VariablesPlugin; |
| import org.eclipse.debug.core.DebugPlugin; |
| import org.eclipse.debug.core.ILaunchConfigurationType; |
| import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; |
| import org.eclipse.debug.core.ILaunchDelegate; |
| import org.eclipse.debug.core.ILaunchManager; |
| import org.eclipse.debug.core.model.ILaunchConfigurationDelegate; |
| import org.eclipse.debug.internal.core.LaunchManager; |
| import org.eclipse.jdt.core.IAccessRule; |
| import org.eclipse.jdt.core.IClasspathAttribute; |
| import org.eclipse.jdt.core.IClasspathEntry; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.debug.testplugin.JavaProjectHelper; |
| import org.eclipse.jdt.debug.testplugin.JavaTestPlugin; |
| import org.eclipse.jdt.debug.tests.AbstractDebugTest; |
| import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; |
| import org.eclipse.jdt.launching.JavaLaunchDelegate; |
| import org.eclipse.jdt.launching.JavaRuntime; |
| |
| /** |
| * Tests for native classpath entries. |
| * |
| * @since 3.1 |
| */ |
| public class JavaLibraryPathTests extends AbstractDebugTest { |
| |
| public JavaLibraryPathTests(String name) { |
| super(name); |
| } |
| |
| /** |
| * Create test projects "PathTests1/2/3" |
| */ |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| createProject("PathTests1"); |
| createProject("PathTests2"); |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| deleteProject("PathTests1"); |
| deleteProject("PathTests2"); |
| super.tearDown(); |
| } |
| |
| private IJavaProject createProject(String name) throws Exception { |
| IProject pro = ResourcesPlugin.getWorkspace().getRoot().getProject(name); |
| if (pro.exists()) { |
| pro.delete(true, true, null); |
| } |
| IJavaProject project = JavaProjectHelper.createJavaProject(name, "bin"); |
| return project; |
| } |
| |
| private void deleteProject(String name) throws Exception { |
| IProject pro = ResourcesPlugin.getWorkspace().getRoot().getProject(name); |
| if (pro.exists()) { |
| pro.delete(true, true, null); |
| } |
| } |
| |
| private void addToClasspath(IJavaProject jproject, IClasspathEntry cpe) throws JavaModelException { |
| IClasspathEntry[] oldEntries= jproject.getRawClasspath(); |
| for (int i= 0; i < oldEntries.length; i++) { |
| if (oldEntries[i].equals(cpe)) { |
| return; |
| } |
| } |
| int nEntries= oldEntries.length; |
| IClasspathEntry[] newEntries= new IClasspathEntry[nEntries + 1]; |
| System.arraycopy(oldEntries, 0, newEntries, 0, nEntries); |
| newEntries[nEntries]= cpe; |
| jproject.setRawClasspath(newEntries, null); |
| } |
| |
| public void testRequiredProjectExplicitPath() throws Exception { |
| // add required project with one java library path entry |
| IPath path = ResourcesPlugin.getWorkspace().getRoot().getLocation(); |
| IClasspathAttribute attribute = JavaRuntime.newLibraryPathsAttribute(new String[] {path.toString()}); |
| IClasspathEntry entry = JavaCore.newProjectEntry(new Path("PathTests3").makeAbsolute(), new IAccessRule[0], false, new IClasspathAttribute[]{attribute}, false); |
| addToClasspath(getJavaProject("PathTests2"), entry); |
| entry = JavaCore.newProjectEntry(new Path("PathTests2").makeAbsolute()); |
| addToClasspath(getJavaProject("PathTests1"), entry); |
| |
| String[] strings = JavaRuntime.computeJavaLibraryPath(getJavaProject("PathTests1"), true); |
| assertEquals("Wrong number of entries", 1, strings.length); |
| assertEquals("Wrong entry", path.toFile().getCanonicalPath(), new File(strings[0]).getCanonicalPath()); |
| } |
| |
| public void testVMArgsForRequiredProjectExplicitPath() throws Exception { |
| // add required project with one java library path entry |
| IPath path = ResourcesPlugin.getWorkspace().getRoot().getLocation(); |
| IClasspathAttribute attribute = JavaRuntime.newLibraryPathsAttribute(new String[]{path.toString()}); |
| IClasspathEntry entry = JavaCore.newProjectEntry(new Path("PathTests3").makeAbsolute(), new IAccessRule[0], false, new IClasspathAttribute[]{attribute}, false); |
| addToClasspath(getJavaProject("PathTests2"), entry); |
| entry = JavaCore.newProjectEntry(new Path("PathTests2").makeAbsolute()); |
| addToClasspath(getJavaProject("PathTests1"), entry); |
| |
| ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager(); |
| ILaunchConfigurationType type = manager.getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION); |
| ILaunchConfigurationWorkingCopy workingCopy = type.newInstance(null, "testVMArgsForRequiredProjectExplicitPath"); |
| workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "PathTests1"); |
| ILaunchDelegate d = ((LaunchManager) getLaunchManager()).getLaunchDelegate(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION); |
| ILaunchConfigurationDelegate delegate = d.getDelegate(); |
| assertTrue(delegate instanceof JavaLaunchDelegate); |
| JavaLaunchDelegate launcher = (JavaLaunchDelegate) delegate; |
| String arguments = launcher.getVMArguments(workingCopy); |
| String expect = "-Djava.library.path=\"" + path.toFile().getAbsolutePath() + "\""; |
| assertTrue("wrong VM args", arguments.indexOf(expect) >= 0); |
| } |
| |
| public void testMultiVMArgsForRequiredProjectExplicitPath() throws Exception { |
| // add required project with one java library path entry |
| IPath path = ResourcesPlugin.getWorkspace().getRoot().getLocation(); |
| IPath path2 = ResourcesPlugin.getWorkspace().getRoot().getProject("PathTests1").getLocation(); |
| IClasspathAttribute attribute = JavaRuntime.newLibraryPathsAttribute(new String[]{path.toString(), path2.toString()}); |
| IClasspathEntry entry = JavaCore.newProjectEntry(new Path("PathTests3").makeAbsolute(), new IAccessRule[0], false, new IClasspathAttribute[]{attribute}, false); |
| addToClasspath(getJavaProject("PathTests2"), entry); |
| entry = JavaCore.newProjectEntry(new Path("PathTests2").makeAbsolute()); |
| addToClasspath(getJavaProject("PathTests1"), entry); |
| |
| ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager(); |
| ILaunchConfigurationType type = manager.getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION); |
| ILaunchConfigurationWorkingCopy workingCopy = type.newInstance(null, "testVMArgsForRequiredProjectExplicitPath"); |
| workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "PathTests1"); |
| ILaunchDelegate d = ((LaunchManager) getLaunchManager()).getLaunchDelegate(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION); |
| ILaunchConfigurationDelegate delegate = d.getDelegate(); |
| assertTrue(delegate instanceof JavaLaunchDelegate); |
| JavaLaunchDelegate launcher = (JavaLaunchDelegate) delegate; |
| String arguments = launcher.getVMArguments(workingCopy); |
| String expect = "-Djava.library.path=\"" + path.toFile().getAbsolutePath() + File.pathSeparator + path2.toFile().getAbsolutePath() + "\""; |
| assertTrue("wrong VM args", arguments.indexOf(expect) >= 0); |
| } |
| |
| public void testNoRequiredProjectExplicitPath() throws Exception { |
| // add required project with one java library path entry |
| IPath path = ResourcesPlugin.getWorkspace().getRoot().getLocation(); |
| IClasspathAttribute attribute = JavaRuntime.newLibraryPathsAttribute(new String[]{ path.toString()}); |
| IClasspathEntry entry = JavaCore.newProjectEntry(new Path("PathTests3").makeAbsolute(), new IAccessRule[0], false, new IClasspathAttribute[]{attribute}, false); |
| addToClasspath(getJavaProject("PathTests2"), entry); |
| entry = JavaCore.newProjectEntry(new Path("PathTests2").makeAbsolute()); |
| addToClasspath(getJavaProject("PathTests1"), entry); |
| |
| String[] strings = JavaRuntime.computeJavaLibraryPath(getJavaProject("PathTests1"), false); |
| assertEquals("Wrong number of entries", 0, strings.length); |
| } |
| |
| public void testStringVariablePath() throws Exception { |
| //add A.jar |
| File jar = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testjars" + File.separator + "A.jar")); |
| IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager(); |
| IValueVariable variable = manager.newValueVariable("a-path", "testStringVariablePath"); |
| IPath rootPath = new Path(jar.getParentFile().getAbsolutePath()); |
| variable.setValue(rootPath.toPortableString()); |
| manager.addVariables(new IValueVariable[]{variable}); |
| try { |
| String path = "${a-path}" + File.separator +"A.jar"; |
| IClasspathAttribute attribute = JavaRuntime.newLibraryPathsAttribute(new String[]{path}); |
| IClasspathEntry entry = JavaCore.newLibraryEntry(new Path(jar.getAbsolutePath()), null, null, new IAccessRule[0], new IClasspathAttribute[]{attribute}, false); |
| addToClasspath(getJavaProject("PathTests1"), entry); |
| |
| String[] strings = JavaRuntime.computeJavaLibraryPath(getJavaProject("PathTests1"), false); |
| assertEquals("Wrong number of entries", 1, strings.length); |
| assertEquals("Wrong entry", jar.getCanonicalFile().getCanonicalPath(), new File(strings[0]).getCanonicalPath()); |
| } finally { |
| manager.removeVariables(new IValueVariable[]{variable}); |
| } |
| } |
| } |