package test; import org.testng.Assert; import org.testng.ITestNGListener; import org.testng.ITestNGMethod; import org.testng.ITestResult; import org.testng.TestNG; import org.testng.annotations.ITestAnnotation; import org.testng.collections.Lists; import org.testng.internal.annotations.AnnotationHelper; import org.testng.internal.annotations.DefaultAnnotationTransformer; import org.testng.internal.annotations.IAnnotationFinder; import org.testng.internal.annotations.JDK15AnnotationFinder; import org.testng.xml.XmlClass; import org.testng.xml.XmlGroups; import org.testng.xml.XmlInclude; import org.testng.xml.XmlPackage; import org.testng.xml.XmlRun; import org.testng.xml.XmlSuite; import org.testng.xml.XmlTest; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.regex.Pattern; public class SimpleBaseTest { // System property specifying where the resources (e.g. xml files) can be found private static final String TEST_RESOURCES_DIR = "test.resources.dir"; public static InvokedMethodNameListener run(Class<?>... testClasses) { TestNG tng = create(testClasses); InvokedMethodNameListener listener = new InvokedMethodNameListener(); tng.addListener((ITestNGListener) listener); tng.run(); return listener; } public static TestNG create() { TestNG result = new TestNG(); result.setUseDefaultListeners(false); result.setVerbose(0); return result; } public static TestNG create(Class<?>... testClasses) { TestNG result = create(); result.setTestClasses(testClasses); return result; } protected static TestNG create(Path outputDir, Class<?>... testClasses) { TestNG result = create(testClasses); result.setOutputDirectory(outputDir.toAbsolutePath().toString()); return result; } protected static TestNG create(XmlSuite... suites) { return create(Arrays.asList(suites)); } protected static TestNG create(List<XmlSuite> suites) { TestNG result = create(); result.setXmlSuites(suites); return result; } protected static TestNG create(Path outputDir, XmlSuite... suites) { return create(outputDir, Arrays.asList(suites)); } protected static TestNG create(Path outputDir, List<XmlSuite> suites) { TestNG result = create(suites); result.setOutputDirectory(outputDir.toAbsolutePath().toString()); return result; } protected static TestNG createTests(String suiteName, Class<?>... testClasses) { return createTests(null, suiteName, testClasses); } protected static TestNG createTests(Path outDir,String suiteName, Class<?>... testClasses) { XmlSuite suite = createXmlSuite(suiteName); int i=0; for (Class<?> testClass : testClasses) { createXmlTest(suite, testClass.getName() + i, testClass); i++; } if (outDir == null) { return create(suite); } return create(outDir, suite); } protected static XmlSuite createXmlSuite(String name) { XmlSuite result = new XmlSuite(); result.setName(name); return result; } protected static XmlSuite createXmlSuite(Map<String, String> params) { XmlSuite result = createXmlSuite(UUID.randomUUID().toString()); result.setParameters(params); return result; } protected static XmlSuite createXmlSuite(String suiteName, String testName, Class<?>... classes) { XmlSuite suite = createXmlSuite(suiteName); createXmlTest(suite, testName, classes); return suite; } protected static XmlTest createXmlTestWithPackages(XmlSuite suite, String name, String ...packageName) { XmlTest result = createXmlTest(suite, name); List<XmlPackage> xmlPackages = Lists.newArrayList(); for (String each : packageName) { XmlPackage xmlPackage = new XmlPackage(); xmlPackage.setName(each); xmlPackages.add(xmlPackage); } result.setPackages(xmlPackages); return result; } protected static XmlTest createXmlTest(XmlSuite suite, String name) { XmlTest result = new XmlTest(suite); result.setName(name); return result; } protected static XmlTest createXmlTest(XmlSuite suite, String name, Map<String, String> params) { XmlTest result = new XmlTest(suite); result.setName(name); result.setParameters(params); return result; } protected static XmlTest createXmlTest(XmlSuite suite, String name, Class<?>... classes) { XmlTest result = createXmlTest(suite, name); int index = 0; for (Class<?> c : classes) { XmlClass xc = new XmlClass(c.getName(), index++, true /* load classes */); result.getXmlClasses().add(xc); } return result; } protected static XmlClass createXmlClass(XmlTest test, Class<?> testClass) { XmlClass clazz = new XmlClass(testClass); test.getXmlClasses().add(clazz); return clazz; } protected static XmlClass createXmlClass(XmlTest test, Class<?> testClass, Map<String, String> params) { XmlClass clazz = createXmlClass(test, testClass); clazz.setParameters(params); return clazz; } protected static XmlInclude createXmlInclude(XmlClass clazz, String method) { XmlInclude include = new XmlInclude(method); include.setXmlClass(clazz); clazz.getIncludedMethods().add(include); return include; } protected static XmlInclude createXmlInclude(XmlClass clazz, String method, Map<String, String> params) { XmlInclude include = createXmlInclude(clazz, method); include.setParameters(params); return include; } protected static XmlInclude createXmlInclude(XmlClass clazz, String method, int index, Integer... list) { XmlInclude include = new XmlInclude(method, Arrays.asList(list), index); include.setXmlClass(clazz); clazz.getIncludedMethods().add(include); return include; } protected static XmlGroups createXmlGroups(XmlSuite suite, String...includedGroupNames) { XmlGroups xmlGroups = createGroupIncluding(includedGroupNames); suite.setGroups(xmlGroups); return xmlGroups; } protected static XmlGroups createXmlGroups(XmlTest test, String...includedGroupNames) { XmlGroups xmlGroups = createGroupIncluding(includedGroupNames); test.setGroups(xmlGroups); return xmlGroups; } private static XmlGroups createGroupIncluding(String...groupNames) { XmlGroups xmlGroups = new XmlGroups(); XmlRun xmlRun = new XmlRun(); for (String group : groupNames) { xmlRun.onInclude(group); } xmlGroups.setRun(xmlRun); return xmlGroups; } protected static XmlTest createXmlTest(XmlSuite suite, String name, String... classes) { XmlTest result = createXmlTest(suite, name); int index = 0; for (String c : classes) { XmlClass xc = new XmlClass(c, index++, true /* load classes */); result.getXmlClasses().add(xc); } return result; } protected static void addMethods(XmlClass cls, String... methods) { int index = 0; for (String method : methods) { XmlInclude include = new XmlInclude(method, index++); cls.getIncludedMethods().add(include); } } public static String getPathToResource(String fileName) { String result = System.getProperty(TEST_RESOURCES_DIR); if (result == null) { throw new IllegalArgumentException("System property " + TEST_RESOURCES_DIR + " was not defined."); } return result + File.separatorChar + fileName; } public static List<ITestNGMethod> extractTestNGMethods(Class<?>... classes) { XmlSuite xmlSuite = new XmlSuite(); xmlSuite.setName("suite"); XmlTest xmlTest = createXmlTest(xmlSuite, "tests", classes); IAnnotationFinder annotationFinder = new JDK15AnnotationFinder(new DefaultAnnotationTransformer()); List<ITestNGMethod> methods = Lists.newArrayList(); for (Class<?> clazz : classes) { methods.addAll( Arrays.asList( AnnotationHelper.findMethodsWithAnnotation(clazz, ITestAnnotation.class, annotationFinder, xmlTest) ) ); } return methods; } /** * Compare a list of ITestResult with a list of String method names, */ protected static void assertTestResultsEqual(List<ITestResult> results, List<String> methods) { List<String> resultMethods = Lists.newArrayList(); for (ITestResult r : results) { resultMethods.add(r.getMethod().getMethodName()); } Assert.assertEquals(resultMethods, methods); } /** * Deletes all files and subdirectories under dir. */ protected static void deleteDir(File dir) { try { Files.walkFileTree(dir.toPath(), new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { Files.delete(dir); return FileVisitResult.CONTINUE; } }); } catch (IOException e) { e.printStackTrace(); } } protected static File createDirInTempDir(String dir) { File slashTmpDir = new File(System.getProperty("java.io.tmpdir")); File mTempDirectory = new File(slashTmpDir, dir); mTempDirectory.mkdirs(); mTempDirectory.deleteOnExit(); return mTempDirectory; } /** * * @param fileName The filename to parse * @param regexp The regular expression * @param resultLines An out parameter that will contain all the lines * that matched the regexp * @return A List<Integer> containing the lines of all the matches * * Note that the size() of the returned valuewill always be equal to * result.size() at the end of this function. */ protected static List<Integer> grep(File fileName, String regexp, List<String> resultLines) { List<Integer> resultLineNumbers = new ArrayList<>(); try (BufferedReader fr = new BufferedReader(new FileReader(fileName))) { String line; int currentLine = 0; Pattern p = Pattern.compile(".*" + regexp + ".*"); while ((line = fr.readLine()) != null) { if (p.matcher(line).matches()) { resultLines.add(line); resultLineNumbers.add(currentLine); } currentLine++; } } catch (IOException e) { e.printStackTrace(); } return resultLineNumbers; } }