package hudson.plugins.testng;
import java.io.IOException;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.BuildListener;
import hudson.model.FreeStyleBuild;
import hudson.model.FreeStyleProject;
import hudson.plugins.testng.util.TestResultHistoryUtil;
import hudson.tasks.test.AbstractTestResultAction;
import hudson.tasks.test.TestResult;
import hudson.util.ChartUtil;
import hudson.util.DataSetBuilder;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.TestBuilder;
/**
* Tests for {@link TestNGProjectAction}
*
* @author nullin
*/
public class TestNGProjectActionTest {
@Rule
public JenkinsRule r = new JenkinsRule();
/**
* Test:
*
* 1. Make sure that settings configured in Project are saved
* correctly in ProjectAction.
* 2. Also validate that the latest build result is returned correctly by
* ProjectAction
* 3. And, verify that results are read correctly even when XML file doesn't have
* 'testng' string in the name at all
*
* @throws Exception
*/
@Test
public void testSettings() throws Exception {
FreeStyleProject p = r.createFreeStyleProject();
Publisher publisher = new Publisher();
publisher.setReportFilenamePattern("some.xml");
publisher.setEscapeTestDescp(false);
publisher.setEscapeExceptionMsg(true);
p.getPublishersList().add(publisher);
p.onCreatedFromScratch(); //to setup project action
p.getBuildersList().add(new TestBuilder() {
@Override
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher,
BuildListener listener) throws InterruptedException, IOException {
//any testng xml will do
String contents = CommonUtil.getContents(Constants.TESTNG_XML_EXP_MSG_XML);
build.getWorkspace().child("some.xml").write(contents,"UTF-8");
return true;
}
});
//run build
FreeStyleBuild build = p.scheduleBuild2(0).get();
//assert of test result
Assert.assertNotNull(build.getAction(AbstractTestResultAction.class));
TestResult testResult;
Assert.assertNotNull(testResult = (TestResult) build.getAction(AbstractTestResultAction.class).getResult());
Assert.assertTrue(testResult.getTotalCount() > 0);
//assert on project action
TestNGProjectAction projAction;
Assert.assertNotNull(projAction = build.getProject().getAction(TestNGProjectAction.class));
Assert.assertFalse(projAction.getEscapeTestDescp());
Assert.assertTrue(projAction.getEscapeExceptionMsg());
Assert.assertSame(testResult, projAction.getLastCompletedBuildAction().getResult());
String summary = TestResultHistoryUtil.toSummary(projAction.getLastCompletedBuildAction());
Assert.assertTrue(summary.contains("gov.nasa.jpl.FoobarTests.b"));
}
@Test
// For JENKINS-32746: TestNG Results Trend graph doesn't show all build results
public void testHistoryRemoval() throws Exception {
FreeStyleProject p = r.createFreeStyleProject();
Publisher publisher = new Publisher();
publisher.setReportFilenamePattern("some.xml");
publisher.setEscapeTestDescp(false);
publisher.setEscapeExceptionMsg(true);
p.getPublishersList().add(publisher);
p.onCreatedFromScratch(); //to setup project action
p.getBuildersList().add(new TestBuilder() {
@Override
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher,
BuildListener listener) throws InterruptedException, IOException {
//any testng xml will do
String contents = CommonUtil.getContents(Constants.TESTNG_XML_EXP_MSG_XML);
build.getWorkspace().child("some.xml").write(contents,"UTF-8");
return true;
}
});
//run build
int buildNumber = 5;
FreeStyleBuild[] builds = new FreeStyleBuild[buildNumber];
for (int i = 0; i < buildNumber; i++) {
builds[i] = p.scheduleBuild2(0).get();
}
TestNGProjectAction action = p.getAction(TestNGProjectAction.class);
DataSetBuilder<String, ChartUtil.NumberOnlyBuildLabel> dataSetBuilder = new DataSetBuilder<String, ChartUtil.NumberOnlyBuildLabel>();
action.populateDataSetBuilder(dataSetBuilder);
Assert.assertEquals(buildNumber, dataSetBuilder.build().getColumnCount());
int[] buildsToRemove = { 2, 3 };
for (int buildToRemove : buildsToRemove) {
builds[buildToRemove].delete();
}
dataSetBuilder = new DataSetBuilder<String, ChartUtil.NumberOnlyBuildLabel>();
action.populateDataSetBuilder(dataSetBuilder);
Assert.assertEquals((buildNumber - buildsToRemove.length), dataSetBuilder.build().getColumnCount());
}
}