Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for Robot Framework 5.0 #43

Merged
merged 14 commits into from
Mar 25, 2022
Merged
Show file tree
Hide file tree
Changes from 8 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
122 changes: 90 additions & 32 deletions src/main/java/hudson/plugins/robot/RobotParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -285,16 +285,24 @@ private RobotCaseResult processTest(XMLStreamReader reader, RobotSuiteResult res
StringBuilder stackTrace = new StringBuilder();

//parse stacktrace
String xmlTag = ignoreUntilStarts(reader, "kw", "for", "if", "doc", "tags", "tag", "status");
while (xmlTag.equals("kw") || xmlTag.equals("for") || xmlTag.equals("if")) {
if (xmlTag.equals("if")) {
stackTrace.append(processIf(reader, 0));
} else if (xmlTag.equals("for")) {
stackTrace.append(processForLoop(reader, 0));
} else {
stackTrace.append(processKeyword(reader, 0));
String[] possible_elements = {"kw", "for", "if", "try", "while", "doc", "tags", "tag", "status"};
String[] elements = {"kw", "for", "if", "try", "while"};
String xmlTag = ignoreUntilStarts(reader, possible_elements);
while (isNameInElements(xmlTag, elements)) {
switch (xmlTag) {
case "if":
case "try":
stackTrace.append(processBranchable(reader, 0));
break;
case "for":
case "while":
stackTrace.append(processLoop(reader, 0));
break;
default:
stackTrace.append(processKeyword(reader, 0));
break;
}
xmlTag = ignoreUntilStarts(reader, "kw", "for", "if", "doc", "tags", "tag", "status");
xmlTag = ignoreUntilStarts(reader, possible_elements);
}

caseResult.setStackTrace(stackTrace.toString().trim().replaceAll("\n+", "\n"));
Expand Down Expand Up @@ -341,12 +349,16 @@ private RobotCaseResult processTest(XMLStreamReader reader, RobotSuiteResult res
return caseResult;
}

private String processForLoop(XMLStreamReader reader, int nestedCount) throws XMLStreamException {
private String processLoop(XMLStreamReader reader, int nestedCount) throws XMLStreamException {
StringBuilder stackTrace = new StringBuilder();
String indentation = getSpacesPerNestedLevel(nestedCount);
stackTrace.append(indentation + "FOR " + reader.getAttributeValue(null, "flavor"));
String kind = reader.getLocalName();
stackTrace.append(indentation + kind.toUpperCase());
if (kind.equals("for")) {
stackTrace.append(" " + reader.getAttributeValue(null, "flavor"));
}
while (reader.hasNext()) {
if (reader.isEndElement() && reader.getLocalName().equals("for")) {
if (reader.isEndElement() && reader.getLocalName().equals(kind)) {
break;
}
if (reader.isStartElement() && reader.getLocalName().equals("iter")) {
Expand All @@ -366,14 +378,25 @@ private String processIteration(XMLStreamReader reader, int nestedCount) throws
}
if (reader.isStartElement()) {
String xmlTag = reader.getLocalName();
if (xmlTag.equals("for")) {
stackTrace.append(processForLoop(reader, nestedCount));
}
if (xmlTag.equals("kw")) {
stackTrace.append(processKeyword(reader, nestedCount));
}
if (xmlTag.equals("if")) {
stackTrace.append(processIf(reader, nestedCount));
switch (xmlTag) {
case "for":
case "while":
stackTrace.append(processLoop(reader, nestedCount));
break;
case "kw":
stackTrace.append(processKeyword(reader, nestedCount));
break;
case "if":
case "try":
stackTrace.append(processBranchable(reader, nestedCount));
break;
case "return":
case "break":
case "continue":
stackTrace.append(processReturnBreakContinue(reader, nestedCount));
break;
default:
break;
}
}
reader.next();
Expand All @@ -382,11 +405,12 @@ private String processIteration(XMLStreamReader reader, int nestedCount) throws
return stackTrace.toString();
}

private String processIf(XMLStreamReader reader, int nestedCount) throws XMLStreamException {
private String processBranchable(XMLStreamReader reader, int nestedCount) throws XMLStreamException {
StringBuilder stackTrace = new StringBuilder();
String indentation = getSpacesPerNestedLevel(nestedCount);
String kind = reader.getLocalName();
while (reader.hasNext()) {
if (reader.isEndElement() && reader.getLocalName().equals("if")) {
if (reader.isEndElement() && reader.getLocalName().equals(kind)) {
break;
}
if (reader.isStartElement() && reader.getLocalName().equals("branch")) {
Expand All @@ -407,14 +431,25 @@ private String processBranch(XMLStreamReader reader, int nestedCount) throws XML
}
if (reader.isStartElement()) {
String xmlTag = reader.getLocalName();
if (xmlTag.equals("for")) {
stackTrace.append(processForLoop(reader, nestedCount));
}
if (xmlTag.equals("kw")) {
stackTrace.append(processKeyword(reader, nestedCount));
}
if (xmlTag.equals("if")) {
stackTrace.append(processIf(reader, nestedCount));
switch (xmlTag) {
case "for":
case "while":
stackTrace.append(processLoop(reader, nestedCount));
break;
case "kw":
stackTrace.append(processKeyword(reader, nestedCount));
break;
case "if":
case "try":
stackTrace.append(processBranchable(reader, nestedCount));
break;
case "return":
case "break":
case "continue":
stackTrace.append(processReturnBreakContinue(reader, nestedCount));
break;
default:
break;
}
}
reader.next();
Expand All @@ -440,13 +475,20 @@ private String processKeyword(XMLStreamReader reader, int nestedCount) throws XM
stackTrace.append(processArgs(reader));
continue; // processArgs returns with us already in <kw>. We don't want to use reader.next()
case "for":
stackTrace.append(processForLoop(reader, nestedCount+1));
case "while":
stackTrace.append(processLoop(reader, nestedCount+1));
break;
case "kw":
stackTrace.append(processKeyword(reader, nestedCount+1));
break;
case "if":
stackTrace.append(processIf(reader, nestedCount+1));
case "try":
stackTrace.append(processBranchable(reader, nestedCount+1));
break;
case "return":
case "break":
case "continue":
stackTrace.append(processReturnBreakContinue(reader, nestedCount+1));
break;
default:
break;
Expand Down Expand Up @@ -500,6 +542,22 @@ private List<String> processTags(XMLStreamReader reader) throws XMLStreamExcepti
return tagList;
}

private String processReturnBreakContinue(XMLStreamReader reader, int nestedCount) throws XMLStreamException {
StringBuilder stringBuilder = new StringBuilder();
String kind = reader.getLocalName();
stringBuilder.append(getSpacesPerNestedLevel(nestedCount)).append(kind.toUpperCase());
while(reader.hasNext()) {
if (reader.isEndElement() && reader.getLocalName().equals(kind)) {
break;
}
if (reader.isStartElement() && reader.getLocalName().equals("kw")) {
stringBuilder.append(processKeyword(reader, nestedCount+1));
}
reader.next();
}
return stringBuilder.toString();
}

private static void setCriticalityIfAvailable(XMLStreamReader reader, RobotCaseResult caseResult) {
String criticality = reader.getAttributeValue(null, "critical");
if (criticality != null) {
Expand Down
6 changes: 6 additions & 0 deletions src/test/java/hudson/plugins/robot/RobotParserTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,12 @@ public void testRobot4If() {
final String dir = ".";
final String mask = "robot4_if_output.xml";
parse(dir, mask);
}

@Test
public void testRobot5Basic() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We will not remember in the future why we test Robot v.5 specifically. I would wish for more descriptive name (eg. testRobot5TryAndWhile) and a comment noting that this was introduced in RF5

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Renamed test and added a comment about test contents.

final String dir = "robot5";
final String mask = "basic_output.xml";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same problem as above: we won't remember in the future why we have basic_output.xml for RF5, rather than have a more descriptive name eg. robot5_except_while_output.xml

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Renamed output file.

parse(dir, mask);
}
}
Loading