Package org.nutz.aop.asm

Source Code of org.nutz.aop.asm.AsmClassAgentTest

package org.nutz.aop.asm;

import static java.lang.reflect.Modifier.PRIVATE;
import static java.lang.reflect.Modifier.PROTECTED;
import static java.lang.reflect.Modifier.PUBLIC;
import static java.lang.reflect.Modifier.TRANSIENT;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.lang.reflect.Method;
import java.util.Arrays;

import org.junit.Test;
import org.nutz.Nutzs;
import org.nutz.aop.ClassAgent;
import org.nutz.aop.ClassDefiner;
import org.nutz.aop.interceptor.LoggingMethodInterceptor;
import org.nutz.aop.javassist.lstn.MethodCounter;
import org.nutz.aop.javassist.lstn.RhinocerosListener;
import org.nutz.aop.javassist.meta.Buffalo;
import org.nutz.aop.javassist.meta.Hippo;
import org.nutz.aop.javassist.meta.Moose;
import org.nutz.aop.javassist.meta.Rhinoceros;
import org.nutz.aop.javassist.meta.Vegetarian;
import org.nutz.aop.javassist.meta.Vegetarians;
import org.nutz.aop.javassist.meta.Vegetarian.BEH;
import org.nutz.aop.matcher.MethodMatcherFactory;
import org.nutz.json.Json;
import org.nutz.lang.Mirror;

public class AsmClassAgentTest {

  @Test
  public void test_duplicate_class_exception() throws Exception {
    int[] cc = new int[4];
    ClassAgent ca = getNewClassAgent();
    ca.addInterceptor(MethodMatcherFactory.matcher(".*"), new MethodCounter(cc));
    ClassAgent ca2 = getNewClassAgent();
    ca2.addInterceptor(MethodMatcherFactory.matcher(".*"), new MethodCounter(cc));

    ClassDefiner cd = Nutzs.cd();

    Class<? extends Moose> c = ca.define(cd, Moose.class);
    Moose m = c.newInstance();
    m.doSomething(BEH.run);
    assertEquals("[2, 2, 0, 0]", Json.toJson(cc));

    Class<? extends Moose> c2 = ca2.define(cd, Moose.class);
    assertEquals(c, c2);
    m = c.newInstance();
    m.doSomething(BEH.run);
    assertEquals("[4, 4, 0, 0]", Json.toJson(cc));
  }

  @Test
  public void test_return_array_method() {
    int[] cc = new int[4];
    Arrays.fill(cc, 0);
    ClassAgent aca = getNewClassAgent();
    aca.addInterceptor(MethodMatcherFactory.matcher("returnArrayMethod"), new MethodCounter(cc));
    Class<? extends Buffalo> c = aca.define(Nutzs.cd(), Buffalo.class);// RA.class;
    Buffalo r = Mirror.me(c).born();
    String[] ss = r.returnArrayMethod();
    assertEquals("[1, 1, 0, 0]", Json.toJson(cc));
    assertEquals(3, ss.length);
  }

  @Test
  public void test_basice_matcher() throws Exception {
    Method method = Vegetarian.class.getDeclaredMethod("doSomething", BEH.class);
    assertTrue(MethodMatcherFactory.matcher().match(method));
    assertTrue(MethodMatcherFactory.matcher(PUBLIC).match(method));
    assertFalse(MethodMatcherFactory.matcher(PROTECTED).match(method));
    assertFalse(MethodMatcherFactory.matcher(TRANSIENT).match(method));
    assertFalse(MethodMatcherFactory.matcher(PRIVATE).match(method));

    method = Vegetarian.class.getDeclaredMethod("run", int.class);
    assertTrue(MethodMatcherFactory.matcher().match(method));
    assertFalse(MethodMatcherFactory.matcher(PUBLIC).match(method));
    assertTrue(MethodMatcherFactory.matcher(PROTECTED).match(method));
    assertFalse(MethodMatcherFactory.matcher(TRANSIENT).match(method));
    assertFalse(MethodMatcherFactory.matcher(PRIVATE).match(method));

    method = Vegetarian.class.getDeclaredMethod("defaultMethod");
    assertTrue(MethodMatcherFactory.matcher().match(method));
    assertFalse(MethodMatcherFactory.matcher(PUBLIC).match(method));
    assertFalse(MethodMatcherFactory.matcher(PROTECTED).match(method));
    assertTrue(MethodMatcherFactory.matcher(TRANSIENT).match(method));
    assertFalse(MethodMatcherFactory.matcher(PRIVATE).match(method));

    method = Vegetarian.class.getDeclaredMethod("privateMethod");
    assertTrue(MethodMatcherFactory.matcher().match(method));
    assertFalse(MethodMatcherFactory.matcher(PUBLIC).match(method));
    assertFalse(MethodMatcherFactory.matcher(PROTECTED).match(method));
    assertFalse(MethodMatcherFactory.matcher(TRANSIENT).match(method));
    assertTrue(MethodMatcherFactory.matcher(PRIVATE).match(method));
  }

  @Test
  public void test_basice_matcher_by_name() throws Exception {
    Method method = Vegetarian.class.getDeclaredMethod("doSomething", BEH.class);
    assertTrue(MethodMatcherFactory.matcher("doSomething").match(method));
  }

  @Test
  public void test_basice_listener() {
    int[] cc = new int[4];
    int[] crun = new int[4];
    Arrays.fill(cc, 0);
    Arrays.fill(crun, 0);
    ClassAgent aca = getNewClassAgent();
    aca.addInterceptor(MethodMatcherFactory.matcher("run"), new MethodCounter(crun));
    aca.addInterceptor(MethodMatcherFactory.matcher(".*"), new MethodCounter(cc));
    aca.addInterceptor(MethodMatcherFactory.matcher("doSomething"), new RhinocerosListener());
    Class<? extends Rhinoceros> c = aca.define(Nutzs.cd(), Rhinoceros.class);// RA.class;
    Rhinoceros r = Mirror.me(c).born();
    r.doSomething(BEH.run);
    r.doSomething(BEH.fight);
    try {
      r.doSomething(BEH.lecture);
      fail();
    }
    catch (Throwable e) {}
    try {
      r.doSomething(BEH.fly);
      fail();
    }
    catch (Throwable e) {}
//    assertEquals("[5, 3, 1, 1]", Json.toJson(cc));
    assertEquals("[1, 1, 0, 0]", Json.toJson(crun));
  }

  @Test
  public void test_basice_matcher_by_mod() {
    int[] cpub = new int[4];
    int[] cpro = new int[4];
    Arrays.fill(cpub, 0);
    Arrays.fill(cpro, 0);
    ClassAgent aca = getNewClassAgent();
    aca.addInterceptor(MethodMatcherFactory.matcher(PUBLIC), new MethodCounter(cpub));
    aca.addInterceptor(MethodMatcherFactory.matcher(PROTECTED), new MethodCounter(cpro));
    Class<? extends Hippo> c = aca.define(Nutzs.cd(), Hippo.class);// RA.class;
    Hippo r = Mirror.me(c).born();
    Vegetarians.run(r, 78);
    r.doSomething(BEH.run);
    try {
      r.doSomething(BEH.lecture);
      fail();
    }
    catch (Throwable e) {}
    try {
      r.doSomething(BEH.fly);
      fail();
    }
    catch (Throwable e) {}
    assertEquals("[3, 1, 1, 1]", Json.toJson(cpub));
    assertEquals("[2, 2, 0, 0]", Json.toJson(cpro));
  }

  public ClassAgent getNewClassAgent() {
    ClassAgent classAgent = new AsmClassAgent();
    classAgent.addInterceptor(MethodMatcherFactory.matcher(".*"), new LoggingMethodInterceptor());
    return classAgent;
  }
}
TOP

Related Classes of org.nutz.aop.asm.AsmClassAgentTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.