blob: 0e5d61cb3e4ac56ac6d329bdcb169f04e4052f2d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.openejb.config;
import org.apache.openejb.assembler.classic.AppInfo;
import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
import org.apache.openejb.config.sys.Deployments;
import org.apache.openejb.config.sys.JaxbOpenejb;
import org.apache.openejb.config.sys.Openejb;
import org.apache.openejb.loader.Files;
import org.apache.openejb.loader.IO;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.loader.Zips;
import org.apache.openejb.util.Archives;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/**
* If an app exists in the apps/ directory in both the
* packed and unpacked states, only deploy the app once
* <p/>
* Do not treat this as two applications and deploy each one separately.
*
* @version $Rev$ $Date$
*/
public class DeploymentsElementTest extends Assert {
@Rule
public final ExpectedException exceptions = ExpectedException.none();
/**
* <Deployments dir="myapps"/>
* <p/>
* EAR file not extracted
* Application.xml
*
* @throws Exception
*/
@Test
public void deploymentsDir_Ear_Packed_ApplicationXml() throws Exception {
final Server server = new Server();
final File apps = server.deploymentsDir("myapps");
final File ear = new File(apps, "colors.ear");
{
final Map<String, Object> contents = new HashMap<String, Object>();
contents.put("foo.jar", Archives.jarArchive(Orange.class));
contents.put("META-INF/application.xml", "<application><module><ejb>foo.jar</ejb></module></application>");
Archives.jarArchive(ear, contents);
}
final OpenEjbConfiguration configuration = server.init();
assertEquals(1, configuration.containerSystem.applications.size());
assertEquals(1, configuration.containerSystem.applications.get(0).ejbJars.size());
assertEquals(1, configuration.containerSystem.applications.get(0).ejbJars.get(0).enterpriseBeans.size());
assertEquals("Orange", configuration.containerSystem.applications.get(0).ejbJars.get(0).enterpriseBeans.get(0).ejbName);
}
/**
* <Deployments dir="myapps"/>
* <p/>
* EAR file not extracted
*
* @throws Exception
*/
@Test
public void deploymentsDir_Ear_Packed_NoApplicationXml() throws Exception {
final Server server = new Server();
final File apps = server.deploymentsDir("myapps");
final File ear = new File(apps, "colors.ear");
{
final Map<String, Object> contents = new HashMap<String, Object>();
contents.put("foo.jar", Archives.jarArchive(Orange.class));
Archives.jarArchive(ear, contents);
}
final OpenEjbConfiguration configuration = server.init();
assertEquals(1, configuration.containerSystem.applications.size());
assertEquals(1, configuration.containerSystem.applications.get(0).ejbJars.size());
assertEquals(1, configuration.containerSystem.applications.get(0).ejbJars.get(0).enterpriseBeans.size());
assertEquals("Orange", configuration.containerSystem.applications.get(0).ejbJars.get(0).enterpriseBeans.get(0).ejbName);
}
/**
* <Deployments dir="myapps"/>
* <p/>
* EAR file extracted
* Application.xml
*
* @throws Exception
*/
@Test
public void deploymentsDir_Ear_Unpacked_ApplicationXml() throws Exception {
final Server server = new Server();
final File apps = server.deploymentsDir("myapps");
final File ear = new File(server.getBase(), "colors.ear");
{
final Map<String, Object> contents = new HashMap<String, Object>();
contents.put("foo.jar", Archives.jarArchive(Orange.class));
contents.put("META-INF/application.xml", "<application><module><ejb>foo.jar</ejb></module></application>");
Archives.jarArchive(ear, contents);
}
Zips.unzip(ear, Files.mkdir(apps, "colors"));
final OpenEjbConfiguration configuration = server.init();
assertEquals(1, configuration.containerSystem.applications.size());
assertEquals(1, configuration.containerSystem.applications.get(0).ejbJars.size());
assertEquals(1, configuration.containerSystem.applications.get(0).ejbJars.get(0).enterpriseBeans.size());
assertEquals("Orange", configuration.containerSystem.applications.get(0).ejbJars.get(0).enterpriseBeans.get(0).ejbName);
}
/**
* <Deployments dir="myapps"/>
* <p/>
* EAR file extracted
*
* @throws Exception
*/
@Test
public void deploymentsDir_Ear_Unpacked_NoApplicationXml() throws Exception {
final Server server = new Server();
final File apps = server.deploymentsDir("myapps");
final File ear = new File(server.getBase(), "colors.ear");
{
final Map<String, Object> contents = new HashMap<String, Object>();
contents.put("foo.jar", Archives.jarArchive(Orange.class));
Archives.jarArchive(ear, contents);
}
Zips.unzip(ear, Files.mkdir(apps, "colors"));
final OpenEjbConfiguration configuration = server.init();
assertEquals(1, configuration.containerSystem.applications.size());
assertEquals(1, configuration.containerSystem.applications.get(0).ejbJars.size());
assertEquals(1, configuration.containerSystem.applications.get(0).ejbJars.get(0).enterpriseBeans.size());
assertEquals("Orange", configuration.containerSystem.applications.get(0).ejbJars.get(0).enterpriseBeans.get(0).ejbName);
}
/**
* <Deployments dir="myapps"/>
* <p/>
* EAR file packed
* EAR file extracted
* Application.xml
*
* @throws Exception
*/
@Test
public void deploymentsDir_Ear_Packed_Unpacked_ApplicationXml() throws Exception {
final Server server = new Server();
final File apps = server.deploymentsDir("myapps");
final File ear = new File(server.getBase(), "colors.ear");
{
final Map<String, Object> contents = new HashMap<String, Object>();
contents.put("foo.jar", Archives.jarArchive(Orange.class));
contents.put("META-INF/application.xml", "<application><module><ejb>foo.jar</ejb></module></application>");
Archives.jarArchive(ear, contents);
}
IO.copy(ear, Files.path(apps, "colors.ear")); // packed
Zips.unzip(ear, Files.mkdir(apps, "colors")); // unpacked
final OpenEjbConfiguration configuration = server.init();
assertEquals(1, configuration.containerSystem.applications.size());
assertEquals(1, configuration.containerSystem.applications.get(0).ejbJars.size());
assertEquals(1, configuration.containerSystem.applications.get(0).ejbJars.get(0).enterpriseBeans.size());
assertEquals("Orange", configuration.containerSystem.applications.get(0).ejbJars.get(0).enterpriseBeans.get(0).ejbName);
}
/**
* <Deployments dir="myapps"/>
* <p/>
* EAR file packed
* EAR file extracted
*
* @throws Exception
*/
@Test
public void deploymentsDir_Ear_Packed_Unpacked_NoApplicationXml() throws Exception {
final Server server = new Server();
final File apps = server.deploymentsDir("myapps");
final File ear = new File(server.getBase(), "colors.ear");
{
final Map<String, Object> contents = new HashMap<String, Object>();
contents.put("foo.jar", Archives.jarArchive(Orange.class));
Archives.jarArchive(ear, contents);
}
IO.copy(ear, Files.path(apps, "colors.ear")); // packed
Zips.unzip(ear, Files.mkdir(apps, "colors")); // unpacked
final OpenEjbConfiguration configuration = server.init();
assertEquals(1, configuration.containerSystem.applications.size());
assertEquals(1, configuration.containerSystem.applications.get(0).ejbJars.size());
assertEquals(1, configuration.containerSystem.applications.get(0).ejbJars.get(0).enterpriseBeans.size());
assertEquals("Orange", configuration.containerSystem.applications.get(0).ejbJars.get(0).enterpriseBeans.get(0).ejbName);
}
/**
* <Deployments dir="myapps"/>
* <p/>
* EAR file packed
* EAR file extracted
* <p/>
* The packed version is newer and an updated version of the packed version
* We should remove the extracted version and unpack the newer ear
*
* @throws Exception
*/
@Test
public void deploymentsDir_Ear_Packed_Unpacked_Modified() throws Exception {
final Server server = new Server();
final File apps = server.deploymentsDir("myapps");
{ // Unpacked version -- Orange
final File ear = new File(server.getBase(), "colors.ear");
final Map<String, Object> contents = new HashMap<String, Object>();
contents.put("foo.jar", Archives.jarArchive(Orange.class));
contents.put("META-INF/application.xml", "<application><module><ejb>foo.jar</ejb></module></application>");
Archives.jarArchive(ear, contents);
Zips.unzip(ear, Files.mkdir(apps, "colors")); // unpacked
}
Thread.sleep(100);
{ // Packed version -- Yellow
final File ear = new File(server.getBase(), "colors.ear");
final Map<String, Object> contents = new HashMap<String, Object>();
contents.put("foo.jar", Archives.jarArchive(Yellow.class));
contents.put("META-INF/application.xml", "<application><module><ejb>foo.jar</ejb></module></application>");
Archives.jarArchive(ear, contents);
Zips.unzip(ear, Files.mkdir(apps, "colors")); // unpacked
}
final OpenEjbConfiguration configuration = server.init();
assertEquals(1, configuration.containerSystem.applications.size());
assertEquals(1, configuration.containerSystem.applications.get(0).ejbJars.size());
assertEquals(1, configuration.containerSystem.applications.get(0).ejbJars.get(0).enterpriseBeans.size());
assertEquals("Yellow", configuration.containerSystem.applications.get(0).ejbJars.get(0).enterpriseBeans.get(0).ejbName);
}
/**
* <Deployments dir="myapps"/>
* <p/>
* Two ejb jars
*
* @throws Exception
*/
@Test
public void deploymentsDir_Jars_Packed() throws Exception {
final Server server = new Server();
final File apps = server.deploymentsDir("myapps");
{ // Jar one
final File ear = new File(apps, "yellow.jar");
Archives.jarArchive(ear, null, Yellow.class);
}
{ // Jar two
final File ear = new File(apps, "orange.jar");
Archives.jarArchive(ear, null, Orange.class);
}
final OpenEjbConfiguration configuration = server.init();
assertEquals(2, configuration.containerSystem.applications.size());
final AppInfo yellow = select(configuration.containerSystem.applications, "yellow");
assertEquals(1, yellow.ejbJars.size());
assertEquals(1, yellow.ejbJars.get(0).enterpriseBeans.size());
assertEquals("Yellow", yellow.ejbJars.get(0).enterpriseBeans.get(0).ejbName);
final AppInfo orange = select(configuration.containerSystem.applications, "orange");
assertEquals(1, orange.ejbJars.size());
assertEquals(1, orange.ejbJars.get(0).enterpriseBeans.size());
assertEquals("Orange", orange.ejbJars.get(0).enterpriseBeans.get(0).ejbName);
}
/**
* <Deployments dir="myapps"/>
* <p/>
* Two ejb jars
* <p/>
* Order should be guaranteed to be the same as
* they are declared in the openejb.xml
* <p/>
* To test, the jars are named intentionally in an order
* that would naturally sort to be the reverse.
*
* @throws Exception
*/
@Test
public void deploymentsFile_Jars_Order() throws Exception {
final Server server = new Server();
{ // Jar one
final File jar = server.deploymentsFile("2000.jar");
Archives.jarArchive(jar, null, Yellow.class);
}
{ // Jar two
final File jar = server.deploymentsFile("1000.jar");
Archives.jarArchive(jar, null, Orange.class);
}
final OpenEjbConfiguration configuration = server.init();
assertEquals(2, configuration.containerSystem.applications.size());
assertEquals("2000", configuration.containerSystem.applications.get(0).appId);
assertEquals("1000", configuration.containerSystem.applications.get(1).appId);
final AppInfo yellow = configuration.containerSystem.applications.get(0);
assertEquals(1, yellow.ejbJars.size());
assertEquals(1, yellow.ejbJars.get(0).enterpriseBeans.size());
assertEquals("Yellow", yellow.ejbJars.get(0).enterpriseBeans.get(0).ejbName);
final AppInfo orange = configuration.containerSystem.applications.get(1);
assertEquals(1, orange.ejbJars.size());
assertEquals(1, orange.ejbJars.get(0).enterpriseBeans.size());
assertEquals("Orange", orange.ejbJars.get(0).enterpriseBeans.get(0).ejbName);
}
/**
* <Deployments dir="myapps/2000.jar"/>
* <Deployments dir="myapps"/>
* <p/>
* Order should be guaranteed to be the same as
* they are declared in the openejb.xml
* <p/>
* To test, the jars are named intentionally in an order
* that would naturally sort to be the reverse.
*
* @throws Exception
*/
@Test
public void deploymentsFile_and_Dir_Jars_Order() throws Exception {
final Server server = new Server();
final File apps = Files.mkdir(server.getBase(), "myapps");
{ // Jar one
final File jar = server.deploymentsFile("myapps/2000.jar");
Archives.jarArchive(jar, null, Yellow.class);
}
{ // Jar two
server.deploymentsDir("myapps");
final File jar = Files.path(apps, "1000.jar");
Archives.jarArchive(jar, null, Orange.class);
}
final OpenEjbConfiguration configuration = server.init();
assertEquals(2, configuration.containerSystem.applications.size());
assertEquals("2000", configuration.containerSystem.applications.get(0).appId);
assertEquals("1000", configuration.containerSystem.applications.get(1).appId);
final AppInfo yellow = configuration.containerSystem.applications.get(0);
assertEquals(1, yellow.ejbJars.size());
assertEquals(1, yellow.ejbJars.get(0).enterpriseBeans.size());
assertEquals("Yellow", yellow.ejbJars.get(0).enterpriseBeans.get(0).ejbName);
final AppInfo orange = configuration.containerSystem.applications.get(1);
assertEquals(1, orange.ejbJars.size());
assertEquals(1, orange.ejbJars.get(0).enterpriseBeans.size());
assertEquals("Orange", orange.ejbJars.get(0).enterpriseBeans.get(0).ejbName);
}
/**
* <Deployments dir="myapps/2000.jar"/>
* <Deployments dir="myapps/2000.jar"/>
* <Deployments dir="myapps"/>
* <Deployments dir="myapps"/>
* <p/>
* Order should be guaranteed to be the same as
* they are declared in the openejb.xml
* <p/>
* To test, the jars are named intentionally in an order
* that would naturally sort to be the reverse.
*
* @throws Exception
*/
@Test
public void deployments_Duplicates() throws Exception {
final Server server = new Server();
final File apps = Files.mkdir(server.getBase(), "myapps");
{ // Jar one
final File jar = server.deploymentsFile("myapps/2000.jar");
server.deploymentsFile("myapps/2000.jar");
Archives.jarArchive(jar, null, Yellow.class);
}
{ // Jar two
server.deploymentsDir("myapps");
server.deploymentsDir("myapps");
final File jar = Files.path(apps, "1000.jar");
Archives.jarArchive(jar, null, Orange.class);
}
final OpenEjbConfiguration configuration = server.init();
assertEquals(2, configuration.containerSystem.applications.size());
assertEquals("2000", configuration.containerSystem.applications.get(0).appId);
assertEquals("1000", configuration.containerSystem.applications.get(1).appId);
final AppInfo yellow = configuration.containerSystem.applications.get(0);
assertEquals(1, yellow.ejbJars.size());
assertEquals(1, yellow.ejbJars.get(0).enterpriseBeans.size());
assertEquals("Yellow", yellow.ejbJars.get(0).enterpriseBeans.get(0).ejbName);
final AppInfo orange = configuration.containerSystem.applications.get(1);
assertEquals(1, orange.ejbJars.size());
assertEquals(1, orange.ejbJars.get(0).enterpriseBeans.size());
assertEquals("Orange", orange.ejbJars.get(0).enterpriseBeans.get(0).ejbName);
}
/**
* We do not treat this as a failure case due to backwards compatibility
*
* @throws Exception
*/
@Test
public void invalidDir_doesNotExist() throws Exception {
final Server server = new Server();
final File dir = server.deploymentsDir("myapps");
Files.delete(dir);
final OpenEjbConfiguration configuration = server.init();
assertEquals(0, configuration.containerSystem.applications.size());
}
@Test
public void invalidDir_notADirectory() throws Exception {
exceptions.expect(RuntimeException.class);
exceptions.expectMessage("Deployments dir=");
exceptions.expectMessage("Not a directory");
exceptions.expectMessage("myapps");
final Server server = new Server();
final File dir = server.deploymentsDir("myapps");
// turn the directory into a file
Files.delete(dir);
assertTrue(dir.createNewFile());
server.init();
}
@Test
@Ignore("The CI system on hemera suddenly seems to no be able to handle this")
public void invalidDir_notReadable() throws Exception {
if (!System.getProperty("os.name", "unknown").toLowerCase().startsWith("win")) {
//File.setReadable(false) does nothing on win platforms
exceptions.expect(RuntimeException.class);
exceptions.expectMessage("Deployments dir=");
exceptions.expectMessage("Not readable");
exceptions.expectMessage("myapps");
final Server server = new Server();
final File dir = server.deploymentsDir("myapps");
assertTrue(dir.setReadable(false));
final OpenEjbConfiguration configuration = server.init();
assertEquals(0, configuration.containerSystem.applications.size());
}
}
@Test
public void invalidFile_notAFile() throws Exception {
exceptions.expect(RuntimeException.class);
exceptions.expectMessage("Deployments file=");
exceptions.expectMessage("Not a file");
exceptions.expectMessage("myapp.jar");
final Server server = new Server();
final File file = server.deploymentsFile("myapp.jar");
Files.delete(file);
Files.mkdir(file);
final OpenEjbConfiguration configuration = server.init();
assertEquals(0, configuration.containerSystem.applications.size());
}
@Test
public void invalidFile_doesNotExist() throws Exception {
exceptions.expect(RuntimeException.class);
exceptions.expectMessage("Deployments file=");
exceptions.expectMessage("not exist");
exceptions.expectMessage("myapp.jar");
final Server server = new Server();
final File file = server.deploymentsFile("myapp.jar");
Files.delete(file);
final OpenEjbConfiguration configuration = server.init();
assertEquals(0, configuration.containerSystem.applications.size());
}
@Test
@Ignore("The CI system on hemera suddenly seems to no be able to handle this")
public void invalidFile_notReadable() throws Exception {
if (!System.getProperty("os.name", "unknown").toLowerCase().startsWith("win")) {
//File.setReadable(false) does nothing on win platforms
exceptions.expect(RuntimeException.class);
exceptions.expectMessage("Deployments file=");
exceptions.expectMessage("Not readable");
exceptions.expectMessage("myapp.jar");
final Server server = new Server();
final File file = server.deploymentsFile("myapp.jar");
assertTrue(file.createNewFile());
assertTrue(file.setReadable(false));
final OpenEjbConfiguration configuration = server.init();
assertEquals(0, configuration.containerSystem.applications.size());
}
}
/**
* If something is in the process of being deployed, do not try to autoDeploy it
*
* @throws Exception
*/
@Test
@Ignore
public void alreadyInDeployProcess() throws Exception {
}
public AppInfo select(final List<AppInfo> appInfos, final String id) {
for (final AppInfo appInfo : appInfos) {
if (id.equals(appInfo.appId)) {
return appInfo;
}
}
throw new RuntimeException("No AppInfo with id: " + id);
}
@Before
public void after() {
SystemInstance.reset();
}
@Singleton
@Startup
public static class Orange {
}
@Singleton
@Startup
public static class Yellow {
}
private class Server {
private final File base;
private final Properties properties;
private final Openejb openejb = new Openejb();
private final File configFile;
private Server() {
base = Files.tmpdir();
final File conf = Files.mkdir(base, "conf");
properties = new Properties();
properties.setProperty("openejb.deployments.classpath", "false");
properties.setProperty("openejb.home", base.getAbsolutePath());
properties.setProperty("openejb.base", base.getAbsolutePath());
configFile = new File(conf, "openejb.xml");
properties.setProperty("openejb.configuration", configFile.getAbsolutePath());
}
public OpenEjbConfiguration init() throws Exception {
try {
IO.writeString(configFile, JaxbOpenejb.marshal(Openejb.class, openejb));
} catch (Exception e) {
throw new RuntimeException(e);
}
SystemInstance.init(properties);
final ConfigurationFactory configurationFactory = new ConfigurationFactory();
configurationFactory.init(properties);
return configurationFactory.getOpenEjbConfiguration();
}
public File getBase() {
return base;
}
public Properties getProperties() {
return properties;
}
public File deploymentsDir(final String dir) {
openejb.getDeployments().add(new Deployments().dir(dir));
return Files.mkdir(base, dir);
}
public File deploymentsFile(final String file) {
openejb.getDeployments().add(new Deployments().file(file));
return Files.path(base, file);
}
}
}