summaryrefslogtreecommitdiff
path: root/python/testSrc/com/jetbrains/env/PyExecutionFixtureTestTask.java
diff options
context:
space:
mode:
Diffstat (limited to 'python/testSrc/com/jetbrains/env/PyExecutionFixtureTestTask.java')
-rw-r--r--python/testSrc/com/jetbrains/env/PyExecutionFixtureTestTask.java174
1 files changed, 174 insertions, 0 deletions
diff --git a/python/testSrc/com/jetbrains/env/PyExecutionFixtureTestTask.java b/python/testSrc/com/jetbrains/env/PyExecutionFixtureTestTask.java
new file mode 100644
index 000000000000..bdb426dde301
--- /dev/null
+++ b/python/testSrc/com/jetbrains/env/PyExecutionFixtureTestTask.java
@@ -0,0 +1,174 @@
+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> {
+
+ }
+}