package org.ovirt.engine.core.dao; import static org.junit.Assert.assertTrue; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import javax.persistence.Column; import javax.persistence.Table; import javax.validation.constraints.Size; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Test; import org.ovirt.engine.core.common.businessentities.DbUser; import org.ovirt.engine.core.common.businessentities.LUNs; import org.ovirt.engine.core.common.businessentities.NetworkInterface; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VdsStatic; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.bookmarks; import org.ovirt.engine.core.common.businessentities.network; import org.ovirt.engine.core.common.businessentities.roles; import org.ovirt.engine.core.common.businessentities.storage_domain_static; import org.ovirt.engine.core.common.businessentities.storage_pool; import org.ovirt.engine.core.common.businessentities.tags; import org.ovirt.engine.core.common.businessentities.vm_pools; import org.ovirt.engine.core.utils.ReflectionUtils; public class GeneralDbDAOTest extends BaseDAOTestCase { private static Log logger = LogFactory.getLog(GeneralDbDAOTest.class); private static List<Class> businessEntities = new ArrayList<Class>(); @Override public void setUp() throws Exception { super.setUp(); // Only classes that allow user input are checked. businessEntities.add(bookmarks.class); businessEntities.add(DbUser.class); businessEntities.add(LUNs.class); businessEntities.add(NetworkInterface.class); businessEntities.add(network.class); businessEntities.add(roles.class); businessEntities.add(storage_domain_static.class); businessEntities.add(storage_pool.class); businessEntities.add(tags.class); businessEntities.add(VDSGroup.class); businessEntities.add(VdsStatic.class); businessEntities.add(vm_pools.class); businessEntities.add(VmStatic.class); businessEntities.add(VmTemplate.class); } /** * Tests that Size annotation on String BE fields match size in the database. */ @Test public void testBusinessEntitiesColumnSize() { String table; String column; List<String> errors = new ArrayList<String>(); // Get all business entities for (Class businessEntity : businessEntities) { // get BE table from class annotation Table tableAnnotation = (Table) ReflectionUtils.getTableAnnotation(businessEntity); if (tableAnnotation != null) { table = tableAnnotation.name(); // get all BE fields Field[] fields = businessEntity.getDeclaredFields(); for (Field field : fields) { // get Column annotation Column columnAnnotation = (Column) ReflectionUtils.getColumnAnnotation(field); if (columnAnnotation != null) { // get column name column = columnAnnotation.name(); int sizeInDb = dbFacade.getColumnSize(table, column); // get Size annotation Size sizeAnnotation = (Size) ReflectionUtils.getSizeAnnotation(field); if (sizeAnnotation != null) { // compare size in DB with size in BE int sizeInBusinessEntity = sizeAnnotation.max(); if (sizeInDb != -1 && (sizeInDb != sizeInBusinessEntity)) { errors.add(String.format("Class [%s] Field [%s]: Table [%s] Column [%s] size in DB: [%d] does not match size in Business Entity: [%d]", businessEntity.getName(), businessEntity.getName(), table, column, sizeInDb, sizeInBusinessEntity)); } } else { // report on String fields that have no Size annotation. if (field.getType().equals(String.class)) { errors.add(String.format("Class [%s] Field [%s] should have @Size(max = %d) annotation", businessEntity.getName(), field.getName(), sizeInDb)); } } } } } } for (String err : errors) { logger.error(err); } assertTrue(errors.size() == 0); } }