package hudson.plugins.performance.build; import com.google.common.io.Files; import hudson.FilePath; import hudson.model.AbstractProject; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.model.Result; import hudson.model.Run; import hudson.plugins.performance.actions.PerformanceProjectAction; import hudson.tasks.Publisher; import hudson.util.StreamTaskListener; import jenkins.util.BuildListenerAdapter; import org.jenkinsci.plugins.workflow.job.WorkflowJob; import org.junit.Test; import org.jvnet.hudson.test.HudsonTestCase; import javax.annotation.Nonnull; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.util.Iterator; public class PerformanceTestBuildTest extends HudsonTestCase { @Test public void testFlow() throws Exception { String path = getClass().getResource("/performanceTest.yml").getPath(); FreeStyleProject project = createFreeStyleProject(); FreeStyleBuildExt buildExt = new FreeStyleBuildExt(project); FilePath workspace = new FilePath(Files.createTempDir()); buildExt.setWorkspace(workspace); buildExt.onStartBuilding(); buildExt.getRootDir().mkdirs(); PerformanceTestBuild buildTest = new PerformanceTestBuild(new File(path).getAbsolutePath() + ' ' + "-o modules.jmeter.plugins=[] -o services=[] -o modules.jmeter.version=3.1 -o modules.jmeter.path=" + workspace.getRemote(), true, true, false, false); assertEquals(PerformanceProjectAction.class, buildTest.getProjectAction((AbstractProject) project).getClass()); ByteArrayOutputStream stream = new ByteArrayOutputStream(); StreamTaskListener taskListener = new StreamTaskListener(stream); buildTest.perform(buildExt, buildExt.getWorkspace(), createLocalLauncher(), new BuildListenerAdapter(taskListener)); Iterator<Publisher> iterator = project.getPublishersList().iterator(); StringBuilder builder = new StringBuilder("\n\nList publishers:\n"); while (iterator.hasNext()) { builder.append(iterator.next().getClass().getName()).append("\n"); } String jobLog = new String(stream.toByteArray()) + builder.toString(); assertEquals(jobLog, Result.SUCCESS, buildExt.getResult()); } public static class FreeStyleBuildExt extends FreeStyleBuild { public FreeStyleBuildExt(FreeStyleProject project) throws IOException { super(project); } @Override public void setWorkspace(@Nonnull FilePath ws) { super.setWorkspace(ws); } @Override public void onStartBuilding() { super.onStartBuilding(); } } @Test public void testGetters() throws Exception { PerformanceTestBuild.Descriptor descriptor = new PerformanceTestBuild.Descriptor(); assertTrue(descriptor.isApplicable(null)); PerformanceTestBuild testBuild = new PerformanceTestBuild("test option", false, false, false, false); assertEquals("test option", testBuild.getParams()); testBuild.setParams("test1"); assertEquals("test1", testBuild.getParams()); assertFalse(testBuild.isUseSystemSitePackages()); assertFalse(testBuild.isPrintDebugOutput()); assertFalse(testBuild.isGeneratePerformanceTrend()); assertFalse(testBuild.isUseBztExitCode()); testBuild.setGeneratePerformanceTrend(true); testBuild.setPrintDebugOutput(true); testBuild.setUseSystemSitePackages(true); testBuild.setUseBztExitCode(true); assertTrue(testBuild.isUseSystemSitePackages()); assertTrue(testBuild.isPrintDebugOutput()); assertTrue(testBuild.isGeneratePerformanceTrend()); assertTrue(testBuild.isUseBztExitCode()); } @Test public void testGenerateReportInPipe() throws Exception { String path = getClass().getResource("/performanceTest.yml").getPath(); WorkflowJob p = jenkins.createProject(WorkflowJob.class, "p"); FilePath workspace = new FilePath(Files.createTempDir()); p.createExecutable(); Run run = p.getFirstBuild(); String args = new File(path).getAbsolutePath() + ' ' + "-o modules.jmeter.plugins=[] -o services=[] -o modules.jmeter.version=3.1 -o modules.jmeter.path=" + workspace.getRemote(); PerformanceTestBuild buildTest = new PerformanceTestBuild(args, true, true, false, false); ByteArrayOutputStream stream = new ByteArrayOutputStream(); StreamTaskListener taskListener = new StreamTaskListener(stream); buildTest.perform(run, workspace, createLocalLauncher(), new BuildListenerAdapter(taskListener)); String jobLog = new String(stream.toByteArray()); File root = run.getRootDir(); File reportFile = new File(root, "/performance-reports/Taurus/aggregate-results.xml"); assertTrue(jobLog.contains("Performance: Recording Taurus reports 'aggregate-results.xml'")); assertTrue(jobLog, jobLog.contains("Performance: Parsing JMeter report file '" + reportFile.getAbsolutePath() + "'.")); assertTrue(jobLog, reportFile.exists()); } @Test public void testFailCriteria() throws Exception { String path = getClass().getResource("/performanceTestWithFailCriteria.yml").getPath(); WorkflowJob p = jenkins.createProject(WorkflowJob.class, "p"); FilePath workspace = new FilePath(Files.createTempDir()); p.createExecutable(); Run run = p.getFirstBuild(); String args = new File(path).getAbsolutePath() + ' ' + "-o modules.jmeter.plugins=[] -o services=[] -o modules.jmeter.version=3.1 -o modules.jmeter.path=" + workspace.getRemote(); PerformanceTestBuild buildTest = new PerformanceTestBuild(args, false, true, false, true); ByteArrayOutputStream stream = new ByteArrayOutputStream(); StreamTaskListener taskListener = new StreamTaskListener(stream); buildTest.perform(run, workspace, createLocalLauncher(), new BuildListenerAdapter(taskListener)); String jobLog = new String(stream.toByteArray()); assertEquals(jobLog, Result.UNSTABLE, run.getResult()); assertTrue(jobLog, jobLog.contains("Done performing with code: 3")); } @Test public void testResutsChecker() throws Exception { PerformanceTestBuild testBuild = new PerformanceTestBuild("test option", false, false, false, false); assertEquals(Result.SUCCESS, testBuild.getBztJobResult(0)); assertEquals(Result.FAILURE, testBuild.getBztJobResult(1)); assertEquals(Result.UNSTABLE, testBuild.getBztJobResult(3)); assertEquals(Result.SUCCESS, testBuild.getJobResult(0)); assertEquals(Result.FAILURE, testBuild.getJobResult(1)); assertTrue(testBuild.isSuccessCode(0)); assertFalse(testBuild.isSuccessCode(1)); } }