package org.jgroups.util; import org.testng.annotations.*; import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Counts and dumps all tests annotated with @Test. Tests with enabled=false are excluded. Takes invocationCount * into account, e.g. a method with @Test(invocationCount=5) is counted 5 times. * @author Bela Ban * @since 3.1 */ public class CountTests { public static void main(String[] args) throws ClassNotFoundException, IOException { List<Class<?>> list=Util.findClassesAnnotatedWith("org.jgroups",Test.class); int total=0, disabled=0; Map<String,Integer> group_count=new HashMap<String,Integer>(list.size()); String group=null; boolean details=false; for(int i=0; i < args.length; i++) { if(args[i].equals("-group")) { group=args[++i]; continue; } if(args[i].equals("-details")) { details=true; continue; } System.out.println("CountTests [-group groupname] [-details]"); return; } for(Class<?> clazz: list) { Test annotation=clazz.getAnnotation(Test.class); if(!annotation.enabled()) { disabled++; continue; } String name=clazz.getSimpleName(); if(details && group != null && hasGroup(annotation, group)) System.out.println(Util.bold("\n" + name + ":")); Method[] methods=clazz.getDeclaredMethods(); int cnt=0; for(Method method: methods) { int mods=method.getModifiers(); if(!Modifier.isPublic(mods)) continue; if(hasAnnotations(method, BeforeSuite.class, BeforeTest.class, BeforeClass.class, BeforeMethod.class, BeforeGroups.class, AfterSuite.class, AfterClass.class, AfterTest.class, AfterMethod.class, AfterGroups.class)) continue; Test method_annotation=method.getAnnotation(Test.class); if(method_annotation != null) { if(method_annotation.enabled() == false) { disabled++; continue; } int invocation_cnt=method_annotation.invocationCount(); if(invocation_cnt > 1) { if(details && group != null && hasGroup(annotation, group)) System.out.println(" " + method.getName() + " [invocationCount=" + invocation_cnt + "]"); total+=invocation_cnt; cnt+=invocation_cnt; continue; } } if(details && group != null && hasGroup(annotation, group)) System.out.println(" " + method.getName()); total++; cnt++; } if(details && group != null && hasGroup(annotation, group)) System.out.println(" (" + cnt + ")"); String[] groups=annotation.groups(); if(groups != null) { for(String grp: groups) { if(group != null && !grp.equals(group)) continue; Integer count=group_count.get(grp); if(count == null) group_count.put(grp, cnt); else group_count.put(grp, count+cnt); } } } System.out.println("\nFound " + total + " classes annotated with @Test: " + disabled + " disabled, groups:"); for(Map.Entry<String,Integer> entry: group_count.entrySet()) { String key=entry.getKey(); Integer val=entry.getValue(); System.out.println(key + ": " + val); } } protected static boolean hasAnnotations(Method method, Class<?> ... annotations) { if(method == null || annotations == null) return false; for(Class<?> annotation: annotations) { Class<Annotation> ann=(Class<Annotation>)annotation; if(method.getAnnotation(ann) != null) return true; } return false; } protected static boolean hasGroup(Test annotation, String grp) { String[] groups=annotation.groups(); if(groups != null) { for(String group: groups) { if(group.equals(grp)) return true; } } return false; } }