blob: d11893fde5b747a5f547cdc46fe5cd2ec3139f03 [file] [log] [blame]
package org.apache.geronimo.microprofile.metrics.test;
import java.lang.reflect.Field;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.CDI;
import org.apache.catalina.Context;
import org.apache.meecrowave.Meecrowave;
import org.apache.meecrowave.arquillian.MeecrowaveContainer;
import org.jboss.arquillian.container.spi.client.container.DeployableContainer;
import org.jboss.arquillian.container.spi.context.annotation.ContainerScoped;
import org.jboss.arquillian.container.spi.context.annotation.DeploymentScoped;
import org.jboss.arquillian.container.spi.event.container.AfterDeploy;
import org.jboss.arquillian.container.spi.event.container.AfterStart;
import org.jboss.arquillian.container.spi.event.container.BeforeUnDeploy;
import org.jboss.arquillian.container.test.impl.client.protocol.local.LocalProtocol;
import org.jboss.arquillian.container.test.spi.client.deployment.ApplicationArchiveProcessor;
import org.jboss.arquillian.container.test.spi.client.deployment.DeploymentPackager;
import org.jboss.arquillian.container.test.spi.client.protocol.Protocol;
import org.jboss.arquillian.core.api.InstanceProducer;
import org.jboss.arquillian.core.api.annotation.Inject;
import org.jboss.arquillian.core.api.annotation.Observes;
import org.jboss.arquillian.core.spi.LoadableExtension;
import org.jboss.arquillian.test.spi.TestClass;
import org.jboss.arquillian.test.spi.event.suite.Before;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.api.spec.WebArchive;
public class ArquillianSetup implements LoadableExtension {
@Override
public void register(final ExtensionBuilder extensionBuilder) {
extensionBuilder.observer(EnvSetup.class)
.override(DeployableContainer.class, MeecrowaveContainer.class, TckContainer.class)
.override(Protocol.class, LocalProtocol.class, ForceWarProtocol.class)
.service(ApplicationArchiveProcessor.class, EnsureTestIsInTheArchiveProcessor.class);
}
public static class EnvSetup {
@Inject
@DeploymentScoped
private InstanceProducer<BeanManager> beanManagerInstanceProducer;
@Inject
@DeploymentScoped
private InstanceProducer<ClassLoader> appClassLoaderInstanceProducer;
@Inject
@ContainerScoped
private InstanceProducer<Meecrowave> container;
public void onDeploy(@Observes final AfterStart afterStart) throws Exception {
final DeployableContainer<?> deployableContainer = afterStart.getDeployableContainer();
final Field container = MeecrowaveContainer.class.getDeclaredField("container");
container.setAccessible(true);
final Meecrowave meecrowave = Meecrowave.class.cast(container.get(deployableContainer));
this.container.set(meecrowave);
}
public void onDeploy(@Observes final AfterDeploy afterDeploy) {
final Meecrowave meecrowave = container.get();
final ClassLoader appLoader = Context.class.cast(meecrowave.getTomcat().getHost().findChildren()[0]).getLoader().getClassLoader();
appClassLoaderInstanceProducer.set(appLoader);
final Thread thread = Thread.currentThread();
thread.setContextClassLoader(appLoader);
beanManagerInstanceProducer.set(CDI.current().getBeanManager());
}
public void onUndeploy(@Observes final BeforeUnDeploy beforeUnDeploy) {
final ClassLoader cl = container.get().getTomcat().getServer().getParentClassLoader();
Thread.currentThread().setContextClassLoader(cl);
}
public void enrich(@Observes final Before before) throws Exception {
final Thread thread = Thread.currentThread();
final ClassLoader classLoader = thread.getContextClassLoader();
thread.setContextClassLoader(appClassLoaderInstanceProducer.get());
try {
container.get().inject(before.getTestInstance()).close();
} finally {
thread.setContextClassLoader(classLoader);
}
}
}
public static class ForceWarProtocol extends LocalProtocol {
@Override
public DeploymentPackager getPackager() {
return (deployment, collection) -> {
final Archive<?> archive = deployment.getApplicationArchive();
if (JavaArchive.class.isInstance(archive)) {
return ShrinkWrap.create(WebArchive.class, archive.getName().replace(".jar", ".war"))
.addAsLibraries(archive);
}
return archive;
};
}
}
public static class EnsureTestIsInTheArchiveProcessor implements ApplicationArchiveProcessor {
@Override
public void process(final Archive<?> archive, final TestClass testClass) {
if (JavaArchive.class.isInstance(archive) && !archive.contains(testClass.getName().replace('.', '/') + ".class")) {
JavaArchive.class.cast(archive).addClass(testClass.getJavaClass());
}
}
}
}