org.jetbrains.kotlin.idea.codeInsight.gradle.GradleImportingTestCase.java Source code

Java tutorial

Introduction

Here is the source code for org.jetbrains.kotlin.idea.codeInsight.gradle.GradleImportingTestCase.java

Source

/*
 * Copyright 2010-2016 JetBrains s.r.o.
 *
 * Licensed 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 org.jetbrains.kotlin.idea.codeInsight.gradle;

import com.intellij.compiler.server.BuildManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.externalSystem.model.ProjectSystemId;
import com.intellij.openapi.externalSystem.model.settings.ExternalSystemExecutionSettings;
import com.intellij.openapi.externalSystem.settings.ExternalSystemSettingsListenerAdapter;
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
import com.intellij.openapi.projectRoots.JavaSdk;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.TestDialog;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.testFramework.IdeaTestUtil;
import com.intellij.util.PathUtil;
import com.intellij.util.containers.ContainerUtil;
import org.gradle.util.GradleVersion;
import org.gradle.wrapper.GradleWrapperMain;
import org.intellij.lang.annotations.Language;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.gradle.settings.DistributionType;
import org.jetbrains.plugins.gradle.settings.GradleProjectSettings;
import org.jetbrains.plugins.gradle.settings.GradleSettings;
import org.jetbrains.plugins.gradle.util.GradleConstants;
import org.junit.Rule;
import org.junit.rules.TestName;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Properties;

import static org.junit.Assume.assumeThat;

// part of org.jetbrains.plugins.gradle.importing.GradleImportingTestCase
@RunWith(value = Parameterized.class)
public abstract class GradleImportingTestCase extends ExternalSystemImportingTestCase {
    private static final String GRADLE_JDK_NAME = "Gradle JDK";
    private static final int GRADLE_DAEMON_TTL_MS = 10000;

    @Rule
    public TestName name = new TestName();

    @Rule
    public VersionMatcherRule versionMatcherRule = new VersionMatcherRule();

    @SuppressWarnings({ "NullableProblems", "WeakerAccess" })
    @NotNull
    @Parameterized.Parameter()
    public String gradleVersion;

    private GradleProjectSettings myProjectSettings;
    private String myJdkHome;

    @Override
    public void setUp() throws Exception {
        myJdkHome = IdeaTestUtil.requireRealJdkHome();
        super.setUp();
        assumeThat(gradleVersion, versionMatcherRule.getMatcher());
        new WriteAction() {
            @Override
            protected void run(@NotNull Result result) throws Throwable {
                Sdk oldJdk = ProjectJdkTable.getInstance().findJdk(GRADLE_JDK_NAME);
                if (oldJdk != null) {
                    ProjectJdkTable.getInstance().removeJdk(oldJdk);
                }
                VirtualFile jdkHomeDir = LocalFileSystem.getInstance()
                        .refreshAndFindFileByIoFile(new File(myJdkHome));
                assert jdkHomeDir != null;
                Sdk jdk = SdkConfigurationUtil.setupSdk(new Sdk[0], jdkHomeDir, JavaSdk.getInstance(), true, null,
                        GRADLE_JDK_NAME);
                assertNotNull("Cannot create JDK for " + myJdkHome, jdk);
                ProjectJdkTable.getInstance().addJdk(jdk);
            }
        }.execute();
        myProjectSettings = new GradleProjectSettings();
        GradleSettings.getInstance(myProject).setGradleVmOptions("-Xmx128m -XX:MaxPermSize=64m");
        System.setProperty(ExternalSystemExecutionSettings.REMOTE_PROCESS_IDLE_TTL_IN_MS_KEY,
                String.valueOf(GRADLE_DAEMON_TTL_MS));
        configureWrapper();
    }

    @Override
    public void tearDown() throws Exception {
        if (myJdkHome == null) {
            //super.setUp() wasn't called
            return;
        }

        try {
            new WriteAction() {
                @Override
                protected void run(@NotNull Result result) throws Throwable {
                    Sdk old = ProjectJdkTable.getInstance().findJdk(GRADLE_JDK_NAME);
                    if (old != null) {
                        SdkConfigurationUtil.removeSdk(old);
                    }
                }
            }.execute();
            Messages.setTestDialog(TestDialog.DEFAULT);
            FileUtil.delete(BuildManager.getInstance().getBuildSystemDirectory());
        } finally {
            super.tearDown();
        }
    }

    @Override
    protected void collectAllowedRoots(List<String> roots) throws IOException {
        roots.add(myJdkHome);
        roots.addAll(collectRootsInside(myJdkHome));
        roots.add(PathManager.getConfigPath());
    }

    @Override
    public String getName() {
        return name.getMethodName() == null ? super.getName() : FileUtil.sanitizeFileName(name.getMethodName());
    }

    @Parameterized.Parameters(name = "{index}: with Gradle-{0}")
    public static Collection<Object[]> data() throws Throwable {
        return Arrays.asList(AbstractModelBuilderTest.SUPPORTED_GRADLE_VERSIONS);
    }

    @Override
    protected String getTestsTempDir() {
        return "gradleImportTests";
    }

    @Override
    protected String getExternalSystemConfigFileName() {
        return "build.gradle";
    }

    @Override
    protected void importProject() {
        ExternalSystemApiUtil.subscribe(myProject, GradleConstants.SYSTEM_ID,
                new ExternalSystemSettingsListenerAdapter() {
                    @Override
                    public void onProjectsLinked(@NotNull Collection settings) {
                        Object item = ContainerUtil.getFirstItem(settings);
                        if (item instanceof GradleProjectSettings) {
                            ((GradleProjectSettings) item).setGradleJvm(GRADLE_JDK_NAME);
                        }
                    }
                });
        super.importProject();
    }

    @Override
    protected void importProject(@NonNls @Language("Groovy") String config) throws IOException {
        config = "allprojects {\n" + "  repositories {\n" + "    maven {\n"
                + "        url 'http://maven.labs.intellij.net/repo1'\n" + "    }\n" + "  }" + "}\n" + config;
        super.importProject(config);
    }

    @Override
    protected GradleProjectSettings getCurrentExternalProjectSettings() {
        return myProjectSettings;
    }

    @Override
    protected ProjectSystemId getExternalSystemId() {
        return GradleConstants.SYSTEM_ID;
    }

    private void configureWrapper() throws IOException, URISyntaxException {
        URI distributionUri = new AbstractModelBuilderTest.DistributionLocator()
                .getDistributionFor(GradleVersion.version(gradleVersion));

        myProjectSettings.setDistributionType(DistributionType.DEFAULT_WRAPPED);
        final VirtualFile wrapperJarFrom = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(wrapperJar());
        assert wrapperJarFrom != null;

        final VirtualFile wrapperJarFromTo = createProjectSubFile("gradle/wrapper/gradle-wrapper.jar");
        new WriteAction() {
            @Override
            protected void run(@NotNull Result result) throws Throwable {
                wrapperJarFromTo.setBinaryContent(wrapperJarFrom.contentsToByteArray());
            }
        }.execute().throwException();

        Properties properties = new Properties();
        properties.setProperty("distributionBase", "GRADLE_USER_HOME");
        properties.setProperty("distributionPath", "wrapper/dists");
        properties.setProperty("zipStoreBase", "GRADLE_USER_HOME");
        properties.setProperty("zipStorePath", "wrapper/dists");
        properties.setProperty("distributionUrl", distributionUri.toString());

        StringWriter writer = new StringWriter();
        properties.store(writer, null);

        createProjectSubFile("gradle/wrapper/gradle-wrapper.properties", writer.toString());
    }

    @NotNull
    private static File wrapperJar() {
        return new File(PathUtil.getJarPathForClass(GradleWrapperMain.class));
    }
}