diff options
| author | J08nY | 2017-10-16 00:09:49 +0200 |
|---|---|---|
| committer | J08nY | 2017-10-16 00:09:49 +0200 |
| commit | dfd0247c88b730300b1e9df64d8331b79524ffc2 (patch) | |
| tree | 6d6cdc8fdac80a71fef757b52ebdcd373c7d0e5f /src | |
| parent | 114c3378e323b954bfd8c0470e489c9615978d58 (diff) | |
| download | ECTester-dfd0247c88b730300b1e9df64d8331b79524ffc2.tar.gz ECTester-dfd0247c88b730300b1e9df64d8331b79524ffc2.tar.zst ECTester-dfd0247c88b730300b1e9df64d8331b79524ffc2.zip | |
Diffstat (limited to 'src')
| -rw-r--r-- | src/cz/crcs/ectester/reader/ECTester.java | 5 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/output/OutputWriter.java | 4 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/output/XMLOutputWriter.java | 93 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/test/Test.java | 9 |
4 files changed, 104 insertions, 7 deletions
diff --git a/src/cz/crcs/ectester/reader/ECTester.java b/src/cz/crcs/ectester/reader/ECTester.java index c0c282c..0d558cb 100644 --- a/src/cz/crcs/ectester/reader/ECTester.java +++ b/src/cz/crcs/ectester/reader/ECTester.java @@ -35,6 +35,7 @@ import javacard.security.KeyPair; import org.apache.commons.cli.*; import javax.smartcardio.CardException; +import javax.xml.parsers.ParserConfigurationException; import java.io.*; import java.nio.file.Files; import java.util.*; @@ -113,7 +114,7 @@ public class ECTester { writer = new TextOutputWriter(logger.getPrintStream()); break; case "xml": - writer = new XMLOutputWriter(); + writer = new XMLOutputWriter(logger.getOutputStream()); break; case "html": writer = new HTMLOutputWriter(); @@ -177,6 +178,8 @@ public class ECTester { } catch (CardException ex) { if (logger != null) logger.println(ex.getMessage()); + } catch (ParserConfigurationException e) { + e.printStackTrace(); } finally { if (logger != null) logger.flush(); diff --git a/src/cz/crcs/ectester/reader/output/OutputWriter.java b/src/cz/crcs/ectester/reader/output/OutputWriter.java index ddcef8c..761d712 100644 --- a/src/cz/crcs/ectester/reader/output/OutputWriter.java +++ b/src/cz/crcs/ectester/reader/output/OutputWriter.java @@ -3,6 +3,10 @@ package cz.crcs.ectester.reader.output; import cz.crcs.ectester.reader.response.Response; import cz.crcs.ectester.reader.test.Test; +import javax.xml.stream.XMLStreamException; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; + /** * @author Jan Jancar johny@neuromancer.sk */ diff --git a/src/cz/crcs/ectester/reader/output/XMLOutputWriter.java b/src/cz/crcs/ectester/reader/output/XMLOutputWriter.java index 2755501..4f72a16 100644 --- a/src/cz/crcs/ectester/reader/output/XMLOutputWriter.java +++ b/src/cz/crcs/ectester/reader/output/XMLOutputWriter.java @@ -1,29 +1,118 @@ package cz.crcs.ectester.reader.output; +import cz.crcs.ectester.reader.Util; import cz.crcs.ectester.reader.response.Response; import cz.crcs.ectester.reader.test.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.*; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import java.io.OutputStream; /** * @author Jan Jancar johny@neuromancer.sk */ public class XMLOutputWriter implements OutputWriter { + private OutputStream output; + private Document doc; + private Node root; + + public XMLOutputWriter(OutputStream output) throws ParserConfigurationException { + this.output = output; + this.doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + } + @Override public void begin() { + root = doc.createElement("testRun"); + doc.appendChild(root); + } + + private Element responseElement(Response r) { + Element responseElem = doc.createElement("response"); + responseElem.setAttribute("successful", r.successful() ? "true" : "false"); + + Element apdu = doc.createElement("apdu"); + apdu.setTextContent(Util.bytesToHex(r.getAPDU().getBytes())); + responseElem.appendChild(apdu); + + Element naturalSW = doc.createElement("natural-sw"); + naturalSW.setTextContent(String.valueOf(r.getNaturalSW())); + responseElem.appendChild(naturalSW); + + Element sws = doc.createElement("sws"); + for (int i = 0; i < r.getNumSW(); ++i) { + Element sw = doc.createElement("sw"); + sw.setTextContent(String.valueOf(r.getSW(i))); + sws.appendChild(sw); + } + responseElem.appendChild(sws); + Element duration = doc.createElement("duration"); + duration.setTextContent(String.valueOf(r.getDuration())); + responseElem.appendChild(duration); + + Element description = doc.createElement("desc"); + description.setTextContent(r.getDescription()); + responseElem.appendChild(description); + + return responseElem; } @Override public void printResponse(Response r) { + root.appendChild(responseElement(r)); + } + + private Element testElement(Test t) { + Element testElem = doc.createElement("test"); + + if (t instanceof Test.Simple) { + Test.Simple test = (Test.Simple) t; + testElem.setAttribute("type", "simple"); + testElem.appendChild(responseElement(test.getResponse())); + } else if (t instanceof Test.Compound) { + Test.Compound test = (Test.Compound) t; + testElem.setAttribute("type", "compound"); + for (Test innerTest : test.getTests()) { + testElem.appendChild(testElement(innerTest)); + } + } + Element description = doc.createElement("desc"); + description.setTextContent(t.getDescription()); + testElem.appendChild(description); + + Element result = doc.createElement("result"); + result.setTextContent(t.getResult().toString()); + testElem.appendChild(result); + + return testElem; } @Override public void printTest(Test t) { - + if (!t.hasRun()) + return; + root.appendChild(testElement(t)); } @Override public void end() { - + try { + DOMSource domSource = new DOMSource(doc); + StreamResult result = new StreamResult(output); + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.transform(domSource, result); + } catch (TransformerException e) { + e.printStackTrace(); + } } }
\ No newline at end of file diff --git a/src/cz/crcs/ectester/reader/test/Test.java b/src/cz/crcs/ectester/reader/test/Test.java index cb885e5..92c2ebb 100644 --- a/src/cz/crcs/ectester/reader/test/Test.java +++ b/src/cz/crcs/ectester/reader/test/Test.java @@ -23,6 +23,8 @@ public abstract class Test { return result; } + public abstract String getDescription(); + public boolean hasRun() { return hasRun; } @@ -31,7 +33,6 @@ public abstract class Test { public abstract void run() throws CardException; - public abstract String getDescription(); /** * A result of a Test. @@ -112,11 +113,11 @@ public abstract class Test { this.tests = tests; } - public Compound function(Function<Test[], Result> callback, Test... tests) { + public static Compound function(Function<Test[], Result> callback, Test... tests) { return new Compound(callback, tests); } - public Compound all(Result what, Test... all) { + public static Compound all(Result what, Test... all) { return new Compound((tests) -> { for (Test test : tests) { if (test.getResult() != what) { @@ -127,7 +128,7 @@ public abstract class Test { }, all); } - public Compound any(Result what, Test... any) { + public static Compound any(Result what, Test... any) { return new Compound((tests) -> { for (Test test : tests) { if (test.getResult() == what) { |
