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