package test.reports;
import org.testng.Assert;
import org.testng.IReporter;
import org.testng.ITestNGListener;
import org.testng.TestNG;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.testng.reporters.EmailableReporter;
import org.testng.reporters.EmailableReporter2;
import test.SimpleBaseTest;
import java.io.File;
import java.lang.reflect.Method;
import java.security.Permission;
public class EmailableReporterTest extends SimpleBaseTest {
private SecurityManager manager;
@BeforeClass(alwaysRun = true)
public void setup() {
manager = System.getSecurityManager();
System.setSecurityManager(new MySecurityManager(manager));
}
@AfterClass(alwaysRun = true)
public void cleanup() {
System.setSecurityManager(manager);
}
@Test(dataProvider = "getReporterInstances", priority = 1)
public void testReportsNameCustomizationViaRunMethodInvocationAndJVMArguments(IReporter reporter, String jvm) {
runTestViaRunMethod(reporter, jvm);
}
@Test(dataProvider = "getReporterInstances", priority = 2)
public void testReportsNameCustomizationViaRunMethodInvocation(IReporter reporter) {
runTestViaRunMethod(reporter, null /* no jvm arguments */);
}
@Test(dataProvider = "getReporterNames", priority = 3)
public void testReportsNameCustomizationViaMainMethodInvocation(String clazzName) {
runTestViaMainMethod(clazzName, null /* no jvm arguments */);
}
@Test(dataProvider = "getReporterNames", priority = 4)
public void testReportsNameCustomizationViaMainMethodInvocationAndJVMArguments(String clazzName, String jvm) {
runTestViaMainMethod(clazzName, jvm);
}
@DataProvider(name = "getReporterInstances")
public Object[][] getReporterInstances(Method method) {
if (method.getName().toLowerCase().contains("jvmarguments")) {
return new Object[][] {
{new EmailableReporter(), "emailable.report.name"},
{new EmailableReporter2(), "emailable.report2.name"}
};
}
return new Object[][] {
{new EmailableReporter()},
{new EmailableReporter2()}
};
}
@DataProvider(name = "getReporterNames")
public Object[][] getReporterNames(Method method) {
if (method.getName().toLowerCase().contains("jvmarguments")) {
return new Object[][] {
{EmailableReporter.class.getName(), "emailable.report.name"},
{EmailableReporter2.class.getName(), "emailable.report2.name"}
};
}
return new Object[][] {
{EmailableReporter.class.getName()},
{EmailableReporter2.class.getName()}
};
}
private void runTestViaMainMethod(String clazzName, String jvm) {
String name = Long.toString(System.currentTimeMillis());
File output = createDirInTempDir(name);
String filename = "report" + name + ".html";
String[] args = {"-d", output.getAbsolutePath(), "-reporter", clazzName +
":fileName=" + filename, "src/test/resources/1332.xml"};
try {
if (jvm != null) {
System.setProperty(jvm, filename);
}
TestNG.main(args);
if (jvm != null) {
//reset the jvm arguments
System.setProperty(jvm, "");
}
} catch (SecurityException t) {
//Gobble Security exception
}
File actual = new File(output.getAbsolutePath(), filename);
Assert.assertEquals(actual.exists(), true);
}
private void runTestViaRunMethod(IReporter reporter, String jvm) {
String name = Long.toString(System.currentTimeMillis());
File output = createDirInTempDir(name);
String filename = "report" + name + ".html";
if (jvm != null) {
System.setProperty(jvm, filename);
}
TestNG testNG = create();
testNG.setOutputDirectory(output.getAbsolutePath());
if (reporter instanceof EmailableReporter2) {
((EmailableReporter2) reporter).setFileName(filename);
}
if (reporter instanceof EmailableReporter) {
((EmailableReporter) reporter).setFileName(filename);
}
testNG.addListener((ITestNGListener) reporter);
testNG.setTestClasses(new Class[] {ReporterSample.class});
testNG.run();
if (jvm != null) {
//reset the jvm argument if it was set
System.setProperty(jvm, "");
}
File actual = new File(output.getAbsolutePath(), filename);
Assert.assertEquals(actual.exists(), true);
}
public static class MySecurityManager extends SecurityManager {
private SecurityManager baseSecurityManager;
MySecurityManager(SecurityManager baseSecurityManager) {
this.baseSecurityManager = baseSecurityManager;
}
@Override
public void checkPermission(Permission permission) {
if (permission.getName().startsWith("exitVM")) {
throw new SecurityException("System exit not allowed");
}
if (baseSecurityManager != null) {
baseSecurityManager.checkPermission(permission);
}
}
}
}