/*
* Copyright 2003-2015 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 jetbrains.mps.jps.make.tests;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.io.FileUtil;
import jetbrains.mps.idea.logging.DelegatingLoggerFactory;
import jetbrains.mps.idea.core.make.MPSMakeConstants;
import jetbrains.mps.jps.make.fileUtil.FileRecursiveTraverser;
import jetbrains.mps.jps.make.fileUtil.ProjectDirFinder;
import jetbrains.mps.jps.make.fileUtil.SimpleFileReader;
import org.apache.log4j.LogManager;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.builders.JpsBuildTestCase;
import org.jetbrains.jps.model.java.JpsJavaExtensionService;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.model.serialization.JpsProjectLoader;
import org.jetbrains.jps.model.serialization.PathMacroUtil;
import org.jetbrains.jps.util.JpsPathUtil;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public abstract class MpsJpsBuildTestCase extends JpsBuildTestCase {
static {
initLogging();
}
private static void initLogging() {
Logger.setFactory(DelegatingLoggerFactory.class);
LogManager.getLogger(MpsJpsBuildTestCase.class).info("The log4 has been initialized successfully");
}
@NotNull
@NonNls
@Override
protected abstract String getTestDataRootPath();
/**
* @deprecated Please consider using {@link #copyToProject}
*/
@Deprecated
protected String copyFromUserDirToProject(@NonNls String relativeSourcePath, @NonNls String relativeTargetPath) {
return copyToProject(relativeSourcePath, relativeTargetPath);
}
@Override
protected String getHomePath() {
final File projectDir = new ProjectDirFinder().findProjectDir();
return projectDir.getAbsolutePath();
}
@Override
protected File findFindUnderProjectHome(String path) { // path may be either absolute or relative (from the project directory)
File file = new File(path);
if (!file.exists()) {
String homePath = getHomePath();
file = new File(homePath, FileUtil.toSystemDependentName(path));
if (!file.exists()) {
throw new IllegalArgumentException("Cannot find file by '" + path + "'; the home path is '" + homePath + "'.");
}
}
return file;
}
@Override
public String copyToProject(@NonNls @NotNull String relativeSourcePath, @NonNls @NotNull String relativeTargetPath) {
return super.copyToProject(relativeSourcePath, relativeTargetPath);
}
protected void assertGenerated(@NotNull String expectedOutputFile) {
try {
String[] expectedPaths = new SimpleFileReader().read(expectedOutputFile);
assertCompiled(MPSMakeConstants.BUILDER_ID, expectedPaths);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
// recursive
protected void assertOutput(@NotNull String outputDir, @NotNull String expectedOutputFile) {
Set<String> actualChildren = new FileRecursiveTraverser(outputDir).traverse();
try {
String[] expectedPaths = new SimpleFileReader().read(expectedOutputFile);
assertSameElements(actualChildren, expectedPaths);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
protected void assertOutput(@NotNull JpsModule module, @NotNull String expectedOutputFile) {
String outputUrl = JpsJavaExtensionService.getInstance().getOutputUrl(module, false);
assertNotNull(outputUrl);
assertOutput(JpsPathUtil.urlToPath(outputUrl), expectedOutputFile);
}
public void addBuildParameter(String key, String value) {
myBuildParams.put(key, value);
}
@Override
protected void setUp() throws Exception {
super.setUp();
myBuildParams.clear();
}
@Override
protected void tearDown() throws Exception {
File projectDir = getOrCreateProjectDir();
try {
super.tearDown();
} finally {
FileUtil.delete(projectDir);
}
}
/**
* resolving strange behaviour at the parent implementation, which depends on test data root
*/
@Override
protected void loadProject(String projectPath, Map<String, String> pathVariables) {
try {
String fullProjectPath = FileUtil.toSystemDependentName(projectPath);
Map<String, String> allPathVariables = new HashMap<String, String>(pathVariables.size() + 1);
allPathVariables.putAll(pathVariables);
allPathVariables.put(PathMacroUtil.APPLICATION_HOME_DIR, PathManager.getHomePathFor(PathManager.class));
allPathVariables.putAll(getAdditionalPathVariables());
JpsProjectLoader.loadProject(myProject, allPathVariables, fullProjectPath);
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
}