001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: package org.apache.tools.ant.taskdefs;
020:
021: import org.apache.tools.ant.MagicNames;
022: import org.apache.tools.ant.Project;
023: import org.apache.tools.ant.types.Path;
024: import org.apache.tools.ant.types.Commandline;
025: import org.apache.tools.ant.taskdefs.condition.Os;
026: import org.apache.tools.ant.util.JavaEnvUtils;
027:
028: import junit.framework.TestCase;
029:
030: /**
031: * Simple testcase for the ExecuteJava class - mostly stolen from
032: * ExecuteWatchdogTest.
033: *
034: */
035: public class ExecuteJavaTest extends TestCase {
036:
037: private final static int TIME_OUT = 5000;
038:
039: private final static int CLOCK_ERROR = 200;
040: private final static int TIME_OUT_TEST = TIME_OUT - CLOCK_ERROR;
041:
042: private ExecuteJava ej;
043: private Project project;
044: private Path cp;
045:
046: public ExecuteJavaTest(String name) {
047: super (name);
048: }
049:
050: protected void setUp() {
051: ej = new ExecuteJava();
052: ej.setTimeout(new Long(TIME_OUT));
053: project = new Project();
054: project.setBasedir(".");
055: project.setProperty(MagicNames.ANT_HOME, System
056: .getProperty(MagicNames.ANT_HOME));
057: cp = new Path(project, getTestClassPath());
058: ej.setClasspath(cp);
059: }
060:
061: private Commandline getCommandline(int timetorun) throws Exception {
062: Commandline cmd = new Commandline();
063: cmd.setExecutable(TimeProcess.class.getName());
064: cmd.createArgument().setValue(String.valueOf(timetorun));
065: return cmd;
066: }
067:
068: public void testNoTimeOut() throws Exception {
069: Commandline cmd = getCommandline(TIME_OUT / 2);
070: ej.setJavaCommand(cmd);
071: ej.execute(project);
072: assertTrue("process should not have been killed", !ej
073: .killedProcess());
074: }
075:
076: // test that the watchdog ends the process
077: public void testTimeOut() throws Exception {
078: Commandline cmd = getCommandline(TIME_OUT * 2);
079: ej.setJavaCommand(cmd);
080: long now = System.currentTimeMillis();
081: ej.execute(project);
082: long elapsed = System.currentTimeMillis() - now;
083: assertTrue("process should have been killed", ej
084: .killedProcess());
085:
086: assertTrue("elapse time of " + elapsed
087: + " ms is less than timeout value of " + TIME_OUT_TEST
088: + " ms", elapsed >= TIME_OUT_TEST);
089: assertTrue("elapse time of " + elapsed
090: + " ms is greater than run value of " + (TIME_OUT * 2)
091: + " ms", elapsed < TIME_OUT * 2);
092: }
093:
094: public void testNoTimeOutForked() throws Exception {
095: Commandline cmd = getCommandline(TIME_OUT / 2);
096: ej.setJavaCommand(cmd);
097: ej.fork(cp);
098: assertTrue("process should not have been killed", !ej
099: .killedProcess());
100: }
101:
102: // test that the watchdog ends the process
103: public void testTimeOutForked() throws Exception {
104: //process doesn't die properly under this combination,
105: //thus test fails. No workaround?
106: if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_2)
107: && Os.isFamily("dos")) {
108: return;
109: }
110: Commandline cmd = getCommandline(TIME_OUT * 2);
111: ej.setJavaCommand(cmd);
112: long now = System.currentTimeMillis();
113: ej.fork(cp);
114: long elapsed = System.currentTimeMillis() - now;
115: assertTrue("process should have been killed", ej
116: .killedProcess());
117:
118: assertTrue("elapse time of " + elapsed
119: + " ms is less than timeout value of " + TIME_OUT_TEST
120: + " ms", elapsed >= TIME_OUT_TEST);
121: assertTrue("elapse time of " + elapsed
122: + " ms is greater than run value of " + (TIME_OUT * 2)
123: + " ms", elapsed < TIME_OUT * 2);
124: }
125:
126: /**
127: * Dangerous method to obtain the classpath for the test. This is
128: * severely tighted to the build.xml properties.
129: */
130: private static String getTestClassPath() {
131: String classpath = System.getProperty("build.tests");
132: if (classpath == null) {
133: System.err
134: .println("WARNING: 'build.tests' property is not available !");
135: classpath = System.getProperty("java.class.path");
136: }
137:
138: return classpath;
139: }
140:
141: }
|