• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
ConfigurationMethod(ConstructorOrMethod com, IAnnotationFinder annotationFinder, boolean isBeforeSuite, boolean isAfterSuite, boolean isBeforeTest, boolean isAfterTest, boolean isBeforeClass, boolean isAfterClass, boolean isBeforeMethod, boolean isAfterMethod, String[] beforeGroups, String[] afterGroups, boolean initialize, Object instance)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
ConfigurationMethod(Method method, IAnnotationFinder annotationFinder, boolean isBeforeSuite, boolean isAfterSuite, boolean isBeforeTest, boolean isAfterTest, boolean isBeforeClass, boolean isAfterClass, boolean isBeforeMethod, boolean isAfterMethod, String[] beforeGroups, String[] afterGroups, Object instance)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 
ConfigurationMethod(ConstructorOrMethod com, IAnnotationFinder annotationFinder, boolean isBeforeSuite, boolean isAfterSuite, boolean isBeforeTest, boolean isAfterTest, boolean isBeforeClass, boolean isAfterClass, boolean isBeforeMethod, boolean isAfterMethod, String[] beforeGroups, String[] afterGroups, Object instance)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 
createMethods(ITestNGMethod[] methods, IAnnotationFinder finder, boolean isBeforeSuite, boolean isAfterSuite, boolean isBeforeTest, boolean isAfterTest, boolean isBeforeClass, boolean isAfterClass, boolean isBeforeMethod, boolean isAfterMethod, String[] beforeGroups, String[] afterGroups, Object instance)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 
createSuiteConfigurationMethods(ITestNGMethod[] methods, IAnnotationFinder annotationFinder, boolean isBefore, Object instance)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 
createTestConfigurationMethods(ITestNGMethod[] methods, IAnnotationFinder annotationFinder, boolean isBefore, Object instance)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 
createClassConfigurationMethods(ITestNGMethod[] methods, IAnnotationFinder annotationFinder, boolean isBefore, Object instance)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 
createBeforeConfigurationMethods(ITestNGMethod[] methods, IAnnotationFinder annotationFinder, boolean isBefore, Object instance)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 
createAfterConfigurationMethods(ITestNGMethod[] methods, IAnnotationFinder annotationFinder, boolean isBefore, Object instance)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 
createTestMethodConfigurationMethods(ITestNGMethod[] methods, IAnnotationFinder annotationFinder, boolean isBefore, Object instance)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
isAfterClassConfiguration()272   public boolean isAfterClassConfiguration() {
273     return m_isAfterClassConfiguration;
274   }
275   /**
276    * @return Returns the isAfterMethodConfiguration.
277    */
278   @Override
isAfterMethodConfiguration()279   public boolean isAfterMethodConfiguration() {
280     return m_isAfterMethodConfiguration;
281   }
282   /**
283    * @return Returns the isBeforeClassConfiguration.
284    */
285   @Override
isBeforeClassConfiguration()286   public boolean isBeforeClassConfiguration() {
287     return m_isBeforeClassConfiguration;
288   }
289   /**
290    * @return Returns the isBeforeMethodConfiguration.
291    */
292   @Override
isBeforeMethodConfiguration()293   public boolean isBeforeMethodConfiguration() {
294     return m_isBeforeMethodConfiguration;
295   }
296 
297 
298   /**
299    * @return Returns the isAfterSuiteConfiguration.
300    */
301   @Override
isAfterSuiteConfiguration()302   public boolean isAfterSuiteConfiguration() {
303     return m_isAfterSuiteConfiguration;
304   }
305 
306   /**
307    * @return Returns the isBeforeSuiteConfiguration.
308    */
309   @Override
isBeforeSuiteConfiguration()310   public boolean isBeforeSuiteConfiguration() {
311     return m_isBeforeSuiteConfiguration;
312   }
313 
314   @Override
isBeforeTestConfiguration()315   public boolean isBeforeTestConfiguration() {
316     return m_isBeforeTestConfiguration;
317   }
318 
319   @Override
isAfterTestConfiguration()320   public boolean isAfterTestConfiguration() {
321     return m_isAfterTestConfiguration;
322   }
323 
324   @Override
isBeforeGroupsConfiguration()325   public boolean isBeforeGroupsConfiguration() {
326     return m_beforeGroups != null && m_beforeGroups.length > 0;
327   }
328 
329   @Override
isAfterGroupsConfiguration()330   public boolean isAfterGroupsConfiguration() {
331     return m_afterGroups != null && m_afterGroups.length > 0;
332   }
333 
inheritGroupsFromTestClass()334   private boolean inheritGroupsFromTestClass() {
335     return m_inheritGroupsFromTestClass;
336   }
337 
init()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 
ppp(String s)407   private static void ppp(String s) {
408     System.out.println("[ConfigurationMethod] " + s);
409   }
410 
411   @Override
clone()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 
isFirstTimeOnly()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 
isLastTimeOnly()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