/* * The MIT License * * Copyright (c) 2004-2009, Tom Huybrechts * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package org.jenkinsci.plugins.quarantine; import hudson.model.FreeStyleBuild; import hudson.model.Result; import hudson.model.Descriptor; import hudson.model.FreeStyleProject; import hudson.model.User; import hudson.security.FullControlOnceLoggedInAuthorizationStrategy; import hudson.tasks.Mailer; import hudson.tasks.junit.TestDataPublisher; import hudson.tasks.junit.TestResult; import hudson.tasks.junit.SuiteResult; import hudson.tasks.junit.CaseResult; import hudson.tasks.junit.JUnitResultArchiver; import hudson.tasks.junit.TestResultAction; import hudson.util.DescribableList; import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.TestBuilder; import hudson.Launcher; import hudson.model.BuildListener; import hudson.model.AbstractBuild; import java.io.IOException; import java.util.List; import org.jvnet.mock_javamail.*; import javax.mail.Message; import org.junit.Test; import hudson.tasks.Mailer; public class QuarantineCoreTest extends HudsonTestCase { private String projectName = "x"; protected String quarantineText = "quarantineReason"; protected String user1Mail = "user1@mail.com"; protected FreeStyleProject project; @Override protected void setUp() throws Exception { super.setUp(); java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(java.util.logging.Level.SEVERE); project = createFreeStyleProject(projectName); DescribableList<TestDataPublisher, Descriptor<TestDataPublisher>> publishers = new DescribableList<TestDataPublisher, Descriptor<TestDataPublisher>>( project); publishers.add(new QuarantineTestDataPublisher()); QuarantinableJUnitResultArchiver archiver = new QuarantinableJUnitResultArchiver("*.xml"); archiver.setTestDataPublishers(publishers); project.getPublishersList().add(archiver); hudson.setAuthorizationStrategy(new FullControlOnceLoggedInAuthorizationStrategy()); hudson.setSecurityRealm(createDummySecurityRealm()); User u = User.get("user1"); u.addProperty(new Mailer.UserProperty(user1Mail)); } protected FreeStyleBuild addBuildFailure() throws Exception { FreeStyleBuild build; project.getBuildersList().add(new TestBuilder() { public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { return false; } }); build = project.scheduleBuild2(0).get(); project.getBuildersList().clear(); return build; } protected FreeStyleBuild runBuildWithJUnitResult(final String xmlFileName) throws Exception { FreeStyleBuild build; project.getBuildersList().add(new TestBuilder() { public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { build.getWorkspace().child("junit.xml").copyFrom(getClass().getResource(xmlFileName)); return true; } }); build = project.scheduleBuild2(0).get(); project.getBuildersList().clear(); return build; } protected TestResult getResultsFromJUnitResult(final String xmlFileName) throws Exception { return runBuildWithJUnitResult(xmlFileName).getAction(TestResultAction.class).getResult(); } public void testAllTestsHaveQuarantineAction() throws Exception { TestResult tr = getResultsFromJUnitResult("junit-1-failure.xml"); for (SuiteResult suite : tr.getSuites()) { for (CaseResult result : suite.getCases()) { assertNotNull(result.getTestAction(QuarantineTestAction.class)); } } } public void testNoTestsHaveQuarantineActionForStandardPublisher() throws Exception { project.getPublishersList().remove(QuarantinableJUnitResultArchiver.class); DescribableList<TestDataPublisher, Descriptor<TestDataPublisher>> publishers = new DescribableList<TestDataPublisher, Descriptor<TestDataPublisher>>( project); publishers.add(new QuarantineTestDataPublisher()); project.getPublishersList().add(new JUnitResultArchiver("*.xml", false, publishers)); TestResult tr = getResultsFromJUnitResult("junit-1-failure.xml"); for (SuiteResult suite : tr.getSuites()) { for (CaseResult result : suite.getCases()) { assertNull(result.getTestAction(QuarantineTestAction.class)); } } } public void testQuarantineSetAndRelease() throws Exception { TestResult tr = getResultsFromJUnitResult("junit-1-failure.xml"); QuarantineTestAction action = tr.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class); action.quarantine("user1", "reason"); assertTrue(action.isQuarantined()); action.release(); assertFalse(action.isQuarantined()); } public void testQuarantineIsStickyOnFailingTest() throws Exception { TestResult tr = getResultsFromJUnitResult("junit-1-failure.xml"); QuarantineTestAction action = tr.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class); action.quarantine("user1", "reason"); assertTrue(action.isQuarantined()); tr = getResultsFromJUnitResult("junit-1-failure.xml"); QuarantineTestAction action2 = tr.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class); assertTrue(tr.getOwner().getNumber() == 2); assertTrue(action2.isQuarantined()); assertEquals(action.quarantinedByName(), action2.quarantinedByName()); } public void testQuarantineIsStickyOnPassingTest() throws Exception { TestResult tr = getResultsFromJUnitResult("junit-1-failure.xml"); QuarantineTestAction action = tr.getSuite("SuiteA").getCase("TestA").getTestAction(QuarantineTestAction.class); action.quarantine("user1", "reason"); assertTrue(action.isQuarantined()); tr = getResultsFromJUnitResult("junit-1-failure.xml"); QuarantineTestAction action2 = tr.getSuite("SuiteA").getCase("TestA").getTestAction(QuarantineTestAction.class); assertTrue(tr.getOwner().getNumber() == 2); assertTrue(action2.isQuarantined()); assertEquals(action.quarantinedByName(), action2.quarantinedByName()); } public void testDontThrowNullptrExceptionWhenNoPreviousTestData() throws Exception { addBuildFailure(); getResultsFromJUnitResult("junit-1-failure.xml"); } public void testUsesResultsFromLastGoodBuildWhenNoPreviousTestData() throws Exception { getResultsFromJUnitResult("junit-1-failure.xml"); TestResult tr = getResultsFromJUnitResult("junit-1-failure.xml"); for (SuiteResult suite : tr.getSuites()) { for (CaseResult result : suite.getCases()) { QuarantineTestAction action = result.getTestAction(QuarantineTestAction.class); action.quarantine("user1", "reason"); } } getResultsFromJUnitResult("junit-dummy.xml"); // add a dummy file that doesn't have the test cases we're looking for tr = getResultsFromJUnitResult("junit-1-failure.xml"); for (SuiteResult suite : tr.getSuites()) { for (CaseResult result : suite.getCases()) { QuarantineTestAction action = result.getTestAction(QuarantineTestAction.class); assertEquals("reason",action.getReason()); } } } public void testResultIsOnlyMarkedAsLatestIfLatest() throws Exception { FreeStyleBuild build = runBuildWithJUnitResult("junit-1-failure.xml"); TestResult tr1 = build.getAction(TestResultAction.class).getResult(); QuarantineTestAction action1 = tr1.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class); assertTrue(action1.isLatestResult()); build = runBuildWithJUnitResult("junit-1-failure.xml"); TestResult tr2 = build.getAction(TestResultAction.class).getResult(); QuarantineTestAction action2 = tr2.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class); assertFalse(action1.isLatestResult()); assertTrue(action2.isLatestResult()); } public void testQuarantiningMakesFinalResultPass() throws Exception { FreeStyleBuild build = runBuildWithJUnitResult("junit-1-failure.xml"); assertTrue(build.getResult() != Result.SUCCESS); TestResult tr = build.getAction(TestResultAction.class).getResult(); QuarantineTestAction action = tr.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class); action.quarantine("user1", "reason"); build = runBuildWithJUnitResult("junit-1-failure.xml"); assertTrue(build.getResult() == Result.SUCCESS); } public void testQuarantiningMakesFinalResultFailIfAnotherTestFails() throws Exception { FreeStyleBuild build = runBuildWithJUnitResult("junit-1-failure.xml"); assertTrue(build.getResult() != Result.SUCCESS); TestResult tr = build.getAction(TestResultAction.class).getResult(); QuarantineTestAction action = tr.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class); action.quarantine("user1", "reason"); build = runBuildWithJUnitResult("junit-2-failures.xml"); assertTrue(build.getResult() != Result.SUCCESS); } public void testQuarantiningMakesFinalResultFailIfQuarantineReleased() throws Exception { FreeStyleBuild build = runBuildWithJUnitResult("junit-1-failure.xml"); assertTrue(build.getResult() != Result.SUCCESS); TestResult tr = build.getAction(TestResultAction.class).getResult(); QuarantineTestAction action = tr.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class); action.quarantine("user1", "reason"); build = runBuildWithJUnitResult("junit-1-failure.xml"); assertTrue(build.getResult() == Result.SUCCESS); tr = build.getAction(TestResultAction.class).getResult(); action = tr.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class); action.release(); build = runBuildWithJUnitResult("junit-1-failure.xml"); System.out.println("result is " + build.getResult()); assertTrue(build.getResult() != Result.SUCCESS); } public void testQuarantineStatusNotLostIfTestNotRun() throws Exception { FreeStyleBuild build = runBuildWithJUnitResult("junit-1-failure.xml"); assertTrue(build.getResult() != Result.SUCCESS); TestResult tr = build.getAction(TestResultAction.class).getResult(); QuarantineTestAction action = tr.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class); action.quarantine("user1", "reason"); build = runBuildWithJUnitResult("junit-1-failure-missing.xml"); assertTrue(build.getResult() == Result.SUCCESS); build = runBuildWithJUnitResult("junit-1-failure.xml"); assertTrue(build.getResult() == Result.SUCCESS); } public void testQuarantinedTestsAreInReport() throws Exception { TestResult tr = getResultsFromJUnitResult("junit-1-failure.xml"); tr.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class).quarantine("user1", "reason"); tr.getSuite("SuiteB").getCase("TestA").getTestAction(QuarantineTestAction.class).quarantine("user1", "reason"); QuarantinedTestsReport report = new QuarantinedTestsReport(); assertEquals(2, report.getQuarantinedTests().size()); assertTrue(report.getQuarantinedTests().contains(tr.getSuite("SuiteA").getCase("TestB"))); assertTrue(report.getQuarantinedTests().contains(tr.getSuite("SuiteB").getCase("TestA"))); } public void testQuarantineReportGetNumberOfSuccessivePasses() throws Exception { TestResult tr = getResultsFromJUnitResult("junit-no-failure.xml"); tr.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class).quarantine("user1", "reason"); QuarantinedTestsReport report = new QuarantinedTestsReport(); assertEquals(1, report.getNumberOfSuccessivePasses(report.getQuarantinedTests().get(0))); runBuildWithJUnitResult("junit-no-failure.xml"); report = new QuarantinedTestsReport(); assertEquals(2, report.getNumberOfSuccessivePasses(report.getQuarantinedTests().get(0))); runBuildWithJUnitResult("junit-1-failure.xml"); report = new QuarantinedTestsReport(); assertEquals(0, report.getNumberOfSuccessivePasses(report.getQuarantinedTests().get(0))); runBuildWithJUnitResult("junit-no-failure.xml"); report = new QuarantinedTestsReport(); assertEquals(1, report.getNumberOfSuccessivePasses(report.getQuarantinedTests().get(0))); } public void testSendsEmailWhenQuarantinedFails() throws Exception { Mailbox.clearAll(); TestResult tr = getResultsFromJUnitResult("junit-1-failure.xml"); tr.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class).quarantine("user1", "reason"); getResultsFromJUnitResult("junit-1-failure.xml"); List<Message> inbox = Mailbox.get(user1Mail); assertEquals(1, inbox.size()); } public void testDoesntEmailWhenQuarantinedPasses() throws Exception { Mailbox.clearAll(); TestResult tr = getResultsFromJUnitResult("junit-1-failure.xml"); tr.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class).quarantine("user1", "reason"); getResultsFromJUnitResult("junit-no-failure.xml"); List<Message> inbox = Mailbox.get(user1Mail); assertEquals(0, inbox.size()); } public void testTestEmailsAreCollatedWhenMultipleQuarantinedFail() throws Exception { Mailbox.clearAll(); TestResult tr = getResultsFromJUnitResult("junit-1-failure.xml"); tr.getSuite("SuiteA").getCase("TestB").getTestAction(QuarantineTestAction.class).quarantine("user1", "reason"); tr.getSuite("SuiteB").getCase("TestA").getTestAction(QuarantineTestAction.class).quarantine("user1", "reason"); getResultsFromJUnitResult("junit-2-failures.xml"); List<Message> inbox = Mailbox.get(user1Mail); assertEquals(1, inbox.size()); } }