blob: 7a9e974b56f5c1cf38cea046ff13a1babf38c5f1 [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.junit5;
import org.apache.openejb.OpenEJBRuntimeException;
import org.apache.openejb.testing.Classes;
import org.apache.openejb.testing.Component;
import org.apache.openejb.testing.Default;
import org.apache.openejb.testing.Jars;
import org.apache.openejb.testing.Module;
import org.apache.openejb.testing.SingleApplicationComposerBase;
import org.apache.xbean.finder.ClassFinder;
import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.List;
import static org.apache.openejb.util.Classes.ancestors;
public class ApplicationComposerPerJVMExtension extends ApplicationComposerPerXYExtensionBase implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback {
private static final SingleApplicationComposerBase BASE = new SingleApplicationComposerBase();
@Override
protected void validate(ExtensionContext context) {
if (!isPerJvm(context) && BASE.isStarted()) {
//XXX: Future work: We might get it to work via a JVM singleton/lock, see https://github.com/apache/tomee/pull/767#discussion_r595343572
throw new OpenEJBRuntimeException("Cannot run PER_JVM in combination with PER_ALL, PER_EACH or AUTO");
}
Class<?> clazz = context.getTestClass()
.orElseThrow(() -> new OpenEJBRuntimeException("Could not obtain test class from extension context"));
final List<Throwable> errors = new ArrayList<>();
ClassFinder classFinder = new ClassFinder(ancestors(clazz));
Class<? extends Annotation>[] toCheck = new Class[]{Component.class, Module.class, Classes.class, Default.class, Jars.class};
for (Class<? extends Annotation> annotation : toCheck) {
if (classFinder.isAnnotationPresent(annotation)) {
errors.add(new Exception("@" + annotation.getName() + " is not allowed with @Application in PER_JVM mode"));
}
}
if (!errors.isEmpty()) {
throw new OpenEJBRuntimeException(errors.toString());
}
}
@Override
public void beforeAll(ExtensionContext context) throws Exception {
super.beforeAll(context);
doInit(context);
doStart(context);
if (isPerClassLifecycle(context)) {
doInject(context);
}
}
@Override
public void beforeEach(ExtensionContext context) {
if (isPerMethodLifecycle(context)) {
doInject(context);
}
}
@Override
void doInit(final ExtensionContext extensionContext) {
//no-op
}
@Override
void doStart(final ExtensionContext extensionContext) throws Exception {
BASE.start(extensionContext.getTestClass().orElse(null));
}
@Override
void doInject(Object target, final ExtensionContext context) throws Exception {
BASE.composerInject(target);
}
public static boolean isStarted() {
return BASE.isStarted();
}
}