1 package org.testng.internal; 2 3 import java.lang.reflect.Method; 4 import java.util.Collections; 5 import java.util.List; 6 import java.util.Map; 7 8 import org.testng.ITestNGMethod; 9 import org.testng.annotations.IAnnotation; 10 import org.testng.annotations.IConfigurationAnnotation; 11 import org.testng.annotations.ITestAnnotation; 12 import org.testng.collections.Lists; 13 import org.testng.collections.Maps; 14 import org.testng.internal.annotations.AnnotationHelper; 15 import org.testng.internal.annotations.ConfigurationAnnotation; 16 import org.testng.internal.annotations.IAfterClass; 17 import org.testng.internal.annotations.IAfterGroups; 18 import org.testng.internal.annotations.IAfterMethod; 19 import org.testng.internal.annotations.IAfterSuite; 20 import org.testng.internal.annotations.IAfterTest; 21 import org.testng.internal.annotations.IAnnotationFinder; 22 import org.testng.internal.annotations.IBeforeClass; 23 import org.testng.internal.annotations.IBeforeGroups; 24 import org.testng.internal.annotations.IBeforeMethod; 25 import org.testng.internal.annotations.IBeforeSuite; 26 import org.testng.internal.annotations.IBeforeTest; 27 28 public class ConfigurationMethod extends BaseTestMethod { 29 /** 30 * 31 */ 32 private static final long serialVersionUID = -6537771498553619645L; 33 private final boolean m_isBeforeSuiteConfiguration; 34 private final boolean m_isAfterSuiteConfiguration; 35 36 private final boolean m_isBeforeTestConfiguration; 37 private final boolean m_isAfterTestConfiguration; 38 39 private final boolean m_isBeforeClassConfiguration; 40 private final boolean m_isAfterClassConfiguration; 41 42 private final boolean m_isBeforeMethodConfiguration; 43 private final boolean m_isAfterMethodConfiguration; 44 45 private boolean m_inheritGroupsFromTestClass = false; 46 47 private ConfigurationMethod(ConstructorOrMethod com, 48 IAnnotationFinder annotationFinder, 49 boolean isBeforeSuite, 50 boolean isAfterSuite, 51 boolean isBeforeTest, 52 boolean isAfterTest, 53 boolean isBeforeClass, 54 boolean isAfterClass, 55 boolean isBeforeMethod, 56 boolean isAfterMethod, 57 String[] beforeGroups, 58 String[] afterGroups, 59 boolean initialize, 60 Object instance) 61 { 62 super(com.getName(), com, annotationFinder, instance); 63 if(initialize) { 64 init(); 65 } 66 67 m_isBeforeSuiteConfiguration = isBeforeSuite; 68 m_isAfterSuiteConfiguration = isAfterSuite; 69 70 m_isBeforeTestConfiguration = isBeforeTest; 71 m_isAfterTestConfiguration = isAfterTest; 72 73 m_isBeforeClassConfiguration = isBeforeClass; 74 m_isAfterClassConfiguration = isAfterClass; 75 76 m_isBeforeMethodConfiguration = isBeforeMethod; 77 m_isAfterMethodConfiguration = isAfterMethod; 78 79 m_beforeGroups = beforeGroups; 80 m_afterGroups = afterGroups; 81 82 } 83 84 /** 85 * @deprecated use #ConfigurationMethod(ConstructorOrMethod,...) instead. 86 */ 87 @Deprecated 88 public ConfigurationMethod(Method method, 89 IAnnotationFinder annotationFinder, 90 boolean isBeforeSuite, 91 boolean isAfterSuite, 92 boolean isBeforeTest, 93 boolean isAfterTest, 94 boolean isBeforeClass, 95 boolean isAfterClass, 96 boolean isBeforeMethod, 97 boolean isAfterMethod, 98 String[] beforeGroups, 99 String[] afterGroups, 100 Object instance) 101 { 102 this(new ConstructorOrMethod(method), annotationFinder, isBeforeSuite, isAfterSuite, isBeforeTest, isAfterTest, 103 isBeforeClass, isAfterClass, isBeforeMethod, isAfterMethod, beforeGroups, afterGroups, instance); 104 } 105 106 public ConfigurationMethod(ConstructorOrMethod com, 107 IAnnotationFinder annotationFinder, 108 boolean isBeforeSuite, 109 boolean isAfterSuite, 110 boolean isBeforeTest, 111 boolean isAfterTest, 112 boolean isBeforeClass, 113 boolean isAfterClass, 114 boolean isBeforeMethod, 115 boolean isAfterMethod, 116 String[] beforeGroups, 117 String[] afterGroups, 118 Object instance) { 119 this(com, annotationFinder, isBeforeSuite, isAfterSuite, isBeforeTest, isAfterTest, 120 isBeforeClass, isAfterClass, isBeforeMethod, isAfterMethod, beforeGroups, afterGroups, 121 true, instance); 122 } 123 124 private static ITestNGMethod[] createMethods(ITestNGMethod[] methods, IAnnotationFinder finder, 125 boolean isBeforeSuite, 126 boolean isAfterSuite, 127 boolean isBeforeTest, 128 boolean isAfterTest, 129 boolean isBeforeClass, 130 boolean isAfterClass, 131 boolean isBeforeMethod, 132 boolean isAfterMethod, 133 String[] beforeGroups, 134 String[] afterGroups, 135 Object instance) 136 { 137 List<ITestNGMethod> result = Lists.newArrayList(); 138 for (ITestNGMethod method : methods) { 139 result.add(new ConfigurationMethod(method.getConstructorOrMethod(), 140 finder, 141 isBeforeSuite, 142 isAfterSuite, 143 isBeforeTest, 144 isAfterTest, 145 isBeforeClass, 146 isAfterClass, 147 isBeforeMethod, 148 isAfterMethod, 149 new String[0], 150 new String[0], 151 instance)); 152 } 153 154 return result.toArray(new ITestNGMethod[result.size()]); 155 } 156 157 158 public static ITestNGMethod[] createSuiteConfigurationMethods(ITestNGMethod[] methods, 159 IAnnotationFinder annotationFinder, boolean isBefore, Object instance) { 160 return createMethods(methods, annotationFinder, 161 isBefore, 162 !isBefore, 163 false, 164 false, 165 false, 166 false, 167 false, 168 false, 169 new String[0], 170 new String[0], 171 instance); 172 } 173 174 public static ITestNGMethod[] createTestConfigurationMethods(ITestNGMethod[] methods, 175 IAnnotationFinder annotationFinder, boolean isBefore, Object instance) { 176 return createMethods(methods, annotationFinder, 177 false, 178 false, 179 isBefore, 180 !isBefore, 181 false, 182 false, 183 false, 184 false, 185 new String[0], 186 new String[0], 187 instance); 188 } 189 190 public static ITestNGMethod[] createClassConfigurationMethods(ITestNGMethod[] methods, 191 IAnnotationFinder annotationFinder, boolean isBefore, Object instance) { 192 return createMethods(methods, annotationFinder, 193 false, 194 false, 195 false, 196 false, 197 isBefore, 198 !isBefore, 199 false, 200 false, 201 new String[0], 202 new String[0], 203 instance); 204 } 205 206 public static ITestNGMethod[] createBeforeConfigurationMethods(ITestNGMethod[] methods, 207 IAnnotationFinder annotationFinder, boolean isBefore, Object instance) 208 { 209 ITestNGMethod[] result = new ITestNGMethod[methods.length]; 210 for(int i = 0; i < methods.length; i++) { 211 result[i] = new ConfigurationMethod(methods[i].getConstructorOrMethod(), 212 annotationFinder, 213 false, 214 false, 215 false, 216 false, 217 false, 218 false, 219 false, 220 false, 221 isBefore ? methods[i].getBeforeGroups() : new String[0], 222 new String[0], 223 instance); 224 } 225 226 return result; 227 } 228 229 public static ITestNGMethod[] createAfterConfigurationMethods(ITestNGMethod[] methods, 230 IAnnotationFinder annotationFinder, boolean isBefore, Object instance) 231 { 232 ITestNGMethod[] result = new ITestNGMethod[methods.length]; 233 for(int i = 0; i < methods.length; i++) { 234 result[i] = new ConfigurationMethod(methods[i].getConstructorOrMethod(), 235 annotationFinder, 236 false, 237 false, 238 false, 239 false, 240 false, 241 false, 242 false, 243 false, 244 new String[0], 245 isBefore ? new String[0] : methods[i].getAfterGroups(), 246 instance); 247 } 248 249 return result; 250 } 251 252 public static ITestNGMethod[] createTestMethodConfigurationMethods(ITestNGMethod[] methods, 253 IAnnotationFinder annotationFinder, boolean isBefore, Object instance) { 254 return createMethods(methods, annotationFinder, 255 false, 256 false, 257 false, 258 false, 259 false, 260 false, 261 isBefore, 262 !isBefore, 263 new String[0], 264 new String[0], 265 instance); 266 } 267 268 /** 269 * @return Returns the isAfterClassConfiguration. 270 */ 271 @Override 272 public boolean isAfterClassConfiguration() { 273 return m_isAfterClassConfiguration; 274 } 275 /** 276 * @return Returns the isAfterMethodConfiguration. 277 */ 278 @Override 279 public boolean isAfterMethodConfiguration() { 280 return m_isAfterMethodConfiguration; 281 } 282 /** 283 * @return Returns the isBeforeClassConfiguration. 284 */ 285 @Override 286 public boolean isBeforeClassConfiguration() { 287 return m_isBeforeClassConfiguration; 288 } 289 /** 290 * @return Returns the isBeforeMethodConfiguration. 291 */ 292 @Override 293 public boolean isBeforeMethodConfiguration() { 294 return m_isBeforeMethodConfiguration; 295 } 296 297 298 /** 299 * @return Returns the isAfterSuiteConfiguration. 300 */ 301 @Override 302 public boolean isAfterSuiteConfiguration() { 303 return m_isAfterSuiteConfiguration; 304 } 305 306 /** 307 * @return Returns the isBeforeSuiteConfiguration. 308 */ 309 @Override 310 public boolean isBeforeSuiteConfiguration() { 311 return m_isBeforeSuiteConfiguration; 312 } 313 314 @Override 315 public boolean isBeforeTestConfiguration() { 316 return m_isBeforeTestConfiguration; 317 } 318 319 @Override 320 public boolean isAfterTestConfiguration() { 321 return m_isAfterTestConfiguration; 322 } 323 324 @Override 325 public boolean isBeforeGroupsConfiguration() { 326 return m_beforeGroups != null && m_beforeGroups.length > 0; 327 } 328 329 @Override 330 public boolean isAfterGroupsConfiguration() { 331 return m_afterGroups != null && m_afterGroups.length > 0; 332 } 333 334 private boolean inheritGroupsFromTestClass() { 335 return m_inheritGroupsFromTestClass; 336 } 337 338 private void init() { 339 IAnnotation a = AnnotationHelper.findConfiguration(m_annotationFinder, m_method.getMethod()); 340 IConfigurationAnnotation annotation = (IConfigurationAnnotation) a; 341 if (a != null) { 342 m_inheritGroupsFromTestClass = annotation.getInheritGroups(); 343 setEnabled(annotation.getEnabled()); 344 setDescription(annotation.getDescription()); 345 } 346 347 if (annotation != null && annotation.isFakeConfiguration()) { 348 if (annotation.getBeforeSuite()) { 349 initGroups(IBeforeSuite.class); 350 } 351 if (annotation.getAfterSuite()) { 352 initGroups(IAfterSuite.class); 353 } 354 if (annotation.getBeforeTest()) { 355 initGroups(IBeforeTest.class); 356 } 357 if (annotation.getAfterTest()) { 358 initGroups(IAfterTest.class); 359 } 360 if (annotation.getBeforeGroups().length != 0) { 361 initGroups(IBeforeGroups.class); 362 } 363 if (annotation.getAfterGroups().length != 0) { 364 initGroups(IAfterGroups.class); 365 } 366 if (annotation.getBeforeTestClass()) { 367 initGroups(IBeforeClass.class); 368 } 369 if (annotation.getAfterTestClass()) { 370 initGroups(IAfterClass.class); 371 } 372 if (annotation.getBeforeTestMethod()) { 373 initGroups(IBeforeMethod.class); 374 } 375 if (annotation.getAfterTestMethod()) { 376 initGroups(IAfterMethod.class); 377 } 378 } 379 else { 380 initGroups(IConfigurationAnnotation.class); 381 } 382 383 // If this configuration method has inherit-groups=true, add the groups 384 // defined in the @Test class 385 if (inheritGroupsFromTestClass()) { 386 ITestAnnotation classAnnotation = m_annotationFinder.findAnnotation(m_methodClass, ITestAnnotation.class); 387 if (classAnnotation != null) { 388 String[] groups = classAnnotation.getGroups(); 389 Map<String, String> newGroups = Maps.newHashMap(); 390 for (String g : getGroups()) { 391 newGroups.put(g, g); 392 } 393 if (groups != null) { 394 for (String g : groups) { 395 newGroups.put(g, g); 396 } 397 setGroups(newGroups.values().toArray(new String[newGroups.size()])); 398 } 399 } 400 } 401 402 if (annotation != null) { 403 setTimeOut(annotation.getTimeOut()); 404 } 405 } 406 407 private static void ppp(String s) { 408 System.out.println("[ConfigurationMethod] " + s); 409 } 410 411 @Override 412 public ConfigurationMethod clone() { 413 ConfigurationMethod clone= new ConfigurationMethod(getConstructorOrMethod(), 414 getAnnotationFinder(), 415 isBeforeSuiteConfiguration(), 416 isAfterSuiteConfiguration(), 417 isBeforeTestConfiguration(), 418 isAfterTestConfiguration(), 419 isBeforeClassConfiguration(), 420 isAfterClassConfiguration(), 421 isBeforeMethodConfiguration(), 422 isAfterMethodConfiguration(), 423 getBeforeGroups(), 424 getAfterGroups(), 425 false /* do not call init() */, 426 getInstance() 427 ); 428 clone.m_testClass= getTestClass(); 429 clone.setDate(getDate()); 430 clone.setGroups(getGroups()); 431 clone.setGroupsDependedUpon(getGroupsDependedUpon(), Collections.<String>emptyList()); 432 clone.setMethodsDependedUpon(getMethodsDependedUpon()); 433 clone.setAlwaysRun(isAlwaysRun()); 434 clone.setMissingGroup(getMissingGroup()); 435 clone.setDescription(getDescription()); 436 clone.setEnabled(getEnabled()); 437 clone.setParameterInvocationCount(getParameterInvocationCount()); 438 clone.m_inheritGroupsFromTestClass= inheritGroupsFromTestClass(); 439 440 return clone; 441 } 442 443 public boolean isFirstTimeOnly() { 444 boolean result = false; 445 IAnnotation before = m_annotationFinder.findAnnotation(getMethod(), IBeforeMethod.class); 446 if (before != null) { 447 result = ((ConfigurationAnnotation) before).isFirstTimeOnly(); 448 } 449 return result; 450 } 451 452 public boolean isLastTimeOnly() { 453 boolean result = false; 454 IAnnotation before = m_annotationFinder.findAnnotation(getMethod(), IAfterMethod.class); 455 if (before != null) { 456 result = ((ConfigurationAnnotation) before).isLastTimeOnly(); 457 } 458 return result; 459 } 460 461 } 462 463