/*
* Copyright 2014 Bernd Vogt and others.
*
* 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.sourcepit.b2.validation;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.sourcepit.b2.model.module.ModuleModelFactory;
import org.sourcepit.b2.model.module.PluginProject;
import org.sourcepit.common.manifest.osgi.BundleManifest;
import org.sourcepit.common.manifest.osgi.BundleManifestFactory;
import org.sourcepit.common.manifest.osgi.resource.BundleManifestResourceImpl;
import org.sourcepit.common.testing.Environment;
import org.sourcepit.common.testing.Workspace;
import org.sourcepit.common.utils.props.LinkedPropertiesMap;
import org.sourcepit.common.utils.props.PropertiesMap;
import org.sourcepit.common.utils.xml.XmlUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class ExecutionEnvironmentConstraintTest {
private Environment env = Environment.get("env-test.properties");
@Rule
public Workspace ws = new Workspace(new File(env.getBuildDir(), "test-ws"), false);
private RecordingLogger logger;
private ExecutionEnvironmentConstraint constraint;
@Before
public void setUp() {
logger = new RecordingLogger();
constraint = new ExecutionEnvironmentConstraint(logger);
}
@Test
public void testEmptyB2Properties() throws Exception {
final PluginProject project = ModuleModelFactory.eINSTANCE.createPluginProject();
project.setDirectory(ws.getRoot());
project.setId("org.sourcepit.foo.plugin");
project.setBundleManifest(BundleManifestFactory.eINSTANCE.createBundleManifest());
addJavaNature(project.getDirectory());
final PropertiesMap properties = new LinkedPropertiesMap();
constraint.validate(project, properties, false);
assertTrue(logger.getMessages().isEmpty());
assertEquals(1, project.getDirectory().list().length);
}
@Test
public void testDefaultEE_NoJavaNature() throws Exception {
final PluginProject project = ModuleModelFactory.eINSTANCE.createPluginProject();
project.setDirectory(ws.getRoot());
project.setId("org.sourcepit.foo.plugin");
project.setBundleManifest(BundleManifestFactory.eINSTANCE.createBundleManifest());
final PropertiesMap properties = new LinkedPropertiesMap();
properties.put("b2.executionEnvironment", "JavaSE-1.6");
constraint.validate(project, properties, false);
assertEquals(0, logger.getMessages().size());
assertEquals(0, project.getDirectory().list().length);
logger.getMessages().clear();
constraint.validate(project, properties, true);
assertEquals(0, logger.getMessages().size());
assertEquals(0, project.getDirectory().list().length);
}
@Test
public void testDefaultEE_NoJDTSettings() throws Exception {
final PluginProject project = ModuleModelFactory.eINSTANCE.createPluginProject();
project.setDirectory(ws.getRoot());
project.setId("org.sourcepit.foo.plugin");
project.setBundleManifest(BundleManifestFactory.eINSTANCE.createBundleManifest());
addJavaNature(project.getDirectory());
final PropertiesMap properties = new LinkedPropertiesMap();
properties.put("b2.executionEnvironment", "JavaSE-1.6");
constraint.validate(project, properties, false);
assertEquals(5, logger.getMessages().size());
assertEquals(1, project.getDirectory().list().length);
logger.getMessages().clear();
constraint.validate(project, properties, true);
assertEquals(5, logger.getMessages().size());
assertEquals(4, project.getDirectory().list().length);
final File cpFile = new File(project.getDirectory(), ".classpath");
assertTrue(cpFile.exists());
final Document cpDoc = XmlUtils.readXml(cpFile);
Element eeNode = (Element) XmlUtils.queryNode(cpDoc,
"/classpath/classpathentry[@kind='con' and starts-with(@path,'org.eclipse.jdt.launching.JRE_CONTAINER/')]");
assertEquals(
"org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6",
eeNode.getAttribute("path"));
Resource eResource = new BundleManifestResourceImpl(URI.createFileURI(new File(project.getDirectory(),
"META-INF/MANIFEST.MF").getAbsolutePath()));
eResource.load(null);
BundleManifest mf = (BundleManifest) eResource.getContents().get(0);
assertEquals("JavaSE-1.6", mf.getBundleRequiredExecutionEnvironment().get(0));
}
@Test
public void testDefaultEE_WithJDTSettings() throws Exception {
final PluginProject project = ModuleModelFactory.eINSTANCE.createPluginProject();
project.setDirectory(ws.getRoot());
project.setId("org.sourcepit.foo.plugin");
project.setBundleManifest(BundleManifestFactory.eINSTANCE.createBundleManifest());
addJavaNature(project.getDirectory());
final File cpFile = new File(project.getDirectory(), ".classpath");
Document cpDoc = XmlUtils.newDocument();
Node cpNode = cpDoc.createElement("classpath");
cpDoc.appendChild(cpNode);
Element eeNode = cpDoc.createElement("classpathentry");
eeNode.setAttribute("kind", "con");
eeNode.setAttribute("path",
"org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/"
+ "J2SE-1.6");
cpNode.appendChild(eeNode);
XmlUtils.writeXml(cpDoc, cpFile);
final PropertiesMap properties = new LinkedPropertiesMap();
properties.put("b2.executionEnvironment", "JavaSE-1.6");
properties.put("b2.executionEnvironment." + project.getId(), "J2SE-1.4");
constraint.validate(project, properties, false);
assertEquals(5, logger.getMessages().size());
assertEquals(2, project.getDirectory().list().length);
logger.getMessages().clear();
constraint.validate(project, properties, true);
assertEquals(5, logger.getMessages().size());
assertEquals(4, project.getDirectory().list().length);
cpDoc = XmlUtils.readXml(cpFile);
eeNode = (Element) XmlUtils.queryNode(
cpDoc,
"/classpath/classpathentry[@kind='con' and starts-with(@path,'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/')]");
assertEquals(
"org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4",
eeNode.getAttribute("path"));
Resource eResource = new BundleManifestResourceImpl(URI.createFileURI(new File(project.getDirectory(),
"META-INF/MANIFEST.MF").getAbsolutePath()));
eResource.load(null);
BundleManifest mf = (BundleManifest) eResource.getContents().get(0);
assertEquals("J2SE-1.4", mf.getBundleRequiredExecutionEnvironment().get(0));
}
private static void addJavaNature(File directory) {
Document doc = XmlUtils.newDocument();
Node projectDescription = doc.createElement("projectDescription");
doc.appendChild(projectDescription);
Element natures = doc.createElement("natures");
projectDescription.appendChild(natures);
Element nature = doc.createElement("nature");
nature.setTextContent("org.eclipse.jdt.core.javanature");
natures.appendChild(nature);
XmlUtils.writeXml(doc, new File(directory, ".project"));
}
}