You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by ka...@apache.org on 2012/06/26 10:43:19 UTC

svn commit: r1353862 - in /db/derby/code/trunk: ./ java/testing/org/apache/derbyTesting/functionTests/master/ java/testing/org/apache/derbyTesting/functionTests/suites/ java/testing/org/apache/derbyTesting/functionTests/tests/tools/ java/testing/org/ap...

Author: kahatlen
Date: Tue Jun 26 08:43:17 2012
New Revision: 1353862

URL: http://svn.apache.org/viewvc?rev=1353862&view=rev
Log:
DERBY-5821: tools/derbyrunjartest.java doesn't use jvmflags

Converted the test to JUnit to allow it to use BaseTestCase's helper
methods for starting sub-processes.

Extended BaseTestCase's helper methods with support for running jar
files with java -jar.

Added:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/derbyrunjartest.policy   (with props)
Removed:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/derbyrunjartest.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/derbyrunjartest_app.properties
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/derbyrunjartest_sed.properties
Modified:
    db/derby/code/trunk/build.xml
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/build.xml
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/derbyrunjartest.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java

Modified: db/derby/code/trunk/build.xml
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/build.xml?rev=1353862&r1=1353861&r2=1353862&view=diff
==============================================================================
--- db/derby/code/trunk/build.xml (original)
+++ db/derby/code/trunk/build.xml Tue Jun 26 08:43:17 2012
@@ -2752,7 +2752,7 @@ you should not have to do this.
             </instr>
 	</emma>
         <!-- Change the classpath used for junit tests to use the jars instrumented by EMMA -->
-        <property name="derby.junit.classpath" value="${emma}:${derby.jar.dir}/derbyTesting.jar:${instrumented.jars}/derbyclient.jar:${instrumented.jars}/derbynet.jar:${instrumented.jars}/derbytools.jar" />
+        <property name="derby.junit.classpath" value="${emma}:${derby.jar.dir}/derbyTesting.jar:${instrumented.jars}/derbyrun.jar"/>
     </target>
     
     <target name="emma-all" depends="emma-instrumentation,junit-all,emma-report">

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall?rev=1353862&r1=1353861&r2=1353862&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall Tue Jun 26 08:43:17 2012
@@ -1,4 +1,3 @@
 tools/dblook_test.java
 tools/dblook_test_territory.java
-tools/derbyrunjartest.java
 tools/ij.sql
\ No newline at end of file

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/build.xml
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/build.xml?rev=1353862&r1=1353861&r2=1353862&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/build.xml (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/build.xml Tue Jun 26 08:43:17 2012
@@ -135,7 +135,7 @@
   <target name="copyfiles">
     <copy todir="${out.dir}/${derby.testing.functest.dir}/tests/tools">
       <fileset dir="${derby.testing.src.dir}/${derby.testing.functest.dir}/tests/tools" 
-        includes="*.jar,*.sql,*.properties"/>  
+        includes="*.jar,*.sql,*.properties,*.policy"/>
     </copy>
   </target> 
 

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/derbyrunjartest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/derbyrunjartest.java?rev=1353862&r1=1353861&r2=1353862&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/derbyrunjartest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/derbyrunjartest.java Tue Jun 26 08:43:17 2012
@@ -21,97 +21,128 @@
 
 package org.apache.derbyTesting.functionTests.tests.tools;
 
-import java.io.File;
-import java.io.IOException;
-import java.lang.Process;
-import java.lang.Runtime;
-import java.lang.SecurityException;
 import java.net.URL;
-import java.security.CodeSource;
-import java.util.Vector;
+import java.util.ArrayList;
+import java.util.Arrays;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.apache.derbyTesting.junit.BaseTestCase;
+import org.apache.derbyTesting.junit.SecurityManagerSetup;
+
+/**
+ * Basic tests for exercising the {@code org.apache.derby.iapi.tools.run}
+ * class found in {@code derbyrun.jar}.
+ */
+public class derbyrunjartest extends BaseTestCase {
 
-import org.apache.derbyTesting.functionTests.harness.BackgroundStreamSaver;
-import org.apache.derbyTesting.functionTests.harness.jvm;
+    public derbyrunjartest(String name) {
+        super(name);
+    }
 
-public class derbyrunjartest {
+    public static Test suite() {
+        Class cl = derbyrunjartest.class;
+        return new SecurityManagerSetup(
+                new TestSuite(cl),
+                cl.getName().replace('.', '/') + ".policy",
+                true);
+    }
 
-    public static void main(String[] args) throws Exception
-    {
-        // get location of run class.
-        CodeSource cs = null;
-        try {
-            cs = org.apache.derby.iapi.tools.run.class.getProtectionDomain().getCodeSource();
-        } catch (SecurityException se) {
-            System.out.println("Security exception: " + se.getMessage());
-        }
- 
-        URL result = cs.getLocation();
-        jvm jvm = null;
+    /**
+     * Invoke {@code org.apache.derby.iapi.tools.run} in a sub-process.
+     *
+     * @param toolArgs the arguments to pass to derbyrun.jar
+     * @param output expected lines of output
+     * @param exitCode expected exit code for the command
+     */
+    private void runtool(String[] toolArgs, String[] output, int exitCode)
+            throws Exception {
+        String runClassName = org.apache.derby.iapi.tools.run.class.getName();
+        URL result = SecurityManagerSetup.getURL(runClassName);
         String derbyrunloc = null;
 
         if (result.toString().endsWith(".jar")) {
             derbyrunloc = result.toString().substring(5);
             if (System.getProperty("os.name").startsWith("Windows"))
               derbyrunloc = derbyrunloc.substring(1);
-            jvm = jvm.getJvm("currentjvm"); // ensure compatibility
         }
 
-        String[][] testCommands = new String[][] {
-            {"ij", "--help"},
-            {"sysinfo", "-cp", "help"},
-            {"dblook"},
-            {"server"},
-        };
+        ArrayList cmdArgs = new ArrayList();
 
-        for (int i = 0; i < testCommands.length; i++) {
-            runtool(jvm, derbyrunloc, testCommands[i]);
+        // Invoke java -jar derbyrun.jar if we are running from jars, or
+        // with fully qualified class name if we are running from classes.
+        if (derbyrunloc == null) {
+            cmdArgs.add(runClassName);
+        } else {
+            cmdArgs.add("-jar");
+            cmdArgs.add(derbyrunloc);
         }
-    }
 
-    private static void runtool(jvm jvm, String loc, String[] args)
-        throws IOException
-    {
-        System.out.println(concatenate(args) + ':');
-
-        if (jvm == null) {
-            org.apache.derby.iapi.tools.run.main(args);
-            return;
-        }
+        cmdArgs.addAll(Arrays.asList(toolArgs));
 
-        Vector cmd = jvm.getCommandLine();
-        cmd.addElement("-jar");
-        cmd.addElement(loc);
-        for (int i=0; i < args.length; i++) {
-            cmd.addElement(args[i]);
-        }
-        String command = concatenate((String[]) cmd.toArray(new String[0]));
+        String[] cmd = (String[]) cmdArgs.toArray(new String[cmdArgs.size()]);
+        assertExecJavaCmdAsExpected(output, cmd, exitCode);
+    }
 
-        Process pr = null;
+    public void testIJ() throws Exception {
+        String[] cmd = { "ij", "--help" };
+        String[] output = {
+            "Usage: java org.apache.derby.tools.ij [-p propertyfile] [inputfile]"
+        };
+        runtool(cmd, output, 0);
+    }
 
-        try
-        {
-            pr = Runtime.getRuntime().exec(command);
-            BackgroundStreamSaver saver = 
-                        new BackgroundStreamSaver(pr.getInputStream(), System.out);
-            saver.finish();
-            pr.waitFor();
-            pr.destroy();
-        } catch(Throwable t) {
-            System.out.println("Process exception: " + t.getMessage());
-            if (pr != null)
-            {
-                pr.destroy();
-                pr = null;
-            }
-        }
+    public void testSysinfo() throws Exception {
+        String[] cmd = { "sysinfo", "-cp", "help" };
+        String[] output = {
+            "USAGE: java org.apache.derby.tools.sysinfo -cp [ [ embedded ][ server ][ client] [ tools ] [ anyClass.class ] ]"
+        };
+        runtool(cmd, output, 0);
     }
 
-    private static String concatenate(String[] args) {
-        StringBuffer buf = new StringBuffer();
-        for (int i = 0; i < args.length; i++) {
-            buf.append(args[i]);
-            if (i + 1 < args.length) buf.append(' ');
-        }
-        return buf.toString();
+    public void testDblook() throws Exception {
+        String[] cmd = { "dblook" };
+        String[] output = {
+            " USAGE:",
+            " java org.apache.derby.tools.dblook -d <sourceDBUrl> [OPTIONS]",
+            " 	where the source URL is the full URL, including the connection protocol",
+            " 	and any connection attributes that might apply.  For example, use",
+            " 	options include:",
+            " 	-z <schemaName> to specify a schema to which the DDL generation",
+            " 	 should be limited.  Only database objects with that schema will have",
+            " 	 their DDL generated.",
+            " 	-t <tableOne> <tableTwo> ... to specify a list of tables for which",
+            " 	 the DDL will be generated; any tables not in the list will be ignored.",
+            " 	-td <value> to specify what should be appended to the end",
+            " 	 of each DDL statement.",
+            "		This defaults to ';'.",
+            " 	-noview to prevent the generation of DDL for views.",
+            " 	-append to keep from overwriting the output files.",
+            " 	-verbose to have error messages printed to the console (in addition",
+            " 	 to the log file).  If not specified, errors will only be printed to the",
+            " 	 log file.",
+            " 	-o <filename> to specify the file name to which the generated DDL",
+            " 	 will be written.",
+            " 		If not specified, default is the console.",
+        };
+        runtool(cmd, output, 0);
+    }
+
+    public void testServer() throws Exception {
+        String[] cmd = { "server" };
+        String[] output = {
+            "Usage: NetworkServerControl <commands> ",
+            "Commands:",
+            "start [-h <host>] [-p <portnumber>] [-noSecurityManager] [-ssl <sslmode>]",
+            "shutdown [-h <host>][-p <portnumber>] [-ssl <sslmode>] [-user <username>] [-password <password>]",
+            "ping [-h <host>][-p <portnumber>] [-ssl <sslmode>]",
+            "sysinfo [-h <host>][-p <portnumber>] [-ssl <sslmode>]",
+            "runtimeinfo [-h <host>][-p <portnumber>] [-ssl <sslmode>]",
+            "logconnections {on|off} [-h <host>][-p <portnumber>] [-ssl <sslmode>]",
+            "maxthreads <max>[-h <host>][-p <portnumber>] [-ssl <sslmode>]",
+            "timeslice <milliseconds>[-h <host>][-p <portnumber>] [-ssl <sslmode>]",
+            "trace {on|off} [-s <session id>][-h <host>][-p <portnumber>] [-ssl <sslmode>]",
+            "tracedirectory <traceDirectory>[-h <host>][-p <portnumber>] [-ssl <sslmode>]",
+        };
+        runtool(cmd, output, 1);
     }
 }

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/derbyrunjartest.policy
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/derbyrunjartest.policy?rev=1353862&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/derbyrunjartest.policy (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/derbyrunjartest.policy Tue Jun 26 08:43:17 2012
@@ -0,0 +1,24 @@
+//
+//   Licensed to the Apache Software Foundation (ASF) under one or more
+//   contributor license agreements.  See the NOTICE file distributed with
+//   this work for additional information regarding copyright ownership.
+//   The ASF licenses this file to You under the Apache License, Version 2.0
+//   (the "License"); you may not use this file except in compliance with
+//   the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+//
+
+grant codeBase "${derbyTesting.testjar}derbyTesting.jar" {
+  permission java.lang.RuntimePermission "getProtectionDomain";
+};
+
+grant codeBase "${derbyTesting.codeclasses}" {
+  permission java.lang.RuntimePermission "getProtectionDomain";
+};

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/derbyrunjartest.policy
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java?rev=1353862&r1=1353861&r2=1353862&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java Tue Jun 26 08:43:17 2012
@@ -549,6 +549,10 @@ public abstract class BaseTestCase
     public static Process execJavaCmd(
         String jvm, String cp, String[] cmd, final File dir)
             throws IOException {
+
+        // Is this an invocation of a jar file with java -jar ...?
+        final boolean isJarInvocation = cmd.length > 0 && cmd[0].equals("-jar");
+
 	    ArrayList cmdlist = new ArrayList();
         cmdlist.add(jvm == null ? getJavaExecutableName() : jvm);
 	    if (isJ9Platform())
@@ -581,6 +585,13 @@ public abstract class BaseTestCase
             if (cp != null) {
                 cp += File.pathSeparator + getEmmaJar().getPath();
             }
+
+            // DERBY-5821: When starting a sub-process with java -jar, the
+            // classpath argument will be ignored, so we cannot add emma.jar
+            // that way. Add it to the boot classpath instead.
+            if (isJarInvocation) {
+                cmdlist.add("-Xbootclasspath/a:" + getEmmaJar().getPath());
+            }
         }
 
         if (runsWithJaCoCo()) {
@@ -591,8 +602,16 @@ public abstract class BaseTestCase
                     "destfile=" + getJaCoCoOutFile());
         }
 
-	    cmdlist.add("-classpath");
-        cmdlist.add(cp == null ? getSystemProperty("java.class.path") : cp);
+        if (isJarInvocation) {
+            // If -jar is specified, the Java command will ignore the user's
+            // classpath, so don't set it. Fail if an explicit classpath has
+            // been set in addition to -jar, as that's probably a mistake in
+            // the calling code.
+            assertNull("Both -jar and classpath specified", cp);
+        } else {
+            cmdlist.add("-classpath");
+            cmdlist.add(cp == null ? getSystemProperty("java.class.path") : cp);
+        }
 
 	    for (int i =0; i < cmd.length;i++) {
 	        cmdlist.add(cmd[i]);