package org.hibernate.eclipse.console.test;
import junit.framework.TestCase;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.ui.IPackagesViewPart;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
import org.hibernate.eclipse.console.HibernateConsolePerspectiveFactory;
import org.hibernate.eclipse.console.test.project.SimpleTestProject;
public abstract class HibernateConsoleTest extends TestCase {
private static final long MAX_IDLE = 5*60*1000L;
private SimpleTestProject project;
public HibernateConsoleTest(String name) {
super(name);
}
protected void setUp() throws Exception {
super.setUp();
this.project = createTestProject();
waitForJobs();
PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage().setPerspective(
PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(HibernateConsolePerspectiveFactory.ID_CONSOLE_PERSPECTIVE));
IPackagesViewPart packageExplorer = null;
try {
packageExplorer = (IPackagesViewPart) PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage().showView(JavaUI.ID_PACKAGES);
} catch (PartInitException e) {
throw new RuntimeException(e);
}
IType type = this.project.getTestClassType();
packageExplorer.selectAndReveal(type);
FileEditorInput input = new FileEditorInput((IFile) type.getCompilationUnit().getCorrespondingResource());
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(input, JavaUI.ID_CU_EDITOR );
delay(2000);
}
protected SimpleTestProject createTestProject() {
return new SimpleTestProject();
}
protected void tearDown() throws Exception {
waitForJobs();
IEditorPart editorPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().closeEditor(editorPart, false);
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().setPerspective(
PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId("org.eclipse.ui.resourcePerspective")); //$NON-NLS-1$
this.project.deleteIProject();
this.project = null;
super.tearDown();
}
/**
* Process UI input but do not return for the specified time interval.
*
* @param waitTimeMillis
* the number of milliseconds
*/
protected void delay(long waitTimeMillis) {
Display display = Display.getCurrent();
// If this is the UI thread,
// then process input.
if (display != null) {
long endTimeMillis = System.currentTimeMillis() + waitTimeMillis;
while (System.currentTimeMillis() < endTimeMillis) {
if (!display.readAndDispatch())
display.sleep();
}
//display.update();
}
// Otherwise, perform a simple sleep.
else {
try {
Thread.sleep(waitTimeMillis);
} catch (InterruptedException e) {
// Ignored.
}
}
}
/**
* Wait until all background tasks are complete.
*/
/*public void waitForJobs() {
while (Platform.getJobManager().currentJob() != null)
delay(2000);
}*/
public void waitForJobs() {
long start = System.currentTimeMillis();
while (!Job.getJobManager().isIdle()) {
delay(500);
if ( (System.currentTimeMillis()-start) > MAX_IDLE ) {
Job[] jobs = Job.getJobManager().find(null);
StringBuffer str = new StringBuffer();
for (Job job : jobs) {
if (job.getThread() != null) {
str.append("\n").append(job.getName()).append(" (")
.append(job.getClass()).append(")");
}
}
throw new RuntimeException(
ConsoleTestMessages.HibernateConsoleTest_long_running_task_detected + ":" + str.toString()); //$NON-NLS-1$
}
}
delay(1000);
}
public boolean noMoreJobs() {
Job[] queuedJobs= Job.getJobManager().find(null);
for (int i= 0; i < queuedJobs.length; i++) {
Job entry= queuedJobs[i];
if (entry.getState() == Job.RUNNING || entry.getState() == Job.WAITING) {
return false;
}
}
return true;
}
protected SimpleTestProject getProject() {
return this.project;
}
}