aboutsummaryrefslogtreecommitdiffstats
path: root/tests/cflow/CounterTest02.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/cflow/CounterTest02.java')
-rw-r--r--tests/cflow/CounterTest02.java85
1 files changed, 85 insertions, 0 deletions
diff --git a/tests/cflow/CounterTest02.java b/tests/cflow/CounterTest02.java
new file mode 100644
index 000000000..e596d7bfa
--- /dev/null
+++ b/tests/cflow/CounterTest02.java
@@ -0,0 +1,85 @@
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * In this testcase we create a pointcut p1() which uses cflow and then we reference
+ * it in two other anonymous pointcuts attached to advice. The cflow() should be managed
+ * by a counter (as no state is maintained) and the reused pointcut should not mean two
+ * counters are created. One counter should be created and shared.
+ */
+public class CounterTest02 {
+
+ public static void main(String []argv) {
+ new CounterTest02().sayMessage();
+ int ctrs = ReflectionHelper.howManyCflowCounterFields(Cflow1.aspectOf());
+ int stacks = ReflectionHelper.howManyCflowStackFields(Cflow1.aspectOf());
+ if (ctrs!=1)
+ throw new RuntimeException("Should be one cflow counter, but found: "+ctrs);
+ if (stacks!=1)
+ throw new RuntimeException("Should be one cflow stacks, but found: "+stacks);
+ if (Cflow1.stackAdvice!=2)
+ throw new RuntimeException("Expected two piece of stack advice to run: "+Cflow1.stackAdvice);
+ if (Cflow1.counterAdvice!=4)
+ throw new RuntimeException("Expected four pieces of counter advice to run: "+Cflow1.counterAdvice);
+
+ }
+
+ public void sayMessage() {
+ printmsg("Hello "); printmsg("World\n");
+ }
+
+ public void printmsg(String msg) {
+ System.out.print(msg);
+ }
+}
+
+aspect Cflow1 {
+ public static int stackAdvice = 0;
+ public static int counterAdvice = 0;
+
+ // CflowCounter created for this pointcut should be shared below!
+ pointcut p1(): cflow(execution(* main(..)));
+
+ before(): call(* print(..)) && p1() {
+ // Managed by a CflowCounter
+ Cflow1.counterAdvice++;
+ }
+
+ before(): call(* print(..)) && p1() {
+ // Managed by a CflowCounter
+ Cflow1.counterAdvice++;
+ }
+
+ before(Object o): call(* print(..)) && cflow(execution(* main(..)) && args(o)) {
+ // Managed by a CflowStack - since state is exposed
+ Cflow1.stackAdvice++;
+ }
+}
+
+class ReflectionHelper {
+ public static List getCflowfields(Object o,boolean includeCounters,boolean includeStacks) {
+ List res = new ArrayList();
+ Class clazz = o.getClass();
+ Field[] fs = clazz.getDeclaredFields();
+ for (int i = 0; i < fs.length; i++) {
+ Field f = fs[i];
+ if ((f.getType().getName().endsWith("CFlowCounter") && includeCounters) ||
+ (f.getType().getName().endsWith("CFlowStack") && includeStacks)) {
+ res.add(f.getType().getName()+":"+f.getName());
+ }
+ }
+ return res;
+ }
+
+ public static int howManyCflowCounterFields(Object o) {
+ return getCflowfields(o,true,false).size();
+ }
+
+ public static int howManyCflowStackFields(Object o) {
+ return getCflowfields(o,false,true).size();
+ }
+
+}