152248d07afd2f379723bb0388bd648970eee4650Cédric Beustpackage test.tmp.verify;
252248d07afd2f379723bb0388bd648970eee4650Cédric Beust
352248d07afd2f379723bb0388bd648970eee4650Cédric Beustimport org.testng.IMethodInstance;
452248d07afd2f379723bb0388bd648970eee4650Cédric Beustimport org.testng.IMethodInterceptor;
552248d07afd2f379723bb0388bd648970eee4650Cédric Beustimport org.testng.ITestContext;
652248d07afd2f379723bb0388bd648970eee4650Cédric Beustimport org.testng.ITestNGMethod;
752248d07afd2f379723bb0388bd648970eee4650Cédric Beustimport org.testng.TestNGUtils;
852248d07afd2f379723bb0388bd648970eee4650Cédric Beustimport org.testng.collections.Maps;
952248d07afd2f379723bb0388bd648970eee4650Cédric Beust
1052248d07afd2f379723bb0388bd648970eee4650Cédric Beustimport java.lang.annotation.Annotation;
1152248d07afd2f379723bb0388bd648970eee4650Cédric Beustimport java.lang.reflect.Method;
1252248d07afd2f379723bb0388bd648970eee4650Cédric Beustimport java.util.ArrayList;
1352248d07afd2f379723bb0388bd648970eee4650Cédric Beustimport java.util.List;
1452248d07afd2f379723bb0388bd648970eee4650Cédric Beustimport java.util.Map;
1552248d07afd2f379723bb0388bd648970eee4650Cédric Beust
1652248d07afd2f379723bb0388bd648970eee4650Cédric Beustpublic class VerifyInterceptor implements IMethodInterceptor {
1752248d07afd2f379723bb0388bd648970eee4650Cédric Beust
1852248d07afd2f379723bb0388bd648970eee4650Cédric Beust  /**
19f9660afeb61b2d1e5890efd086cb14620303f624Cédric Beust   * @return the list of methods received in parameters with all methods
20f9660afeb61b2d1e5890efd086cb14620303f624Cédric Beust   * annotated with @Verify inserted after each of these test methods.
21892b08c1f1afd198fd8ccbf804de28b7ce12f547nullin   *
22f9660afeb61b2d1e5890efd086cb14620303f624Cédric Beust   * This happens in two steps:
2352248d07afd2f379723bb0388bd648970eee4650Cédric Beust   * - Find all the methods annotated with @Verify in the classes that contain test methods
2452248d07afd2f379723bb0388bd648970eee4650Cédric Beust   * - Insert these verify methods after each method passed in parameter
2552248d07afd2f379723bb0388bd648970eee4650Cédric Beust   * These @Verify methods are stored in a map keyed by the class in order to avoid looking them
2652248d07afd2f379723bb0388bd648970eee4650Cédric Beust   * up more than once on the same class.
2752248d07afd2f379723bb0388bd648970eee4650Cédric Beust   */
28892b08c1f1afd198fd8ccbf804de28b7ce12f547nullin  @Override
2952248d07afd2f379723bb0388bd648970eee4650Cédric Beust  public List<IMethodInstance> intercept(List<IMethodInstance> methods,
3052248d07afd2f379723bb0388bd648970eee4650Cédric Beust      ITestContext context) {
3152248d07afd2f379723bb0388bd648970eee4650Cédric Beust
3210c223b7aa6bf34778079bb5ee1a494c83cd1239Ryan Schmitt    List<IMethodInstance> result = new ArrayList<>();
33f9660afeb61b2d1e5890efd086cb14620303f624Cédric Beust    Map<Class<?>, List<IMethodInstance>> verifyMethods = Maps.newHashMap();
3452248d07afd2f379723bb0388bd648970eee4650Cédric Beust    for (IMethodInstance mi : methods) {
3552248d07afd2f379723bb0388bd648970eee4650Cédric Beust      ITestNGMethod tm = mi.getMethod();
36f9660afeb61b2d1e5890efd086cb14620303f624Cédric Beust      List<IMethodInstance> verify = verifyMethods.get(tm.getRealClass());
37f9660afeb61b2d1e5890efd086cb14620303f624Cédric Beust      if (verify == null) {
38f9660afeb61b2d1e5890efd086cb14620303f624Cédric Beust        verify = findVerifyMethods(tm.getRealClass(), tm);
3952248d07afd2f379723bb0388bd648970eee4650Cédric Beust      }
4052248d07afd2f379723bb0388bd648970eee4650Cédric Beust      result.add(mi);
41f9660afeb61b2d1e5890efd086cb14620303f624Cédric Beust      result.addAll(verify);
4252248d07afd2f379723bb0388bd648970eee4650Cédric Beust    }
4352248d07afd2f379723bb0388bd648970eee4650Cédric Beust
4452248d07afd2f379723bb0388bd648970eee4650Cédric Beust    return result;
4552248d07afd2f379723bb0388bd648970eee4650Cédric Beust  }
4652248d07afd2f379723bb0388bd648970eee4650Cédric Beust
4752248d07afd2f379723bb0388bd648970eee4650Cédric Beust  /**
4852248d07afd2f379723bb0388bd648970eee4650Cédric Beust   * @return all the @Verify methods found on @code{realClass}
4952248d07afd2f379723bb0388bd648970eee4650Cédric Beust   */
5052248d07afd2f379723bb0388bd648970eee4650Cédric Beust  private List<IMethodInstance> findVerifyMethods(Class realClass, final ITestNGMethod tm) {
5110c223b7aa6bf34778079bb5ee1a494c83cd1239Ryan Schmitt    List<IMethodInstance> result = new ArrayList<>();
5252248d07afd2f379723bb0388bd648970eee4650Cédric Beust    for (final Method m : realClass.getDeclaredMethods()) {
5352248d07afd2f379723bb0388bd648970eee4650Cédric Beust      Annotation a = m.getAnnotation(Verify.class);
5452248d07afd2f379723bb0388bd648970eee4650Cédric Beust      if (a != null) {
5552248d07afd2f379723bb0388bd648970eee4650Cédric Beust        final ITestNGMethod vm = TestNGUtils.createITestNGMethod(tm, m);
5652248d07afd2f379723bb0388bd648970eee4650Cédric Beust        result.add(new IMethodInstance() {
5752248d07afd2f379723bb0388bd648970eee4650Cédric Beust
58892b08c1f1afd198fd8ccbf804de28b7ce12f547nullin          @Override
5952248d07afd2f379723bb0388bd648970eee4650Cédric Beust          public Object[] getInstances() {
6052248d07afd2f379723bb0388bd648970eee4650Cédric Beust            return tm.getInstances();
6152248d07afd2f379723bb0388bd648970eee4650Cédric Beust          }
6252248d07afd2f379723bb0388bd648970eee4650Cédric Beust
63892b08c1f1afd198fd8ccbf804de28b7ce12f547nullin          @Override
6452248d07afd2f379723bb0388bd648970eee4650Cédric Beust          public ITestNGMethod getMethod() {
6552248d07afd2f379723bb0388bd648970eee4650Cédric Beust            return vm;
6652248d07afd2f379723bb0388bd648970eee4650Cédric Beust          }
6752248d07afd2f379723bb0388bd648970eee4650Cédric Beust
686bb8186dfcf2d0cd7a49b1ca748ae451496affdaCédric Beust          public int compareTo(IMethodInstance o) {
69892b08c1f1afd198fd8ccbf804de28b7ce12f547nullin            if (getInstances()[0] == o.getInstances()[0]) {
70892b08c1f1afd198fd8ccbf804de28b7ce12f547nullin              return 0;
71892b08c1f1afd198fd8ccbf804de28b7ce12f547nullin            } else {
72892b08c1f1afd198fd8ccbf804de28b7ce12f547nullin              return -1;
73892b08c1f1afd198fd8ccbf804de28b7ce12f547nullin            }
746bb8186dfcf2d0cd7a49b1ca748ae451496affdaCédric Beust          }
75eb2b9ac857aad415986677a51513d47e91eb7c8dCédric Beust
76eb2b9ac857aad415986677a51513d47e91eb7c8dCédric Beust          @Override
77eb2b9ac857aad415986677a51513d47e91eb7c8dCédric Beust          public Object getInstance() {
78eb2b9ac857aad415986677a51513d47e91eb7c8dCédric Beust            return tm.getInstance();
79eb2b9ac857aad415986677a51513d47e91eb7c8dCédric Beust          }
8052248d07afd2f379723bb0388bd648970eee4650Cédric Beust        });
8152248d07afd2f379723bb0388bd648970eee4650Cédric Beust      }
8252248d07afd2f379723bb0388bd648970eee4650Cédric Beust    }
8352248d07afd2f379723bb0388bd648970eee4650Cédric Beust
8452248d07afd2f379723bb0388bd648970eee4650Cédric Beust    return result;
8552248d07afd2f379723bb0388bd648970eee4650Cédric Beust  }
8652248d07afd2f379723bb0388bd648970eee4650Cédric Beust}
87