/*************************GO-LICENSE-START********************************* * Copyright 2014 ThoughtWorks, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *************************GO-LICENSE-END***********************************/ package com.thoughtworks.go.server.domain; import static org.junit.Assert.assertEquals; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.thoughtworks.go.domain.JobInstanceLog; import com.thoughtworks.go.config.TestArtifactPlan; import com.thoughtworks.go.util.SystemEnvironment; import com.thoughtworks.go.util.FileUtil; import org.apache.commons.io.IOUtils; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.nullValue; import org.jmock.Mockery; import org.jmock.lib.legacy.ClassImposteriser; import org.junit.After; import static org.junit.Assert.assertThat; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(org.jmock.integration.junit4.JMock.class) public class JobInstanceLogTest { private JobInstanceLog jobInstanceLog; private LogFile defaultLogFile; private Mockery context; private File rootFolder; private SystemEnvironment env; @Before public void setUp() { context = new Mockery(); context.setImposteriser(ClassImposteriser.INSTANCE); jobInstanceLog = new JobInstanceLog(null, new HashMap()); defaultLogFile = new LogFile(new File("log20051209122103.xml")); rootFolder = new File("root"); rootFolder.mkdirs(); env = new SystemEnvironment(); } @After public void teardown() { FileUtil.deleteFolder(rootFolder); } @Test public void canGetNumberOfTestsFromBuild() { BuildTestSuite suiteWithFiveTests = new BuildTestSuite("", 0.0f); suiteWithFiveTests.addTestCase(new BuildTestCase(null, null, null, null, null, null)); suiteWithFiveTests.addTestCase(new BuildTestCase(null, null, null, null, null, null)); suiteWithFiveTests.addTestCase(new BuildTestCase(null, null, null, null, null, null)); suiteWithFiveTests.addTestCase(new BuildTestCase(null, null, null, null, null, null)); suiteWithFiveTests.addTestCase(new BuildTestCase(null, null, null, null, null, null)); BuildTestSuite suiteWithFourTests = new BuildTestSuite("", 0.0f); suiteWithFourTests.addTestCase(new BuildTestCase(null, null, null, null, null, null)); suiteWithFourTests.addTestCase(new BuildTestCase(null, null, null, null, null, null)); suiteWithFourTests.addTestCase(new BuildTestCase(null, null, null, null, null, null)); suiteWithFourTests.addTestCase(new BuildTestCase(null, null, null, null, null, null)); List nineTests = new ArrayList(); nineTests.add(suiteWithFiveTests); nineTests.add(suiteWithFourTests); Map props = new HashMap(); props.put("testsuites", nineTests); JobInstanceLog laterJob = new JobInstanceLog(defaultLogFile, props); assertEquals(9, laterJob.getNumberOfTests()); } @Test public void canGetNumberOfFailedTests() { BuildTestSuite suiteWithTwoFailures = new BuildTestSuite("", 0.0f); suiteWithTwoFailures.addTestCase(new BuildTestCase(null, null, null, null, null, BuildTestCaseResult.FAILED)); suiteWithTwoFailures.addTestCase(new BuildTestCase(null, null, null, null, null, BuildTestCaseResult.FAILED)); BuildTestSuite suiteWithOneFailure = new BuildTestSuite("", 0.0f); suiteWithOneFailure.addTestCase(new BuildTestCase(null, null, null, null, null, BuildTestCaseResult.FAILED)); List threeFailures = new ArrayList(); threeFailures.add(suiteWithTwoFailures); threeFailures.add(suiteWithOneFailure); Map props = new HashMap(); props.put("testsuites", threeFailures); JobInstanceLog laterJob = new JobInstanceLog(defaultLogFile, props); assertEquals(3, laterJob.getNumberOfFailures()); } @Test public void canGetNumberOfTestErrors() { BuildTestSuite suiteWithTwoErrors = new BuildTestSuite("", 0.0f); suiteWithTwoErrors.addTestCase(new BuildTestCase(null, null, null, null, null, BuildTestCaseResult.ERROR)); suiteWithTwoErrors.addTestCase(new BuildTestCase(null, null, null, null, null, BuildTestCaseResult.ERROR)); BuildTestSuite suiteWithThreeErrors = new BuildTestSuite("", 0.0f); suiteWithThreeErrors.addTestCase(new BuildTestCase(null, null, null, null, null, BuildTestCaseResult.ERROR)); suiteWithThreeErrors.addTestCase(new BuildTestCase(null, null, null, null, null, BuildTestCaseResult.ERROR)); suiteWithThreeErrors.addTestCase(new BuildTestCase(null, null, null, null, null, BuildTestCaseResult.ERROR)); List fiveErrors = new ArrayList(); fiveErrors.add(suiteWithTwoErrors); fiveErrors.add(suiteWithThreeErrors); Map props = new HashMap(); props.put("testsuites", fiveErrors); JobInstanceLog laterJob = new JobInstanceLog(defaultLogFile, props); assertEquals(5, laterJob.getNumberOfErrors()); } @Test public void shouldFindIndexPageFromTestOutput() throws Exception { rootFolder = new File("root"); final File testOutput = new File(rootFolder, "testoutput"); testOutput.mkdirs(); File indexHtml = new File(testOutput, "index.html"); FileOutputStream fileOutputStream = new FileOutputStream(indexHtml); IOUtils.write("Test", fileOutputStream); IOUtils.closeQuietly(fileOutputStream); HashMap map = new HashMap(); map.put("artifactfolder", rootFolder); jobInstanceLog = new JobInstanceLog(null, map); assertThat(jobInstanceLog.getTestIndexPage(), is(indexHtml)); } @Test public void shouldNotCauseExceptionIfFilesAreNotAvailable() throws Exception { rootFolder = new File("root"); final File testOutput = new File(rootFolder, "testoutputxxxxxxx"); HashMap map = new HashMap(); map.put("artifactfolder", testOutput); jobInstanceLog = new JobInstanceLog(null, map); assertThat(jobInstanceLog.getTestIndexPage(), is(nullValue())); } @Test public void shouldFindIndexPageFromTestOutputRecursively() throws Exception { final File testOutput = new File(rootFolder, "testoutput"); final File junitReportFolder = new File(testOutput, "junitreport"); junitReportFolder.mkdirs(); FileOutputStream fileOutputStream = new FileOutputStream(new File(junitReportFolder, "index.html")); IOUtils.write("Test", fileOutputStream); IOUtils.closeQuietly(fileOutputStream); HashMap map = new HashMap(); map.put("artifactfolder", rootFolder); jobInstanceLog = new JobInstanceLog(null, map); assertThat(jobInstanceLog.getTestIndexPage().getName(), is("index.html")); } @Test public void shouldFindIndexPageFromTestOutputRecursivelyWithMultipleFolders() throws Exception { final File logFolder = new File(rootFolder, "logs"); final File testOutput = new File(rootFolder, TestArtifactPlan.TEST_OUTPUT_FOLDER); final File junitReportFolder = new File(testOutput, "junitreport"); junitReportFolder.mkdirs(); logFolder.mkdirs(); FileOutputStream fileOutputStream = new FileOutputStream(new File(junitReportFolder, "index.html")); IOUtils.write("Test", fileOutputStream); IOUtils.closeQuietly(fileOutputStream); HashMap map = new HashMap(); map.put("artifactfolder", rootFolder); jobInstanceLog = new JobInstanceLog(null, map); assertThat(jobInstanceLog.getTestIndexPage().getName(), is("index.html")); } @Test public void shouldFindIndexPageFromTestOutputGivenNunitTestOutput() throws Exception { final File testOutput = new File(rootFolder, TestArtifactPlan.TEST_OUTPUT_FOLDER); testOutput.mkdirs(); IOUtils.write("Test", new FileOutputStream(new File(testOutput, "index.html"))); HashMap map = new HashMap(); map.put("artifactfolder", rootFolder); jobInstanceLog = new JobInstanceLog(null, map); assertThat(jobInstanceLog.getTestIndexPage().getName(), is("index.html")); FileUtil.deleteFolder(rootFolder); } }