aboutsummaryrefslogtreecommitdiffstats
path: root/tests/ajdoc/JavadocCompareClassMode.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ajdoc/JavadocCompareClassMode.java')
-rw-r--r--tests/ajdoc/JavadocCompareClassMode.java200
1 files changed, 200 insertions, 0 deletions
diff --git a/tests/ajdoc/JavadocCompareClassMode.java b/tests/ajdoc/JavadocCompareClassMode.java
new file mode 100644
index 000000000..2ec00490b
--- /dev/null
+++ b/tests/ajdoc/JavadocCompareClassMode.java
@@ -0,0 +1,200 @@
+
+import java.io.*;
+import java.util.*;
+import common.OutputComparator;
+//import org.aspectj.testing.Tester;
+
+public class JavadocCompareClassMode {
+
+ /** wait a minimum (of 1 second) for processes to complete */
+ static final int MIN_SECS = 1;
+ /** wait a maximum (of 4 hours) for processes to complete */
+ static final int MAX_SECS = 4*60*60;
+
+ static final String INPUT_FILES = "input/applesJava/*.java";
+ static final String FILE_1 = "Apple.html";
+ static final String FILE_2 = "AppleCrate.html";
+ static final String OUTPUT_DIR = "output";
+ static final String AJDOC_DIR = OUTPUT_DIR + File.separator + "ajdoc";
+ static final String JAVADOC_DIR = OUTPUT_DIR + File.separator + "javadoc";
+ static final String AJDOC_CALL = "java org.aspectj.tools.ajdoc.Main -d " + AJDOC_DIR + " " + INPUT_FILES;
+ static final String JAVADOC_CALL = "javadoc -package -d " + JAVADOC_DIR + " " + INPUT_FILES;
+
+ public static void main(String[] args) { test(System.out); }
+
+ public static boolean ensureDir(String dirPath, StringBuffer errSink) {
+ boolean result = false;
+ if (dirPath != null) {
+ try {
+ File dir = new File(dirPath);
+ if (!dir.exists()) {
+ dir.mkdir();
+ }
+ result = (dir.exists() && dir.isDirectory());
+ } catch (SecurityException e) {
+ if (null != errSink) {
+ errSink.append(e.getClass().getName());
+ errSink.append(" ensuring directory ");
+ errSink.append(dirPath);
+ errSink.append(": ");
+ errSink.append(e.getMessage());
+ }
+ }
+ }
+ return result;
+ } // ensureDir
+
+ /**
+ * This implements a basic three-step test:
+ * <UL>
+ * <LI>step 1: exec ajdoc as a command on INPUT_FILES
+ * <LI>step 2: exec javadoc in the same way
+ * <LI>step 3: find differences in files FILE_1 and FILE_2
+ * </UL>
+ */
+ public static void test(PrintStream sink) {
+ OutputComparator outputComparator = new OutputComparator();
+
+ sink.println("> Setup directories");
+ StringBuffer errSink = new StringBuffer();
+ if (! ensureDir(OUTPUT_DIR, errSink)) {
+ sink.println("Error: " + errSink.toString());
+ return;
+ }
+ if (! ensureDir(AJDOC_DIR, errSink)) {
+ sink.println("Error: " + errSink.toString());
+ return;
+ }
+ if (! ensureDir(JAVADOC_DIR, errSink)) {
+ sink.println("Error: " + errSink.toString());
+ return;
+ }
+
+ String toolName = "> ajdoc";
+ sink.println(toolName + " running ");
+ int result = runCommand(AJDOC_CALL);
+ sink.println(toolName + " result " + result);
+
+ toolName = "> javadoc";
+ sink.println(toolName + " running ");
+ result = runCommand(JAVADOC_CALL);
+ sink.println(toolName + " result " + result);
+
+ toolName = "> compare";
+ sink.println(toolName + " running ");
+ String[] files = new String[] { FILE_1, FILE_2 };
+ Vector diffs = null;
+ result = -2;
+ for (int i = 0; i < files.length; i++) {
+ String file = files[i];
+ String ajdocFile = AJDOC_DIR + "/" + file;
+ String javadocFile = JAVADOC_DIR + "/" + file;
+ try {
+ diffs = outputComparator.compareFilesByLine(ajdocFile, javadocFile);
+ if (diffs == null) {
+ sink.println("No differences in file " + file);
+ result = 0;
+ } else {
+ result = diffs.size();
+ sink.println("Start of Differences in file " + FILE_1);
+ sink.println(diffs.toString());
+ sink.println("end of Differences in file " + FILE_1);
+ }
+ } catch (IOException e) {
+ sink.println("Exception comparing: " + file);
+ e.printStackTrace(sink);
+ result = -1;
+ }
+ }
+ sink.println(toolName + " result " + result);
+ }
+
+ /** write in to out */
+ static void writeStream(InputStream in, PrintStream out) {
+ if ((null == in) || (null == out)) {
+ return;
+ }
+ try {
+ BufferedReader lines = new BufferedReader(new InputStreamReader(in));
+ String line;
+ while (null != (line = lines.readLine())) {
+ out.println(line);
+ }
+ } catch (IOException e) {
+ e.printStackTrace(out);
+ }
+ }
+
+ /**
+ * Complete a running process, handling timeout and streams appropriately.
+ * @param process the Process to run
+ * @param secsToWait an int for the number of seconds to wait before timing out
+ * - use Integer.MAXVALUE to mean no timeout (otherwise,
+ * IllegalArgumentException unless (MIN_SECS <= secsToWait <= MAX_SECS))
+ * @param outSink the PrintStream sink for the process output stream
+ * (use null to ignore process output stream).
+ * @param errSink the PrintStream sink for the process error stream
+ * (use null to ignore process error stream).
+ * @returns Integer.MIN_VALUE if interrupted while waiting for process to complete,
+ * Integer.MAX_VALUE if timed out,
+ * or the int returned by <code>Process.waitFor()</code> otherwise.
+ * @throws IllegalArgumentException if any parms are null or invalid
+ */
+ public static int completeProcess(final Process process, int secsToWait,
+ PrintStream outSink,
+ PrintStream errSink) {
+ if (null == process) throw new IllegalArgumentException("null process");
+ if ((Integer.MAX_VALUE != secsToWait)
+ && ((MIN_SECS > secsToWait) || ((MAX_SECS < secsToWait)))) {
+ throw new IllegalArgumentException("invalid time: " + secsToWait);
+ }
+ // setup timeout
+ TimerTask task = null;
+ if (Integer.MAX_VALUE != secsToWait) {
+ Timer t = new Timer(true);
+ task = new TimerTask() {
+ public void run() {
+ process.destroy();
+ }
+ };
+ t.schedule(task, secsToWait*1000l);
+ }
+
+ // try to wait for the process
+ int status = Integer.MAX_VALUE;
+ try {
+ status = process.waitFor();
+ } catch (InterruptedException ie) {
+ status = Integer.MIN_VALUE; // ignore
+ }
+ finally {
+ if (null != task) task.cancel();
+ if (errSink != null) writeStream(process.getErrorStream(), errSink);
+ // misnamed API: the "input" stream is our input from the process output
+ if (outSink != null) writeStream(process.getInputStream(), outSink);
+ }
+ return status;
+ } // completeProcess
+
+ /**
+ * Run command, delegating process handling to runProcess.
+ * @param command the String passed to Runtime.exec
+ * @return the int returned from process.waitFor();
+ */
+ public static int runCommand(String command) {
+ int result = -1;
+ try {
+ System.out.println("Running " + command);
+ Process process = Runtime.getRuntime().exec(command);
+ System.out.println("waiting for Result.." );
+ final int seconds = 60;
+ result = completeProcess(process, seconds, System.out, System.err);
+ System.out.println("Result: " + result + " for " + command);
+ } catch (Exception e) {
+ throw new RuntimeException("could not execute: " + command +
+ ", " + e.getMessage() );
+ }
+ return result;
+ }
+
+}