blob: 69665ba33cba60232eefd97cc1dae0510db1179a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.tests.eval;
import java.io.File;
import java.io.InputStream;
import java.io.PrintStream;
import org.eclipse.jdt.core.tests.runtime.LocalVirtualMachine;
import org.eclipse.jdt.core.tests.runtime.LocalVMLauncher;
import org.eclipse.jdt.core.tests.runtime.TargetException;
import org.eclipse.jdt.core.tests.runtime.TargetInterface;
import org.eclipse.jdt.core.tests.util.CompilerTestSetup;
import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.internal.compiler.batch.FileSystem;
import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
import org.eclipse.jdt.internal.eval.EvaluationContext;
public class EvaluationSetup extends CompilerTestSetup {
public static final String EVAL_DIRECTORY = Util.getOutputDirectory() + File.separator + "evaluation";
public static final String JRE_PATH = Util.getJREDirectory();
EvaluationContext context;
TargetInterface target;
LocalVirtualMachine launchedVM;
INameEnvironment env;
public EvaluationSetup(long complianceLevel) {
super(complianceLevel);
}
protected void setUp() {
if (this.context == null) { // non null if called from subclass
// Launch VM in evaluation mode
int evalPort = Util.getFreePort();
try {
LocalVMLauncher launcher = LocalVMLauncher.getLauncher();
launcher.setVMPath(JRE_PATH);
launcher.setEvalPort(evalPort);
launcher.setEvalTargetPath(EVAL_DIRECTORY);
this.launchedVM = launcher.launch();
} catch (TargetException e) {
throw new Error(e.getMessage());
}
// Thread that read the stout of the VM so that the VM doesn't block
try {
startReader("VM's stdout reader", this.launchedVM.getInputStream(), System.out);
} catch (TargetException e) {
}
// Thread that read the sterr of the VM so that the VM doesn't block
try {
startReader("VM's sterr reader", this.launchedVM.getErrorStream(), System.err);
} catch (TargetException e) {
}
// Create context
this.context = new EvaluationContext();
// Create target
this.target = new TargetInterface();
this.target.connect("localhost", evalPort, 30000); // allow 30s max to connect (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=188127)
// Create name environment
this.env = new FileSystem(Util.getJavaClassLibs(), new String[0], null);
}
super.setUp();
}
protected void startReader(String name, final InputStream in, final PrintStream out) {
(new Thread(name) {
public void run() {
int read = 0;
while (read != -1) {
try {
read = in.read();
} catch (java.io.IOException e) {
read = -1;
}
if (read != -1) {
out.print((char)read);
}
}
}
}).start();
}
protected void tearDown() {
if (this.context != null) {
LocalVirtualMachine vm = this.launchedVM;
if (vm != null) {
try {
if (this.target != null) {
this.target.disconnect(); // Close the socket first so that the OS resource has a chance to be freed.
}
int retry = 0;
while (vm.isRunning() && (++retry < 20)) {
try {
Thread.sleep(retry * 100);
} catch (InterruptedException e) {
}
}
if (vm.isRunning()) {
vm.shutDown();
}
this.context = null;
} catch (TargetException e) {
throw new Error(e.getMessage());
}
}
}
if (this.env != null) {
this.env.cleanup();
}
}
}