package jetbrains.buildServer.xmlReportPlugin;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import jetbrains.buildServer.AgentServerFunctionalTestCase;
import jetbrains.buildServer.ExtensionHolder;
import jetbrains.buildServer.RunBuildException;
import jetbrains.buildServer.agent.*;
import jetbrains.buildServer.agent.duplicates.DuplicatesReporter;
import jetbrains.buildServer.agent.impl.SpringContextFixture;
import jetbrains.buildServer.agent.impl.SpringContextXmlBean;
import jetbrains.buildServer.agent.inspections.InspectionReporter;
import jetbrains.buildServer.serverSide.BuildStatisticsOptions;
import jetbrains.buildServer.serverSide.BuildTypeEx;
import jetbrains.buildServer.serverSide.SFinishedBuild;
import jetbrains.buildServer.serverSide.SRunningBuild;
import jetbrains.buildServer.util.EventDispatcher;
import jetbrains.buildServer.util.FileUtil;
import jetbrains.buildServer.xmlReportPlugin.parsers.antJUnit.AntJUnitFactory;
import org.jetbrains.annotations.NotNull;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* @User Victory.Bedrosova
* 12/16/13.
*/
@Test
@SpringContextFixture(beans = @SpringContextXmlBean(clazz = AntJUnitFactory.class))
public class XmlReportPluginIntegrationTest extends AgentServerFunctionalTestCase {
public static final String RUN_TYPE = "reportPublisher";
@NotNull
private File myCheckoutDir;
@NotNull
private File myOuterDir;
@BeforeClass
@Override
protected void setUpClass() {
super.setUpClass();
}
@BeforeMethod
@Override
protected void setUp1() throws Throwable {
super.setUp1();
myCheckoutDir = createTempDir();
myOuterDir = createTempDir();
new XmlReportPlugin(getExtensionHolder(),
getAgentEvents(),
getExtensionHolder().findSingletonService(InspectionReporter.class),
getExtensionHolder().findSingletonService(DuplicatesReporter.class),
getExtensionHolder().findSingletonService(BuildAgentConfiguration.class));
registerRunner(new AgentBuildRunner() {
@NotNull
public BuildProcess createBuildProcess(@NotNull final AgentRunningBuild runningBuild, @NotNull final BuildRunnerContext context) {
return new BuildProcess() {
public void start() { }
public boolean isInterrupted() { return false; }
public boolean isFinished() { return false; }
public void interrupt() { }
@NotNull
public BuildFinishedStatus waitFor() throws RunBuildException {
try {
final File reportFile = getCheckoutDirFile("report.xml");
FileUtil.writeFile(reportFile,
"\n" +
"\n" +
" \n" +
" \n" +
"\n",
"UTF-8"
);
// Make sure file is created after build start, as some
// filesystems have 1 second last-modified resolution.
assertTrue("Failed to update 'last-modified' attribute of report.xml", reportFile.setLastModified(reportFile.lastModified() + 1000));
final File resultFile = getCheckoutDirFile("result.xml");
FileUtil.writeFile(resultFile,
"\n" +
"\n" +
" \n" +
" \n" +
" \n" +
" junit.framework.AssertionFailedError: Assertion message from test\n" +
" at TestCase.test(Unknown Source)\n" +
" \n" +
" \n" +
"\n",
"UTF-8"
);
// Make sure file is created after build start, as some
// filesystems have 1 second last-modified resolution.
assertTrue("Failed to update 'last-modified' attribute of result.xml", resultFile.setLastModified(resultFile.lastModified() + 1000));
final File outerFile = getOuterDirFile("outer.xml");
FileUtil.writeFile(outerFile,
"\n" +
"\n" +
" \n" +
" \n" +
"\n",
"UTF-8"
);
// Make sure file is created after build start, as some
// filesystems have 1 second last-modified resolution.
assertTrue("Failed to update 'last-modified' attribute of outer.xml", outerFile.setLastModified(outerFile.lastModified() + 1000));
} catch (IOException e) {
throw new RunBuildException(e);
}
return BuildFinishedStatus.FINISHED_SUCCESS;
}
};
}
@NotNull
public AgentBuildRunnerInfo getRunnerInfo() {
return new AgentBuildRunnerInfo() {
@NotNull
public String getType() {
return RUN_TYPE;
}
public boolean canRun(@NotNull final BuildAgentConfiguration agentConfiguration) {
return true;
}
};
}
});
}
@NotNull
private File getCheckoutDirFile(@NotNull String name) {
return new File(myCheckoutDir, name);
}
@NotNull
private File getOuterDirFile(@NotNull String name) {
return new File(myOuterDir, name);
}
@Test
public void testUnexisting() throws Exception {
doTest("abrakadabra.xml", 0, "No reports found");
}
@Test
public void testUnexistingAbsolute() throws Exception {
doTest("##C_D##/abrakadabra.xml", 0, "No reports found");
}
@Test
public void testUnexistingMask() throws Exception {
doTest("abrakadabra*.xml", 0, "No reports found");
}
@Test
public void testUnexistingAbsoluteMask() throws Exception {
doTest("##C_D##/abrakadabra*.xml", 0, "No reports found");
}
@Test
public void testSingleFile() throws Exception {
doTest("report.xml", 1, "1 report found for paths");
}
@Test
public void testSingleMaskFile() throws Exception {
doTest("rep*.xml", 1, "1 report found for paths");
}
@Test
public void testSingleAbsoluteFile() throws Exception {
doTest("##C_D##/report.xml", 1, "1 report found for paths");
}
@Test
public void testSingleOuterFile() throws Exception {
doTest("##O_D##/outer.xml", 1, "1 report found for paths");
}
@Test
public void testSingleRelativeFile() throws Exception {
doTest("##C_D##/fold/../report.xml", 1, "1 report found for paths");
}
@Test
public void testSingleOuterRelativeFile() throws Exception {
doTest("##O_D##/fold/../outer.xml", 1, "1 report found for paths");
}
@Test
public void testSingleRelativeFileDot() throws Exception {
doTest("##C_D##/./report.xml", 1, "1 report found for paths");
}
@Test
public void testSingleOuterRelativeFileDot() throws Exception {
doTest("##O_D##/./outer.xml", 1, "1 report found for paths");
}
@Test
public void testSingleRelativeMaskFile() throws Exception {
doTest("##C_D##/fold/../rep*.xml", 1, "1 report found for paths");
}
@Test
public void testSingleOuterRelativeMaskFile() throws Exception {
doTest("##O_D##/fold/../out*.xml", 1, "1 report found for paths");
}
@Test
public void testSingleRelativeMaskFileDot() throws Exception {
doTest("##C_D##/./rep*.xml", 1, "1 report found for paths");
}
@Test
public void testSingleOuterRelativeMaskFileDot() throws Exception {
doTest("##O_D##/./out*.xml", 1, "1 report found for paths");
}
@Test
public void testSingleAbsoluteMaskFile() throws Exception {
doTest("##C_D##/rep*.xml", 1, "1 report found for paths");
}
@Test
public void testSingleOuterMaskFile() throws Exception {
doTest("##O_D##/out*.xml", 1, "1 report found for paths");
}
@Test
public void testSingleRule() throws Exception {
doTest("+:report.xml", 1, "1 report found for paths");
}
@Test
public void testSingleMaskRule() throws Exception {
doTest("+:rep*.xml", 1, "1 report found for paths");
}
@Test
public void testSingleAbsoluteRule() throws Exception {
doTest("+:##C_D##/report.xml", 1, "1 report found for paths");
}
@Test
public void testSingleOuterRule() throws Exception {
doTest("+:##O_D##/outer.xml", 1, "1 report found for paths");
}
@Test
public void testSingleRelativeRule() throws Exception {
doTest("+:##C_D##/fold/../report.xml", 1, "1 report found for paths");
}
@Test
public void testSingleOuterRelativeRule() throws Exception {
doTest("+:##O_D##/fold/../outer.xml", 1, "1 report found for paths");
}
@Test
public void testSingleRelativeRuleDor() throws Exception {
doTest("+:##C_D##/./report.xml", 1, "1 report found for paths");
}
@Test
public void testSingleOuterRelativeRuleDot() throws Exception {
doTest("+:##O_D##/./outer.xml", 1, "1 report found for paths");
}
@Test
public void testSingleRelativeMaskRule() throws Exception {
doTest("+:##C_D##/fold/../rep*.xml", 1, "1 report found for paths");
}
@Test
public void testSingleOuterRelativeMaskRule() throws Exception {
doTest("+:##O_D##/fold/../out*.xml", 1, "1 report found for paths");
}
@Test
public void testSingleRelativeMaskRuleDot() throws Exception {
doTest("+:##C_D##/./rep*.xml", 1, "1 report found for paths");
}
@Test
public void testSingleOuterRelativeMaskRuleDot() throws Exception {
doTest("+:##O_D##/./out*.xml", 1, "1 report found for paths");
}
@Test
public void testSingleAbsoluteMaskRule() throws Exception {
doTest("+:##C_D##/rep*.xml", 1, "1 report found for paths");
}
@Test
public void testSingleOuterMaskRule() throws Exception {
doTest("+:##O_D##/out*.xml", 1, "1 report found for paths");
}
@Test
public void testTwoFiles() throws Exception {
doTest("report.xml\nresult.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoMaskFiles() throws Exception {
doTest("rep*.xml\nres*.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoAbsoluteFiles() throws Exception {
doTest("##C_D##/report.xml\n##C_D##/result.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoRelativeFiles() throws Exception {
doTest("##C_D##/fold/../report.xml\n##C_D##/fold/../result.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoRelativeMaskFiles() throws Exception {
doTest("##C_D##/fold/../rep*.xml\n##C_D##/fold/../res*.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoRelativeFilesDot() throws Exception {
doTest("##C_D##/./report.xml\n##C_D##/./result.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoRelativeMaskFilesDot() throws Exception {
doTest("##C_D##/./rep*.xml\n##C_D##/./res*.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoAbsoluteMaskFiles() throws Exception {
doTest("##C_D##/rep*.xml\n##C_D##/res*.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoRules() throws Exception {
doTest("+:report.xml\n+:result.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoMaskRules() throws Exception {
doTest("+:rep*.xml\n+:res*.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoAbsoluteRules() throws Exception {
doTest("+:##C_D##/report.xml\n+:##C_D##/result.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoRelativeRules() throws Exception {
doTest("+:##C_D##/fold/../report.xml\n+:##C_D##/fold/../result.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoRelativeMaskRules() throws Exception {
doTest("+:##C_D##/fold/../rep*.xml\n+:##C_D##/fold/../res*.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoRelativeRulesDot() throws Exception {
doTest("+:##C_D##/./report.xml\n+:##C_D##/./result.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoRelativeMaskRulesDot() throws Exception {
doTest("+:##C_D##/./rep*.xml\n+:##C_D##/./res*.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoAbsoluteMaskRules() throws Exception {
doTest("+:##C_D##/rep*.xml\n+:##C_D##/res*.xml", 2, "2 reports found for paths");
}
@Test
public void testTwoDifferentRules() throws Exception {
doTest("+:report.xml\n-:result.xml", 1, "1 report found for paths");
}
@Test
public void testTwoDifferentMaskRules() throws Exception {
doTest("+:rep*.xml\n-:res*.xml", 1, "1 report found for paths");
}
@Test
public void testTwoDifferentAbsoluteRules() throws Exception {
doTest("+:##C_D##/report.xml\n-:##C_D##/result.xml", 1, "1 report found for paths");
}
@Test
public void testTwoDifferentRelativeRules() throws Exception {
doTest("+:##C_D##/fold/../report.xml\n-:##C_D##/fold/../result.xml", 1, "1 report found for paths");
}
@Test
public void testTwoDifferentRelativeMaskRules() throws Exception {
doTest("+:##C_D##/fold/../rep*.xml\n-:##C_D##/fold/../res*.xml", 1, "1 report found for paths");
}
@Test
public void testTwoDifferentRelativeRulesDot() throws Exception {
doTest("+:##C_D##/./report.xml\n-:##C_D##/./result.xml", 1, "1 report found for paths");
}
@Test
public void testTwoDifferentRelativeMaskRulesDot() throws Exception {
doTest("+:##C_D##/./rep*.xml\n-:##C_D##/./res*.xml", 1, "1 report found for paths");
}
@Test
public void testTwoDifferentAbsoluteMaskRules() throws Exception {
doTest("+:##C_D##/rep*.xml\n-:##C_D##/res*.xml", 1, "1 report found for paths");
}
// TW-37280
@Test
public void testOverlappingBuildFinishedBuildStartedEvents() throws Exception {
final EventDispatcher agentEvents = getAgentEvents();
final XmlReportPlugin reportPlugin = new XmlReportPlugin(getExtensionHolder(),
agentEvents,
getExtensionHolder().findSingletonService(InspectionReporter.class),
getExtensionHolder().findSingletonService(DuplicatesReporter.class),
getExtensionHolder().findSingletonService(BuildAgentConfiguration.class));
final BuildTypeEx bt = createBuildType(RUN_TYPE);
startBuild(bt, true);
final AgentRunningBuildEx build = getAgentRunningBuild();
reportPlugin.buildStarted(build);
reportPlugin.beforeBuildFinish(build, BuildFinishedStatus.FINISHED_SUCCESS);
reportPlugin.buildStarted(build);
reportPlugin.buildFinished(build, BuildFinishedStatus.FINISHED_SUCCESS);
reportPlugin.beforeBuildFinish(build, BuildFinishedStatus.FINISHED_SUCCESS);
reportPlugin.buildFinished(build, BuildFinishedStatus.FINISHED_SUCCESS);
}
private void doTest(@NotNull String reportDirs, int numberOfTests, String... messages) throws Exception {
final BuildTypeEx bt = createBuildType(RUN_TYPE);
bt.setCheckoutDirectory(myCheckoutDir.getAbsolutePath());
final Map fps = new HashMap();
fps.put(XmlReportPluginConstants.REPORT_TYPE, "junit");
fps.put(XmlReportPluginConstants.REPORT_DIRS, reportDirs.replace("##C_D##", myCheckoutDir.getAbsolutePath()).replace("##O_D##", myOuterDir.getAbsolutePath()));
bt.addBuildFeature(XmlReportPluginBuildFeature.FEATURE_TYPE, fps);
final SRunningBuild sb = startBuild(bt, true);
final SFinishedBuild fb = finishBuild(sb);
assertEquals(numberOfTests, fb.getBuildStatistics(BuildStatisticsOptions.ALL_TESTS_NO_DETAILS).getAllTestRunCount());
final String buildLog = getBuildLog(fb);
for (String m : messages) {
assertTrue(buildLog.contains(m));
}
}
}