package org.sonar.api.test;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.maven.it.VerificationException;
import org.apache.maven.it.Verifier;
import org.junit.Assert;
import org.junit.BeforeClass;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Inspired by <a href="http://svn.sonatype.org/flexmojos/trunk/flexmojos-testing/flexmojos-test-harness">flexmojos-test-harness</a>.
*
* @author Evgeny Mandrikov
*/
public class AbstractSonarMavenTest {
private static final ReadWriteLock copyProjectLock = new ReentrantReadWriteLock();
protected static File projectsSource;
protected static File projectsWorkdir;
private static File mavenHome;
private static Properties props;
private static Properties profilerPropertis;
@BeforeClass
public static void init() throws IOException {
if (props != null) {
return;
}
props = new Properties();
ClassLoader cl = AbstractSonarMavenTest.class.getClassLoader();
InputStream is = cl.getResourceAsStream("baseTest.properties");
if (is != null) {
try {
props.load(is);
} finally {
is.close();
}
}
projectsSource = new File(getProperty("projects-source"));
projectsWorkdir = new File(getProperty("projects-target"));
mavenHome = new File(getProperty("fake-maven"));
// Profiler configuration
String jprofilerHome = getProperty("profiler-home");
profilerPropertis = new Properties();
profilerPropertis.setProperty("LD_LIBRARY_PATH", jprofilerHome + "/bin/linux-x86"); // TODO
StringBuilder profilerOpts = new StringBuilder();
profilerOpts.append("-agentlib:jprofilerti=offline,id=106,config=").append(getProperty("profiler-config")).append(' ');
profilerOpts.append("-Xbootclasspath/a:").append(jprofilerHome).append("/bin/agent.jar");
profilerPropertis.setProperty("MAVEN_OPTS", profilerOpts.toString());
}
protected static Verifier test(File projectDirectory) throws VerificationException {
Verifier verifier = getVerifier(projectDirectory);
// First of all we should compile project
verifier.executeGoal("compile");
// Execute sonar with profiler
verifier.executeGoal("sonar:sonar", profilerPropertis);
// TODO resave snapshot with proper name
return verifier;
}
protected static synchronized String getProperty(String key) {
return props.getProperty(key);
}
@SuppressWarnings({"unchecked"})
protected static Verifier getVerifier(File projectDirectory) throws VerificationException {
System.setProperty("maven.home", mavenHome.getAbsolutePath());
Verifier verifier = new Verifier(projectDirectory.getAbsolutePath());
List<String> options = verifier.getCliOptions();
// options.add("--offline");
options.add("--no-plugin-updates");
options.add("--batch-mode");
options.add("--debug");
// TODO use local repo
// verifier.getVerifierProperties().put( "use.mavenRepoLocal", "true" );
// verifier.setLocalRepo( getProperty( "fake-repo" ) );
// verifier.setLogFileName(getTestName() + ".log");
verifier.setAutoclean(false);
return verifier;
}
protected static File getProject(String projectName) throws IOException {
copyProjectLock.writeLock().lock();
try {
File projectFolder = new File(projectsSource, projectName);
Assert.assertTrue(
"Project " + projectName + " folder not found.\n" + projectFolder.getAbsolutePath(),
projectFolder.isDirectory()
);
File destDir = new File(projectsWorkdir, projectName); // TODO include testName
FileUtils.copyDirectory(projectFolder, destDir, HiddenFileFilter.VISIBLE);
return destDir;
} finally {
copyProjectLock.writeLock().unlock();
}
}
}