blob: 69ee8ab1936e0e70f3e4e3cadcfdf8ceb1e97d57 [file] [log] [blame]
/*
*
* 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.
*
*/
package utils;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
/**
* User: dschaffer
* Date: Mar 7, 2005
* Time: 11:17:42 AM
*/
public class RuntimeExecHelper {
boolean running = false;
boolean output = false;
int timeout = 300; // timeout in seconds
int exitValue = -1;
String inputText = null;
String outputText;
String errorText;
String command[];
String environment[];
String dir;
protected Process browserProcess;
protected long startTime;
protected ThreadReader outThreadReader;
protected ThreadReader errThreadReader;
private boolean printOutput = false;
private boolean stop = false;
public int browserServerID;
public RuntimeExecHelper(String command[],String environment[],String dir) {
setCommand(command);
setEnvironment(environment);
setDir(dir);
}
public RuntimeExecHelper(String command[],String dir) {
this(command,null,dir);
}
public void setOutput(boolean output) {
this.output=output;
}
public void setTimeout(int timeout) {
this.timeout=timeout;
}
public void setInputText(String inputText) {
this.inputText=inputText;
}
public void setDir(String dir) {
this.dir=dir;
}
public void setCommand(String command[]) {
this.command=command;
}
public void setEnvironment(String environment[]) {
this.environment=environment;
}
public void setPrintOutput(boolean printOutput) {
this.printOutput=printOutput;
}
public boolean getRunning() {
return running;
}
public String getOutputText() {
refreshStreams();
return outputText;
}
public String getErrorText() {
refreshStreams();
return errorText;
}
public int getExitValue() {
return exitValue;
}
public void refreshStreams() {
outputText = outThreadReader.getOutput();
errorText = errThreadReader.getOutput();
try {
exitValue = browserProcess.exitValue();
} catch (Exception e) {
}
if (exitValue != -1)
running=false;
}
public void stop() {
stop = true;
}
public void kill() throws Exception {
if (browserProcess != null && exitValue == -1)
browserProcess.destroy();
outputText = outThreadReader.getOutput();
errorText = errThreadReader.getOutput();
}
public void runInBackground() throws Exception {
browserProcess = Runtime.getRuntime().exec(command,environment,new File(dir));
running=true;
if (inputText != null) {
Thread.sleep(1000);
OutputStreamWriter osw = new OutputStreamWriter(browserProcess.getOutputStream());
osw.write(inputText);
osw.flush();
osw.close();
}
InputStreamReader outReader = new InputStreamReader(browserProcess.getInputStream());
outThreadReader = new ThreadReader(outReader);
Thread outTR = new Thread(outThreadReader);
outTR.setName("Out-" + command[command.length - 1]);
outTR.start();
InputStreamReader errReader = new InputStreamReader(browserProcess.getErrorStream());
errThreadReader = new ThreadReader(errReader);
Thread errTR = new Thread(errThreadReader);
errTR.setName("Err-" + command[command.length - 1]);
errTR.start();
startTime = System.currentTimeMillis();
exitValue = -1;
}
public void run() throws Exception {
runInBackground();
waitFor();
}
public void waitFor() throws Exception {
int outputCounter=0;
while (!stop && System.currentTimeMillis() - startTime < timeout * 1000L) {
try {
exitValue = browserProcess.exitValue();
} catch (Exception e) {
}
if (exitValue > -1)
break;
if (output) {
String out = outThreadReader.getOutput();
System.out.print(out.substring(outputCounter));
outputCounter = out.length();
}
Thread.sleep(300);
}
if (exitValue==-1) {
kill();
}
Thread.sleep(1000);
outputText = outThreadReader.getOutput();
errorText = errThreadReader.getOutput();
}
public void runBrowserServerTest(String test, String browserType, String browserServer, int browserServerPort) {
String id="";
try {
if (test.indexOf("localhost")>-1) {
try {
String ipaddress = InetAddress.getLocalHost().getHostAddress();
test = test.substring(0,test.indexOf("localhost")) + ipaddress + test.substring(test.indexOf("localhost") + 9);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("starting test "+test);
Socket s = new Socket(browserServer,browserServerPort);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bw.write("cmd=start browser=" + browserType + " url=" + test + " timeout=300 pingTimeout=300 ;");
bw.newLine();
bw.flush();
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
if (line.indexOf("id=")>-1) {
line = line.substring(line.indexOf("id") + 3);
line = line.substring(0, line.indexOf(" "));
id=line;
break;
}
}
s.close();
/*
Thread.sleep(2000);
while (true) {
s=new Socket(browserServer,browserServerPort);
bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bw.write("cmd=status id="+id+";");
bw.newLine();
bw.flush();
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
done=false;
while ((line=br.readLine())!=null) {
if (line.indexOf(": true :")>-1) {
System.out.println("test is still running...");
break;
} else if (line.indexOf(": false :")>-1) {
System.out.println("test finished...");
done=true;
break;
}
}
s.close();
if (done) break;
Thread.sleep(5000);
}
*/
} catch (Exception e) {
e.printStackTrace();
}
browserServerID = Integer.parseInt(id);
}
public class ThreadReader implements Runnable {
Reader reader;
String output = "";
boolean running = true;
public ThreadReader(Reader reader) {
this.reader = reader;
}
public String getOutput() {
return output;
}
public void run() {
int len;
char ch[] = new char[8192];
while (true) {
try {
len = reader.read(ch, 0, 8192);
if (len == -1)
break;
String newOut=new String(ch, 0, len);
if (printOutput)
System.out.print(newOut);
output = output + newOut;
if (!running)
break;
if (len==0)
Thread.sleep(100);
} catch (Exception e) {
String errorString = "===============================\n" + Thread.currentThread().toString() +
"\n======Error Marker Start=======" +
"\n" + output +
"\n=======Error Marker End========";
System.out.println(errorString);
e.printStackTrace();
break;
}
}
}
}
}