/* * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ import java.util.Properties; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.security.AccessController; import java.security.PrivilegedAction; /** * Provides access to the value of properties in the test environment. * Properties are typically host names used by the networking or NIO tests. * * If the environment variable JTREG_TESTENV is set then its value is taken * to be the path to a java properties file defining some or all of the * properties required by the tests. Environment variables are passed to * jtreg with the -e option, eg: * jtreg -e JTREG_TESTENV=/config/testenv.properties ... * * Where the environment variable is not set or the properties file doesn't * define all the required properties then the properties are loaded from the * properties file ${user.home}/.jtreg.testenv where ${user.home} is the value * of the system property "user.home". * * Finally, this class hard-codes a number of properties for when the properties * are not defined in the user's home directory or by the environment variable. * * Note to test developers: You can invoke this class from shell scripts to * get the value of properties using the -get option, eg: * VALUE=`java TestEnv -get host` * will set VALUE to the value of the "host" property. */ public class TestEnv { // environment variable to configure location of properties file private static final String CONFIG_PROPERTY = "JTREG_TESTENV"; // properties file in home directory private static final String RC_FILE = ".jtreg.testenv"; // hard-coded defaults private static final String defaultProps[][] = { // Reachable host with the following services running: // - echo service (port 7) // - day time port (port 13) { "host", "javaweb.sfbay.sun.com" }, // Reachable host that refuses connections to port 80 { "refusing_host", "jano1.sfbay.sun.com" }, // Reachable host that is of sufficient hops away that a connection // takes a while to be established (connect doesn't complete immediatly) { "far_host", "irejano.ireland.sun.com" }, // Hostname that cannot be resolved by named service { "unresovable_host", "blah-blah.blah-blah.blah" }, }; private static Properties props = loadProperties(); /** * Returns the value of a property in the test environment or {@code null} * if the property is not defined. */ public static String getProperty(String key) { return props.getProperty(key); } /** * Prints the value of a property, or "unknown" to standard output */ public static void main(String[] args) { if (args.length == 0) { props.list(System.out); System.exit(0); } if (args.length < 2 || !args[0].equals("-get")) { System.err.println("Usage: java TestEnv [-get prop]"); System.exit(-1); } String value = props.getProperty(args[1]); if (value == null) value = "unknown"; System.out.println(value); } /** * Loads properties. The properties are loaded in the following order: * * 1. Default (hard-coded) properties * 2. Properties file in home directory (overrides defaults) * 3. Properties file configured by environment variable (overrides 1 & 2) */ private static Properties loadProperties() { // default properties final Properties p = new Properties(); for (int i=0; i<defaultProps.length; i++) { p.put(defaultProps[i][0], defaultProps[i][1]); } AccessController.doPrivileged(new PrivilegedAction<Void>() { public Void run() { // load from ~/<config-file> String rcfile = System.getProperty("user.home") + File.separator + RC_FILE; loadPropertiesFromFile(rcfile, p); // load from file set by environment variable String config = System.getenv(CONFIG_PROPERTY); if (config != null) { loadPropertiesFromFile(config, p); } return null; } }); return p; } private static void loadPropertiesFromFile(String file, Properties p) { try { FileReader reader = new FileReader(file); try { p.load(reader); } finally { reader.close(); } } catch (IOException ignore) { } } }