blob: bdb426dde301f7d3a167a29a72007d37222cbcde [file] [log] [blame]
package com.jetbrains.env;
import com.google.common.collect.Lists;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.ide.util.projectWizard.EmptyModuleBuilder;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.module.ModuleTypeManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.testFramework.LightProjectDescriptor;
import com.intellij.testFramework.builders.ModuleFixtureBuilder;
import com.intellij.testFramework.fixtures.*;
import com.intellij.testFramework.fixtures.impl.ModuleFixtureBuilderImpl;
import com.intellij.testFramework.fixtures.impl.ModuleFixtureImpl;
import com.intellij.util.ui.UIUtil;
import com.jetbrains.python.PythonModuleTypeBase;
import com.jetbrains.python.PythonTestUtil;
import com.jetbrains.python.sdk.InvalidSdkException;
import com.jetbrains.python.sdkTools.PyTestSdkTools;
import com.jetbrains.python.sdkTools.SdkCreationType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.Assert;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
* @author traff
*/
public abstract class PyExecutionFixtureTestTask extends PyTestTask {
public static final int NORMAL_TIMEOUT = 30000;
public static final int LONG_TIMEOUT = 120000;
protected int myTimeout = NORMAL_TIMEOUT;
protected CodeInsightTestFixture myFixture;
public Project getProject() {
return myFixture.getProject();
}
public void useNormalTimeout() {
myTimeout = NORMAL_TIMEOUT;
}
public void useLongTimeout() {
myTimeout = LONG_TIMEOUT;
}
public void setUp(final String testName) throws Exception {
initFixtureBuilder();
final TestFixtureBuilder<IdeaProjectTestFixture> fixtureBuilder = IdeaTestFixtureFactory.getFixtureFactory().createFixtureBuilder(
testName);
myFixture = IdeaTestFixtureFactory.getFixtureFactory().createCodeInsightFixture(fixtureBuilder.getFixture());
UIUtil.invokeAndWaitIfNeeded(
new Runnable() {
@Override
public void run() {
ModuleFixtureBuilder moduleFixtureBuilder = fixtureBuilder.addModule(MyModuleFixtureBuilder.class);
moduleFixtureBuilder.addSourceContentRoot(myFixture.getTempDirPath());
moduleFixtureBuilder.addSourceContentRoot(getTestDataPath());
final List<String> contentRoots = getContentRoots();
for (String contentRoot : contentRoots) {
moduleFixtureBuilder.addContentRoot(getTestDataPath() + contentRoot);
}
}
}
);
myFixture.setUp();
myFixture.setTestDataPath(getTestDataPath());
}
protected List<String> getContentRoots() {
return Lists.newArrayList();
}
protected String getTestDataPath() {
return PythonTestUtil.getTestDataPath();
}
protected void initFixtureBuilder() {
IdeaTestFixtureFactory.getFixtureFactory().registerFixtureBuilder(MyModuleFixtureBuilder.class, MyModuleFixtureBuilderImpl.class);
}
public void tearDown() throws Exception {
if (myFixture != null) {
myFixture.tearDown();
myFixture = null;
}
}
@Nullable
protected LightProjectDescriptor getProjectDescriptor() {
return null;
}
protected void disposeProcess(ProcessHandler h) throws InterruptedException {
h.destroyProcess();
if (!waitFor(h)) {
new Throwable("Can't stop process").printStackTrace();
}
}
protected boolean waitFor(ProcessHandler p) throws InterruptedException {
return p.waitFor(myTimeout);
}
protected boolean waitFor(@NotNull Semaphore s) throws InterruptedException {
return waitFor(s, myTimeout);
}
protected static boolean waitFor(@NotNull Semaphore s, long timeout) throws InterruptedException {
return s.tryAcquire(timeout, TimeUnit.MILLISECONDS);
}
public static class MyModuleFixtureBuilderImpl extends ModuleFixtureBuilderImpl<ModuleFixture> implements MyModuleFixtureBuilder {
public MyModuleFixtureBuilderImpl(TestFixtureBuilder<? extends IdeaProjectTestFixture> fixtureBuilder) {
super(new PlatformPythonModuleType(), fixtureBuilder);
}
@Override
protected ModuleFixture instantiateFixture() {
return new ModuleFixtureImpl(this);
}
}
public static class PlatformPythonModuleType extends PythonModuleTypeBase<EmptyModuleBuilder> {
@NotNull
public static PlatformPythonModuleType getInstance() {
return (PlatformPythonModuleType)ModuleTypeManager.getInstance().findByID(PYTHON_MODULE);
}
@NotNull
@Override
public EmptyModuleBuilder createModuleBuilder() {
return new EmptyModuleBuilder() {
@Override
public ModuleType getModuleType() {
return getInstance();
}
};
}
}
/**
* Creates SDK by its path
*
* @param sdkHome path to sdk (probably obtained by {@link #runTestOn(String)})
* @param sdkCreationType SDK creation strategy (see {@link com.jetbrains.python.sdkTools.SdkCreationType} doc)
* @return sdk
*/
@NotNull
protected Sdk createTempSdk(@NotNull final String sdkHome, @NotNull final SdkCreationType sdkCreationType)
throws InvalidSdkException, IOException {
final VirtualFile sdkHomeFile = LocalFileSystem.getInstance().findFileByPath(sdkHome);
Assert.assertNotNull("Interpreter file not found: " + sdkHome, sdkHomeFile);
return PyTestSdkTools.createTempSdk(sdkHomeFile, sdkCreationType, myFixture.getModule());
}
public interface MyModuleFixtureBuilder extends ModuleFixtureBuilder<ModuleFixture> {
}
}