aboutsummaryrefslogtreecommitdiffstats
path: root/testing/src/main/java/org/aspectj/testing/CompileSpec.java
diff options
context:
space:
mode:
Diffstat (limited to 'testing/src/main/java/org/aspectj/testing/CompileSpec.java')
-rw-r--r--testing/src/main/java/org/aspectj/testing/CompileSpec.java336
1 files changed, 336 insertions, 0 deletions
diff --git a/testing/src/main/java/org/aspectj/testing/CompileSpec.java b/testing/src/main/java/org/aspectj/testing/CompileSpec.java
new file mode 100644
index 000000000..22570e3d1
--- /dev/null
+++ b/testing/src/main/java/org/aspectj/testing/CompileSpec.java
@@ -0,0 +1,336 @@
+/* *******************************************************************
+ * Copyright (c) 2004,2016 IBM Corporation
+ * 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:
+ * Adrian Colyer,
+ * ******************************************************************/
+package org.aspectj.testing;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.aspectj.testing.util.TestUtil;
+import org.aspectj.tools.ajc.AjcTestCase;
+import org.aspectj.tools.ajc.CompilationResult;
+
+/**
+ * @author Adrian Colyer
+ * @author Andy Clement
+ */
+public class CompileSpec implements ITestStep {
+
+ private List<ExpectedMessageSpec> expected = new ArrayList<ExpectedMessageSpec>();
+
+ private String files;
+ private boolean includeClassesDir;
+ private String aspectpath;
+ private String classpath;
+ private String modulepath;
+ private String inpath;
+ private String sourceroots;
+ private String outjar;
+ private String outxml;
+ private String xlintfile;
+ private String options;
+ private String baseDir;
+ private String extdirs;
+ private AjcTest myTest;
+
+ public CompileSpec() {
+ }
+
+ public void execute(AjcTestCase inTestCase) {
+ File base = new File(baseDir);
+ String[] args = buildArgs();
+ CompilationResult result = inTestCase.ajc(base,args);
+ AjcTestCase.MessageSpec messageSpec = buildMessageSpec();
+ String failMessage = "test \"" + myTest.getTitle() + "\" failed";
+ inTestCase.assertMessages(result,failMessage,messageSpec);
+ inTestCase.setShouldEmptySandbox(false); // so subsequent steps in same test see my results
+ }
+
+ public void addExpectedMessage(ExpectedMessageSpec message) {
+ expected.add(message);
+ }
+
+ public void setBaseDir(String dir) {
+ this.baseDir = dir;
+ }
+
+ protected String getBaseDir() { return baseDir; }
+
+ public void setTest(AjcTest t) {
+ this.myTest = t;
+ if (options != null && (options.indexOf("-1.5") != -1)) {
+ myTest.setVm("1.5");
+ }
+ }
+
+ protected AjcTest getTest() { return myTest; }
+
+ /**
+ * @return Returns the aspectpath.
+ */
+ public String getAspectpath() {
+ return aspectpath;
+ }
+ /**
+ * @param aspectpath The aspectpath to set.
+ */
+ public void setAspectpath(String aspectpath) {
+ this.aspectpath = aspectpath.replace(',',File.pathSeparatorChar);
+ }
+ /**
+ * @return Returns the classpath.
+ */
+ public String getClasspath() {
+ return classpath;
+ }
+ /**
+ * @param classpath The classpath to set.
+ */
+ public void setClasspath(String classpath) {
+ this.classpath = classpath.replace(',',File.pathSeparatorChar);
+ }
+
+ public String getModulepath() {
+ return this.modulepath;
+ }
+
+ public void setModulepath(String modulepath) {
+ this.modulepath = modulepath.replace(',', File.pathSeparatorChar);
+ }
+ /**
+ * @return Returns the files.
+ */
+ public String getFiles() {
+ return files;
+ }
+ /**
+ * @param files The files to set.
+ */
+ public void setFiles(String files) {
+ this.files = files;
+ }
+ /**
+ * @return Returns the includeClassesDir.
+ */
+ public boolean isIncludeClassesDir() {
+ return includeClassesDir;
+ }
+ /**
+ * @param includeClassesDir The includeClassesDir to set.
+ */
+ public void setIncludeClassesDir(boolean includeClassesDir) {
+ this.includeClassesDir = includeClassesDir;
+ }
+ /**
+ * @return Returns the inpath.
+ */
+ public String getInpath() {
+ return inpath;
+ }
+ /**
+ * @param inpath The inpath to set.
+ */
+ public void setInpath(String inpath) {
+ this.inpath = inpath.replace(',',File.pathSeparatorChar).replace(';',File.pathSeparatorChar);
+ }
+ /**
+ * @return Returns the options.
+ */
+ public String getOptions() {
+ return options;
+ }
+ /**
+ * @param options The options to set.
+ */
+ public void setOptions(String options) {
+ int i = options.indexOf("!eclipse");
+ if (i != -1) {
+ this.options = options.substring(0,i);
+ this.options += options.substring(i + "!eclipse".length());
+ } else {
+ this.options = options;
+ }
+ }
+ /**
+ * @return Returns the outjar.
+ */
+ public String getOutjar() {
+ return outjar;
+ }
+ /**
+ * @param outjar The outjar to set.
+ */
+ public void setOutjar(String outjar) {
+ this.outjar = outjar;
+ }
+
+ /**
+ * @return Returns the outxml.
+ */
+ public String getOutxmlfile() {
+ return outxml;
+ }
+
+ /**
+ * @param outxml The the of the aop.xml file to generate
+ */
+ public void setOutxmlfile(String outxml) {
+ this.outxml = outxml;
+ }
+ /**
+ * @return Returns the sourceroots.
+ */
+ public String getSourceroots() {
+ return sourceroots;
+ }
+ /**
+ * @param sourceroots The sourceroots to set.
+ */
+ public void setSourceroots(String sourceroots) {
+ this.sourceroots = sourceroots;
+ }
+ /**
+ * @return Returns the xlintfile.
+ */
+ public String getXlintfile() {
+ return xlintfile;
+ }
+ /**
+ * @param xlintfile The xlintfile to set.
+ */
+ public void setXlintfile(String xlintfile) {
+ this.xlintfile = xlintfile;
+ }
+
+ public String getExtdirs() { return extdirs;}
+ public void setExtdirs(String extdirs) { this.extdirs = extdirs; }
+
+ protected String[] buildArgs() {
+ StringBuffer args = new StringBuffer();
+ // add any set options, and then files to compile at the end
+ if (getAspectpath() != null) {
+ args.append("-aspectpath ");
+ args.append(getAspectpath());
+ args.append(" ");
+ }
+ if (getSourceroots() != null) {
+ args.append("-sourceroots ");
+ args.append(getSourceroots());
+ args.append(" ");
+ }
+ if (getOutjar() != null) {
+ args.append("-outjar ");
+ args.append(getOutjar());
+ args.append(" ");
+ }
+ if (getOutxmlfile() != null) {
+ args.append("-outxmlfile ");
+ args.append(getOutxmlfile());
+ args.append(" ");
+ }
+ if (getOptions() != null) {
+ StringTokenizer strTok = new StringTokenizer(getOptions(),",");
+ while (strTok.hasMoreTokens()) {
+ // For an option containing a comma, pass in a { in its place
+ args.append(strTok.nextToken().replace('{', ','));
+ args.append(" ");
+ }
+ }
+ if (getClasspath() != null) {
+ args.append("-classpath ");
+ args.append(getClasspath());
+ args.append(" ");
+ }
+ if (getModulepath() != null) {
+ args.append("-p ");
+ args.append(rewrite(getModulepath()));
+ args.append(" ");
+ }
+ if (getXlintfile() != null) {
+ args.append("-Xlintfile ");
+ args.append(getXlintfile());
+ args.append(" ");
+ }
+ if (getExtdirs() != null) {
+ args.append("-extdirs ");
+ args.append(getExtdirs());
+ args.append(" ");
+ }
+ List<String> fileList = new ArrayList<String>();
+ List<String> jarList = new ArrayList<String>();
+ // convention that any jar on file list should be added to inpath
+ String files = getFiles();
+ if (files == null) files = "";
+ StringTokenizer strTok = new StringTokenizer(files,",");
+ while (strTok.hasMoreTokens()) {
+ final String file = strTok.nextToken();
+ if (file.endsWith(".jar")) {
+ jarList.add(file);
+ } else {
+ fileList.add(file);
+ }
+ }
+ if ((getInpath() != null) || !jarList.isEmpty()) {
+ args.append("-inpath ");
+ if (getInpath() != null) args.append(getInpath());
+ for (String jar: jarList) {
+ args.append(File.pathSeparator);
+ args.append(jar);
+ }
+ args.append(" ");
+ }
+ for (String file: fileList) {
+ args.append(file);
+ args.append(" ");
+ }
+ String argumentString = args.toString();
+ strTok = new StringTokenizer(argumentString," ");
+ String[] ret = new String[strTok.countTokens()];
+ for (int i = 0; i < ret.length; i++) {
+ ret[i] = strTok.nextToken();
+ }
+ return ret;
+ }
+
+ private String rewrite(String path) {
+ path = path.replace("$runtime", TestUtil.aspectjrtPath().toString());
+ return path;
+ }
+
+ protected AjcTestCase.MessageSpec buildMessageSpec() {
+ List<AjcTestCase.Message> infos = null;
+ List<AjcTestCase.Message> warnings = new ArrayList<AjcTestCase.Message>();
+ List<AjcTestCase.Message> errors = new ArrayList<AjcTestCase.Message>();
+ List<AjcTestCase.Message> fails = new ArrayList<AjcTestCase.Message>();
+ List<AjcTestCase.Message> weaveInfos = new ArrayList<AjcTestCase.Message>();
+ for (ExpectedMessageSpec exMsg: expected) {
+ String kind = exMsg.getKind();
+ if (kind.equals("info")) {
+ if (infos == null) infos = new ArrayList<AjcTestCase.Message>();
+ infos.add(exMsg.toMessage());
+ } else if (kind.equals("warning")) {
+ warnings.add(exMsg.toMessage());
+ } else if (kind.equals("error")) {
+ errors.add(exMsg.toMessage());
+ } else if (kind.equals("fail")) {
+ fails.add(exMsg.toMessage());
+ } else if (kind.equals("abort")) {
+ fails.add(exMsg.toMessage());
+ } else if (kind.equals("weave")) {
+ weaveInfos.add(exMsg.toMessage());
+ }
+ }
+ return new AjcTestCase.MessageSpec(infos,warnings,errors,fails,weaveInfos);
+ }
+
+}