You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jdo-commits@db.apache.org by mc...@apache.org on 2010/12/03 05:03:44 UTC

svn commit: r1041682 - in /db/jdo/trunk/exectck/src/main/java/org/apache/jdo/exectck: RunTCK.java Utilities.java

Author: mcaisse
Date: Fri Dec  3 04:03:44 2010
New Revision: 1041682

URL: http://svn.apache.org/viewvc?rev=1041682&view=rev
Log:
JDO-647 - Progress.... interim check-in

Modified:
    db/jdo/trunk/exectck/src/main/java/org/apache/jdo/exectck/RunTCK.java
    db/jdo/trunk/exectck/src/main/java/org/apache/jdo/exectck/Utilities.java

Modified: db/jdo/trunk/exectck/src/main/java/org/apache/jdo/exectck/RunTCK.java
URL: http://svn.apache.org/viewvc/db/jdo/trunk/exectck/src/main/java/org/apache/jdo/exectck/RunTCK.java?rev=1041682&r1=1041681&r2=1041682&view=diff
==============================================================================
--- db/jdo/trunk/exectck/src/main/java/org/apache/jdo/exectck/RunTCK.java (original)
+++ db/jdo/trunk/exectck/src/main/java/org/apache/jdo/exectck/RunTCK.java Fri Dec  3 04:03:44 2010
@@ -14,10 +14,12 @@ import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Properties;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import org.apache.commons.io.FileUtils;
+import org.apache.jdo.exectck.Utilities.InvocationResult;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -367,7 +369,8 @@ public class RunTCK extends AbstractMojo
         Properties props = null;
         boolean alreadyran = false;
         String runonce = "false";
-        StringBuffer propsString = new StringBuffer(" ");
+//        StringBuffer propsString = new StringBuffer(" ");
+        List<String> propsString = new ArrayList<String>();
 
         if (cfgs != null) {
             System.out.println("Configurations specified in cfgs are " + cfgs.toString());
@@ -390,16 +393,15 @@ public class RunTCK extends AbstractMojo
                 + "\n  identity types: " + identitytypes.toString());
 
         // Properties required for test execution
-        propsString.append(" -DResultPrinterClass=" + resultPrinterClass);
-        propsString.append(" -Dverbose=" + verbose);
-        propsString.append(" -Djdo.tck.cleanupaftertest=" + cleanupaftertest);
-        propsString.append(" -DPMFProperties=" + pmfProperties);
-        propsString.append(" -DPMFProperties=" + confDirectory + File.separator
-                + pmfProperties + " ");
-        propsString.append(" -DPMF2Properties=" + buildDirectory + File.separator
+        propsString.add("-DResultPrinterClass=" + resultPrinterClass);
+        propsString.add("-Dverbose=" + verbose);
+        propsString.add("-Djdo.tck.cleanupaftertest=" + cleanupaftertest);
+        propsString.add("-DPMFProperties=" + buildDirectory + File.separator
+                + "classes" + File.separator + pmfProperties);
+        propsString.add("-DPMF2Properties=" + buildDirectory + File.separator
                 + "classes" + File.separator + pmfProperties);
         String excludeFile = confDirectory + File.separator + exclude;
-        propsString.append(" -Djdo.tck.exclude=" +
+        propsString.add("-Djdo.tck.exclude=" +
                 PropertyUtils.getProperties(excludeFile).getProperty("jdo.tck.exclude"));
 
         // Create configuration log directory
@@ -412,7 +414,7 @@ public class RunTCK extends AbstractMojo
             throw new MojoExecutionException("Failed to create directory "
                     + cfgDirName);
         }
-        propsString.append(" -Djdo.tck.log.directory=" + thisLogDir);
+        propsString.add("-Djdo.tck.log.directory=" + thisLogDir);
 
         // Get ClassLoader URLs to build classpath below
         URL[] cpURLs = ((URLClassLoader) Thread.currentThread().getContextClassLoader()).getURLs();
@@ -423,7 +425,7 @@ public class RunTCK extends AbstractMojo
             alreadyran = false;
 
             for (String idtype : idtypes) {
-                propsString.append(" -Djdo.tck.identitytype=" + idtype);
+                propsString.add("-Djdo.tck.identitytype=" + idtype);
                 String enhancedDirName = buildDirectory + File.separator + "enhanced"
                         + File.separator + impl + File.separator + idtype + File.separator;
                 File enhancedDir = new File(enhancedDirName);
@@ -454,15 +456,15 @@ public class RunTCK extends AbstractMojo
                     // Parse conf file and set properties String
                     props = PropertyUtils.getProperties(confDirectory
                             + File.separator + cfg);
-                    propsString.append(" -Djdo.tck.testdata=" +
+                    propsString.add("-Djdo.tck.testdata=" +
                             props.getProperty("jdo.tck.testdata"));
-                    propsString.append(" -Djdo.tck.standarddata=" +
+                    propsString.add("-Djdo.tck.standarddata=" +
                             props.getProperty("jdo.tck.standarddata"));
-//                    propsString.append(" -Djdo.tck.description=\"" +
+//                    propsString.append("-Djdo.tck.description=\"" +
 //                            props.getProperty("jdo.tck.description") + "\"");
-                    propsString.append(" -Djdo.tck.requiredOptions=" +
+                    propsString.add("-Djdo.tck.requiredOptions=" +
                             props.getProperty("jdo.tck.requiredOptions"));
-                    propsString.append(" -Djdo.tck.signaturefile=" +
+                    propsString.add("-Djdo.tck.signaturefile=" +
                             signaturefile);
                     String mapping = props.getProperty("jdo.tck.mapping");
                     if (mapping == null) {
@@ -474,9 +476,11 @@ public class RunTCK extends AbstractMojo
                         throw new MojoExecutionException(
                                 "Could not find classes value in conf file: " + cfg);
                     }
+                    List<String> classesList = Arrays.asList(classes.split(" "));
+
 
-                    propsString.append(" -Djdo.tck.schemaname=" + idtype + mapping);
-                    propsString.append(" -Djdo.tck.cfg=" + cfg);
+                    propsString.add("-Djdo.tck.schemaname=" + idtype + mapping);
+                    propsString.add("-Djdo.tck.cfg=" + cfg);
 
                     runonce = props.getProperty("runonce");
                     runonce = (runonce == null) ? "false" : runonce;
@@ -499,17 +503,31 @@ public class RunTCK extends AbstractMojo
                     }
 
                     // build command line string
-                    StringBuffer cmdBuf = new StringBuffer();
-                    cmdBuf.append("java " + " ");
-                    cmdBuf.append("-cp " + cpString + " ");
-                    cmdBuf.append(propsString + " ");
-                    cmdBuf.append(dbproperties + " ");
-                    cmdBuf.append(jvmproperties + " ");
+//                    StringBuffer cmdBuf = new StringBuffer();
+                    List<String> command = new ArrayList<String>();
+                    command.add("java");
+                    command.add("-cp");
+                    command.add(cpString);
+                    command.addAll(propsString);
+                    command.add(dbproperties);
+                    // TODO!!! split jvmproperties into a List!!
+                    command.add(jvmproperties);
                     if (debugTCK) {
-                        cmdBuf.append(debugDirectives + " ");
+                        command.add(debugDirectives);
                     }
-                    cmdBuf.append(testRunnerClass + " ");
-                    cmdBuf.append(classes);
+                    command.add(testRunnerClass);
+                    command.addAll(classesList);
+
+//                    cmdBuf.append("java ");
+//                    cmdBuf.append("-cp " + cpString + " ");
+//                    cmdBuf.append(propsString + " ");
+//                    cmdBuf.append(dbproperties + " ");
+//                    cmdBuf.append(jvmproperties + " ");
+//                    if (debugTCK) {
+//                        cmdBuf.append(debugDirectives + " ");
+//                    }
+//                    cmdBuf.append(testRunnerClass + " ");
+//                    cmdBuf.append(classes);
 
                     // invoke class runner
                     System.out.println("Starting configuration=" + cfg +
@@ -522,21 +540,15 @@ public class RunTCK extends AbstractMojo
                     if (runonce.equals("true") && alreadyran) {
                         continue;
                     }
-                    System.out.println("Command line is: \n" + cmdBuf.toString());
-                    try {
-                        Process proc = Runtime.getRuntime().exec(cmdBuf.toString());
-//                        System.out.println("Err: "
-//                                + Utilities.convertStreamToString(proc.getErrorStream()));
-//                        System.out.println("Out: "
-//                                + Utilities.convertStreamToString(proc.getInputStream()));
-                        try {
-                            proc.waitFor();
-                        } catch (InterruptedException ex) {
-                            Logger.getLogger(RunTCK.class.getName()).log(Level.SEVERE, null, ex);
-                        }
-                    } catch (IOException ex) {
-                        Logger.getLogger(RunTCK.class.getName()).log(Level.SEVERE, null, ex);
+                    System.out.println("Command line is: \n" + command.toString());
+                    InvocationResult result = (new Utilities()).invokeTest(command);
+
+                    if (runtckVerbose) {
+                        System.out.println("Test exit value is" + result.getExitValue());
+                        System.out.println("Test result output:\n" + result.getOutputString());
+                        System.out.println("Test result error:\n" + result.getErrorString());
                     }
+
                     if (runonce.equals("true")) {
                         alreadyran = true;
                     }

Modified: db/jdo/trunk/exectck/src/main/java/org/apache/jdo/exectck/Utilities.java
URL: http://svn.apache.org/viewvc/db/jdo/trunk/exectck/src/main/java/org/apache/jdo/exectck/Utilities.java?rev=1041682&r1=1041681&r2=1041682&view=diff
==============================================================================
--- db/jdo/trunk/exectck/src/main/java/org/apache/jdo/exectck/Utilities.java (original)
+++ db/jdo/trunk/exectck/src/main/java/org/apache/jdo/exectck/Utilities.java Fri Dec  3 04:03:44 2010
@@ -10,9 +10,13 @@ import java.io.StringWriter;
 import java.io.Writer;
 import java.net.URL;
 import java.net.URLClassLoader;
+import java.nio.CharBuffer;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.List;
+import java.util.Map;
+import javax.jdo.JDOException;
 
 public class Utilities {
 
@@ -92,31 +96,118 @@ public class Utilities {
 
     }
 
-    public static String convertStreamToString(InputStream is)
-            throws IOException {
-        /*
-         * To convert the InputStream to String we use the
-         * Reader.read(char[] buffer) method. We iterate until the
-         * Reader return -1 which means there's no more data to
-         * read. We use the StringWriter class to produce the string.
-         */
-        if (is != null) {
-            Writer writer = new StringWriter();
-
-            char[] buffer = new char[1024];
-            try {
-                Reader reader = new BufferedReader(
-                        new InputStreamReader(is, "UTF-8"));
-                int n;
-                while ((n = reader.read(buffer)) != -1) {
-                    writer.write(buffer, 0, n);
-                }
-            } finally {
-                is.close();
+//    public static String convertStreamToString(InputStream is)
+//            throws IOException {
+//        /*
+//         * To convert the InputStream to String we use the
+//         * Reader.read(char[] buffer) method. We iterate until the
+//         * Reader return -1 which means there's no more data to
+//         * read. We use the StringWriter class to produce the string.
+//         */
+//        if (is != null) {
+//            Writer writer = new StringWriter();
+//
+//            char[] buffer = new char[1024];
+//            try {
+//                Reader reader = new BufferedReader(
+//                        new InputStreamReader(is, "UTF-8"));
+//                int n;
+//                while ((n = reader.read(buffer)) != -1) {
+//                    writer.write(buffer, 0, n);
+//                }
+//            } finally {
+//                is.close();
+//            }
+//            return writer.toString();
+//        } else {
+//            return "";
+//        }
+//    }
+    InvocationResult invokeTest(List command) {
+        InvocationResult result = new InvocationResult();
+        try {
+            ProcessBuilder builder = new ProcessBuilder(command);
+            Map<String, String> env = builder.environment();
+            Process proc = builder.start();
+            InputStream stdout = proc.getInputStream();
+            InputStream stderr = proc.getErrorStream();
+            CharBuffer outBuffer = CharBuffer.allocate(1000000);
+            CharBuffer errBuffer = CharBuffer.allocate(1000000);
+            Thread outputThread = createReaderThread(stdout, outBuffer);
+            Thread errorThread = createReaderThread(stderr, errBuffer);
+            int exitValue = proc.waitFor();
+            result.setExitValue(exitValue);
+            errorThread.join(10000); // wait ten seconds to get stderr after process terminates
+            outputThread.join(10000); // wait ten seconds to get stdout after process terminates
+            result.setErrorString(errBuffer.toString());
+            result.setOutputString(outBuffer.toString());
+            // wait until the Enhancer command finishes
+        } catch (InterruptedException ex) {
+            throw new RuntimeException("InterruptedException", ex);
+        } catch (IOException ex) {
+            throw new RuntimeException("IOException", ex);
+        } catch (JDOException jdoex) {
+            jdoex.printStackTrace();
+            Throwable[] throwables = jdoex.getNestedExceptions();
+            System.out.println("Exception throwables of size: " + throwables.length);
+            for (Throwable throwable: throwables) {
+                throwable.printStackTrace();
             }
-            return writer.toString();
-        } else {
-            return "";
         }
+        return result;
+    }
+
+    private Thread createReaderThread(final InputStream input, final CharBuffer output) {
+        final Reader reader = new InputStreamReader(input);
+        Thread thread = new Thread(
+                new Runnable() {
+                    public void run() {
+                        int count = 0;
+                        int outputBytesRead = 0;
+                        try {
+                            while (-1 != (outputBytesRead = reader.read(output))) {
+                                count += outputBytesRead;
+                            }
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        } finally {
+                            output.flip();
+                        }
+                    }
+                });
+        thread.start();
+        return thread;
+    }
+
+
+    class InvocationResult {
+        private int exitValue;
+        private String errorString;
+        private String outputString;
+
+        int getExitValue() {
+            return exitValue;
+        }
+
+        private void setExitValue(int exitValue) {
+            this.exitValue = exitValue;
+        }
+
+        private void setErrorString(String errorString) {
+            this.errorString = errorString;
+        }
+
+        String getErrorString() {
+            return errorString;
+        }
+
+        private void setOutputString(String outputString) {
+            this.outputString = outputString;
+        }
+
+        String getOutputString() {
+            return outputString;
+        }
+
     }
 }