Home | History | Annotate | Download | only in test
      1 package test;
      2 
      3 
      4 import java.io.BufferedReader;
      5 import java.io.File;
      6 import java.io.FileReader;
      7 import java.io.IOException;
      8 import java.util.ArrayList;
      9 import java.util.Arrays;
     10 import java.util.Collection;
     11 import java.util.HashMap;
     12 import java.util.List;
     13 import java.util.Map;
     14 import java.util.Set;
     15 import java.util.regex.Pattern;
     16 
     17 import org.testng.Assert;
     18 import org.testng.IClassListener;
     19 import org.testng.IInvokedMethodListener;
     20 import org.testng.ISuite;
     21 import org.testng.ITestResult;
     22 import org.testng.ITestRunnerFactory;
     23 import org.testng.SuiteRunner;
     24 import org.testng.TestListenerAdapter;
     25 import org.testng.TestRunner;
     26 import org.testng.annotations.BeforeMethod;
     27 import org.testng.collections.Lists;
     28 import org.testng.internal.Configuration;
     29 import org.testng.internal.IConfiguration;
     30 import org.testng.reporters.JUnitXMLReporter;
     31 import org.testng.reporters.TestHTMLReporter;
     32 import org.testng.xml.XmlClass;
     33 import org.testng.xml.XmlInclude;
     34 import org.testng.xml.XmlMethodSelector;
     35 import org.testng.xml.XmlPackage;
     36 import org.testng.xml.XmlSuite;
     37 import org.testng.xml.XmlTest;
     38 
     39 /**
     40  * Base class for tests
     41  *
     42  * @author Cedric Beust, May 5, 2004
     43  *
     44  */
     45 public class BaseTest extends BaseDistributedTest {
     46   private static final String m_outputDirectory= "test-output-tests";
     47 
     48   private XmlSuite m_suite= null;
     49   private ITestRunnerFactory m_testRunnerFactory;
     50   private IConfiguration m_configuration;
     51 
     52   private Integer m_verbose = null;
     53 
     54   public BaseTest() {
     55     m_testRunnerFactory= new InternalTestRunnerFactory(this);
     56     m_configuration = new Configuration();
     57   }
     58 
     59   private IConfiguration getConfiguration() {
     60     return m_configuration;
     61   }
     62 
     63   protected void setDebug() {
     64     getTest().setVerbose(9);
     65   }
     66 
     67   protected void setParallel(XmlSuite.ParallelMode parallel) {
     68     getTest().setParallel(parallel);
     69   }
     70 
     71   protected void setVerbose(int n) {
     72     m_verbose = n;
     73   }
     74 
     75   protected void setTestTimeOut(long n) {
     76       getTest().setTimeOut(n);
     77   }
     78 
     79   protected void setSuiteTimeOut(long n) {
     80       m_suite.setTimeOut(Long.toString(n));
     81   }
     82 
     83   protected void setJUnit(boolean f) {
     84     getTest().setJUnit(f);
     85   }
     86 
     87   protected void setThreadCount(int count) {
     88     getTest().getSuite().setThreadCount(count);
     89   }
     90 
     91   private Map<Long, XmlTest> m_tests= new HashMap<>();
     92   private Map<Long, Map> m_passedTests= new HashMap<>();
     93   private Map<Long, Map> m_failedTests= new HashMap<>();
     94   private Map<Long, Map> m_skippedTests= new HashMap<>();
     95   private Map<Long, XmlTest> m_testConfigs= new HashMap<>();
     96   private Map<Long, Map> m_passedConfigs= new HashMap<>();
     97   private Map<Long, Map> m_failedConfigs= new HashMap<>();
     98   private Map<Long, Map> m_skippedConfigs= new HashMap<>();
     99   private Map<Long, Map> m_failedButWithinSuccessPercentageTests= new HashMap<>();
    100 
    101   protected Map<String, List<ITestResult>> getTests(Map<Long, Map> map) {
    102     Map<String, List<ITestResult>> result= map.get(getId());
    103     if(null == result) {
    104       result= new HashMap<>();
    105       map.put(getId(), result);
    106     }
    107 
    108     return result;
    109   }
    110 
    111   protected XmlTest getTest() {
    112     return m_tests.get(getId());
    113   }
    114 
    115   protected void setTests(Map<Long, Map> map, Map m) {
    116     map.put(getId(), m);
    117   }
    118 
    119   public Map<String, List<ITestResult>> getFailedTests() {
    120     return getTests(m_failedTests);
    121   }
    122 
    123   public Map<String, List<ITestResult>> getFailedButWithinSuccessPercentageTests() {
    124     return getTests(m_failedButWithinSuccessPercentageTests);
    125   }
    126 
    127   public Map<String, List<ITestResult>> getPassedTests() {
    128     return getTests(m_passedTests);
    129   }
    130 
    131   public Map<String, List<ITestResult>> getSkippedTests() {
    132     return getTests(m_skippedTests);
    133   }
    134 
    135   public Map<String, List<ITestResult>> getFailedConfigs() {
    136     return getTests(m_failedConfigs);
    137   }
    138 
    139   public Map<String, List<ITestResult>> getPassedConfigs() {
    140     return getTests(m_passedConfigs);
    141   }
    142 
    143   public Map<String, List<ITestResult>> getSkippedConfigs() {
    144     return getTests(m_skippedConfigs);
    145   }
    146 
    147   public void setSkippedTests(Map m) {
    148     setTests(m_skippedTests, m);
    149   }
    150 
    151   public void setPassedTests(Map m) {
    152     setTests(m_passedTests, m);
    153   }
    154 
    155   public void setFailedTests(Map m) {
    156     setTests(m_failedTests, m);
    157   }
    158 
    159   public void setFailedButWithinSuccessPercentageTests(Map m) {
    160     setTests(m_failedButWithinSuccessPercentageTests, m);
    161   }
    162 
    163   public void setSkippedConfigs(Map m) {
    164     setTests(m_skippedConfigs, m);
    165   }
    166 
    167   public void setPassedConfigs(Map m) {
    168     setTests(m_passedConfigs, m);
    169   }
    170 
    171   public void setFailedConfigs(Map m) {
    172     setTests(m_failedConfigs, m);
    173   }
    174 
    175 
    176   protected void run() {
    177     assert null != getTest() : "Test wasn't set, maybe @Configuration methodSetUp() was never called";
    178     setPassedTests(new HashMap());
    179     setFailedTests(new HashMap());
    180     setSkippedTests(new HashMap());
    181     setPassedConfigs(new HashMap());
    182     setFailedConfigs(new HashMap());
    183     setSkippedConfigs(new HashMap());
    184     setFailedButWithinSuccessPercentageTests(new HashMap());
    185 
    186     m_suite.setVerbose(m_verbose != null ? m_verbose : 0);
    187     SuiteRunner suite = new SuiteRunner(m_configuration,
    188         m_suite, m_outputDirectory, m_testRunnerFactory);
    189 
    190     suite.run();
    191   }
    192 
    193   protected void addMethodSelector(String className, int priority) {
    194     XmlMethodSelector methodSelector= new XmlMethodSelector();
    195     methodSelector.setName(className);
    196     methodSelector.setPriority(priority);
    197     getTest().getMethodSelectors().add(methodSelector);
    198   }
    199 
    200   protected XmlClass addClass(Class<?> cls) {
    201     return addClass(cls.getName());
    202   }
    203 
    204   protected XmlClass addClass(String className) {
    205     XmlClass result= new XmlClass(className);
    206     getTest().getXmlClasses().add(result);
    207 
    208     return result;
    209   }
    210 
    211   protected void setBeanShellExpression(String expression) {
    212     getTest().setBeanShellExpression(expression);
    213   }
    214 
    215   protected void addPackage(String pkgName, String[] included, String[] excluded) {
    216     XmlPackage pkg= new XmlPackage();
    217     pkg.setName(pkgName);
    218     pkg.getInclude().addAll(Arrays.asList(included));
    219     pkg.getExclude().addAll(Arrays.asList(excluded));
    220     getTest().getSuite().getXmlPackages().add(pkg);
    221   }
    222 
    223   private XmlClass findClass(String className) {
    224     for(XmlClass cl : getTest().getXmlClasses()) {
    225       if(cl.getName().equals(className)) {
    226         return cl;
    227       }
    228     }
    229 
    230     XmlClass result= addClass(className);
    231 
    232     return result;
    233   }
    234 
    235   public void addIncludedMethod(String className, String m) {
    236     XmlClass xmlClass= findClass(className);
    237     xmlClass.getIncludedMethods().add(new XmlInclude(m));
    238     getTest().getXmlClasses().add(xmlClass);
    239   }
    240 
    241   public void addExcludedMethod(String className, String m) {
    242     XmlClass xmlClass= findClass(className);
    243     xmlClass.getExcludedMethods().add(m);
    244     getTest().getXmlClasses().add(xmlClass);
    245   }
    246 
    247   public void addIncludedGroup(String g) {
    248     getTest().addIncludedGroup(g);
    249   }
    250 
    251   public void addExcludedGroup(String g) {
    252     getTest().addExcludedGroup(g);
    253   }
    254 
    255   public void addMetaGroup(String mg, List<String> l) {
    256     getTest().getMetaGroups().put(mg, l);
    257   }
    258 
    259   public void addMetaGroup(String mg, String n) {
    260     List<String> l= new ArrayList<>();
    261     l.add(n);
    262     addMetaGroup(mg, l);
    263   }
    264 
    265   public void setParameter(String key, String value) {
    266     getTest().addParameter(key, value);
    267   }
    268 
    269 //  @Configuration(beforeTestMethod = true, groups = { "init", "initTest"})
    270   @BeforeMethod(groups= { "init", "initTest" })
    271   public void methodSetUp() {
    272     m_suite= new XmlSuite();
    273     m_suite.setName("Internal_suite");
    274     XmlTest xmlTest= new XmlTest(m_suite);
    275     xmlTest.setName("Internal_test_failures_are_expected");
    276     m_tests.put(getId(), xmlTest);
    277   }
    278 
    279   private void addTest(Map<String, List<ITestResult>> tests, ITestResult t) {
    280     List<ITestResult> l= tests.get(t.getMethod().getMethodName());
    281     if(null == l) {
    282       l= new ArrayList<>();
    283       tests.put(t.getMethod().getMethodName(), l);
    284     }
    285     l.add(t);
    286   }
    287 
    288   public void addPassedTest(ITestResult t) {
    289     addTest(getPassedTests(), t);
    290   }
    291 
    292   public void addFailedTest(ITestResult t) {
    293     addTest(getFailedTests(), t);
    294   }
    295 
    296   public void addFailedButWithinSuccessPercentageTest(ITestResult t) {
    297     addTest(getFailedButWithinSuccessPercentageTests(), t);
    298   }
    299 
    300   public void addSkippedTest(ITestResult t) {
    301     addTest(getSkippedTests(), t);
    302   }
    303 
    304   public void addPassedConfig(ITestResult t) {
    305     addTest(getPassedConfigs(), t);
    306   }
    307 
    308   public void addFailedConfig(ITestResult t) {
    309     addTest(getFailedConfigs(), t);
    310   }
    311 
    312   public void addSkippedConfig(ITestResult t) {
    313     addTest(getSkippedConfigs(), t);
    314   }
    315 
    316   private void ppp(String s) {
    317     System.out.println("[BaseTest " + getId() + "] " + s);
    318   }
    319 
    320   protected Long getId() {
    321     return 42L;
    322 //    long result = Thread.currentThread().getId();
    323 ////    System.out.println("RETURNING ID " + result);
    324 //    return result;
    325   }
    326 
    327   public XmlSuite getSuite() {
    328     return m_suite;
    329   }
    330 
    331   public void setSuite(XmlSuite suite) {
    332     m_suite = suite;
    333   }
    334 
    335   /**
    336    * Used for instanceCount testing, when we need to look inside the
    337    * TestResult to count the various SUCCESS/FAIL/FAIL_BUT_OK
    338    */
    339   protected void verifyResults(Map<String, List<ITestResult>> tests,
    340                                int expected,
    341                                String message) {
    342     if(tests.size() > 0) {
    343       Set keys= tests.keySet();
    344       Object firstKey= keys.iterator().next();
    345       List<ITestResult> passedResult= tests.get(firstKey);
    346       int n= passedResult.size();
    347       assert n == expected : "Expected " + expected + " " + message + " but found " + n;
    348     }
    349     else {
    350       assert expected == 0 : "Expected " + expected + " " + message + " but found "
    351         + tests.size();
    352     }
    353   }
    354 
    355   protected void dumpResults(String name, Map<String, List<ITestResult>> tests) {
    356     ppp("============= " + name);
    357     for(Map.Entry<String, List<ITestResult>> entry : tests.entrySet()) {
    358       ppp("TEST:" + entry.getKey());
    359       List<ITestResult> l= entry.getValue();
    360       for(ITestResult tr : l) {
    361         ppp("   " + tr);
    362       }
    363     }
    364   }
    365 
    366   protected static void verifyInstanceNames(String title, Map<String, List<ITestResult>> actual,
    367       String[] expected)
    368   {
    369     List<String> actualNames = Lists.newArrayList();
    370     for (Map.Entry<String, List<ITestResult>> es : actual.entrySet()) {
    371       for (ITestResult tr : es.getValue()) {
    372         Object instance = tr.getInstance();
    373         actualNames.add(es.getKey() + "#" + (instance != null ? instance.toString() : ""));
    374       }
    375     }
    376     Assert.assertEqualsNoOrder(actualNames.toArray(), expected);
    377   }
    378 
    379   protected void verifyPassedTests(String... expectedPassed) {
    380     verifyTests("Passed", expectedPassed, getPassedTests());
    381   }
    382 
    383   protected void verifyFailedTests(String... expectedFailed) {
    384     verifyTests("Failed", expectedFailed, getFailedTests());
    385   }
    386 
    387   /**
    388      *
    389      * @param fileName The filename to parse
    390      * @param regexp The regular expression
    391      * @param resultLines An out parameter that will contain all the lines
    392      * that matched the regexp
    393      * @return A List<Integer> containing the lines of all the matches
    394      *
    395      * Note that the size() of the returned valuewill always be equal to
    396      * result.size() at the end of this function.
    397      */
    398     public static List<Integer> grep(File fileName, String regexp, List<String> resultLines) {
    399       List<Integer> resultLineNumbers = new ArrayList<>();
    400       BufferedReader fr = null;
    401       try {
    402         fr = new BufferedReader(new FileReader(fileName));
    403         String line = fr.readLine();
    404         int currentLine = 0;
    405         Pattern p = Pattern.compile(".*" + regexp + ".*");
    406 
    407         while(null != line) {
    408   //        ppp("COMPARING " + p + " TO @@@" + line + "@@@");
    409           if(p.matcher(line).matches()) {
    410             resultLines.add(line);
    411             resultLineNumbers.add(currentLine);
    412           }
    413 
    414           line = fr.readLine();
    415           currentLine++;
    416         }
    417       } catch(IOException e) {
    418         e.printStackTrace();
    419       }
    420       finally {
    421         if(null != fr) {
    422           try {
    423             fr.close();
    424           }
    425           catch(IOException ex) {
    426             ex.printStackTrace();
    427           }
    428         }
    429       }
    430 
    431       return resultLineNumbers;
    432 
    433     }
    434 
    435   private static class InternalTestRunnerFactory implements ITestRunnerFactory {
    436     private final BaseTest m_baseTest;
    437 
    438     public InternalTestRunnerFactory(final BaseTest baseTest) {
    439       m_baseTest= baseTest;
    440     }
    441 
    442     /**
    443      * @see org.testng.ITestRunnerFactory#newTestRunner(org.testng.ISuite, org.testng.xml.XmlTest)
    444      */
    445     @Override
    446     public TestRunner newTestRunner(ISuite suite, XmlTest test,
    447         Collection<IInvokedMethodListener> listeners, List<IClassListener> classListeners) {
    448       TestRunner testRunner= new TestRunner(m_baseTest.getConfiguration(), suite, test, false,
    449           listeners, classListeners);
    450 
    451       testRunner.addTestListener(new TestHTMLReporter());
    452       testRunner.addTestListener(new JUnitXMLReporter());
    453       testRunner.addListener(new TestListener(m_baseTest));
    454       if (listeners != null) {
    455         for (IInvokedMethodListener l : listeners) {
    456           testRunner.addListener(l);
    457         }
    458       }
    459 
    460       return testRunner;
    461     }
    462   }
    463 
    464   /**
    465    *  Deletes all files and subdirectories under dir.
    466 
    467    *  @return true if all deletions were successful.
    468    *  If a deletion fails, the method stops attempting to delete and returns false.
    469    */
    470   public static boolean deleteDir(File dir) {
    471     if (dir.isDirectory()) {
    472       String[] children = dir.list();
    473       for (String element : children) {
    474         boolean success = deleteDir(new File(dir, element));
    475         if (!success) {
    476           return false;
    477         }
    478       }
    479     }
    480 
    481     // The directory is now empty so delete it
    482     return dir.delete();
    483   }
    484 
    485   protected void runTest(String cls, String[] passed, String[] failed, String[] skipped) {
    486     addClass(cls);
    487     run();
    488     verifyTests("Passed", passed, getPassedTests());
    489     verifyTests("Failed", failed, getFailedTests());
    490     verifyTests("Skipped", skipped, getSkippedTests());
    491   }
    492 
    493 } // BaseTest
    494 
    495 ////////////////////////////
    496 
    497 class TestListener extends TestListenerAdapter {
    498   private static BaseTest m_test= null;
    499 
    500   public TestListener(BaseTest t1) {
    501     m_test= t1;
    502   }
    503 
    504   @Override
    505   public void onTestSuccess(ITestResult tr) {
    506     m_test.addPassedTest(tr);
    507   }
    508 
    509   @Override
    510   public void onTestFailure(ITestResult tr) {
    511     m_test.addFailedTest(tr);
    512   }
    513 
    514   @Override
    515   public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
    516     m_test.addFailedButWithinSuccessPercentageTest(result);
    517   }
    518 
    519   @Override
    520   public void onTestSkipped(ITestResult tr) {
    521     m_test.addSkippedTest(tr);
    522   }
    523 
    524   @Override
    525   public void onConfigurationSuccess(ITestResult tr) {
    526     m_test.addPassedConfig(tr);
    527   }
    528 
    529   @Override
    530   public void onConfigurationFailure(ITestResult tr) {
    531     m_test.addFailedConfig(tr);
    532   }
    533 
    534   @Override
    535   public void onConfigurationSkip(ITestResult tr) {
    536     m_test.addSkippedConfig(tr);
    537   }
    538 
    539 } // TestListener
    540