blob: 00445bec3c5bb6a15ae48aa872ea209a1bcb97ec [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.tomee.embedded;
import org.apache.openejb.assembler.classic.Assembler;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.observer.Observes;
import org.apache.openejb.testing.Application;
import org.apache.openejb.testing.Classes;
import org.apache.openejb.testing.ContainerProperties;
import org.apache.openejb.testing.RandomPort;
import org.apache.openejb.testng.PropertiesBuilder;
import org.apache.tomee.embedded.event.TomEEEmbeddedApplicationRunnerInjection;
import org.apache.tomee.embedded.junit.jupiter.RunWithTomEEEmbedded;
import org.apache.tomee.embedded.junit.jupiter.TomEEEmbeddedExtension;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import java.io.Closeable;
import java.io.IOException;
import java.net.URL;
import java.util.Collection;
import java.util.Properties;
import static org.junit.Assert.*;
// just a manual test to check it works, can't be executed with the rest of the suite,
// we could use a different surefire execution if we want to add it to the default run
//-Dtomee.application-composer.application=org.apache.tomee.embedded.SingleInstanceRunnerExtensionTest$TheApp
@RunWithTomEEEmbedded
public class SingleInstanceRunnerExtensionTest {
@Application // app can have several injections/helpers
private TheApp app;
@RandomPort("http") // @RandomPort are propagated by value + type only (both need to match ATM)
private int port;
@Test
public void run() {
assertNotNull(SystemInstance.get().getComponent(Assembler.class));
assertEquals("val", SystemInstance.get().getProperty("simple"));
assertEquals("set", SystemInstance.get().getProperty("t"));
assertEquals("p", SystemInstance.get().getProperty("prog"));
assertEquals("128463", SystemInstance.get().getProperty("my.server.port"));
assertEquals("true", SystemInstance.get().getProperty("configurer"));
assertNotEquals(8080, app.port);
assertTrue(app.base.toExternalForm().endsWith("/app"));
assertEquals(app.port, port);
assertNotNull(app.task);
assertNotNull(app.tasks);
assertEquals(1, app.tasks.size());
assertEquals(app.task, app.tasks.iterator().next());
assertEquals(app.task, MyTask.instance);
assertNotNull(app.custom);
}
@Application
@Classes(context = "app")
@ContainerProperties({
@ContainerProperties.Property(name = "simple", value = "val"),
@ContainerProperties.Property(name = "tomee.embedded.application.runner.properties.t", value = "${t.value}"),
@ContainerProperties.Property(name = "tomee.embedded.application.runner.t.value", value = "set")
})
@TomEEEmbeddedApplicationRunner.LifecycleTasks(MyTask.class)
// can start a ftp/sftp/elasticsearch/mongo/... server before tomee
@TomEEEmbeddedApplicationRunner.Configurers(SetMyProperty.class)
public static class TheApp {
@RandomPort("http")
private int port;
@RandomPort("http")
private URL base;
@TomEEEmbeddedApplicationRunner.LifecycleTask
private MyTask task;
@TomEEEmbeddedApplicationRunner.LifecycleTask
private Collection<LifecycleTask> tasks;
@org.apache.openejb.testing.Configuration
public Properties add() {
return new PropertiesBuilder().p("prog", "p").build();
}
private Custom custom;
public void doInject(@Observes final TomEEEmbeddedApplicationRunnerInjection injector) {
injector.inject(Custom.class, new Custom())
.inject(NotHere.class, new NotHere());
}
}
public static class NotHere {
}
public static class Custom {
}
public static class MyTask implements LifecycleTask {
private static MyTask instance;
@Override
public Closeable beforeContainerStartup() {
instance = this;
System.out.println(">>> start");
System.setProperty("my.server.port", "128463");
return new Closeable() {
@Override
public void close() throws IOException {
System.out.println(">>> close");
}
};
}
}
public static class SetMyProperty implements TomEEEmbeddedApplicationRunner.Configurer {
@Override
public void configure(final Configuration configuration) {
configuration.property("configurer", "true");
}
}
}