package org.erlide.core.services.builder;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import java.io.StringBufferInputStream;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.jobs.IJobManager;
import org.eclipse.core.runtime.jobs.Job;
import org.erlide.core.builder.BuildNotifier;
import org.erlide.core.internal.builder.ErlangBuilder;
import org.erlide.core.internal.builder.ErlangBuilder.BuildKind;
import org.erlide.core.internal.builder.ErlangBuilderFactory;
import org.erlide.core.internal.builder.ErlangNature;
import org.erlide.engine.ErlangEngine;
import org.erlide.engine.model.builder.BuilderTool;
import org.erlide.engine.model.root.IErlProject;
import org.erlide.engine.util.ErlideTestUtils;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;
@SuppressWarnings("deprecation")
public class BuildersTest {
private IProject prj;
@Before
public void initialClean() throws CoreException {
final IErlProject p2 = ErlideTestUtils.getExistingProject("builders");
if (p2 == null || !p2.exists()) {
return;
}
prj = p2.getWorkspaceProject();
final IResource ebin = prj.findMember("ebin");
if (ebin != null) {
ebin.delete(true, null);
} else {
prj.getFolder("ebin").create(true, true, null);
}
}
@After
public void restore() {
prj = null;
}
@AfterClass
public static void finish() throws CoreException {
final IErlProject p2 = ErlideTestUtils.getExistingProject("p2");
final IProject prj = p2.getResource().getProject();
ErlangNature.setErlangProjectBuilder(prj, BuilderTool.INTERNAL);
}
@Test
public void internalBuilderShouldWork() throws CoreException {
testBuilder(BuilderTool.INTERNAL);
}
@Test
public void makeBuilderShouldWork() throws CoreException {
final IFolder folder = (IFolder) prj.findMember("src");
final IFile app = folder.getFile("z.app.src");
app.create(new StringBufferInputStream(
"{application, builders,[{description, \"\"},{vsn, \"1\"},"
+ "{registered, []},{applications, [kernel,stdlib]},"
+ "{mod, { mod, []}},{env, []}]}."),
true, null);
try {
testBuilder(BuilderTool.MAKE);
} finally {
app.delete(true, null);
}
}
@Test
public void emakeBuilderShouldWork() throws CoreException {
testBuilder(BuilderTool.EMAKE);
}
@Test
public void rebarBuilderShouldWork() throws CoreException {
final IFolder folder = (IFolder) prj.findMember("src");
final IFile app = folder.getFile("z.app.src");
app.create(new StringBufferInputStream(
"{application, builders,[{description, \"\"},{vsn, \"1\"},"
+ "{registered, []},{applications, [kernel,stdlib]},"
+ "{mod, { mod, []}},{env, []}]}."),
true, null);
try {
testBuilder(BuilderTool.REBAR);
} finally {
app.delete(true, null);
}
}
@Test(expected = AssertionError.class)
public void rebarBuilderShouldNotWorkWithoutAppFile() throws CoreException {
testBuilder(BuilderTool.REBAR);
}
private void testBuilder(final BuilderTool builderTool) throws CoreException {
assertThat(prj, notNullValue());
ErlangNature.setErlangProjectBuilder(prj, builderTool);
final String targetBeamPath = "ebin/mod.beam";
final IResource beam0 = prj.findMember(targetBeamPath);
assertThat("beam existed before test", beam0, nullValue());
final ErlangBuilder builder = ErlangBuilderFactory.get(builderTool);
final BuildNotifier notifier = new BuildNotifier(null, prj);
final IErlProject erlProject = ErlangEngine.getInstance().getModel()
.getErlangProject(prj);
builder.build(BuildKind.FULL, erlProject, notifier);
prj.refreshLocal(IResource.DEPTH_INFINITE, null);
waitJobsToFinish(ResourcesPlugin.FAMILY_MANUAL_REFRESH);
final IResource beam = prj.findMember(targetBeamPath);
assertThat("beam was not created", beam, notNullValue());
builder.clean(erlProject, notifier);
prj.refreshLocal(IResource.DEPTH_INFINITE, null);
waitJobsToFinish(ResourcesPlugin.FAMILY_MANUAL_REFRESH);
final IResource beam2 = prj.findMember(targetBeamPath);
assertThat("beam was not removed", beam2, nullValue());
}
private void waitJobsToFinish(final Object family) {
final IJobManager jobMan = Job.getJobManager();
final Job[] build = jobMan.find(family);
if (build.length == 1) {
try {
build[0].join();
} catch (final InterruptedException e) {
}
}
}
}