blob: 5f5d122ba3185a17c1331882168e74a9cd4a65c2 [file] [log] [blame]
/*
* Copyright 2000-2013 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 com.intellij.openapi.externalSystem.test
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.extensions.ExtensionPoint
import com.intellij.openapi.extensions.Extensions
import com.intellij.openapi.externalSystem.ExternalSystemManager
import com.intellij.openapi.externalSystem.model.DataNode
import com.intellij.openapi.externalSystem.model.project.ProjectData
import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManager
import com.intellij.openapi.externalSystem.util.DisposeAwareProjectChange
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ex.ProjectRootManagerEx
import com.intellij.openapi.util.io.FileUtil
import com.intellij.testFramework.PlatformTestCase
import com.intellij.testFramework.SkipInHeadlessEnvironment
import com.intellij.testFramework.UsefulTestCase
import com.intellij.testFramework.fixtures.IdeaProjectTestFixture
import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory
import com.intellij.util.ui.UIUtil
import org.jetbrains.annotations.NotNull
import org.jetbrains.annotations.Nullable
import java.lang.reflect.Field
import java.lang.reflect.Modifier
/**
* @author Denis Zhdanov
* @since 8/7/13 2:04 PM
*/
@SkipInHeadlessEnvironment
abstract class AbstractExternalSystemTest extends UsefulTestCase {
static File tmpDir
IdeaProjectTestFixture testFixture
Project project
File projectDir
TestExternalSystemManager externalSystemManager
ExtensionPoint externalSystemManagerEP
AbstractExternalSystemTest() {
PlatformTestCase.autodetectPlatformPrefix()
}
@Override
protected void setUp() throws Exception {
super.setUp()
ensureTempDirCreated()
testFixture = IdeaTestFixtureFactory.fixtureFactory.createFixtureBuilder(name).fixture
testFixture.setUp()
project = testFixture.project
projectDir = new File(tmpDir, getTestName(false));
projectDir.mkdirs();
externalSystemManager = new TestExternalSystemManager(project)
def area = Extensions.getArea(null)
externalSystemManagerEP = area.getExtensionPoint(ExternalSystemManager.EP_NAME)
externalSystemManagerEP.registerExtension(externalSystemManager)
}
private static void ensureTempDirCreated() {
if (tmpDir != null) {
return
}
tmpDir = new File(FileUtil.tempDirectory, "externalSystemTests")
FileUtil.delete(tmpDir)
tmpDir.mkdirs()
}
@Override
protected void tearDown() throws Exception {
try {
project = null
UIUtil.invokeAndWaitIfNeeded {
try {
externalSystemManagerEP.unregisterExtension(externalSystemManager)
testFixture.tearDown();
testFixture = null;
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
if (!FileUtil.delete(projectDir) && projectDir.exists()) {
System.err.println("Cannot delete " + projectDir);
//printDirectoryContent(myDir);
projectDir.deleteOnExit();
}
}
finally {
super.tearDown();
resetClassFields(getClass());
}
}
private void resetClassFields(@Nullable Class<?> aClass) {
if (aClass == null) {
return
}
for (Field field : aClass.declaredFields) {
final int modifiers = field.modifiers;
if ((modifiers & Modifier.FINAL) == 0 && (modifiers & Modifier.STATIC) == 0 && !field.getType().isPrimitive()) {
field.setAccessible(true);
try {
field.set(this, null);
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
if (aClass != AbstractExternalSystemTest.class) {
resetClassFields(aClass.getSuperclass());
}
}
public void setupExternalProject(@NotNull Closure c) {
DataNode<ProjectData> node = buildExternalProjectInfo(c)
applyProjectState([node])
}
@NotNull
public <T> DataNode<T> buildExternalProjectInfo(@NotNull Closure c) {
ExternalProjectBuilder builder = new ExternalProjectBuilder(projectDir: projectDir)
c.delegate = builder
c.call()
}
protected void applyProjectState(@NotNull List<DataNode<ProjectData>> states) {
def dataManager = ServiceManager.getService(ProjectDataManager.class)
def settingsInitialized = false
for (DataNode<ProjectData> node : states) {
if (!settingsInitialized) {
settingsInitialized = true
def settings = ExternalSystemApiUtil.getSettings(project, ExternalSystemTestUtil.TEST_EXTERNAL_SYSTEM_ID)
settings.linkedProjectsSettings = [new TestExternalProjectSettings(externalProjectPath: node.data.linkedExternalProjectPath)]
}
final Project myProject = project
ExternalSystemApiUtil.executeProjectChangeAction(true, new DisposeAwareProjectChange(myProject) {
@Override
void execute() {
ProjectRootManagerEx.getInstanceEx(myProject).mergeRootsChangesDuring {
dataManager.importData(node.key, [node], myProject, true)
}
}})
}
}
}