1 /*
   2  * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /**
  25  *
  26  */
  27 
  28 import java.io.*;
  29 import java.util.Arrays;
  30 import java.util.Properties;
  31 import java.util.StringTokenizer;
  32 
  33 /**
  34  * RMI regression test utility class that uses Runtime.exec to spawn a
  35  * java process that will run a named java class.
  36  */
  37 public class JavaVM {
  38 
  39     // need to
  40     protected Process vm = null;
  41 
  42     private String classname = "";
  43     private String args = "";
  44     private String options = "";
  45     private OutputStream outputStream = System.out;
  46     private OutputStream errorStream = System.err;
  47     private String policyFileName = null;
  48 
  49     private static void mesg(Object mesg) {
  50         System.err.println("JAVAVM: " + mesg.toString());
  51     }
  52 
  53     /** string name of the program execd by JavaVM */
  54     private static String javaProgram = "java";
  55 
  56     static {
  57         try {
  58             javaProgram = TestLibrary.getProperty("java.home", "") +
  59                 File.separator + "bin" + File.separator + javaProgram;
  60         } catch (SecurityException se) {
  61         }
  62     }
  63 
  64     public JavaVM(String classname) {
  65         this.classname = classname;
  66     }
  67     public JavaVM(String classname,
  68                   String options, String args) {
  69         this.classname = classname;
  70         this.options = options;
  71         this.args = args;
  72     }
  73 
  74     public JavaVM(String classname,
  75                   String options, String args,
  76                   OutputStream out, OutputStream err) {
  77         this(classname, options, args);
  78         this.outputStream = out;
  79         this.errorStream = err;
  80     }
  81 
  82     public void addOptions(String[] opts) {
  83         String newOpts = "";
  84         for (int i = 0 ; i < opts.length ; i ++) {
  85             newOpts += " " + opts[i];
  86         }
  87         newOpts += " ";
  88         options = newOpts + options;
  89     }
  90     public void addArguments(String[] arguments) {
  91         String newArgs = "";
  92         for (int i = 0 ; i < arguments.length ; i ++) {
  93             newArgs += " " + arguments[i];
  94         }
  95         newArgs += " ";
  96         args = newArgs + args;
  97     }
  98 
  99     public void setPolicyFile(String policyFileName) {
 100         this.policyFileName = policyFileName;
 101     }
 102 
 103     /**
 104      * This method is used for setting VM options on spawned VMs.
 105      * It returns the extra command line options required
 106      * to turn on jcov code coverage analysis.
 107      */
 108     protected static String getCodeCoverageOptions() {
 109         return TestLibrary.getExtraProperty("jcov.options","");
 110     }
 111 
 112 
 113     /**
 114      * Exec the VM as specified in this object's constructor.
 115      */
 116     public void start() throws IOException {
 117 
 118         if (vm != null) return;
 119 
 120         /*
 121          * If specified, add option for policy file
 122          */
 123         if (policyFileName != null) {
 124             String option = "-Djava.security.policy=" + policyFileName;
 125             addOptions(new String[] { option });
 126         }
 127 
 128         addOptions(new String[] { getCodeCoverageOptions() });
 129 
 130         StringTokenizer optionsTokenizer = new StringTokenizer(options);
 131         StringTokenizer argsTokenizer = new StringTokenizer(args);
 132         int optionsCount = optionsTokenizer.countTokens();
 133         int argsCount = argsTokenizer.countTokens();
 134 
 135         String javaCommand[] = new String[optionsCount + argsCount + 2];
 136         int count = 0;
 137 
 138         javaCommand[count++] = JavaVM.javaProgram;
 139         while (optionsTokenizer.hasMoreTokens()) {
 140             javaCommand[count++] = optionsTokenizer.nextToken();
 141         }
 142         javaCommand[count++] = classname;
 143         while (argsTokenizer.hasMoreTokens()) {
 144             javaCommand[count++] = argsTokenizer.nextToken();
 145         }
 146 
 147         mesg("command = " + Arrays.asList(javaCommand).toString());
 148         System.err.println("");
 149 
 150         vm = Runtime.getRuntime().exec(javaCommand);
 151 
 152         /* output from the execed process may optionally be captured. */
 153         StreamPipe.plugTogether(vm.getInputStream(), this.outputStream);
 154         StreamPipe.plugTogether(vm.getErrorStream(), this.errorStream);
 155 
 156         try {
 157             Thread.sleep(2000);
 158         } catch (Exception ignore) {
 159         }
 160 
 161         mesg("finished starting vm.");
 162     }
 163 
 164     public void destroy() {
 165         if (vm != null) {
 166             vm.destroy();
 167         }
 168         vm = null;
 169     }
 170 
 171     protected Process getVM() {
 172         return vm;
 173     }
 174 }