123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597 |
- /* *******************************************************************
- * Copyright (c) 2004 IBM Corporation
- * All rights reserved.
- * This program and the accompanying materials are made available
- * under the terms of the Eclipse Public License v 2.0
- * which accompanies this distribution and is available at
- * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
- *
- * Contributors:
- * Noel Markham, Matthew Webster initial implementation
- * ******************************************************************/
-
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
-
-
- /**
- * @author Noel Markham
- */
- public class WeaveTest {
-
- private static final String OUTPUT_PACKAGE = "out";
-
- private static final int WEAVE_FAST = 1;
- private static final int WEAVE_MED = 2;
- private static final int WEAVE_SLOW = 3;
-
- public static final String EXECUTION_SLOW = "execution(void *(..))";
- public static final String EXECUTION_MED = "args(" + OUTPUT_PACKAGE + ".C0) && execution(void m0(..))";
- public static final String EXECUTION_FAST = "within(" + OUTPUT_PACKAGE + ".C0) && execution(void m0(..))";
-
- public static final String GET_SLOW = "get(int *)";
- public static final String GET_MED = "target(" + OUTPUT_PACKAGE + ".C0) && get(int i0)";
- public static final String GET_FAST = "get(int " + OUTPUT_PACKAGE + ".C0.i0)";
-
- // Defaults, can be changed with command-line args
- private static int NUMCLASSES = 5;
- private static int ITERATIONS = 3;
- private static int METHODLINES = 20;
- private static int NUMMETHODS = 100;
- private static boolean INCLUDE_TEST_CLASSES = false;
- private static boolean TEST_GET = true;
- private static boolean TEST_EXECUTION = true;
-
- private static boolean ALL_POINTCUT_TESTS = true;
- private static boolean TEST_ONE = false;
- private static boolean TEST_ONE_SEARCH_ALL = false;
- private static boolean TEST_ALL = false;
- private static boolean ECHO = false;
-
- public static long[] compileTimes = new long[ITERATIONS];
- public static long[] executionSlowTimes = new long[ITERATIONS];
- public static long[] executionMedTimes = new long[ITERATIONS];
- public static long[] executionFastTimes = new long[ITERATIONS];
- public static long[] getSlowTimes = new long[ITERATIONS];
- public static long[] getMedTimes = new long[ITERATIONS];
- public static long[] getFastTimes = new long[ITERATIONS];
-
- private static final String NL = System.getProperty("line.separator", "\n");
-
- private static final File outputDir = new File(System.getProperty("user.dir") + File.separatorChar + OUTPUT_PACKAGE);
-
- static {
- outputDir.mkdirs();
- }
-
- public static void main(String[] args) throws IOException {
-
- //if (args.length > 0) parseArgs(args);
- parseArgs(args);
-
- if(ECHO) System.out.println("Weave-time Test");
- if(ECHO) System.out.println("---------------");
-
- if(ECHO) System.out.println("Number of classes: " + NUMCLASSES);
- if(ECHO) System.out.println("Number of methods: " + NUMMETHODS);
- if(ECHO) System.out.println("Number of method lines: " + METHODLINES);
- if(ECHO) System.out.println("Number of test iterations: " + ITERATIONS);
- if(ECHO)
- if(INCLUDE_TEST_CLASSES) System.out.println("Including advice test classes");
- if(ECHO)
- if(TEST_GET && !TEST_EXECUTION) System.out.println("Weaving only get advice");
- if(ECHO)
- if(TEST_EXECUTION && !TEST_GET) System.out.println("Weaving only execution advice");
- if(ECHO) {
- if(!ALL_POINTCUT_TESTS) {
- if(TEST_ONE) System.out.println("Weaving one poinctcut");
- if(TEST_ONE_SEARCH_ALL) System.out.println("Weaving one pointcut, searching all");
- if(TEST_ALL) System.out.println("Weaving all");
- }
- }
-
- if(ECHO) System.out.println();
-
- createClasses();
- compileClasses();
-
- boolean warm = false;
-
- if (TEST_EXECUTION) {
- String advice = "execution";
- createAspects(advice);
-
- //Warm up the weaver
- weaveAllAspects(advice, WEAVE_FAST);
- warm = true;
-
- weaveAspects(advice);
- }
-
- if (TEST_GET) {
- String advice = "get";
- createAspects(advice);
-
- if(!warm) weaveAllAspects(advice, WEAVE_FAST);
- weaveAspects(advice);
- }
- }
-
- private static void parseArgs(String[] args) {
-
- if(args == null || args.length <= 0) return;
-
- int i = 0;
- boolean error = false;
-
- while(i < args.length) {
- String arg = args[i++];
-
- try {
- if(arg.equals("-c")) { // Number of classes
- if(i < args.length)
- NUMCLASSES = Integer.parseInt(args[i++]);
- else error = true;
- }
- else if(arg.equals("-m")) { // Number of methods
- if(i < args.length)
- NUMMETHODS = Integer.parseInt(args[i++]);
- else error = true;
- }
- else if(arg.equals("-l")) { // Number of method lines
- if(i < args.length)
- METHODLINES = Integer.parseInt(args[i++]);
- else error = true;
- }
- else if(arg.equals("-i")) { // Number of iterations
- if(i < args.length)
- ITERATIONS = Integer.parseInt(args[i++]);
- else error = true;
- }
- else if(arg.equals("-include-tests")) {
- if(i < args.length) {
- arg = args[i++];
- if(arg.equalsIgnoreCase("y")) INCLUDE_TEST_CLASSES = true;
- else if(arg.equalsIgnoreCase("n")) INCLUDE_TEST_CLASSES = false;
- else error = true;
- }
- }
- else if(arg.equals("-advice")) {
- String advice = args[i++];
- if(advice.equals("get")){
- TEST_GET = true;
- TEST_EXECUTION = false;
- }
- else if(advice.equals("execution")){
- TEST_EXECUTION = true;
- TEST_GET = false;
- }
- else error = true;
- }
- else if(arg.equals("-pointcut")) {
- ALL_POINTCUT_TESTS = false;
- String advice = args[i++];
- if(advice.equals("fast")) TEST_ONE = true;
- else if(advice.equals("meduim")) TEST_ONE_SEARCH_ALL = true;
- else if(advice.equals("slow")) TEST_ALL = true;
- else error = true;
- }
- else if(arg.equals("-echo")) {
- ECHO = true;
- }
- else if (arg.equals("-help")) {
- usage();
- }
- else error = true;
- } catch (NumberFormatException e) {
- usage();
- }
-
- if(error) usage();
-
- compileTimes = new long[ITERATIONS];
- executionSlowTimes = new long[ITERATIONS];
- executionMedTimes = new long[ITERATIONS];
- executionFastTimes = new long[ITERATIONS];
- getSlowTimes = new long[ITERATIONS];
- getMedTimes = new long[ITERATIONS];
- getFastTimes = new long[ITERATIONS];
-
- }
- }
-
- private static void usage() {
- System.err.println("Usage:");
- System.err.println("\tjava WeaveTests [-c num_of_classes] [-m num_of_methods] " +
- "[-l num_of_method_lines] [-i num_of_iterations]" +
- "\n\t\t[-include-tests y|n] [-advice get|execution] [-pointcut fast|medium|slow] [-echo] [-help]");
-
- System.exit(-1);
- }
-
- /**
- * Will create a number of classes of the following form:
- *
- * public class C0 {
- *
- * int i0;
- * ...
- * int iN;
- *
- * void m0(C0 arg) {
- * i0++;
- * ...
- * iN++;
- * }
- * ...
- * void mN(C0 arg) {
- * ...
- * }
- *
- */
- public static void createClasses() throws IOException {
-
- if(ECHO) System.out.println("Creating classes");
-
- for(int classcounter = 0; classcounter < NUMCLASSES; classcounter++) {
-
- StringBuilder classfile = new StringBuilder(1000);
-
- classfile.append("// Auto-generated" + NL);
- classfile.append("package " + OUTPUT_PACKAGE + ";" + NL + NL);
-
- classfile.append("public class C" + classcounter + " {" + NL + NL);
-
- for(int intdeclaration = 0; intdeclaration < METHODLINES; intdeclaration++) {
- classfile.append("\tint i" + intdeclaration + ";" + NL);
- }
- classfile.append("\tint getter;" + NL);
-
- classfile.append(NL);
-
- for(int methodcounter = 0; methodcounter < NUMMETHODS; methodcounter++) {
- classfile.append("\tvoid m" + methodcounter + "(C" + classcounter + " arg) {" + NL);
-
- for(int methodbody = 0; methodbody < METHODLINES; methodbody++) {
- classfile.append("\t\ti" + methodbody + "++;" + NL);
- }
-
- classfile.append("\t}" + NL + NL);
- }
-
- classfile.append("}" + NL);
-
- try {
-
- File f = new File(outputDir, ("C" + classcounter + ".java"));
- FileOutputStream fos = new FileOutputStream(f);
- BufferedOutputStream bos = new BufferedOutputStream(fos);
-
- bos.write(new String(classfile).getBytes());
-
- bos.close();
- fos.close();
-
- } catch (IOException e) {
- e.printStackTrace();
- System.exit(-1);
- }
- }
-
- if (INCLUDE_TEST_CLASSES) {
- StringBuilder testFiles = new StringBuilder(1000);
-
- try {
- testFiles.append("// Auto generated" + NL);
- testFiles.append("package " + OUTPUT_PACKAGE + ";" + NL + NL);
-
- testFiles.append("public class TestGet {" + NL + NL);
- testFiles.append(
- "\tpublic static void main(String args[]) {" + NL);
- testFiles.append("\t\tC0 tester = new C0();" + NL);
- testFiles.append("\t\tint i = tester.i0;" + NL);
- testFiles.append("\t}" + NL);
- testFiles.append("}" + NL);
-
- File f = new File(outputDir, "TestGet.java");
- FileOutputStream fos = new FileOutputStream(f);
- BufferedOutputStream bos = new BufferedOutputStream(fos);
-
- bos.write(new String(testFiles).getBytes());
- bos.close();
- fos.close();
- } catch (IOException e) {
- e.printStackTrace();
- System.exit(-1);
- }
-
- testFiles = new StringBuilder(1000);
-
- try {
- testFiles.append("// Auto generated" + NL);
- testFiles.append("package " + OUTPUT_PACKAGE + ";" + NL + NL);
-
- testFiles.append("public class TestExecution {" + NL + NL);
- testFiles.append(
- "\tpublic static void main(String args[]) {" + NL);
- testFiles.append("\t\tC0 tester = new C0();" + NL);
- testFiles.append("\t\ttester.m0(tester);" + NL);
- testFiles.append("\t}" + NL);
- testFiles.append("}" + NL);
-
- File f = new File(outputDir, "TestExecution.java");
- FileOutputStream fos = new FileOutputStream(f);
- BufferedOutputStream bos = new BufferedOutputStream(fos);
-
- bos.write(new String(testFiles).getBytes());
- bos.close();
- fos.close();
- } catch (IOException e) {
- e.printStackTrace();
- System.exit(-1);
- }
- }
-
- StringBuilder buildList = new StringBuilder(100);
-
- for(int i = 0; i < NUMCLASSES; i++)
- buildList.append("C" + i + ".java" + NL);
-
- if (INCLUDE_TEST_CLASSES) {
- buildList.append("TestGet.java" + NL);
- buildList.append("TestExecution.java" + NL);
- }
-
- try {
- File f = new File(outputDir, "build.lst");
- FileOutputStream fos = new FileOutputStream(f);
- BufferedOutputStream bos = new BufferedOutputStream(fos);
-
- bos.write(new String(buildList).getBytes());
-
- bos.close();
- fos.close();
- } catch (IOException e) {
- e.printStackTrace();
- System.exit(-1);
- }
- }
-
- /**
- * @param adviceType Either "get" or "execution" depending on which test.
- *
- * Will create an aspect such as the following:
- *
- * public aspect GetAdviceWeaveOne {
- *
- * before() : get(int output.C0.getter) {
- * System.out.println("In the aspect");
- * }
- * }
- */
- public static void createAspects(String adviceType) {
-
- adviceType = adviceType.toLowerCase();
-
- if((!adviceType.equals("get")) && (!adviceType.equals("execution"))) {
- System.err.println("Only get and execution advice is supported");
- System.exit(-1);
- }
-
- if(ECHO) System.out.println("Creating aspects");
-
- if(ALL_POINTCUT_TESTS || TEST_ONE)
- createAllAspects(adviceType, WEAVE_FAST);
- if(ALL_POINTCUT_TESTS || TEST_ONE_SEARCH_ALL)
- createAllAspects(adviceType, WEAVE_MED);
- if(ALL_POINTCUT_TESTS || TEST_ALL)
- createAllAspects(adviceType, WEAVE_SLOW);
- }
-
- private static void createAllAspects(String adviceType, int pointcut) {
-
- StringBuilder aspectFile = new StringBuilder(1000);
-
- // Capitalises the first char in the adviceType String, and then adds "Advice" to it.
- String adviceName = (char)(adviceType.charAt(0) - 32) + adviceType.substring(1) + "Advice";
-
- switch(pointcut) {
- case WEAVE_FAST:
- adviceName += "WeaveFast";
- break;
- case WEAVE_MED:
- adviceName += "WeaveMedium";
- break;
- case WEAVE_SLOW:
- adviceName += "WeaveSlow";
- break;
- }
-
- aspectFile.append("// Auto-generated" + NL + NL);
-
- aspectFile.append("public aspect " + adviceName + " {" + NL + NL);
- aspectFile.append("\tbefore() : ");
-
- if(adviceType.equals("execution")) {
- switch(pointcut) {
- case WEAVE_FAST:
- aspectFile.append(EXECUTION_FAST);
- break;
- case WEAVE_MED:
- aspectFile.append(EXECUTION_MED);
- break;
- case WEAVE_SLOW:
- aspectFile.append(EXECUTION_SLOW);
- break;
- }
- }
- else {
- switch(pointcut) {
- case WEAVE_FAST:
- aspectFile.append(GET_FAST);
- break;
- case WEAVE_MED:
- aspectFile.append(GET_MED);
- break;
- case WEAVE_SLOW:
- aspectFile.append(GET_SLOW);
- break;
- }
- }
-
- aspectFile.append(" {" + NL);
-
- aspectFile.append("\t\tSystem.out.println(\"In the aspect\");" + NL);
- aspectFile.append("\t}" + NL);
- aspectFile.append("}" + NL);
-
- // Create the file
- try {
- File f = new File(outputDir, (adviceName + ".aj"));
- FileOutputStream fos = new FileOutputStream(f);
- BufferedOutputStream bos = new BufferedOutputStream(fos);
-
- bos.write(new String(aspectFile).getBytes());
-
- bos.close();
- fos.close();
- } catch (IOException e) {
- e.printStackTrace();
- System.exit(-1);
- }
- }
-
- public static void compileClasses() throws IOException {
-
- if(ECHO) System.out.print("Compiling: ");
-
- long average = 0;
-
- for (int i = 0; i < ITERATIONS; i++) {
- long time = performCompile();
- compileTimes[i] = time;
- average += time;
- }
-
- if(ECHO) System.out.println((average / ITERATIONS) + " millis");
- }
-
- private static long performCompile() throws IOException {
-
- String ajcargs =
- "-noExit -outjar " + OUTPUT_PACKAGE + File.separatorChar + "classes.jar " +
- "-argfile " + OUTPUT_PACKAGE + File.separatorChar + "build.lst";
-
- // split method creates a String array delimited on a space
- String[] parsedArgs = RunWeaveTests.split(ajcargs);
-
-
- long start = System.currentTimeMillis();
-
- org.aspectj.tools.ajc.Main.main(parsedArgs);
-
- long stop = System.currentTimeMillis();
-
- return stop - start;
- }
-
-
- public static void weaveAspects(String adviceType) throws IOException {
-
- adviceType = adviceType.toLowerCase();
-
- if((!adviceType.equals("get")) && (!adviceType.equals("execution"))) {
- System.err.println("Only get and execution advice is supported");
- System.exit(-1);
- }
-
- long average = 0;
-
- if(ECHO) System.out.println((char)(adviceType.charAt(0) - 32) + adviceType.substring(1));
-
- if (ALL_POINTCUT_TESTS || TEST_ONE) {
- if(ECHO) System.out.print("Weave Fast:");
- for (int i = 0; i < ITERATIONS; i++) {
- long time = weaveAllAspects(adviceType, WEAVE_FAST);
-
- if(adviceType.equals("execution")) executionFastTimes[i] = time;
- else getFastTimes[i] = time;
-
- average += time;
- if(ECHO) System.out.print(".");
- }
- if(ECHO) System.out.println(" " + (average / ITERATIONS) + " millis");
- }
-
-
- average = 0;
-
- if (ALL_POINTCUT_TESTS || TEST_ONE_SEARCH_ALL) {
- if(ECHO) System.out.print("Weave Medium:");
- for (int i = 0; i < ITERATIONS; i++) {
- long time = weaveAllAspects(adviceType, WEAVE_MED);
-
- if(adviceType.equals("execution")) executionMedTimes[i] = time;
- else getMedTimes[i] = time;
-
- average += time;
- if(ECHO) System.out.print(".");
- }
- if(ECHO) System.out.println(" " + (average / ITERATIONS) + " millis");
- }
-
-
- average = 0;
-
- if (ALL_POINTCUT_TESTS || TEST_ALL) {
- if(ECHO) System.out.print("Weave Slow:");
- for (int i = 0; i < ITERATIONS; i++) {
- long time = weaveAllAspects(adviceType, WEAVE_SLOW);
-
- if(adviceType.equals("execution")) executionSlowTimes[i] = time;
- else getSlowTimes[i] = time;
-
- average += time;
- if(ECHO) System.out.print(".");
- }
- if(ECHO) System.out.println(" " + (average / ITERATIONS) + " millis");
- }
-
- if(ECHO) System.out.println();
- }
-
- private static long weaveAllAspects(String adviceType, int pointcut) throws IOException {
-
- // Capitalises the first char in the adviceType String, to keep to Java naming convention
- String adviceName = (char)(adviceType.charAt(0) - 32) + adviceType.substring(1) + "Advice";
-
- switch(pointcut) {
- case WEAVE_FAST:
- adviceName += "WeaveFast";
- break;
- case WEAVE_MED:
- adviceName += "WeaveMedium";
- break;
- case WEAVE_SLOW:
- adviceName += "WeaveSlow";
- break;
- }
-
- String ajcargs =
- "-noExit -injars " + OUTPUT_PACKAGE + File.separatorChar + "classes.jar " +
- "-outjar " + OUTPUT_PACKAGE + File.separatorChar + adviceName + ".jar " +
- OUTPUT_PACKAGE + File.separatorChar + adviceName + ".aj";
-
- String[] parsedArgs = RunWeaveTests.split(ajcargs);
-
- long start = System.currentTimeMillis();
-
- org.aspectj.tools.ajc.Main.main(parsedArgs);
-
- long stop = System.currentTimeMillis();
-
- return stop - start;
- }
- }
|