Author: rmannibucau Date: Mon Oct 14 09:26:31 2013 New Revision: 1531832 URL: http://svn.apache.org/r1531832 Log: adding a basic way to test tomee maven plugin
Added: tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/ tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/ tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/ tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/ tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/ tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/ tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/ tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/Config.java tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/TomEEMavenPluginRule.java tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/Url.java tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/test/ tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/test/TomEEMavenPluginTest.java Modified: tomee/tomee/trunk/maven/tomee-maven-plugin/pom.xml tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java Modified: tomee/tomee/trunk/maven/tomee-maven-plugin/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/maven/tomee-maven-plugin/pom.xml?rev=1531832&r1=1531831&r2=1531832&view=diff ============================================================================== --- tomee/tomee/trunk/maven/tomee-maven-plugin/pom.xml (original) +++ tomee/tomee/trunk/maven/tomee-maven-plugin/pom.xml Mon Oct 14 09:26:31 2013 @@ -62,6 +62,15 @@ <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-utils</artifactId> </dependency> + + <dependency> + <groupId>org.apache.openejb</groupId> + <artifactId>apache-tomee</artifactId> + <version>${project.version}</version> + <scope>test</scope> + <classifier>webprofile</classifier> + <type>zip</type> + </dependency> </dependencies> <properties> Modified: tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java?rev=1531832&r1=1531831&r2=1531832&view=diff ============================================================================== --- tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java (original) +++ tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java Mon Oct 14 09:26:31 2013 @@ -1,4 +1,3 @@ -package org.apache.openejb.maven.plugin; /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -15,6 +14,7 @@ package org.apache.openejb.maven.plugin; * See the License for the specific language governing permissions and * limitations under the License. */ +package org.apache.openejb.maven.plugin; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; @@ -119,10 +119,10 @@ public abstract class AbstractTomEEMojo protected String tomeeClassifier; @Parameter(property = "tomee-plugin.shutdown", defaultValue = "8005") - protected int tomeeShutdownPort = 8005; + protected int tomeeShutdownPort; @Parameter(property = "tomee-plugin.ajp", defaultValue = "8009") - protected int tomeeAjpPort = 8009; + protected int tomeeAjpPort; @Parameter(property = "tomee-plugin.https") protected Integer tomeeHttpsPort; @@ -182,7 +182,7 @@ public abstract class AbstractTomEEMojo private List<String> classpaths; @Parameter(property = "tomee-plugin.quick-session", defaultValue = "true") - private boolean quickSession; + protected boolean quickSession; @Parameter(property = "tomee-plugin.force-reloadable", defaultValue = "false") protected boolean forceReloadable; @@ -370,7 +370,7 @@ public abstract class AbstractTomEEMojo getLog().warn("can't create '" + destParent.getPath() + "'"); } - for (String file : files) { + for (final String file : files) { updateLib(file, destParent, defaultType); } } @@ -827,7 +827,7 @@ public abstract class AbstractTomEEMojo } } - private void unzip(File mvnTomEE, File catalinaBase) { + private void unzip(final File mvnTomEE, final File catalinaBase) { ZipFile in = null; try { in = new ZipFile(mvnTomEE); Added: tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/Config.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/Config.java?rev=1531832&view=auto ============================================================================== --- tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/Config.java (added) +++ tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/Config.java Mon Oct 14 09:26:31 2013 @@ -0,0 +1,27 @@ +/* + * 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.maven.plugin; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Config { +} Added: tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/TomEEMavenPluginRule.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/TomEEMavenPluginRule.java?rev=1531832&view=auto ============================================================================== --- tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/TomEEMavenPluginRule.java (added) +++ tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/TomEEMavenPluginRule.java Mon Oct 14 09:26:31 2013 @@ -0,0 +1,244 @@ +/* + * 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.maven.plugin; + +import org.apache.maven.artifact.DefaultArtifact; +import org.apache.maven.artifact.factory.ArtifactFactory; +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.artifact.repository.DefaultArtifactRepository; +import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout; +import org.apache.maven.artifact.resolver.ArtifactResolver; +import org.apache.maven.artifact.versioning.VersionRange; +import org.apache.maven.settings.Settings; +import org.apache.maven.settings.io.xpp3.SettingsXpp3Reader; +import org.apache.openejb.config.RemoteServer; +import org.apache.openejb.loader.Files; +import org.apache.openejb.util.NetworkUtil; +import org.apache.openejb.util.OpenEjbVersion; +import org.junit.rules.MethodRule; +import org.junit.runners.model.FrameworkMethod; +import org.junit.runners.model.Statement; + +import java.io.File; +import java.io.FileReader; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +/** + * Allows to write unit tests on TomEE Maven Plugin. + * + * The basic usage is: + * + * +public class TomEEMavenPluginTest { + @Rule + public TomEEMavenPluginRule TMPRule = new TomEEMavenPluginRule(); + + @Url // get the base http url injected + private String url; + + @Config + private String tomeeHost = "localhost"; + + @Test + public void simpleStart() throws Exception { + assertThat(IO.slurp(new URL(url + "/docs")), containsString("Apache Tomcat")); + } +} + * + * @Url specifies you want the http url base injected (without any webapp context) + * @Config specifies you want to configure the backend mojo with the value specifies on the test instance + */ +public class TomEEMavenPluginRule implements MethodRule { + @Override + public Statement apply(final Statement base, final FrameworkMethod method, final Object target) { + return new RunTest(target, base); + } + + public class RunTest extends Statement { + // The TestCase instance + private final Object testInstance; + private final Statement next; + + public RunTest(final Object testInstance, final Statement next) { + this.testInstance = testInstance; + this.next = next; + } + + @Override + public void evaluate() throws Throwable { + final TestTomEEMojo testMojo = newMojo(); + + for (final Field f : testInstance.getClass().getDeclaredFields()) { + if (f.getAnnotation(Url.class) != null) { + f.setAccessible(true); + f.set(testInstance, "http://localhost:" + testMojo.tomeeHttpPort); + } else if (f.getAnnotation(Config.class) != null) { + f.setAccessible(true); + + final Field mojoField = AbstractTomEEMojo.class.getDeclaredField(f.getName()); + mojoField.setAccessible(true); + f.set(mojoField, f.get(testInstance)); + } + } + + testMojo.runTest(); + } + + private TestTomEEMojo newMojo() { + return defaults(new TestTomEEMojo() { + @Override + protected void asserts() throws Throwable { + next.evaluate(); + } + }); + } + } + + protected static abstract class TestTomEEMojo extends StartTomEEMojo { + final AtomicReference<Throwable> ex = new AtomicReference<Throwable>(); + + protected abstract void asserts() throws Throwable; + + public void runTest() throws Throwable { + execute(); + if (ex.get() != null) { + throw ex.get(); + } + } + + protected void serverCmd(final RemoteServer server, final List<String> strings) { + super.serverCmd(server, strings); + + // the test + try { + asserts(); + } catch (final Throwable e) { + ex.set(e); + } finally { + destroy(this); + } + } + } + + protected static <T extends AbstractTomEEMojo> T defaults(final T tomEEMojo) { + // settings + final File settingsXml = new File(System.getProperty("user.home") + "/.m2/settings.xml"); + if (settingsXml.exists()) { + try { + final FileReader reader = new FileReader(settingsXml); + try { + tomEEMojo.settings = new SettingsXpp3Reader().read(reader, false); + } finally { + reader.close(); + } + } catch (final Exception e) { + // no-op + } + } + if (tomEEMojo.settings == null) { + tomEEMojo.settings = new Settings(); + } + tomEEMojo.settings.setOffline(true); + if (tomEEMojo.settings.getLocalRepository() == null) { + tomEEMojo.settings.setLocalRepository(System.getProperty("user.home") + "/.m2/repository"); + } + + // we don't deploy anything by default + tomEEMojo.skipCurrentProject = true; + + // our well known web profile ;) + tomEEMojo.tomeeGroupId = "org.apache.openejb"; + tomEEMojo.tomeeArtifactId = "apache-tomee"; + tomEEMojo.tomeeVersion = "1" + OpenEjbVersion.get().getVersion().substring(1); + tomEEMojo.tomeeClassifier = "webprofile"; + tomEEMojo.tomeeType = "zip"; + + // target config + tomEEMojo.catalinaBase = new File("target/mvn-test"); + Files.mkdirs(tomEEMojo.catalinaBase); + + // some defaults + tomEEMojo.simpleLog = true; + tomEEMojo.quickSession = true; + + tomEEMojo.libDir = "lib"; + tomEEMojo.webappDir = "webapps"; + tomEEMojo.appDir = "apps"; + + tomEEMojo.bin = new File(tomEEMojo.catalinaBase.getPath() + "-bin"); + tomEEMojo.config = new File(tomEEMojo.catalinaBase.getPath() + "-conf"); + tomEEMojo.lib = new File(tomEEMojo.catalinaBase.getPath() + "-lib"); + + tomEEMojo.tomeeHttpsPort = NetworkUtil.getNextAvailablePort(); + tomEEMojo.tomeeHttpPort = NetworkUtil.getNextAvailablePort(); + tomEEMojo.tomeeAjpPort = NetworkUtil.getNextAvailablePort(); + tomEEMojo.tomeeShutdownPort = NetworkUtil.getNextAvailablePort(); + tomEEMojo.tomeeHost = "localhost"; + + tomEEMojo.useConsole = true; + tomEEMojo.checkStarted = true; + + // we mock all the artifact resolution in test + tomEEMojo.remoteRepos = new LinkedList<ArtifactRepository>(); + tomEEMojo.local = new DefaultArtifactRepository("local", tomEEMojo.settings.getLocalRepository(), new DefaultRepositoryLayout()); + + tomEEMojo.factory = ArtifactFactory.class.cast(Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class<?>[]{ArtifactFactory.class}, new InvocationHandler() { + @Override + public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { + return new DefaultArtifact( + tomEEMojo.tomeeGroupId, + tomEEMojo.tomeeArtifactId, + VersionRange.createFromVersion(tomEEMojo.tomeeVersion), + "provided", + tomEEMojo.tomeeType, + tomEEMojo.tomeeClassifier, + null) { + @Override + public File getFile() { + return new File( + tomEEMojo.settings.getLocalRepository(), + getGroupId().replace('.', '/') + + '/' + getArtifactId().replace('.', '/') + + '/' + getVersion() + + '/' + getArtifactId().replace('.', '/') + '-' + getVersion() + '-' + getClassifier() + '.' + getType()); + } + }; + } + })); + + tomEEMojo.resolver = ArtifactResolver.class.cast(Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class<?>[] { ArtifactResolver.class }, new InvocationHandler() { + @Override + public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { + return null; + } + })); + + return tomEEMojo; + } + + protected static void destroy(final AbstractTomEEMojo run) { + if (run.server != null) { + run.server.destroy(); + } + } +} Added: tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/Url.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/Url.java?rev=1531832&view=auto ============================================================================== --- tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/Url.java (added) +++ tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/Url.java Mon Oct 14 09:26:31 2013 @@ -0,0 +1,27 @@ +/* + * 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.maven.plugin; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Url { +} Added: tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/test/TomEEMavenPluginTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/test/TomEEMavenPluginTest.java?rev=1531832&view=auto ============================================================================== --- tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/test/TomEEMavenPluginTest.java (added) +++ tomee/tomee/trunk/maven/tomee-maven-plugin/src/test/java/org/apache/openejb/maven/plugin/test/TomEEMavenPluginTest.java Mon Oct 14 09:26:31 2013 @@ -0,0 +1,41 @@ +/* + * 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.maven.plugin.test; + +import org.apache.openejb.loader.IO; +import org.apache.openejb.maven.plugin.TomEEMavenPluginRule; +import org.apache.openejb.maven.plugin.Url; +import org.junit.Rule; +import org.junit.Test; + +import java.net.URL; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; + +public class TomEEMavenPluginTest { + @Rule + public TomEEMavenPluginRule TMPRule = new TomEEMavenPluginRule(); + + @Url + private String url; + + @Test + public void simpleStart() throws Exception { + assertThat(IO.slurp(new URL(url + "/docs")), containsString("Apache Tomcat")); + } +}