package testclient; import iaik.ixsil.algorithms.Transform; import iaik.ixsil.algorithms.TransformImplExclusiveCanonicalXML; import iaik.ixsil.init.IXSILInit; import iaik.ixsil.util.URI; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.RandomAccessFile; import java.io.UTFDataFormatException; import java.net.HttpURLConnection; import java.net.URL; import java.security.KeyStore; import java.security.Principal; import java.security.Security; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Enumeration; import java.util.Iterator; import java.util.StringTokenizer; import java.util.TreeMap; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.SAXParseException; import at.gv.egovernment.moa.spss.client.call.SignatureCreationCaller; import at.gv.egovernment.moa.spss.client.call.SignatureVerificationCaller; import at.gv.egovernment.moa.util.Base64Utils; import at.gv.egovernment.moa.util.Constants; import at.gv.egovernment.moa.util.DOMUtils; import at.gv.egovernment.moa.util.XPathUtils; import com.sun.net.ssl.internal.ssl.Provider; /** * @author Sven * * To change this generated comment edit the template variable "typecomment": * Window>Preferences>Java>Templates. * To enable and disable the creation of type comments go to * Window>Preferences>Java>Code Generation. */ public class TestClient { // stats private int pos_ok = 0; private int pos_nok = 0; private int pos_exc = 0; private int neg_ok = 0; private int neg_nok = 0; private int neg_exc = 0; private long max_request = 0; private long min_request = 99999; private long all_request = 0; private int count_all_request = 0; private int count_tests = 0; private TreeMap suits = new TreeMap(); private PrintStream Log = null; private static File directory = null; private static String directorystring = null; private static Provider ssl_provider = null; private static boolean ssl_connection = false; private static String defaultserver = "http://localhost:8080/"; private static String defaultdirectory = "data/feature41/"; private static String server; private static boolean ignoreSignatureValue = false; // end points private static String VERIFICATION_ENDPOINT = "moa-spss/services/SignatureVerification"; private static String CREATION_ENDPOINT = "moa-spss/services/SignatureCreation"; private static String SSL_VERIFICATION_ENDPOINT = null; private static String SSL_CREATION_ENDPOINT = null; private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss.SSS"); // super cool stuff private static ArrayList testtimes = new ArrayList(); private static ArrayList testnames = new ArrayList(); private static ArrayList testvalues = new ArrayList(); private static ArrayList testerrors = new ArrayList(); private static int ELEMS_MAX = 40; private static String ELEMS_ICON = "O"; private static String ELEMS_ICON_BAD = "X"; private static final boolean debug = true; public static void main(String[] args) { long start = System.currentTimeMillis(); long end = 0; System.out.println("Lade IXSIL ..."); try { IXSILInit.init(new URI("init/properties/init.properties")); } catch (Exception e) { e.printStackTrace(); System.exit(1); } System.out.println("Starte TestClient @ " + sdf.format(new Date(start)) + "..."); if (args.length == 0) { directory = new File(defaultdirectory); server = defaultserver; System.out.println("DefaultPfad wird benutzt (" + directory.getPath() + ")"); System.out.println("DefaultServer wird benutzt (" + server + ")"); } else if (args.length == 1) { System.out.println("Pfad " + args[0] + " wird benutzt "); directory = new File(args[0]); server = defaultserver; System.out.println("DefaultServer wird benutzt (" + server + ")"); } else if (args.length == 2) { System.out.println("Pfad " + args[0] + " wird benutzt "); directory = new File(args[0]); System.out.println("Server " + args[1] + " wird benutzt "); server = args[1]; } VERIFICATION_ENDPOINT = server + VERIFICATION_ENDPOINT; CREATION_ENDPOINT = server + CREATION_ENDPOINT; TestClient tc = new TestClient(); tc.run(); end = System.currentTimeMillis(); System.out.println("Ende TestClient @ " + sdf.format(new Date(end)) + "..."); System.out.println("Durchlaufzeit: " + ((end - start) / 1000) + " sekunden"); } public void run() { ssl_provider = new Provider(); Security.addProvider(ssl_provider); Log = System.out; try { prepareFiles(); runSuits(); } catch (Exception e) { e.printStackTrace(); } Log.println("----- Auswertung:"); Log.println("----- Positiv Tests:" + (pos_ok + pos_nok + pos_exc)); Log.println("----- OK:" + (pos_ok)); Log.println("----- nicht OK:" + (pos_nok)); Log.println("----- Exception aufgetreten:" + (pos_exc)); Log.println("----- Negativ Test:" + (neg_ok + neg_nok + neg_exc)); Log.println("----- OK:" + (neg_ok)); Log.println("----- nicht OK:" + (neg_nok)); Log.println("----- Exception aufgetreten:" + (neg_exc)); Log.println("----- schnellste Anfrage:" + min_request + " ms"); Log.println("----- langsamste Anfrage:" + max_request + " ms"); if (count_all_request > 2) Log.println( "----- durchschnittliche Anfrage:" + ((all_request - max_request - min_request) / (count_all_request - 2)) + " ms"); else if (count_all_request == 0) Log.println("----- keine gültigen Messungen für Durchschnittsermittlung"); else Log.println("----- durchschnittliche Anfrage:" + ((all_request) / (count_all_request)) + " ms"); } private void prepareFiles() throws Exception { if (!directory.isDirectory()) { throw new Exception("Das angegebene Verzeichnis ist kein Verzeichnis. Bitte Pfad überprüfen."); } directorystring = directory.getAbsolutePath(); String[] list = directory.list(); for (int counter = 0; counter < list.length; counter++) { if (list[counter].endsWith("Req.xml") || list[counter].endsWith("Res.xml") || list[counter].endsWith("Config.xml")) { String suitename = list[counter].substring(0, list[counter].indexOf(".")); if (!suits.containsKey(suitename)) suits.put(suitename, null); ArrayList al = (ArrayList) suits.get(suitename); if (al == null) { al = new ArrayList(); suits.put(suitename, al); } al.add(list[counter]); } } } private void runSuits() { Iterator i = suits.keySet().iterator(); while (i.hasNext()) { String suitename = (String) i.next(); Log.println("Suite:" + suitename); ArrayList al = (ArrayList) suits.get(suitename); testtimes.clear(); testnames.clear(); testvalues.clear(); testerrors.clear(); runTests(al, suitename); printGraph(testnames, testtimes, testvalues, testerrors, suitename); } } private void runTests(ArrayList testlist, String suitename) { TreeMap tests = new TreeMap(); String config = null; int size = testlist.size(); for (int counter = 0; counter < size; counter++) { String filename = (String) testlist.get(counter); StringTokenizer st = new StringTokenizer(filename, "."); String prefix = st.nextToken(); String number = st.nextToken(); if (number.equals("Config")) { config = filename; continue; } ArrayList testfiles = null; if (!tests.containsKey(number)) { testfiles = new ArrayList(); tests.put(number, testfiles); } else { testfiles = (ArrayList) tests.get(number); } testfiles.add(filename); } Iterator i = tests.keySet().iterator(); while (i.hasNext()) { String number = (String) i.next(); runTest((ArrayList) tests.get(number), null, number, suitename); } } private void runTest(ArrayList files, String config, String number, String suitename) { String request = null; String response = null; String errorresponse = null; //Log.println("Test:"+number+" Mit Config:"+config); int size = files.size(); for (int counter = 0; counter < size; counter++) { String filename = (String) files.get(counter); //Log.println("File:"+filename); if (filename.endsWith("ErrRes.xml")) errorresponse = filename; else if (filename.endsWith("Res.xml")) response = filename; else if (filename.endsWith("Req.xml")) request = filename; else Log.println("Nicht relevant:" + filename); } if (request != null) { for (int counter = 0; counter < 1; counter++) { if (response != null && errorresponse != null) Log.println( "Test " + number + " nicht gültig ! Sowohl Response als auch ErrorResponse vorhanden !"); else if (response != null) runPosTest(request, response, config, number, suitename); else if (errorresponse != null) runNegTest(request, errorresponse, config, number, suitename); } } else { Log.println("Test " + number + " nicht gültig ! Kein Request vorhanden !"); } } private void runPosTest(String request, String response, String config, String number, String suitename) { long start = System.currentTimeMillis(); long end = 0; Log.println("\n----- Starte Test <" + number + "> (positiv) -----"); Log.println("----- Request: " + request); Log.println("----- Response: " + response); try { long start_req = 0; long end_req = 0; Log.println("----- Lade Request:" + directorystring + "/" + request); FileInputStream fis = new FileInputStream(directorystring + "/" + request); Document root_doc = DOMUtils.parseDocument(fis, false, Constants.ALL_SCHEMA_LOCATIONS, null); Element root = root_doc.getDocumentElement(); if (debug) Log.println(DOMUtils.serializeNode(root)); Log.println("----- Lade Response:" + directorystring + "/" + response); FileInputStream fis2 = new FileInputStream(directorystring + "/" + response); Document root_response_doc = DOMUtils.parseDocument(fis2, true, Constants.ALL_SCHEMA_LOCATIONS, null); Element root_response = root_response_doc.getDocumentElement(); //can_root_response.normalize(); if (request.endsWith("CX3.001.Req.xml")) { printKeyStoreInformation("./resources/client.keystore", "changeit"); System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol"); System.setProperty("javax.net.ssl.keyStore", "./resources/client.keystore"); System.setProperty("javax.net.ssl.keyStorePassword", "changeit"); System.setProperty("javax.net.ssl.trustStore", "./resources/client.keystore"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); ssl_connection = true; } else ssl_connection = false; if (request.endsWith("CX0.005.Req.xml")) // ECDSA ignoreSignatureValue = true; else ignoreSignatureValue = false; boolean compare = false; Transform can = new TransformImplExclusiveCanonicalXML(); can.setInput(XPathUtils.selectNodeList(root_response, XPathUtils.ALL_NODES_XPATH), null); InputStream is = (InputStream) can.transform(); Document can_root_response_doc = DOMUtils.parseDocument(is, true, Constants.ALL_SCHEMA_LOCATIONS, null); Element can_root_response = root_response_doc.getDocumentElement(); if (checkNode(root, "VerifyCMSSignatureRequest")) { Log.println("----- Anfrage wird gesendet ..."); SignatureVerificationCaller svc = new SignatureVerificationCaller(); start_req = System.currentTimeMillis(); Element root_serverresponse = svc.verifyCMSSignature(root, VERIFICATION_ENDPOINT); end_req = System.currentTimeMillis(); Transform can2 = new TransformImplExclusiveCanonicalXML(); can2.setInput(XPathUtils.selectNodeList(root_serverresponse, XPathUtils.ALL_NODES_XPATH), null); InputStream is2 = (InputStream) can2.transform(); Document can_root_serverresponse_doc = DOMUtils.parseDocument(is2, true, Constants.ALL_SCHEMA_LOCATIONS, null); Element can_root_serverresponse = can_root_serverresponse_doc.getDocumentElement(); if (debug) Log.println("----- Antwort sollte so aussehen ...\n" + DOMUtils.serializeNode(can_root_response)); if (debug) Log.println("----- Antwort vom Server ...\n" + DOMUtils.serializeNode(can_root_serverresponse)); Log.println("----- Antwort validieren ...\n"); DOMUtils.validateElement(can_root_serverresponse, Constants.ALL_SCHEMA_LOCATIONS, null); Log.println("----- Antwort vergleichen ...\n"); String error = findErrorNode(can_root_serverresponse); if (error != null) { compare = false; Log.println("----- ServerError: " + error); testerrors.add(error); } else { compare = compareElements(can_root_response, can_root_serverresponse); testerrors.add(null); } } else if (checkNode(root, "VerifyXMLSignatureRequest")) { Log.println("----- Anfrage wird gesendet ..."); SignatureVerificationCaller svc = new SignatureVerificationCaller(); start_req = System.currentTimeMillis(); Element root_serverresponse = svc.verifyXMLSignature(root, VERIFICATION_ENDPOINT); end_req = System.currentTimeMillis(); Transform can2 = new TransformImplExclusiveCanonicalXML(); can2.setInput(XPathUtils.selectNodeList(root_serverresponse, XPathUtils.ALL_NODES_XPATH), null); InputStream is2 = (InputStream) can2.transform(); Document can_root_serverresponse_doc = DOMUtils.parseDocument(is2, false, Constants.ALL_SCHEMA_LOCATIONS, null); Element can_root_serverresponse = can_root_serverresponse_doc.getDocumentElement(); if (debug) Log.println("----- Antwort sollte so aussehen ...\n" + DOMUtils.serializeNode(can_root_response)); if (debug) Log.println("----- Antwort vom Server ...\n" + DOMUtils.serializeNode(can_root_serverresponse)); Log.println("----- Antwort validieren ...\n"); DOMUtils.validateElement(can_root_serverresponse, Constants.ALL_SCHEMA_LOCATIONS, null); Log.println("----- Antwort vergleichen ...\n"); String error = findErrorNode(can_root_serverresponse); if (error != null) { compare = false; Log.println("----- ServerError: " + error); testerrors.add(error); } else { compare = compareElements(can_root_response, can_root_serverresponse); testerrors.add(null); } } else if (checkNode(root, "CreateXMLSignatureRequest")) { Log.println("----- Anfrage wird gesendet ..."); SignatureCreationCaller scc = new SignatureCreationCaller(); start_req = System.currentTimeMillis(); Element root_serverresponse = scc.createXMLSignature(root, CREATION_ENDPOINT); end_req = System.currentTimeMillis(); Transform can2 = new TransformImplExclusiveCanonicalXML(); can2.setInput(XPathUtils.selectNodeList(root_serverresponse, XPathUtils.ALL_NODES_XPATH), null); InputStream is2 = (InputStream) can2.transform(); Document can_root_serverresponse_doc = DOMUtils.parseDocument(is2, false, Constants.ALL_SCHEMA_LOCATIONS, null); Element can_root_serverresponse = can_root_serverresponse_doc.getDocumentElement(); if (debug) Log.println("----- Antwort sollte so aussehen ...\n" + DOMUtils.serializeNode(can_root_response)); //Log.println("----- Antwort vom Server (von Can)...\n"+DOMUtils.serializeNode(root_serverresponse)); if (debug) Log.println("----- Antwort vom Server ...\n" + DOMUtils.serializeNode(can_root_serverresponse)); Log.println("----- Antwort validieren ...\n"); DOMUtils.validateElement(can_root_serverresponse, Constants.ALL_SCHEMA_LOCATIONS, null); Log.println("----- Antwort vergleichen ...\n"); String error = findErrorNode(can_root_serverresponse); if (error != null) { compare = false; Log.println("----- ServerError: " + error); testerrors.add(error); } else { compare = compareElements(can_root_response, can_root_serverresponse); testerrors.add(null); } } else { throw new Exception("Responsetyp nicht bekannt"); } if (compare) { pos_ok++; testvalues.add(" OK"); Log.println("----- Keine Fehler aufgetreten"); } else { pos_nok++; testvalues.add("NOK"); Log.println("----- Response war nicht ok !"); } Date start_date = new Date(start_req); Date end_date = new Date(end_req); long diff = end_req - start_req; Log.println("----- Requeststart: " + sdf.format(start_date)); Log.println("----- Requestende: " + sdf.format(end_date)); Log.println("----- Requestdauer: " + diff + " ms"); if (diff > max_request) max_request = diff; if (diff < min_request) min_request = diff; all_request += diff; count_all_request++; // :) testtimes.add(new Long(diff)); testnames.add(number); } catch (Exception e) { testtimes.add(new Long(-1L)); testnames.add(number); testvalues.add("EXC"); testerrors.add(e.getMessage()); pos_exc++; Log.println("----- Exception:\n"); e.printStackTrace(Log); } end = System.currentTimeMillis(); Log.println("----- Durchlaufzeit: " + ((end - start) / 1000) + " sekunden"); Log.println("----- Ende Test <" + number + "> -----\n"); } private void runNegTest( String request, String errorresponse, String config, String number, String suitename) { long start = System.currentTimeMillis(); long end = 0; Log.println("\n----- Starte Test <" + number + "> (negativ) -----"); Log.println("----- Config: " + config); Log.println("----- Request: " + request); Log.println("----- ErrorResponse: " + errorresponse); int error_no = 0; try { FileInputStream fis = null; Document root_doc = null; Element root = null; long start_req = 0; long end_req = 0; try { error_no = Integer.parseInt(readFile(directorystring + "/" + errorresponse)); } catch (NumberFormatException nfe) { throw new Exception( "Fehler beim Lesen der Datei " + directorystring + "/" + errorresponse + ". Die Fehlernummer konnte nicht ermittelt werden"); } try { Log.println("----- Lade Request: " + directorystring + "/" + request); fis = new FileInputStream(directorystring + "/" + request); root_doc = DOMUtils.parseDocument(fis, false, Constants.ALL_SCHEMA_LOCATIONS, null); root = root_doc.getDocumentElement(); } catch (SAXParseException saxpe) { Log.println("Fehler beim Lesen der Requestdatei !"); throw saxpe; } try { if (request.endsWith("CX4.051.Req.xml")) { printKeyStoreInformation("./resources/sven.keystore", "example"); System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol"); System.setProperty("javax.net.ssl.keyStore", "./resources/sven.keystore"); System.setProperty("javax.net.ssl.keyStorePassword", "example"); System.setProperty("javax.net.ssl.trustStore", "./resources/sven.keystore"); System.setProperty("javax.net.ssl.trustStorePassword", "example"); ssl_connection = true; } else if (request.endsWith("CX3.052.Req.xml")) { printKeyStoreInformation("./resources/client.keystore", "changeit"); System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol"); System.setProperty("javax.net.ssl.keyStore", "./resources/client.keystore"); System.setProperty("javax.net.ssl.keyStorePassword", "changeit"); System.setProperty("javax.net.ssl.trustStore", "./resources/client.keystore"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); ssl_connection = true; } else ssl_connection = false; Element root_serverresponse = null; if (checkNode(root, "VerifyCMSSignatureRequest")) { SignatureVerificationCaller svc = new SignatureVerificationCaller(); start_req = System.currentTimeMillis(); root_serverresponse = svc.verifyCMSSignature(root, VERIFICATION_ENDPOINT); end_req = System.currentTimeMillis(); Log.println(DOMUtils.serializeNode(root_serverresponse)); } else if (checkNode(root, "VerifyXMLSignatureRequest")) { SignatureVerificationCaller svc = new SignatureVerificationCaller(); start_req = System.currentTimeMillis(); root_serverresponse = svc.verifyXMLSignature(root, VERIFICATION_ENDPOINT); end_req = System.currentTimeMillis(); Log.println(DOMUtils.serializeNode(root_serverresponse)); } else if (checkNode(root, "CreateXMLSignatureRequest")) { SignatureCreationCaller svc = new SignatureCreationCaller(); start_req = System.currentTimeMillis(); root_serverresponse = svc.createXMLSignature(root, CREATION_ENDPOINT); end_req = System.currentTimeMillis(); Log.println(DOMUtils.serializeNode(root_serverresponse)); } Transform can2 = new TransformImplExclusiveCanonicalXML(); can2.setInput(XPathUtils.selectNodeList(root_serverresponse, XPathUtils.ALL_NODES_XPATH), null); InputStream is2 = (InputStream) can2.transform(); Document can_root_serverresponse_doc = DOMUtils.parseDocument(is2, false, Constants.ALL_SCHEMA_LOCATIONS, null); Element can_root_serverresponse = can_root_serverresponse_doc.getDocumentElement(); int errno = getErrorNumber(can_root_serverresponse); if (errno == -1) { Log.println("Kein Fehler aufgetreten oder Fehlernummer konnte nicht ermittelt werden."); neg_nok++; testvalues.add("NOK"); testerrors.add("Kein Fehler aufgetreten oder Fehlernummer konnte nicht ermittelt werden."); } else { Log.println("----- Fehlercode vom Server:" + errno); Log.println("----- Fehlercode vom Test:" + error_no); if (errno == error_no) { Log.println("Test erfolgreich !"); testvalues.add(" OK"); testerrors.add(null); neg_ok++; } else { Log.println("Test nicht erfolgreich !"); neg_nok++; testvalues.add("NOK"); testerrors.add("Fehlercodes nicht gleich: Server " + errno + " Client " + error_no); } } } catch (org.apache.axis.AxisFault af) { end_req = System.currentTimeMillis(); /* * Sample Fault: AxisFault faultCode: {http://xml.apache.org/axis/}Server.userException faultString: at.gv.egovernment.moa.spss.server.MOAApplicationException: Fehler beim Validieren der Anfrage faultActor: null faultDetail: ErrorResponse: 1100 Fehler beim Validieren der Anfrage */ Element base = af.getFaultDetails()[0]; System.out.println(DOMUtils.serializeNode(base)); int error_no_server = getErrorNumber(base); if (error_no_server == -1) { Log.println("Kein Fehler aufgetreten oder Fehlernummer konnte nicht ermittelt werden."); neg_nok++; testvalues.add("NOK"); testerrors.add("Kein Fehler aufgetreten oder Fehlernummer konnte nicht ermittelt werden."); } else { Log.println("----- Fehlercode vom Server:" + error_no_server); Log.println("----- Fehlercode vom Test:" + error_no); if (error_no_server == error_no) { Log.println("Test erfolgreich !"); testvalues.add(" OK"); testerrors.add(null); neg_ok++; } else { Log.println("Test nicht erfolgreich !"); neg_nok++; testvalues.add("NOK"); testerrors.add("Fehlercodes nicht gleich: Server " + error_no_server + " Client " + error_no); } } } long diff = end_req - start_req; Log.println("----- Requestdauer: " + diff + " ms"); if (diff > max_request) max_request = diff; if (diff < min_request) min_request = diff; all_request += diff; count_all_request++; testtimes.add(new Long(diff)); testnames.add(number); } catch (UTFDataFormatException e) { method2(request, error_no, number); } catch (SAXParseException e) { method2(request, error_no, number); } catch (Exception e) { neg_exc++; testtimes.add(new Long(-1L)); testnames.add(number); testvalues.add("EXC"); testerrors.add(e.getMessage()); Log.println("----- Exception:\n"); e.printStackTrace(Log); } end = System.currentTimeMillis(); Log.println("----- Durchlaufzeit: " + ((end - start) / 1000) + " sekunden"); Log.println("----- Ende Test <" + number + "> -----\n"); } private void method2(String request, int error_no, String number) { try { Log.println("----- Methode 2\n"); String data = readFile(directorystring + "/" + request); //Log.println("Data:\n"+data); int index = data.indexOf(">"); if (index != -1) { String xml_head = data.substring(0, index); data = data.substring(index + 1); //Log.println("Data2:\n"+data); data = xml_head + "\" " + "soap:encodingStyle=\"http://www.w3.org/2001/12/soap-encoding\"> " + " " + data + "" + ""; //Log.println("Data3:\n"+data); String ep = null; if (data.indexOf(""); if (pos == -1) { Log.println("Test nicht erfolgreich !"); neg_nok++; testvalues.add("NOK"); testtimes.add(new Long(-1)); testnames.add(number); testerrors.add("Test nicht erfolgreich !"); } else { resp = resp.substring(pos + "ErrorCode>".length()); pos = resp.indexOf("<"); if (pos == -1) { Log.println("Test nicht erfolgreich !"); neg_nok++; testvalues.add("NOK"); testtimes.add(new Long(-1)); testnames.add(number); testerrors.add("Test nicht erfolgreich !"); } else { resp = resp.substring(0, pos); int err_resp = -1; try { err_resp = Integer.parseInt(resp); } catch (NumberFormatException nfe) { } //Log.println("ResponseCode:\n"+resp); Log.println("----- Fehlercode vom Server:" + err_resp); Log.println("----- Fehlercode vom Test:" + error_no); if (err_resp == error_no) { Log.println("Test erfolgreich !"); neg_ok++; testvalues.add(" OK"); testtimes.add(new Long(-1)); testnames.add(number); testerrors.add(null); } else { Log.println("Test nicht erfolgreich !"); neg_ok++; testvalues.add("NOK"); testtimes.add(new Long(-1)); testnames.add(number); testerrors.add("Fehlercodes nicht gleich: Server " + err_resp + " Client " + error_no); } } } } } } catch (Exception ee) { ee.printStackTrace(); } } private boolean compareElements(Element root1, Element root2) { //Log.println("----- Compare Elements:"+root1.getNodeName()+" "+root2.getNodeName()); filterTree(root1); filterTree(root2); return compareNodes(root1, root2, 0, "root/", false); } private boolean compareNodes(Node n1, Node n2, int level, String path, boolean attribute) { /*try { Log.println(DOMUtils.serializeNode(n1)); } catch(Exception e) { e.printStackTrace(); }*/ boolean equal = false; //Log.println("----- Compare Node "+level+":"+n1+" "+n2); //Log.println("----- Compare Node "+level+":"+n1.getNodeName()+" "+n2.getNodeName()); //Log.println("----- Checking:"+path+getPathString(n1)); NodeList nl1 = n1.getChildNodes(); NodeList nl2 = n2.getChildNodes(); int size1 = nl1.getLength(); int size2 = nl2.getLength(); if (debug) display_one(n1); if (debug) display_one(n2); if (debug) if (n1.getNodeName().equals("Base64Content") && n2.getNodeName().equals("Base64Content")) { try { Log.println( "CONT:" + new String(Base64Utils.decode(strip(n1.getChildNodes().item(0).getNodeValue()), false))); Log.println( "CONT:" + new String(Base64Utils.decode(strip(n2.getChildNodes().item(0).getNodeValue()), false))); } catch (Exception e) { e.printStackTrace(); } } if (size1 != size2) { Log.println( "----- Anzahl der Kinder nicht gleich:" + path + getPathString(n1) + "(" + size1 + ") / " + getPathString(n2) + "(" + size2 + ")"); return false; } equal = compareNodeExact(n1, n2, level, path + getPathString(n1) + "/"); if (!equal) { Log.println("----- Knoten sind nicht identisch:" + path + getPathString(n1)); return false; } if (n1.hasAttributes() || n2.hasAttributes()) { equal = compareNodeAttriubtes(n1, n2, level + 1, path + getPathString(n1) + "/(a)"); if (!equal) { Log.println("----- Attribute stimmen nicht überein:" + path + getPathString(n1)); return false; } } if (size1 == 0) { return true; } for (int counter = 0; counter < size1; counter++) { boolean found = false; Node comp_n1 = nl1.item(counter); //if(comp_n1==null) return false; Node comp_n2 = null; size2 = nl2.getLength(); for (int counter2 = 0; counter2 < size2; counter2++) { comp_n2 = nl2.item(counter2); /*equal = compareNodeExact(comp_n1,comp_n2,level+1); if(equal) return false;*/ //Log.println("COMP_N1:"+comp_n1); //Log.println("COMP_N2:"+comp_n2); equal = compareNodes(comp_n1, comp_n2, level + 1, path + getPathString(comp_n1) + "/", false); if (equal) { n2.removeChild(comp_n2); counter2 = size2; nl2 = n2.getChildNodes(); size2 = nl2.getLength(); } } if (!equal) { Log.println("----- Keine Übereinstimmung gefunden:" + path + getPathString(comp_n1)); return false; } } return true; } private boolean compareNodeExact(Node n1, Node n2, int level, String path) { if (n1.getNodeType() == Node.TEXT_NODE) { Text textnode = (Text) n1; /*Log.println("----- *****"+textnode.getNodeName()); Log.println("----- *****"+textnode.getParentNode().getNodeName()); Log.println("----- *****"+textnode.getNodeValue());*/ } //Log.println("----- Checking:"+path); String n1_name = n1.getNodeName(); String n2_name = n2.getNodeName(); /*Log.println("----- !!!!!"+n1.getNodeName()); Log.println("----- !!!!!"+n1.getNodeValue()); Log.println("----- !!!!!"+n1.getLocalName()); Log.println("----- !!!!!"+n1.getPrefix()); Log.println("----- !!!!!"+n1.getNextSibling()); Log.println("----- !!!!!"+n1.getPreviousSibling());*/ //Log.println("----- Compare Node "+level+":"+n1_name+" "+n2_name); if (!((n1_name == null && n2_name == null) || (n1_name != null && n2_name != null && n1_name.equals(n2_name)))) { Log.println("----- Name stimmt nicht überein:" + path); return false; } //Log.println("----- Compare Node "+level+":"+n1.getNodeType()+" "+n2.getNodeType()); if (n1.getNodeType() != n2.getNodeType()) { Log.println("----- Knotentyp stimmt nicht überein:" + path); return false; } String n1_ns = n1.getPrefix(); String n2_ns = n2.getPrefix(); //Log.println("----- Compare Node "+level+":"+n1_ns+" "+n2_ns); if (!((n1_ns == null && n2_ns == null) || (n1_ns != null && n2_ns != null && n1_ns.equals(n2_ns)))) { Log.println("----- NameSpace stimmt nicht überein:" + path); return false; } String n1_value = n1.getNodeValue(); String n2_value = n2.getNodeValue(); boolean special = false; special = specialValues(n1_value, n2_value, path); if (special) return true; //Log.println("----- Compare Node "+level+":"+n1_value+" "+n2_value); if (!((n1_value == null && n2_value == null) || (n1_value != null && n2_value != null && n1_value.equals(n2_value)))) { Log.println("----- Wert stimmt nicht überein:" + path); Log.println("----- Value1:\n" + n1_value); Log.println("----- Value2:\n" + n2_value); return false; } return true; } private boolean compareNodeAttriubtesWithoutSize(Node n1, Node n2, int level, String path) { return true; } private boolean compareNodeAttriubtes(Node n1, Node n2, int level, String path) { //Log.println("----- Compare NodeAttributes "+level+":"+n1.getNodeName()+" "+n2.getNodeName()); Element n1elem = (Element) n1; Element n2elem = (Element) n2; NamedNodeMap nnm1 = n1.getAttributes(); NamedNodeMap nnm2 = n2.getAttributes(); int size1 = 0; int size2 = 0; boolean specialattrs = specialAttributesSize(path); if (!specialattrs) { if (nnm1 == null && nnm2 == null) return true; if (nnm1 == null || nnm2 == null) { Log.println("----- Anzahl der Attribute nicht gleich:" + path + ":" + getPathString(n1)); return false; } size1 = nnm1.getLength(); size2 = nnm2.getLength(); if (size1 != size2) { Log.println("----- Anzahl der Attribute nicht gleich:" + path + ":" + getPathString(n1)); return false; } } else { return compareNodeAttriubtesWithoutSize(n1, n2, level, path); } for (int counter = 0; counter < size1; counter++) { Node attribute_node1 = nnm1.item(counter); Node attribute_node2 = nnm2.item(counter); String attr1_name = attribute_node1.getNodeName(); String attr2_name = attribute_node2.getNodeName(); //Log.println("----- Checking:"+path+">"+attr1_name); String value1 = n1elem.getAttribute(attr1_name); String value2 = n2elem.getAttribute(attr2_name); boolean special = false; special = specialAttributes(value1, value2); if (special) { return special; } if (!value1.equals(value2)) { Log.println("----- Keine Übereinstimmung gefunden:" + path + getPathString(n1)); return false; } //Log.println("----- Compare NodeAttributes > "+level+":"+attribute_node1+" "+attribute_node2); /*boolean equal = compareNodes(attribute_node1,attribute_node2,level+1,path+attribute_node1.getNodeName()+"/",true); if(!equal) { //Log.println("----- no match for:"+attribute_node1.getNodeName()); return false; }*/ } return true; } private boolean checkNode(Node base, String name) { if (base.getNodeName().equals(name)) { return true; } NodeList children = base.getChildNodes(); int size = children.getLength(); for (int counter = 0; counter < size; counter++) { boolean found = checkNode(children.item(counter), name); if (found) return true; } return false; } private void display_one(Node base) { int att_size = 0; if (base.getAttributes() != null) { att_size = base.getAttributes().getLength(); } if (base.getNodeName().equals("#text")) Log.println( base.getNodeName() + base.getChildNodes().getLength() + ":" + att_size + " (" + base.getNodeValue() + ")"); else Log.println(base.getNodeName() + base.getChildNodes().getLength() + ":" + att_size); } private void display(Node base) { display(base, 1); } private void display(Node base, int level) { String spacer = ""; for (int counter = 0; counter < level; counter++) { spacer += " "; } int att_size = 0; if (base.getAttributes() != null) { att_size = base.getAttributes().getLength(); } if (base.getNodeName().equals("#text")) Log.println( spacer + base.getNodeName() + base.getChildNodes().getLength() + ":" + att_size + " (" + base.getNodeValue() + ")"); else Log.println(spacer + base.getNodeName() + base.getChildNodes().getLength() + ":" + att_size); NodeList children = base.getChildNodes(); int size = children.getLength(); for (int counter = 0; counter < size; counter++) { display(children.item(counter), level + 1); } } private void filterTree(Node base) { ArrayList removeList = new ArrayList(); NodeList children = base.getChildNodes(); int size = children.getLength(); for (int counter = 0; counter < size; counter++) { Node child1 = children.item(counter); if (child1.getNodeType() == Node.TEXT_NODE && child1.getNodeValue().trim().equals("")) { removeList.add(child1); } } size = removeList.size(); for (int counter = 0; counter < size; counter++) { base.removeChild((Node) removeList.get(counter)); } children = base.getChildNodes(); size = children.getLength(); for (int counter = 0; counter < size; counter++) { filterTree(children.item(counter)); } } private String readFile(String filename) throws Exception { RandomAccessFile raf = new RandomAccessFile(filename, "r"); if (raf.length() > Integer.MAX_VALUE) throw new IOException("file too big to fit in byte array."); byte[] result = new byte[(int) raf.length()]; raf.read(result); return new String(result); } private String getPathString(Node n) { if (n.getNodeType() == Node.TEXT_NODE) { return n.getParentNode().getNodeName() + "(text)"; } else { return n.getNodeName(); } } private String replaceString(String input, String oldPart, String newPart) throws Exception { String erg = null; //First Part erg = input.substring(0, input.indexOf(oldPart)); //Insert new Part erg += newPart; //insert REST erg += input.substring(input.indexOf(oldPart) + oldPart.length(), input.length()); return erg; } private String replaceStringWithCheck(String input, String oldPart, String newPart) throws Exception { String erg = null; if (input.indexOf(oldPart) == -1) return input; return replaceString(input, oldPart, newPart); } private void printKeyStoreInformation(String keystore, String pw) throws Exception { KeyStore ks = KeyStore.getInstance("JKS", "SUN"); ks.load(new FileInputStream(keystore), pw.toCharArray()); Enumeration enum = ks.aliases(); while (enum.hasMoreElements()) { String certname = (String) enum.nextElement(); Log.println("Cert:" + certname); sun.security.x509.X509CertImpl c = (sun.security.x509.X509CertImpl) ks.getCertificate(certname); Principal p = c.getIssuerDN(); Log.println(" Issuer:" + p.getName()); p = c.getSubjectDN(); Log.println(" Subject:" + p.getName()); Log.println(" Serial:" + c.getSerialNumber()); } } private void printGraph( ArrayList names, ArrayList times, ArrayList values, ArrayList errors, String suitename) { long max = getMax(times, names); //Log.println("MAX:"+max); if (max == -1) { Log.println("Kein Graph möglich !"); return; } Log.println("names:" + names.size()); Log.println("times:" + times.size()); Log.println("values:" + values.size()); Log.println("errors:" + errors.size()); Log.println("# | Status | Suite:" + suitename); int size = times.size(); for (int counter = 0; counter < size; counter++) { String output = ""; long value = ((Long) times.get(counter)).longValue(); if (value != -1) { output = names.get(counter) + " | " + values.get(counter) + " | " + getElement(value, max); } else { output = names.get(counter) + " | " + values.get(counter) + " | " + ELEMS_ICON_BAD; } if (errors.get(counter) != null) { output += buildSpacer(70 - output.length()) + errors.get(counter); } Log.println(output); } } private String getElement(long value, long max) { boolean plus = false; int elems = (int) (((((double) value) / ((double) max)) * (ELEMS_MAX / 2))); if (elems > ELEMS_MAX) { elems = ELEMS_MAX; plus = true; } StringBuffer sb = new StringBuffer(); for (int counter = 0; counter < elems; counter++) { sb.append(ELEMS_ICON); } for (int counter = 0; counter < (ELEMS_MAX - elems); counter++) { sb.append(" "); } if (plus) sb.append("> "); else sb.append(" "); sb.append(value + " ms"); return sb.toString(); } private long getMax(ArrayList times, ArrayList names) { int count = 0; double sum = 0; int size = times.size(); for (int counter = 0; counter < size; counter++) { //Log.println(times.get(counter)+":"+names.get(counter)); long value = ((Long) times.get(counter)).longValue(); if (value != -1) { sum += value; count++; } } if (count == 0) return -1; return ((long) (sum / count)); } private boolean specialAttributes(String value1, String value2) { //if(value1.startsWith("reference-") && value2.startsWith("reference-")) return true; if (value1.startsWith("signature-") && value2.startsWith("signature-")) return true; return false; } private boolean specialAttributesSize(String path) { if (path.endsWith("/xsl:template/(a)")) return true; return false; } private boolean specialValues(String value1, String value2, String path) { //Log.println(path); if (ignoreSignatureValue) { if (path.endsWith("/dsig:SignatureValue(text)/")) { return true; } } else { if (path.endsWith("/dsig:SignatureValue(text)/")) { String stripped_1 = strip(value1); String stripped_2 = strip(value2); return stripped_1.equals(stripped_2); } } if (path.endsWith("/dsig:X509Certificate(text)/")) { String stripped_1 = strip(value1); String stripped_2 = strip(value2); return stripped_1.equals(stripped_2); } if (path.endsWith("/dsig:Object(text)/")) { String stripped_1 = strip(value1); String stripped_2 = strip(value2); return stripped_1.equals(stripped_2); } if (path.endsWith("/Base64Content(text)/")) { String stripped_1 = strip(value1); String stripped_2 = strip(value2); return stripped_1.equals(stripped_2); } if (path.endsWith("/FailedReference(text)/")) { try { int stripped_1 = Integer.parseInt(value1); int stripped_2 = Integer.parseInt(value2); return stripped_1 == stripped_2; } catch (Exception e) { return false; } } return false; } private String strip(String input) { String output = replaceStringAll(input, " ", ""); output = replaceStringAll(output, "\n", ""); output = replaceStringAll(output, "\r", ""); return output; } public static String replaceStringAll(String input, String oldPart, String newPart) { String erg = null; int pos = input.indexOf(oldPart); if (pos == -1) return input; while (true) { //First Part pos = input.indexOf(oldPart); if (pos == -1) break; erg = input.substring(0, pos); //Insert new Part erg += newPart; //insert REST erg += input.substring(input.indexOf(oldPart) + oldPart.length(), input.length()); input = erg; } return erg; } private int getErrorNumber(Element root) { ArrayList result = new ArrayList(); findNode(root, "ErrorCode", result); if (result.size() != 1) return -1; Node n = (Node) result.get(0); String text = (String) n.getChildNodes().item(0).getNodeValue(); try { int error = Integer.parseInt(text); return error; } catch (NumberFormatException nfe) { Log.println(text + " ist keine gültige Fehlernummer"); return -1; } } private void findNode(Node base, String name, ArrayList foundNodes) { findNode(base, name, foundNodes, -1); } private void findNode(Node base, String name, ArrayList foundNodes, int max_level) { findNode(base, name, foundNodes, max_level, 0); } private void findNode(Node base, String name, ArrayList foundNodes, int max_level, int level) { if (max_level != -1 && max_level <= level) return; //System.out.println("FINDNODE "+name); //System.out.println("CHECKING "+base.getNodeName()); if (base.getNodeName().endsWith(name)) { //System.out.println("ADD BASE !"+name); foundNodes.add(base); } NodeList children = base.getChildNodes(); int size = children.getLength(); for (int counter = 0; counter < size; counter++) { findNode(children.item(counter), name, foundNodes, max_level, level + 1); } } private String findErrorNode(Node n) { ArrayList al = new ArrayList(); findNode(n, "ErrorResponse", al); if (al.size() != 0) { al.clear(); findNode(n, "ErrorCode", al); String code = ((Node) al.get(0)).getChildNodes().item(0).getNodeValue(); al.clear(); findNode(n, "Info", al); String msg = ((Node) al.get(0)).getChildNodes().item(0).getNodeValue(); return "ErrorCode: " + code + " / ErrorMsg: " + msg; } else return null; } private String buildSpacer(int length) { if (length <= 0) return ""; else { StringBuffer output = new StringBuffer(); for (int counter = 0; counter < length; counter++) { output.append(" "); } return output.toString(); } } }