Home | History | Annotate | Download | only in framework
      1 /*
      2  * Licensed to the Apache Software Foundation (ASF) under one or more
      3  * contributor license agreements.  See the NOTICE file distributed with
      4  * this work for additional information regarding copyright ownership.
      5  * The ASF licenses this file to You under the Apache License, Version 2.0
      6  * (the "License"); you may not use this file except in compliance with
      7  * the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *
     15  *  See the License for the specific language governing permissions and
     16  *  limitations under the License.
     17  */
     18 
     19 /**
     20  * @author Vitaly A. Provodin
     21  */
     22 
     23 /**
     24  * Created on 26.01.2005
     25  */
     26 package org.apache.harmony.jpda.tests.framework;
     27 
     28 import java.util.HashMap;
     29 
     30 /**
     31  * This class provides access to options for running JPDA tests.
     32  * <p>
     33  * The settings are presented as a set of getters and setters for test options,
     34  * which can be implemented in different ways. In this implementation test
     35  * options are implemented via VM system properties, which can be specified
     36  * using option '-D' in VM command line.
     37  * <p>
     38  * The following options are currently recognized:
     39  * <ul>
     40  * <li><code>jpda.settings.debuggeeJavaHome</code>
     41  *   - path to Java bundle to run debuggee on
     42  * <li><code>jpda.settings.debuggeeJavaExec</code>
     43  *   - name of Java executable to run debuggee on
     44  * <li><code>jpda.settings.debuggeeJavaPath</code>
     45  *   - full path to Java executable to run debuggee on
     46  * <li><code>jpda.settings.debuggeeAgentName</code>
     47  *   - name of agent native library
     48  * <li><code>jpda.settings.debuggeeAgentExtraOptions</code>
     49  *   - extra options for agent
     50  * <li><code>jpda.settings.debuggeeClassName</code>
     51  *   - full name of class to run debuggee with
     52  * <li><code>jpda.settings.debuggeeVMExtraOptions</code>
     53  *   - extra options to run debuggee with
     54  * <li><code>jpda.settings.debuggeeSuspend</code>
     55  *   - debuggee suspend mode ("y"|"n")
     56  * <li><code>jpda.settings.transportWrapperClass</code>
     57  *   - class name of TransportWrapper implementation
     58  * <li><code>jpda.settings.transportAddress</code>
     59  *   - address for JDWP connection
     60  * <li><code>jpda.settings.connectorKind</code>
     61  *   - type of JDWP connection (attach or listen)
     62  * <li><code>jpda.settings.syncPort</code>
     63  *   - port number for sync connection
     64  * <li><code>jpda.settings.timeout</code>
     65  *   - timeout used in JPDA tests
     66  * <li><code>jpda.settings.waitingTime</code>
     67  *   - timeout for waiting events
     68  * </ul>
     69  * <li><code>jpda.settings.verbose</code>
     70  *   - flag that disables (default) or enables writing messages to the log
     71  * </ul>
     72  * All options have default values, if they are not specified.
     73  *
     74  */
     75 public class TestOptions {
     76 
     77     /** Default timeout value for various operations. */
     78     public static final int DEFAULT_TIMEOUT = 1 * 60 * 1000; // 1 minute
     79 
     80     /** Default time interval for waiting for various events. */
     81     public static final int DEFAULT_WAITING_TIME = DEFAULT_TIMEOUT;
     82 
     83     /** Default static address for transport connection. */
     84     public static final String DEFAULT_ATTACHING_ADDRESS = "127.0.0.1:9898";
     85 
     86     /** Default port number for sync connection. */
     87     public static final String DEFAULT_STATIC_SYNC_PORT = "9797";
     88 
     89     /** Default port number for sync connection. */
     90     public static final int DEFAULT_SYNC_PORT = 0;
     91 
     92     /** Default class name for transport wrapper. */
     93     public static final String DEFAULT_TRANSPORT_WRAPPER
     94         = "org.apache.harmony.jpda.tests.framework.jdwp.SocketTransportWrapper";
     95 
     96     /** Default aclass name for debuggee application. */
     97     public static final String DEFAULT_DEBUGGEE_CLASS_NAME
     98         = "org.apache.harmony.jpda.tests.jdwp.share.debuggee.HelloWorld";
     99 
    100     // current waiting time value (negative means using default value)
    101     private long waitingTime = -1;
    102 
    103     // current timeout value (negative means using default value)
    104     private long timeout = -1;
    105 
    106     // internally set property values
    107     private HashMap internalProperties = new HashMap();
    108 
    109     /**
    110      * Constructs an instance of this class.
    111      */
    112     public TestOptions() {
    113         super();
    114     }
    115 
    116     /**
    117      * Returns path to Java bundle to run debuggee on.
    118      *
    119      * @return option "jpda.settings.debuggeeJavaHome" or system property
    120      *         "java.home" by default.
    121      */
    122     public String getDebuggeeJavaHome() {
    123         return getProperty("jpda.settings.debuggeeJavaHome", getProperty("java.home", null));
    124     }
    125 
    126     /**
    127      * Returns name of Java executable to run debuggee on.
    128      *
    129      * @return option "jpda.settings.debuggeeJavaExec" or "java" by default.
    130      */
    131     public String getDebuggeeJavaExec() {
    132         return getProperty("jpda.settings.debuggeeJavaExec", "java");
    133     }
    134 
    135     /**
    136      * Returns full path to Java executable to run debuggee on.
    137      *
    138      * @return option "jpda.settings.debuggeeJavaPath" or construct path from
    139      *         getDebuggeeJavaHome() and getDebuggeeJavaExec() by default.
    140      */
    141     public String getDebuggeeJavaPath() {
    142         return getProperty("jpda.settings.debuggeeJavaPath",
    143                 getDebuggeeJavaHome() + "/bin/" + getDebuggeeJavaExec());
    144     }
    145 
    146     /**
    147      * Returns class name of TransportWrapper implementation.
    148      *
    149      * @return option "jpda.settings.transportWrapperClass" or
    150      *         DEFAULT_TRANSPORT_WRAPPER by default.
    151      */
    152     public String getTransportWrapperClassName() {
    153         return getProperty("jpda.settings.transportWrapperClass",
    154                 DEFAULT_TRANSPORT_WRAPPER);
    155     }
    156 
    157     /**
    158      * Returns address for JDWP connection or null for dynamic address.
    159      *
    160      * @return option "jpda.settings.transportAddress" or null by default.
    161      */
    162     public String getTransportAddress() {
    163         return getProperty("jpda.settings.transportAddress", null);
    164     }
    165 
    166     /**
    167      * Sets address to attach to debuggee.
    168      *
    169      * @param address to attach
    170      */
    171     public void setTransportAddress(String address) {
    172         setProperty("jpda.settings.transportAddress", address);
    173     }
    174 
    175     /**
    176      * Returns name of JDWP agent library.
    177      *
    178      * @return option "jpda.settings.debuggeeAgentName" or "jdwp" by default
    179      */
    180     public String getDebuggeeAgentName() {
    181         return getProperty("jpda.settings.debuggeeAgentName", "jdwp");
    182     }
    183 
    184     /**
    185      * Returns string with extra options for agent.
    186      *
    187      * @return option "jpda.settings.debuggeeAgentExtraOptions" or "" by default
    188      */
    189     public String getDebuggeeAgentExtraOptions() {
    190         return getProperty("jpda.settings.debuggeeAgentExtraOptions", "");
    191     }
    192 
    193     /**
    194      * Returns string with all options for agent including specified connection
    195      * address.
    196      *
    197      * @param address - address to attach
    198      * @param isDebuggerListen - true if debugger is listening for connection
    199      *
    200      * @return string with all agent options
    201      */
    202     public String getDebuggeeAgentOptions(String address, boolean isDebuggerListen) {
    203         String serv;
    204         if (isDebuggerListen) {
    205             serv = "n";
    206         } else {
    207             serv = "y";
    208         }
    209 
    210         // add ',' to agent extra options if required
    211         String agentExtraOptions = getDebuggeeAgentExtraOptions();
    212         if (agentExtraOptions.length() > 0 && agentExtraOptions.charAt(0) != ',') {
    213             agentExtraOptions = "," + agentExtraOptions;
    214         }
    215 
    216         return getProperty("jpda.settings.debuggeeAgentOptions",
    217                 "transport=dt_socket,address=" + address + ",server=" + serv
    218                 + ",suspend=" + getDebuggeeSuspend() + agentExtraOptions);
    219     }
    220 
    221     /**
    222      * Returns string with all options for agent including specified connection
    223      * address (only for debugger in listening mode). It just calls
    224      * <ul>
    225      * <li><code>getDebuggeeAgentOptions(address, true)</code></li>
    226      * </ul>
    227      *
    228      * @deprecated This method is used as workaround for old tests and will be removed soon.
    229      *
    230      * @param address - address to attach
    231      *
    232      * @return string with all agent options
    233      */
    234     public String getDebuggeeAgentOptions(String address) {
    235         return getDebuggeeAgentOptions(address, true);
    236     }
    237 
    238     /**
    239      * Returns VM classpath value to run debuggee with.
    240      *
    241      * @return system property "java.class.path" by default.
    242      */
    243     public String getDebuggeeClassPath() {
    244         return getProperty("java.class.path", null);
    245     }
    246 
    247     /**
    248      * Returns full name of the class to start debuggee with.
    249      *
    250      * @return option "jpda.settings.debuggeeClassName" or
    251      *         "org.apache.harmony.jpda.tests.jdwp.share.debuggee.HelloWorld" by default
    252      */
    253     public String getDebuggeeClassName() {
    254         return getProperty("jpda.settings.debuggeeClassName", DEFAULT_DEBUGGEE_CLASS_NAME);
    255     }
    256 
    257     /**
    258      * Sets full name of the class to start debuggee with.
    259      *
    260      * @param className
    261      *            full class name
    262      */
    263     public void setDebuggeeClassName(String className) {
    264         setProperty("jpda.settings.debuggeeClassName", className);
    265     }
    266 
    267     /**
    268      * Returns string with extra options to start debuggee with.
    269      *
    270      * @return option "jpda.settings.debuggeeVMExtraOptions" or "" by default
    271      */
    272     public String getDebuggeeVMExtraOptions() {
    273         String extOpts = getProperty("jpda.settings.debuggeeVMExtraOptions", "");
    274         extOpts = extOpts + " -Djpda.settings.verbose=" + isVerbose();
    275         return extOpts;
    276     }
    277 
    278     /**
    279      * Returns debuggee suspend mode ("y"|"n").
    280      *
    281      * @return option "jpda.settings.debuggeeSuspend" or "y" by default
    282      */
    283     public String getDebuggeeSuspend() {
    284         return getProperty("jpda.settings.debuggeeSuspend", "y");
    285     }
    286 
    287     /**
    288      * Returns debuggee suspend mode ("y"|"n").
    289      *
    290      * @param mode
    291      *            suspend mode
    292      */
    293     public void setDebuggeeSuspend(String mode) {
    294         setProperty("jpda.settings.debuggeeSuspend", mode);
    295     }
    296 
    297     /**
    298      * Checks if debuggee is launched in suspend mode.
    299      *
    300      * @return true if debuggee is launched in suspend mode
    301      */
    302     public boolean isDebuggeeSuspend() {
    303         return getDebuggeeSuspend().equals("y");
    304     }
    305 
    306     /**
    307      * Returns string representation of TCP/IP port for synchronization channel.
    308      *
    309      * @return string with port number or null
    310      */
    311     public String getSyncPortString() {
    312         return getProperty("jpda.settings.syncPort", null);
    313     }
    314 
    315     /**
    316      * Returns type of connection with debuggee.
    317      *
    318      * @return system property "jpda.settings.connectorKind" or "listen" by default.
    319      */
    320     public String getConnectorKind() {
    321         return getProperty("jpda.settings.connectorKind", "listen");
    322     }
    323 
    324     /**
    325      * Checks if attach connection with debuggee.
    326      *
    327      * @return true, if attach connection, false otherwise.
    328      */
    329     public boolean isAttachConnectorKind() {
    330         return ((getConnectorKind()).equals("attach"));
    331 
    332     }
    333 
    334     /**
    335      * Checks if listen connection with debuggee.
    336      *
    337      * @return true, if listen connection, false otherwise.
    338      */
    339     public boolean isListenConnectorKind() {
    340         return (getConnectorKind().equals("listen"));
    341     }
    342 
    343     /**
    344      * Sets connectorKind to attach to debuggee.
    345      */
    346     public void setAttachConnectorKind() {
    347         setConnectorKind("attach");
    348     }
    349 
    350     /**
    351      * Sets connectorKind to listen connection from debuggee.
    352      */
    353     public void setListenConnectorKind() {
    354         setConnectorKind("listen");
    355     }
    356 
    357     /**
    358      * Sets kind of connector (attach or listen).
    359      */
    360     public void setConnectorKind(String kind) {
    361         setProperty("jpda.settings.connectorKind", kind);
    362     }
    363 
    364     /**
    365      * Returns kind of launching debuggee VM, which can be "auto" or "manual".
    366      *
    367      * @return option "jpda.settings.debuggeeLaunchKind" or "auto" by default.
    368      */
    369     public String getDebuggeeLaunchKind() {
    370         return getProperty("jpda.settings.debuggeeLaunchKind", "auto");
    371     }
    372 
    373     /**
    374      * Returns TCP/IP port for synchronization channel.
    375      *
    376      * @return string with port number or null
    377      */
    378     public int getSyncPortNumber() {
    379         String buf = getSyncPortString();
    380         if (buf == null) {
    381             return DEFAULT_SYNC_PORT;
    382         }
    383 
    384         try {
    385             return Integer.parseInt(buf);
    386         } catch (NumberFormatException e) {
    387             throw new TestErrorException(e);
    388         }
    389     }
    390 
    391     /**
    392      * Returns timeout for JPDA tests in milliseconds.
    393      *
    394      * @return option "jpda.settings.timeout" or DEFAULT_TIMEOUT by default.
    395      */
    396     public long getTimeout() {
    397         if (timeout < 0) {
    398             timeout = DEFAULT_TIMEOUT;
    399             String buf = getProperty("jpda.settings.timeout", null);
    400             if (buf != null) {
    401                 try {
    402                     timeout = Long.parseLong(buf);
    403                 } catch (NumberFormatException e) {
    404                     throw new TestErrorException(e);
    405                 }
    406             }
    407         }
    408         return timeout;
    409     }
    410 
    411     /**
    412      * Sets timeout for JPDA tests in milliseconds.
    413      *
    414      * @param timeout
    415      *            timeout to be set
    416      */
    417     public void setTimeout(long timeout) {
    418         if (timeout < 0) {
    419             throw new TestErrorException("Cannot set negative timeout value: "
    420                     + timeout);
    421         }
    422         this.timeout = timeout;
    423     }
    424 
    425     /**
    426      * Returns waiting time for events in milliseconds.
    427      *
    428      * @return waiting time
    429      */
    430     public long getWaitingTime() {
    431         if (waitingTime < 0) {
    432             waitingTime = DEFAULT_WAITING_TIME;
    433             String buf = getProperty("jpda.settings.waitingTime", null);
    434             if (buf != null) {
    435                 try {
    436                     waitingTime = Long.parseLong(buf);
    437                 } catch (NumberFormatException e) {
    438                     throw new TestErrorException(e);
    439                 }
    440             }
    441         }
    442         return waitingTime;
    443     }
    444 
    445     /**
    446      * Sets waiting time for events in milliseconds.
    447      *
    448      * @param waitingTime
    449      *            waiting time to be set
    450      */
    451     public void setWaitingTime(long waitingTime) {
    452         this.waitingTime = waitingTime;
    453     }
    454 
    455     /**
    456      * Returns whether print to log is enabled.
    457      *
    458      * @return false (default) if log is disabled or true otherwise.
    459      */
    460     public boolean isVerbose() {
    461         return isTrue(getProperty("jpda.settings.verbose", "true"));
    462     }
    463 
    464     /**
    465      * Converts text to boolean.
    466      *
    467      * @param str string representing boolean value
    468      * @return boolean
    469      */
    470     static public boolean isTrue(String str) {
    471         return str != null && (
    472             str.equalsIgnoreCase("true") ||
    473             str.equalsIgnoreCase("yes") ||
    474             str.equalsIgnoreCase("on") ||
    475             str.equals("1"));
    476     }
    477 
    478     /**
    479      * Returns value of given property if it was set internally or specified in system properties.
    480      *
    481      * @param name
    482      *           property name
    483      * @param defaultValue
    484      *           default value for given property
    485      * @return string value of given property or default value if no such property found
    486      */
    487     protected String getProperty(String name, String defaultValue) {
    488         String value = (String)internalProperties.get(name);
    489         if (value != null) {
    490             return value;
    491         }
    492         return System.getProperty(name, defaultValue);
    493     }
    494 
    495     /**
    496      * Sets internal value of given property to override corresponding system property.
    497      *
    498      * @param name
    499      *           proparty name
    500      * @param value
    501      *           value for given property
    502      */
    503     protected void setProperty(String name, String value) {
    504         internalProperties.put(name, value);
    505     }
    506 
    507 }
    508