package er.erxtest; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Iterator; import java.util.Vector; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import org.junit.runner.Description; import org.junit.runner.Result; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunListener; public class ERXTestReportListener extends RunListener { int attempted = 0; int failed = 0; long start = 0L; int loop = 0; private ArrayList<String> listLoadedClasses(ClassLoader loader) { ArrayList<String> loadedClasses = new ArrayList<>(); Class klass = loader.getClass(); while (klass != java.lang.ClassLoader.class) { klass = klass.getSuperclass(); } try { java.lang.reflect.Field fldClasses = klass.getDeclaredField("classes"); fldClasses.setAccessible(true); Vector classes = (Vector) fldClasses.get(loader); for (Iterator iter = classes.iterator(); iter.hasNext();) { loadedClasses.add(iter.next().toString()); } } catch (java.lang.SecurityException e) { e.printStackTrace(); } catch (java.lang.IllegalArgumentException e) { e.printStackTrace(); } catch (java.lang.NoSuchFieldException e) { e.printStackTrace(); } catch (java.lang.IllegalAccessException e) { e.printStackTrace(); } return loadedClasses; } private ArrayList<String> getVersionInfo(boolean verbose) { ClassLoader loader = this.getClass().getClassLoader(); ArrayList<String> found = listLoadedClasses(loader); ArrayList<String> fixed = new ArrayList<>(); java.security.MessageDigest md = null; try { md = java.security.MessageDigest.getInstance("SHA-1"); } catch (java.security.NoSuchAlgorithmException nsae) { throw new IllegalArgumentException(nsae); } for (String aClassName : found) { String classAsPath = aClassName.replace("interface ", "").replace("class ", "").replace('.', '/') + ".class"; java.io.InputStream stream = loader.getResourceAsStream(classAsPath); int current = 0; int intvl = 16; byte bytes[] = new byte[intvl]; try { int bytesRead = 1; while (bytesRead > 0) { if (stream != null) { bytesRead = stream.read(bytes, current, intvl); md.update(bytes, 0, intvl); if (verbose) { for (int idx = 0; idx < bytesRead; idx++) { String num = Integer.toHexString(bytes[idx] & 0xff); while (num.length() < 2) { num = "0"+num; } System.out.print(" "+num); } System.out.println(""); } } else bytesRead = 0; } } catch (java.io.IOException ioe) { System.out.println(ioe.getMessage()); } byte[] digest = md.digest(); StringBuilder str = new StringBuilder(); for (int idx = 0; idx < digest.length; idx++) { String num = Integer.toHexString(digest[idx] & 0xff); while (num.length() < 2) { num = "0"+num; } str.append(num); } fixed.add(str+" "+aClassName); } if (verbose) System.out.println("system classes found # "+found.size()); return fixed; } @Override public void testRunStarted(Description description) { start = System.currentTimeMillis(); } @Override public void testStarted(Description description) { } @Override public void testFailure(Failure failure) { } private static java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public void testRunFinished(Result result) { String contact = System.getProperty("wo.test.emailAddress"); if (contact != null && ! contact.equals("") && ! contact.startsWith("$")) { ArrayList<String> params = new ArrayList<>(); params.add("email="+contact); params.add("duration="+(System.currentTimeMillis() - start)); params.add("when="+format.format(new java.util.Date())); params.add("timezone="+java.util.TimeZone.getDefault().getID()); int failCount = 0; for (Failure f : result.getFailures()) { params.add("fail"+(++failCount)+"="+f); } String osName = System.getProperty("os.name"); String osVersion = System.getProperty("os.version"); String javaVersion = System.getProperty("java.version"); String woVersion = Application.application().getWebObjectsVersion(); params.add("env1=OS: "+osName+" - "+osVersion); params.add("env2=JavaVM: "+javaVersion); params.add("env3=WebObjects: "+woVersion); String extra = System.getProperty("wo.test.extra"); if (extra != null && ! extra .equals("") && ! extra.startsWith("$")) { if (extra.length() > 64) extra = extra.substring(0,64); params.add("env4="+extra); } int versCount = 0; for (String version : getVersionInfo(false)) { params.add("vers"+(++versCount)+"="+version); } StringBuilder allParams = new StringBuilder(); for (int idx = 0; idx < params.size(); idx++) { //System.out.println(" param: \""+params.get(idx)+"\""); if (idx > 0) allParams.append("&"); allParams.append(params.get(idx)); } try { String url = "https://wocommunity.org/apps/WebObjects/WOTested.woa/wa/addResult"; //String url = "http://10.0.1.6:55555/cgi-bin/WebObjects/WOTested.woa/wa/addResult"; URL homeURL = null; homeURL = new URL(url); HttpURLConnection connection = null; if (url.startsWith("http:")) { connection = (HttpURLConnection)homeURL.openConnection(); } if (url.startsWith("https:")) { final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { @Override public void checkClientTrusted(final X509Certificate[] chain, final String authType) { } @Override public void checkServerTrusted(final X509Certificate[] chain, final String authType) { } @Override public X509Certificate[] getAcceptedIssuers() { return null; } } }; final SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); connection = (HttpURLConnection)homeURL.openConnection(); ((HttpsURLConnection)connection).setSSLSocketFactory(sslSocketFactory); } if (connection != null) { connection.setDoOutput(true); OutputStreamWriter osWriter = new OutputStreamWriter(connection.getOutputStream()); osWriter.write(allParams.toString()); osWriter.close(); int httpResponse = connection.getResponseCode(); } } catch (java.io.IOException ioe) { System.out.println("Test results not submitted. No worries.\n"+ioe); } catch (java.security.NoSuchAlgorithmException nsae) { System.out.println("Test results not submitted. No worries.\n"+nsae); } catch (java.security.KeyManagementException kme) { System.out.println("Test results not submitted. No worries.\n"+kme); } } } }