/******************************************************************************* * Copyright (c) 2005, 2010 Oracle. 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: * Oracle - initial API and implementation ******************************************************************************/ package org.eclipse.jpt.utility.tests.internal; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.jar.JarEntry; import java.util.jar.JarFile; import junit.framework.TestCase; import org.eclipse.jpt.utility.internal.ArrayTools; import org.eclipse.jpt.utility.internal.Classpath; import org.eclipse.jpt.utility.internal.CollectionTools; import org.eclipse.jpt.utility.internal.Tools; @SuppressWarnings("nls") public class ClasspathTests extends TestCase { private static final String JAVA_HOME = System.getProperty("java.home"); public ClasspathTests(String name) { super(name); } public void testCompressed() { String path = ""; // no changes path = new Classpath(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar")).compressed().getPath(); assertEquals(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar"), path); path = new Classpath(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar")).compressed().getPath(); assertEquals(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar"), path); path = new Classpath(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\i18n.jar;C:\\jdk\\jaws.jar")).compressed().getPath(); assertEquals(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar"), path); path = new Classpath(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar;C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar")).compressed().getPath(); assertEquals(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar"), path); path = new Classpath(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\i18n.jar;C:\\jdk\\i18n.jar;C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar")).compressed().getPath(); assertEquals(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar"), path); path = new Classpath(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar;C:\\jdk\\rt.jar;;;;C:\\jdk\\jaws.jar;C:\\jdk\\jaws.jar;C:\\jdk\\rt.jar;;;")).compressed().getPath(); assertEquals(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar"), path); // no changes path = new Classpath(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar")).compressed().getPath(); assertEquals(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar"), path); path = new Classpath(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar")).compressed().getPath(); assertEquals(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar"), path); path = new Classpath(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\..\\jdk\\i18n.jar;C:\\jdk\\jaws.jar")).compressed().getPath(); assertEquals(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar"), path); path = new Classpath(this.morph("C:\\jdk1\\jdk2\\jdk3\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk1\\jdk2\\jdk3\\..\\..\\..\\jdk1\\jdk2\\jdk3\\i18n.jar;C:\\jdk\\jaws.jar")).compressed().getPath(); assertEquals(this.morph("C:\\jdk1\\jdk2\\jdk3\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar"), path); } public void testConvertToClassName() { String fileName = "java/lang/String.class"; File file = new File(fileName); String className = Classpath.convertToClassName(file); assertEquals(java.lang.String.class.getName(), className); } public void testConvertToClass() throws ClassNotFoundException { String fileName = "java/lang/String.class"; File file = new File(fileName); Class javaClass = Classpath.convertToClass(file); assertEquals(java.lang.String.class, javaClass); } public void testConvertToArchiveClassFileEntryName() { String fileName = Classpath.convertToArchiveClassFileEntryName(java.lang.String.class); assertEquals("java/lang/String.class", fileName); } public void testConvertToArchiveEntryNameBase() { String fileName = Classpath.convertToArchiveEntryNameBase(java.lang.String.class); assertEquals("java/lang/String", fileName); } public void testConvertToClassFileName() { char sc = File.separatorChar; String fileName = Classpath.convertToClassFileName(java.lang.String.class); assertEquals("java" + sc + "lang" + sc + "String.class", fileName); } public void testConvertToClassFileString() { char sc = File.separatorChar; File file = Classpath.convertToClassFile(java.lang.String.class.getName()); assertEquals("java" + sc + "lang" + sc + "String.class", file.getPath()); } public void testConvertToClassFileClass() { char sc = File.separatorChar; File file = Classpath.convertToClassFile(java.lang.String.class); assertEquals("java" + sc + "lang" + sc + "String.class", file.getPath()); } public void testConvertToJavaFileName() { char sc = File.separatorChar; String fileName = Classpath.convertToJavaFileName(java.lang.String.class); assertEquals("java" + sc + "lang" + sc + "String.java", fileName); } public void testConvertToJavaFileString() { char sc = File.separatorChar; File file = Classpath.convertToJavaFile(java.lang.String.class.getName()); assertEquals("java" + sc + "lang" + sc + "String.java", file.getPath()); } public void testConvertToJavaFileClass() { char sc = File.separatorChar; File file = Classpath.convertToJavaFile(java.lang.String.class); assertEquals("java" + sc + "lang" + sc + "String.java", file.getPath()); } public void testConvertToFileNameBase() { char sc = File.separatorChar; String fileName = Classpath.convertToFileNameBase(java.lang.String.class); assertEquals("java" + sc + "lang" + sc + "String", fileName); } public void testConvertToURLs() { Iterator entries = new Classpath(this.morph("C:\\jdk\\rt.jar;C:\\jdk\\i18n.jar;C:\\jdk\\jaws.jar;C:\\foo\\classes;C:\\bar\\bar.jar")).getURLs().iterator(); assertEquals(this.morphURL("/C:/jdk/rt.jar"), entries.next().getPath()); assertEquals(this.morphURL("/C:/jdk/i18n.jar"), entries.next().getPath()); assertEquals(this.morphURL("/C:/jdk/jaws.jar"), entries.next().getPath()); assertEquals(this.morphURL("/C:/foo/classes"), entries.next().getPath()); assertEquals(this.morphURL("/C:/bar/bar.jar"), entries.next().getPath()); assertFalse(entries.hasNext()); } public void testGetEntries() { Classpath cp = new Classpath(this.morph("C:\\jdk\\rt.jar;;.;C:\\jdk\\i18n.jar;;;C:\\jdk\\jaws.jar;;C:\\foo\\classes;C:\\bar\\bar.jar;C:\\bar\\bar.jar;")); Iterator entries = cp.getEntries().iterator(); assertEquals(this.morph("C:\\jdk\\rt.jar"), entries.next().getFileName()); assertEquals(this.morph("."), entries.next().getFileName()); assertEquals(this.morph("C:\\jdk\\i18n.jar"), entries.next().getFileName()); assertEquals(this.morph("C:\\jdk\\jaws.jar"), entries.next().getFileName()); assertEquals(this.morph("C:\\foo\\classes"), entries.next().getFileName()); assertEquals(this.morph("C:\\bar\\bar.jar"), entries.next().getFileName()); assertEquals(this.morph("C:\\bar\\bar.jar"), entries.next().getFileName()); assertFalse(entries.hasNext()); cp = cp.compressed(); entries = cp.getEntries().iterator(); assertEquals(this.morph("C:\\jdk\\rt.jar"), entries.next().getFileName()); assertEquals(this.morph("."), entries.next().getFileName()); assertEquals(this.morph("C:\\jdk\\i18n.jar"), entries.next().getFileName()); assertEquals(this.morph("C:\\jdk\\jaws.jar"), entries.next().getFileName()); assertEquals(this.morph("C:\\foo\\classes"), entries.next().getFileName()); assertEquals(this.morph("C:\\bar\\bar.jar"), entries.next().getFileName()); assertFalse(entries.hasNext()); } public void testGetEntryForFileNamed() { Classpath.Entry entry = null; // in the middle - qualified entry = new Classpath(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\rt.jar;C:\\jdk\\jaws.jar;C:\\foo\\classes;C:\\bar\\bar.jar")).getEntryForFileNamed("rt.jar"); assertEquals(this.morph("C:\\jdk\\rt.jar"), entry.getFileName()); // in the middle - unqualified entry = new Classpath(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\jaws.jar;rt.jar;C:\\foo\\classes;C:\\bar\\bar.jar")).getEntryForFileNamed("rt.jar"); assertEquals("rt.jar", entry.getFileName()); // at the beginning - qualified entry = new Classpath(this.morph("C:\\jdk\\rt.jar;C:\\jdk\\i18n.jar;C:\\jdk\\jaws.jar;C:\\foo\\classes;C:\\bar\\bar.jar")).getEntryForFileNamed("rt.jar"); assertEquals(this.morph("C:\\jdk\\rt.jar"), entry.getFileName()); // at the beginning - unqualified entry = new Classpath(this.morph("rt.jar;C:\\jdk\\i18n.jar;C:\\jdk\\jaws.jar;C:\\foo\\classes;C:\\bar\\bar.jar")).getEntryForFileNamed("rt.jar"); assertEquals("rt.jar", entry.getFileName()); // at the end - qualified entry = new Classpath(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\jaws.jar;C:\\foo\\classes;C:\\bar\\bar.jar;C:\\jdk\\rt.jar")).getEntryForFileNamed("rt.jar"); assertEquals(this.morph("C:\\jdk\\rt.jar"), entry.getFileName()); // at the end - unqualified entry = new Classpath(this.morph("C:\\jdk\\i18n.jar;C:\\jdk\\jaws.jar;C:\\foo\\classes;C:\\bar\\bar.jar;rt.jar")).getEntryForFileNamed("rt.jar"); assertEquals("rt.jar", entry.getFileName()); // alone - qualified entry = new Classpath(this.morph("C:\\jdk\\rt.jar")).getEntryForFileNamed("rt.jar"); assertEquals(this.morph("C:\\jdk\\rt.jar"), entry.getFileName()); // alone - unqualified entry = new Classpath("rt.jar").getEntryForFileNamed("rt.jar"); assertEquals("rt.jar", entry.getFileName()); // trick entry at the beginning entry = new Classpath(this.morph("rt.jar.new;C:\\jdk\\rt.jar;C:\\jdk\\i18n.jar;C:\\jdk\\jaws.jar;C:\\foo\\classes;C:\\bar\\bar.jar")).getEntryForFileNamed("rt.jar"); assertEquals(this.morph("C:\\jdk\\rt.jar"), entry.getFileName()); // trick entry in the middle entry = new Classpath(this.morph("rt.jar.new;C:\\jdk\\rtrtrt.jar;C:\\jdk\\rt.jar;C:\\jdk\\i18n.jar;C:\\jdk\\jaws.jar;C:\\foo\\classes;C:\\bar\\bar.jar")).getEntryForFileNamed("rt.jar"); assertEquals(this.morph("C:\\jdk\\rt.jar"), entry.getFileName()); // trick entry at the end entry = new Classpath(this.morph("rt.jar.new;C:\\jdk\\rtrtrt.jar;C:\\jdk\\rt.jar;C:\\jdk\\i18n.jar;C:\\jdk\\jaws.jar;C:\\foo\\classes;C:\\bar\\bar.jar;C:\\jdk\\rtrtrt.jar")).getEntryForFileNamed("rt.jar"); assertEquals(this.morph("C:\\jdk\\rt.jar"), entry.getFileName()); // missing entry = new Classpath(this.morph("rt.jar.new;C:\\jdk\\rtrtrt.jar;C:\\jdk\\i18n.jar;C:\\jdk\\jaws.jar;C:\\foo\\classes;C:\\bar\\bar.jar;C:\\jdk\\rtrtrt.jar")).getEntryForFileNamed("rt.jar"); assertEquals("path entry should not be found", null, entry); } public void testGetEntryForClassNamed() { assertNotNull(Classpath.completeClasspath().getEntryForClassNamed(java.lang.String.class.getName())); assertNull(Classpath.completeClasspath().getEntryForClassNamed("foo.bar.Baz")); } public void testLocationForClass() { Class javaClass = Classpath.class; File entry = new File(Classpath.locationFor(javaClass)); if (entry.isFile() || entry.isDirectory()) { assertTrue(entry.exists()); } if (entry.isDirectory()) { assertTrue(new File(entry, Classpath.convertToClassFileName(javaClass)).exists()); } } public void testRtJarName() throws IOException { File rtFile = new File(Classpath.rtJarName()); assertTrue("rt.jar does not exist", rtFile.exists()); JarFile rtJarFile = new JarFile(rtFile); JarEntry entry = rtJarFile.getJarEntry("java/lang/Object.class"); rtJarFile.close(); assertTrue("bogus rt.jar", entry != null); } public void testJREClassNames() { assertTrue("Vector is missing from JRE class names", CollectionTools.contains(Classpath.bootClasspath().getClassNames(), java.util.Vector.class.getName())); assertTrue("File is missing from JRE class names", CollectionTools.contains(Classpath.bootClasspath().getClassNames(), java.io.File.class.getName())); } public void testJavaExtensionDirectoryNames() { char sep = File.separatorChar; String stdExtDirName = JAVA_HOME + sep + "lib" + sep + "ext"; assertTrue("standard extension dir name missing: " + stdExtDirName, ArrayTools.contains(Classpath.javaExtensionDirectoryNames(), stdExtDirName)); } public void testJavaExtensionDirectories() { char sep = File.separatorChar; File stdExtDir = new File(JAVA_HOME + sep + "lib" + sep + "ext"); assertTrue("standard extension dir missing: " + stdExtDir.getParent(), ArrayTools.contains(Classpath.javaExtensionDirectories(), stdExtDir)); } public void testJavaExtensionClasspathEntries() { char sep = File.separatorChar; String jdk = System.getProperty("java.version"); if (jdk.startsWith("1.4") || jdk.startsWith("1.5") || jdk.startsWith("1.6")) { Collection jarNames = new ArrayList(); Iterable entries = Classpath.javaExtensionClasspath().getEntries(); for (Classpath.Entry entry : entries) { jarNames.add(entry.getFileName()); } String stdExtJarName = JAVA_HOME + sep + "lib" + sep + "ext" + sep + "dnsns.jar"; String msg = "jdk 1.4.x standard extension jar missing: " + stdExtJarName; boolean jarPresent = jarNames.contains(stdExtJarName); if (Tools.jvmIsSun() || (Tools.jvmIsIBM() && jdk.startsWith("1.6"))) { assertTrue(msg, jarPresent); } } else { fail("we need to update this test for the current jdk"); } } public void testJavaExtensionClassNames() { String jdk = System.getProperty("java.version"); if (jdk.startsWith("1.4") || jdk.startsWith("1.5") || jdk.startsWith("1.6")) { String className = "sun.net.spi.nameservice.dns.DNSNameService"; String msg = "jdk 1.4.x standard extension class missing: " + className; boolean classPresent = CollectionTools.contains(Classpath.javaExtensionClasspath().classNames(), className); if (Tools.jvmIsSun() || (Tools.jvmIsIBM() && jdk.startsWith("1.6"))) { assertTrue(msg, classPresent); } } else { fail("we need to update this test for the current jdk"); } } public void testJavaClasspathClassNames() { String className = this.getClass().getName(); ClassLoader cl = this.getClass().getClassLoader(); // make sure we are running under the "normal" class loader; // when the tests are executed as an ANT task, they are run under // an ANT class loader and the "Java" classpath does not include this class if (cl.getClass().getName().startsWith("sun.misc")) { assertTrue("class missing: " + className, CollectionTools.contains(Classpath.javaClasspath().getClassNames(), className)); } } public void testCompleteClasspathClassNames() { String className = this.getClass().getName(); ClassLoader cl = this.getClass().getClassLoader(); // make sure we are running under the "normal" class loader; // when the tests are executed as an ANT task, they are run under // an ANT class loader and the "Java" classpath does not include this class if (cl.getClass().getName().startsWith("sun.misc")) { assertTrue("class missing: " + className, CollectionTools.contains(Classpath.completeClasspath().getClassNames(), className)); } } public void testClasspathForClass() { assertNotNull(Classpath.classpathFor(java.lang.String.class)); } public void testAddClassNamesTo() { Collection classNames = new ArrayList(1000); Classpath.bootClasspath().addClassNamesTo(classNames); assertTrue(classNames.contains(java.util.Vector.class.getName())); } public void testToString() { assertNotNull(Classpath.bootClasspath().toString()); } public void testEntry_getCanonicalFile() { Classpath.Entry entry = Classpath.bootClasspath().getEntryForClassNamed(java.lang.String.class.getName()); assertTrue(entry.getCanonicalFile().getPath().endsWith(".jar")); } public void testEntry_getCanonicalFileName() { Classpath.Entry entry = Classpath.bootClasspath().getEntryForClassNamed(java.lang.String.class.getName()); if (Tools.jvmIsSun()) { assertTrue(entry.getCanonicalFileName().endsWith("rt.jar")); } else if (Tools.jvmIsIBM()) { assertTrue(entry.getCanonicalFileName().endsWith("vm.jar")); } } public void testEntry_equals() { Classpath.Entry entry = Classpath.bootClasspath().getEntryForClassNamed(java.lang.String.class.getName()); assertFalse(entry.equals("foo")); } public void testEntry_containsClass() { Classpath.Entry entry = Classpath.bootClasspath().getEntryForClassNamed(java.lang.String.class.getName()); assertTrue(entry.contains(java.lang.String.class)); } public void testEntry_containsString() { Classpath.Entry entry = Classpath.bootClasspath().getEntryForClassNamed(java.lang.String.class.getName()); assertTrue(entry.contains(java.lang.String.class.getName())); } public void testEntry_getClassNames() { Classpath.Entry entry = Classpath.bootClasspath().getEntryForClassNamed(java.lang.String.class.getName()); assertTrue(CollectionTools.contains(entry.getClassNames(), java.lang.String.class.getName())); } public void testEntry_classNames() { Classpath.Entry entry = Classpath.bootClasspath().getEntryForClassNamed(java.lang.String.class.getName()); assertTrue(CollectionTools.contains(entry.classNames(), java.lang.String.class.getName())); } /** * morph the specified path to a platform-independent path */ private String morph(String path) { String result = path; result = result.replace('\\', File.separatorChar); result = result.replace(';', File.pathSeparatorChar); if (!ArrayTools.contains(File.listRoots(), new File("C:\\"))) { result = result.replaceAll("C:", ""); } return result; } /** * morph the specified URL to a platform-independent path */ private String morphURL(String url) { String result = url; if (!ArrayTools.contains(File.listRoots(), new File("C:\\"))) { result = result.replaceAll("/C:", ""); } return result; } }