package org.ovirt.engine.core.dao;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Modifier;
import java.util.Collections;
import java.util.Set;
import javax.inject.Singleton;
import org.junit.BeforeClass;
import org.junit.Test;
import org.reflections.Reflections;
public class DaoCdiIntegrationTest {
private static Set<Class<? extends Dao>> daoClasses;
@BeforeClass
public static void setUp() throws Exception {
final Reflections reflections = new Reflections("org.ovirt.engine");
daoClasses = Collections.unmodifiableSet(reflections.getSubTypesOf(Dao.class));
}
@Test
public void testSingletonDaoAnnotationPresent() {
daoClasses.stream().filter(this::isConcreteClass).forEach(daoClass ->
assertTrue("A concrete DAO class has to be annotated with @Singleton: " + daoClass.getCanonicalName(),
daoClass.isAnnotationPresent(Singleton.class)));
}
@Test
public void testSingletonDaoAnnotationNotPresentOnAbstractClass() {
daoClasses.stream().filter(this::isAbstractClass).forEach(daoClass ->
assertFalse("An abstract DAO class cannot be annotated with @Singleton: " + daoClass.getCanonicalName(),
daoClass.isAnnotationPresent(Singleton.class)));
}
@Test
public void testSingletonDaoAnnotationNotPresentOnParametrizedClass() {
daoClasses.stream().filter(this::isParametrizedClass).forEach(daoClass ->
assertFalse(
"A parametrized DAO class cannot be annotated with @Singleton: " + daoClass.getCanonicalName(),
daoClass.isAnnotationPresent(Singleton.class)));
}
private boolean isParametrizedClass(Class<?> clazz) {
return clazz.getTypeParameters().length > 0;
}
private boolean isAbstractClass(Class<?> clazz) {
return clazz.isInterface() || Modifier.isAbstract(clazz.getModifiers());
}
private boolean isConcreteClass(Class<?> daoClass) {
return !isAbstractClass(daoClass);
}
}