/*
* The MIT License
*
* Copyright (c) 2012 Bruno P. Kinoshita
*
* 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.tap4j.plugin.model;
import hudson.model.Run;
import hudson.tasks.junit.CaseResult;
import hudson.tasks.test.TabulatedResult;
import hudson.tasks.test.TestObject;
import hudson.tasks.test.TestResult;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.export.Exported;
import org.tap4j.model.TestSet;
import org.tap4j.plugin.TapResult;
import org.tap4j.util.StatusValues;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* A tabulated TAP Stream result.
*
* @author Bruno P. Kinoshita - http://www.kinoshita.eti.br
* @since 0.1
*/
public class TapStreamResult extends TabulatedResult {
private static final long serialVersionUID = 8337146933697574082L;
private final Run<?, ?> owner;
private List<TestResult> children = new ArrayList<TestResult>();
private TapResult tapResult;
public TapStreamResult(Run<?, ?> owner, TapResult tapResult) {
this.owner = owner;
this.tapResult = tapResult;
setChildrenInfo();
}
/* (non-Javadoc)
* @see hudson.model.ModelObject#getDisplayName()
*/
public String getDisplayName() {
return "TAP Stream Results";
}
/* (non-Javadoc)
* @see hudson.tasks.test.TestObject#getOwner()
*/
@Override
public Run<?, ?> getRun() {
return owner;
}
/* (non-Javadoc)
* @see hudson.tasks.test.TestObject#getParent()
*/
@Override
public TestObject getParent() {
return null;
}
/* (non-Javadoc)
* @see hudson.tasks.test.TestObject#findCorrespondingResult(java.lang.String)
*/
@Override
public TestResult findCorrespondingResult(String id) {
return null;
}
/* (non-Javadoc)
* @see hudson.tasks.test.TabulatedResult#getChildren()
*/
@Override
public Collection<? extends TestResult> getChildren() {
return children;
}
/* (non-Javadoc)
* @see hudson.tasks.test.TabulatedResult#hasChildren()
*/
@Override
public boolean hasChildren() {
return children.size() > 0;
}
/* (non-Javadoc)
* @see hudson.tasks.test.AbstractTestResultAction#getFailCount()
*/
@Override
@Exported(visibility = 2)
public int getFailCount() {
return tapResult.getFailed();
}
/* (non-Javadoc)
* @see hudson.tasks.test.AbstractTestResultAction#getTotalCount()
*/
@Override
@Exported(visibility = 2)
public int getTotalCount() {
return tapResult.getTotal();
}
/* (non-Javadoc)
* @see hudson.tasks.test.AbstractTestResultAction#getSkipCount()
*/
@Override
@Exported(visibility = 2)
public int getSkipCount() {
return tapResult.getSkipped();
}
/* (non-Javadoc)
* @see hudson.tasks.test.AbstractTestResultAction#getFailedTests()
*/
@Override
public List<CaseResult> getFailedTests() {
//throw new AssertionError("Not supposed to be called");
return Collections.emptyList();
}
// FIXME: use the getFailedTests, or explain why it's not used
public List<TestResult> getFailedTests2() {
List<TestResult> failedTests = new ArrayList<TestResult>();
if(tapResult != null && tapResult.getTestSets().size() > 0) {
for(TestSetMap tsm : tapResult.getTestSets()) {
TestSet ts = tsm.getTestSet();
for(org.tap4j.model.TestResult tr : ts.getTestResults()) {
if(tr.getStatus() == StatusValues.NOT_OK) {
failedTests.add(new TapTestResultResult(owner, tsm, tr, this.tapResult.getTodoIsFailure(), tapResult.getIncludeCommentDiagnostics(), tapResult.getValidateNumberOfTests()));
}
}
}
}
return failedTests;
}
public float getDuration() {
return this.tapResult.getDuration();
};
@Override
public Object getDynamic(String name, StaplerRequest req, StaplerResponse rsp) {
TapTestResultResult tr = getTapTestResultResult(name);
if (tr != null) {
return tr;
} else {
return super.getDynamic(name, req, rsp);
}
}
public TapResult getTapResult() {
return this.tapResult;
}
/**
* @param name
* @return
*/
private TapTestResultResult getTapTestResultResult(String name) {
if (name == null)
return null; // we don't allow null, nay!
if (name.lastIndexOf("-") <= 0)
return null; // ops, where's the - mate?
name = name.trim();
int rightIndex = name.length();
while (name.charAt(rightIndex-1) == '/') {
rightIndex -= 1;
}
int leftIndex = name.lastIndexOf('/') +1;
String testResultName = name.substring(leftIndex, rightIndex); // but we want the test result name (testSet1.tap)
if (testResultName.indexOf('-') <= 0) // plus the number (testSet1.tap-2)
return null;
String testNumber = testResultName.substring(testResultName.lastIndexOf('-')+1);
String fileName = name.substring(0, name.lastIndexOf('-'));
for(TestSetMap tsm : tapResult.getTestSets()) {
if(tsm.getFileName().equals(fileName)) {
TestSet ts = tsm.getTestSet();
org.tap4j.model.TestResult desired = ts.getTestResult(Integer.parseInt(testNumber));
return new TapTestResultResult(owner, tsm, desired, this.tapResult.getTodoIsFailure(), tapResult.getIncludeCommentDiagnostics(), tapResult.getValidateNumberOfTests());
}
}
return null; // ops, something went wrong
}
public void merge(TapResult other) {
tapResult = tapResult.copyWithExtraTestSets(other.getTestSets());
tapResult.tally();
children = new ArrayList<TestResult>();
setChildrenInfo();
}
private void setChildrenInfo() {
for(TestSetMap tsm : tapResult.getTestSets()) {
TestSet ts = tsm.getTestSet();
for(org.tap4j.model.TestResult tr : ts.getTestResults()) {
this.children.add(new TapTestResultResult(owner, tsm, tr, tapResult.getTodoIsFailure(), tapResult.getIncludeCommentDiagnostics(), tapResult.getValidateNumberOfTests()));
}
}
}
}