import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.Enumeration;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import java.util.Properties;
import java.util.Set;
import jdiff.text.FileLine;
*/
public final class TestUtil {
+ private static final String ASPECTJRT_KEY = "aspectjrt";
+ private static final String TESTING_CLIENT_KEY = "testing-client";
+ public static final URL BAD_URL;
+ private static final File LIB_DIR;
+ private static final Properties LIB_RPATHS;
+ private static final Map LIB_ENTRIES;
+ static {
+ {
+ URL url = null;
+ try {
+ url = new URL("http://eclipse.org/BADURL");
+ } catch (MalformedURLException e) {
+ // ignore - hopefully never
+ }
+ BAD_URL = url;
+ }
+ {
+ File file = new File("lib");
+ if (!isLibDir(file)) {
+ File cur = new File(".").getAbsoluteFile();
+ File parent = cur.getParentFile();
+ while (null != parent) {
+ file = new File(parent, "lib");
+ if (isLibDir(file)) {
+ break;
+ }
+ parent = parent.getParentFile();
+ }
+ if (null == parent) {
+ file = new File("NOT IN ASPECTJ TREE");
+ }
+ }
+ LIB_DIR = file;
+ }
+
+ LIB_RPATHS = new Properties();
+ LIB_RPATHS.setProperty(ASPECTJRT_KEY, "tests/aspectjrt.jar");
+ LIB_RPATHS.setProperty(TESTING_CLIENT_KEY, "tests/testing-client.jar");
+ // TODO support others loaded dynamically
+
+ Map map = new HashMap();
+ for (Iterator iter = LIB_RPATHS.keySet().iterator(); iter.hasNext();) {
+ String key = (String) iter.next();
+ String path = LIB_RPATHS.getProperty(key);
+ File file = null;
+ URL url = null;
+ try {
+ file = libFile(path);
+ url = libURL(path);
+ } catch (IllegalArgumentException e) {
+ file = new File(path + " not found");
+ url = BAD_URL;
+ } finally {
+ map.put(key + ".file", file);
+ map.put(key + ".url", url);
+ }
+ }
+ // TODO support changing entries, etc.
+ LIB_ENTRIES = Collections.unmodifiableMap(map);
+ }
+ private static boolean isLibDir(File lib) {
+ return new File(lib, "test" + File.separator + "aspectjrt.jar").exists();
+ }
private TestUtil() {
super();
}
+ public static URL fileToURL(File file) {
+ try {
+ return file.toURI().toURL();
+ } catch (MalformedURLException e) {
+ return null;
+ }
+ }
+ public static String filesToPath(File[] entries) {
+ return toPath(entries);
+ }
+ public static String urlsToPath(URL[] entries) {
+ return toPath(entries);
+ }
+ /**
+ * untyped interface for mixed entries
+ */
+ public static String filesOrurlsToPath(Object[] entries) {
+ return toPath(entries);
+ }
+
+ /**
+ * This relies on these being File (where toString() == getPath())
+ * or URL (where toString() == toExternalForm()).
+ * @param entries the Object[] of File or URL elements
+ * @return the String with entries dlimited by the File.pathSeparator
+ */
+ private static String toPath(Object[] entries) {
+ if ((null == entries) || (0 == entries.length)) {
+ return "";
+ }
+ StringBuffer path = new StringBuffer();
+ boolean started = false;
+ for (int i = 0; i < entries.length; i++) {
+ if (null != entries[i]) {
+ if (started) {
+ path.append(File.pathSeparator);
+ } else {
+ started = true;
+ }
+ path.append(entries[i].toString());
+ }
+ }
+ return path.toString();
+ }
+
+
+ public static File aspectjrtJarFile() {
+ return (File) LIB_ENTRIES.get(ASPECTJRT_KEY + ".file");
+ }
+
+ public static URL aspectjrtJarURL() {
+ return (URL) LIB_ENTRIES.get(ASPECTJRT_KEY + ".url");
+ }
+ public static File testingClientJarFile() {
+ return (File) LIB_ENTRIES.get(TESTING_CLIENT_KEY + ".file");
+ }
+
+ public static URL testingClientJarURL() {
+ return (URL) LIB_ENTRIES.get(TESTING_CLIENT_KEY + ".url");
+ }
+
+ /**
+ *
+ * @param rpath the String relative path from the library directory
+ * to a resource that must exist (may be a directory),
+ * using forward slashes as a file separator
+ * @return the File path
+ * @throws IllegalArgumentException if no such directory or file
+ */
+ public static File libFile(String rpath) {
+ if ((null == rpath) || (0 == rpath.length())) {
+ throw new IllegalArgumentException("no input");
+ }
+ rpath = rpath.replace('/', File.separatorChar);
+ File result = new File(LIB_DIR, rpath);
+ if (result.exists()) {
+ return result;
+ }
+ throw new IllegalArgumentException("not in " + LIB_DIR + ": " + rpath);
+ }
+
+ /**
+ * Like libPath, only it returns a URL.
+ * @return URL or null if it does not exist
+ * @throws IllegalArgumentException if no such directory or file
+ */
+ public static URL libURL(String rpath) {
+ File file = libFile(rpath);
+ try {
+ return file.toURI().toURL();
+ } catch (MalformedURLException e) {
+ throw new IllegalArgumentException("bad URL from: " + file);
+ }
+ }
+
// ---- arrays
public static void assertArrayEquals(String msg, Object[] expected,