Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,12 @@
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.xmlunit</groupId>
<artifactId>xmlunit-core</artifactId>
<version>2.11.0</version>
<scope>test</scope>
</dependency>
</dependencies>

<repositories>
Expand Down
176 changes: 176 additions & 0 deletions src/main/java/hudson/tasks/junit/CaseResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@
private String errorStackTrace;
private String errorDetails;
private Map<String, String> properties;
private List<FlakyFailure> flakyFailures;
private List<RerunFailure> rerunFailures;

@SuppressFBWarnings(value = "SE_TRANSIENT_FIELD_NOT_RESTORED", justification = "Specific method to restore it")
private transient SuiteResult parent;
Expand Down Expand Up @@ -247,6 +249,8 @@
}
this.properties = properties;
this.keepTestNames = keepTestNames;
this.flakyFailures = parseFlakyFailures(testCase);
this.rerunFailures = parseRerunFailures(testCase);
}

public CaseResult(CaseResult src) {
Expand All @@ -263,12 +267,46 @@
this.stderr = src.stderr;
this.properties = new HashMap<>();
this.properties.putAll(src.properties);
this.flakyFailures = src.flakyFailures;
this.rerunFailures = src.rerunFailures;
}

public static float clampDuration(float d) {
return Math.min(365.0f * 24 * 60 * 60, Math.max(0.0f, d));
}

private static List<FlakyFailure> parseFlakyFailures(Element testCase) {
List<FlakyFailure> flakyFailures = new ArrayList<>();
List<Element> flakyFailuresElements = testCase.elements("flakyFailure");
if (flakyFailuresElements != null) {

Check warning on line 281 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 281 is only partially covered, one branch is missing
for (Element flakyFailuresElement : flakyFailuresElements) {
String message = flakyFailuresElement.attributeValue("message");
String type = flakyFailuresElement.attributeValue("type");
String stackTrace = flakyFailuresElement.elementText("stackTrace");
String stdout = flakyFailuresElement.elementText("system-out");
String stderr = flakyFailuresElement.elementText("system-err");
flakyFailures.add(new FlakyFailure(message, type, stackTrace, stdout, stderr));
}
}
return flakyFailures;
}

private static List<RerunFailure> parseRerunFailures(Element testCase) {
List<RerunFailure> rerunFailures = new ArrayList<>();
List<Element> rerunFailureElements = testCase.elements("rerunFailure");
if (rerunFailureElements != null) {

Check warning on line 297 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 297 is only partially covered, one branch is missing
for (Element rerunFailureElement : rerunFailureElements) {
String message = rerunFailureElement.attributeValue("message");
String type = rerunFailureElement.attributeValue("type");
String stackTrace = rerunFailureElement.elementText("stackTrace");
String stdout = rerunFailureElement.elementText("system-out");
String stderr = rerunFailureElement.elementText("system-err");
rerunFailures.add(new RerunFailure(message, type, stackTrace, stdout, stderr));
}
}
return rerunFailures;
}

static CaseResult parse(SuiteResult parent, final XMLStreamReader reader, String context, String ver)
throws XMLStreamException {
CaseResult r = new CaseResult(parent, null, null, null);
Expand Down Expand Up @@ -320,6 +358,12 @@
r.properties = new HashMap<>();
parseProperties(r.properties, reader, context, ver);
break;
case "flakyFailures":
r.flakyFailures = parseFlakyFailures(reader, context, ver);
break;
case "rerunFailures":
r.rerunFailures = parseRerunFailures(reader, context, ver);
break;
default:
LOGGER.finest(() -> "Unknown field in " + context + ": " + elementName);
}
Expand All @@ -328,6 +372,126 @@
return r;
}

static List<FlakyFailure> parseFlakyFailures(final XMLStreamReader reader, String context, String ver)
throws XMLStreamException {
List<FlakyFailure> flakyFailures = new ArrayList<>();
while (reader.hasNext()) {

Check warning on line 378 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 378 is only partially covered, one branch is missing
final int event = reader.next();
if (event == XMLStreamReader.END_ELEMENT && reader.getLocalName().equals("flakyFailures")) {

Check warning on line 380 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 380 is only partially covered, one branch is missing
break;
}
if (event == XMLStreamReader.START_ELEMENT) {
final String elementName = reader.getLocalName();
switch (elementName) {

Check warning on line 385 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 385 is only partially covered, one branch is missing
case "flakyFailure":
flakyFailures.add(parseFlakyFailure(reader, context, ver));
break;
default:
LOGGER.finest(() -> "Unknown field in " + context + ": " + elementName);

Check warning on line 390 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 390 is not covered by tests
}
}
}
return flakyFailures;
}

public static FlakyFailure parseFlakyFailure(XMLStreamReader reader, String context, String ver)
throws XMLStreamException {
String message = null;
String type = null;
String stackTrace = null;
String stdout = null;
String stderr = null;
while (reader.hasNext()) {

Check warning on line 404 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 404 is only partially covered, one branch is missing
int event = reader.next();
if (event == XMLStreamReader.END_ELEMENT && "flakyFailure".equals(reader.getLocalName())) {

Check warning on line 406 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 406 is only partially covered, one branch is missing
break;
}
if (event == XMLStreamReader.START_ELEMENT) {
String elementName = reader.getLocalName();
switch (elementName) {

Check warning on line 411 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 411 is only partially covered, one branch is missing
case "message":
message = reader.getElementText();
break;
case "type":
type = reader.getElementText();
break;
case "stackTrace":
stackTrace = reader.getElementText();
break;
case "stdout":
stdout = reader.getElementText();
break;
case "stderr":
stderr = reader.getElementText();
break;
default:
LOGGER.finest(() -> "Unknown field in " + context + ": " + elementName);

Check warning on line 428 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 428 is not covered by tests
}
}
}
return new FlakyFailure(message, type, stackTrace, stdout, stderr);
}

static List<RerunFailure> parseRerunFailures(final XMLStreamReader reader, String context, String ver)
throws XMLStreamException {
List<RerunFailure> rerunFailures = new ArrayList<>();
while (reader.hasNext()) {

Check warning on line 438 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 438 is only partially covered, one branch is missing
final int event = reader.next();
if (event == XMLStreamReader.END_ELEMENT && reader.getLocalName().equals("rerunFailures")) {

Check warning on line 440 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 440 is only partially covered, one branch is missing
break;
}
if (event == XMLStreamReader.START_ELEMENT) {
final String elementName = reader.getLocalName();
switch (elementName) {

Check warning on line 445 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 445 is only partially covered, one branch is missing
case "rerunFailure":
rerunFailures.add(parseRerunFailure(reader, context, ver));
break;
default:
LOGGER.finest(() -> "Unknown field in " + context + ": " + elementName);

Check warning on line 450 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 450 is not covered by tests
}
}
}
return rerunFailures;
}

public static RerunFailure parseRerunFailure(XMLStreamReader reader, String context, String ver)
throws XMLStreamException {
String message = null;
String type = null;
String stackTrace = null;
String stdout = null;
String stderr = null;
while (reader.hasNext()) {

Check warning on line 464 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 464 is only partially covered, one branch is missing
int event = reader.next();
if (event == XMLStreamReader.END_ELEMENT && "rerunFailure".equals(reader.getLocalName())) {

Check warning on line 466 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 466 is only partially covered, one branch is missing
break;
}
if (event == XMLStreamReader.START_ELEMENT) {
String elementName = reader.getLocalName();
switch (elementName) {

Check warning on line 471 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 471 is only partially covered, one branch is missing
case "message":
message = reader.getElementText();
break;
case "type":
type = reader.getElementText();
break;
case "stackTrace":
stackTrace = reader.getElementText();
break;
case "stdout":
stdout = reader.getElementText();
break;
case "stderr":
stderr = reader.getElementText();
break;
default:
LOGGER.finest(() -> "Unknown field in " + context + ": " + elementName);

Check warning on line 488 in src/main/java/hudson/tasks/junit/CaseResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 488 is not covered by tests
}
}
}
return new RerunFailure(message, type, stackTrace, stdout, stderr);
}

static void parseProperties(Map<String, String> r, final XMLStreamReader reader, String context, String ver)
throws XMLStreamException {
while (reader.hasNext()) {
Expand Down Expand Up @@ -1040,6 +1204,18 @@
this.parent = parent;
}

@Exported
@Override
public List<FlakyFailure> getFlakyFailures() {
return flakyFailures == null ? Collections.emptyList() : Collections.unmodifiableList(flakyFailures);
}

@Exported
@Override
public List<RerunFailure> getRerunFailures() {
return rerunFailures == null ? Collections.emptyList() : Collections.unmodifiableList(rerunFailures);
}

/**
* Constants that represent the status of this test.
*/
Expand Down
63 changes: 63 additions & 0 deletions src/main/java/hudson/tasks/junit/FlakyFailure.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package hudson.tasks.junit;

import java.io.Serializable;
import org.kohsuke.stapler.export.ExportedBean;

@ExportedBean
public class FlakyFailure implements Serializable {
private String message;
private String type;
private String stackTrace;
private String stdout;
private String stderr;

public FlakyFailure() {}

Check warning on line 14 in src/main/java/hudson/tasks/junit/FlakyFailure.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 14 is not covered by tests

public FlakyFailure(String message, String type, String stackTrace, String stdout, String stderr) {
this.message = message;
this.type = type;
this.stackTrace = stackTrace;
this.stdout = stdout;
this.stderr = stderr;
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

Check warning on line 30 in src/main/java/hudson/tasks/junit/FlakyFailure.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 29-30 are not covered by tests

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

Check warning on line 38 in src/main/java/hudson/tasks/junit/FlakyFailure.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 37-38 are not covered by tests

public String getStackTrace() {
return stackTrace;
}

public void setStackTrace(String stackTrace) {
this.stackTrace = stackTrace;
}

Check warning on line 46 in src/main/java/hudson/tasks/junit/FlakyFailure.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 45-46 are not covered by tests

public String getStdout() {
return stdout;
}

public void setStdout(String stdout) {
this.stdout = stdout;
}

Check warning on line 54 in src/main/java/hudson/tasks/junit/FlakyFailure.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 53-54 are not covered by tests

public String getStderr() {
return stderr;
}

public void setStderr(String stderr) {
this.stderr = stderr;
}

Check warning on line 62 in src/main/java/hudson/tasks/junit/FlakyFailure.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 61-62 are not covered by tests
}
61 changes: 61 additions & 0 deletions src/main/java/hudson/tasks/junit/RerunFailure.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package hudson.tasks.junit;

import java.io.Serializable;

public class RerunFailure implements Serializable {
private String message;
private String type;
private String stackTrace;
private String stdout;
private String stderr;

public RerunFailure() {}

Check warning on line 12 in src/main/java/hudson/tasks/junit/RerunFailure.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 12 is not covered by tests

public RerunFailure(String message, String type, String stackTrace, String stdout, String stderr) {
this.message = message;
this.type = type;
this.stackTrace = stackTrace;
this.stdout = stdout;
this.stderr = stderr;
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

Check warning on line 28 in src/main/java/hudson/tasks/junit/RerunFailure.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 27-28 are not covered by tests

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

Check warning on line 36 in src/main/java/hudson/tasks/junit/RerunFailure.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 35-36 are not covered by tests

public String getStackTrace() {
return stackTrace;
}

public void setStackTrace(String stackTrace) {
this.stackTrace = stackTrace;
}

Check warning on line 44 in src/main/java/hudson/tasks/junit/RerunFailure.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 43-44 are not covered by tests

public String getStdout() {
return stdout;
}

public void setStdout(String stdout) {
this.stdout = stdout;
}

Check warning on line 52 in src/main/java/hudson/tasks/junit/RerunFailure.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 51-52 are not covered by tests

public String getStderr() {
return stderr;
}

public void setStderr(String stderr) {
this.stderr = stderr;
}

Check warning on line 60 in src/main/java/hudson/tasks/junit/RerunFailure.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 59-60 are not covered by tests
}
2 changes: 2 additions & 0 deletions src/main/java/hudson/tasks/junit/TestResultAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,8 @@ public Widget getWidget() {
XSTREAM.alias("result", TestResult.class);
XSTREAM.alias("suite", SuiteResult.class);
XSTREAM.alias("case", CaseResult.class);
XSTREAM.alias("flakyFailure", FlakyFailure.class);
XSTREAM.alias("rerunFailure", RerunFailure.class);
XSTREAM.registerConverter(new HeapSpaceStringConverter(), 100);
}
}
11 changes: 11 additions & 0 deletions src/main/java/hudson/tasks/test/TestResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,12 @@
import hudson.model.Job;
import hudson.model.Result;
import hudson.model.Run;
import hudson.tasks.junit.FlakyFailure;
import hudson.tasks.junit.RerunFailure;
import hudson.tasks.junit.TestAction;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
Expand Down Expand Up @@ -263,6 +266,14 @@
return Collections.emptyMap();
}

public List<FlakyFailure> getFlakyFailures() {
return Collections.emptyList();
}

public List<RerunFailure> getRerunFailures() {
return Collections.emptyList();

Check warning on line 274 in src/main/java/hudson/tasks/test/TestResult.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 270-274 are not covered by tests
}

/**
* @return true if the test was not skipped and did not fail, false otherwise.
*/
Expand Down
Loading
Loading