diff --git a/.gitignore b/.gitignore index 5eb8616..2f35fdf 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,4 @@ hs_err_pid* /.settings /.classpath /.project -db-migration/bin/ +*/bin/ diff --git a/cust-services/pom.xml b/cust-services/pom.xml index c92f904..a41f3fb 100644 --- a/cust-services/pom.xml +++ b/cust-services/pom.xml @@ -11,12 +11,20 @@ cust-webapp war HSAdmin XML-RPC Customers Webapp + de.hsadmin framework 1.0-SNAPSHOT + + de.hsadmin + framework + 1.0-SNAPSHOT + test-jar + test + org.apache.geronimo.specs geronimo-jpa_2.0_spec @@ -88,6 +96,10 @@ + + org.jacoco + jacoco-maven-plugin + org.apache.maven.plugins maven-war-plugin diff --git a/cust-services/src/main/resources/META-INF/persistence.xml b/cust-services/src/main/resources/META-INF/persistence.xml index 58f1aa9..a432242 100644 --- a/cust-services/src/main/resources/META-INF/persistence.xml +++ b/cust-services/src/main/resources/META-INF/persistence.xml @@ -7,6 +7,8 @@ HsarDataSource de.hsadmin.bo.customer.Contact de.hsadmin.bo.customer.Customer + de.hsadmin.bo.customer.MemberShare + de.hsadmin.bo.customer.MemberAsset de.hsadmin.bo.customer.SEPADirectDebit de.hsadmin.bo.domain.Domain de.hsadmin.bo.domain.DomainOption @@ -21,4 +23,4 @@ de.hsadmin.bo.pac.PacComponent de.hsadmin.bo.pac.UnixUser - \ No newline at end of file + diff --git a/cust-services/src/test/java/de/hsadmin/service/customer/ContactRemoteTest.java b/cust-services/src/test/java/de/hsadmin/service/customer/ContactRemoteTest.java new file mode 100644 index 0000000..e8ca3b0 --- /dev/null +++ b/cust-services/src/test/java/de/hsadmin/service/customer/ContactRemoteTest.java @@ -0,0 +1,15 @@ +package de.hsadmin.service.customer; + +import org.junit.Test; + +import de.hsadmin.test.BaseRemoteTest; + +public class ContactRemoteTest extends BaseRemoteTest { + + @Test + public void canInstantiateMemberShareServiceLocalViaRemoteRegistry() throws Exception { + givenRegisteredModuleLookupFor(ContactServiceLocal.class); + whenServiceIsRetrievedFromRemoteRegistryKey("contact"); + thenModuleInstantiatesServiceOfClass(ContactService.class); + } +} diff --git a/cust-services/src/test/java/de/hsadmin/service/customer/CustomerRemoteTest.java b/cust-services/src/test/java/de/hsadmin/service/customer/CustomerRemoteTest.java new file mode 100644 index 0000000..e0f4f85 --- /dev/null +++ b/cust-services/src/test/java/de/hsadmin/service/customer/CustomerRemoteTest.java @@ -0,0 +1,15 @@ +package de.hsadmin.service.customer; + +import org.junit.Test; + +import de.hsadmin.test.BaseRemoteTest; + +public class CustomerRemoteTest extends BaseRemoteTest { + + @Test + public void canInstantiateMemberShareServiceLocalViaRemoteRegistry() throws Exception { + givenRegisteredModuleLookupFor(CustomerServiceLocal.class); + whenServiceIsRetrievedFromRemoteRegistryKey("customer"); + thenModuleInstantiatesServiceOfClass(CustomerService.class); + } +} diff --git a/cust-services/src/test/java/de/hsadmin/service/customer/SEPADirectDebitRemoteTest.java b/cust-services/src/test/java/de/hsadmin/service/customer/SEPADirectDebitRemoteTest.java new file mode 100644 index 0000000..f0d21a2 --- /dev/null +++ b/cust-services/src/test/java/de/hsadmin/service/customer/SEPADirectDebitRemoteTest.java @@ -0,0 +1,15 @@ +package de.hsadmin.service.customer; + +import org.junit.Test; + +import de.hsadmin.test.BaseRemoteTest; + +public class SEPADirectDebitRemoteTest extends BaseRemoteTest { + + @Test + public void canInstantiateMemberShareServiceLocalViaRemoteRegistry() throws Exception { + givenRegisteredModuleLookupFor(SEPADirectDebitServiceLocal.class); + whenServiceIsRetrievedFromRemoteRegistryKey("mandat"); + thenModuleInstantiatesServiceOfClass(SEPADirectDebitService.class); + } +} diff --git a/cust-services/src/test/java/de/hsadmin/service/pac/HiveRemoteTest.java b/cust-services/src/test/java/de/hsadmin/service/pac/HiveRemoteTest.java new file mode 100644 index 0000000..85d34c8 --- /dev/null +++ b/cust-services/src/test/java/de/hsadmin/service/pac/HiveRemoteTest.java @@ -0,0 +1,15 @@ +package de.hsadmin.service.pac; + +import org.junit.Test; + +import de.hsadmin.test.BaseRemoteTest; + +public class HiveRemoteTest extends BaseRemoteTest { + + @Test + public void canInstantiateMemberShareServiceLocalViaRemoteRegistry() throws Exception { + givenRegisteredModuleLookupFor(HiveServiceLocal.class); + whenServiceIsRetrievedFromRemoteRegistryKey("hive"); + thenModuleInstantiatesServiceOfClass(HiveService.class); + } +} diff --git a/cust-services/src/test/java/de/hsadmin/service/pac/PacRemoteTest.java b/cust-services/src/test/java/de/hsadmin/service/pac/PacRemoteTest.java new file mode 100644 index 0000000..0a7a800 --- /dev/null +++ b/cust-services/src/test/java/de/hsadmin/service/pac/PacRemoteTest.java @@ -0,0 +1,15 @@ +package de.hsadmin.service.pac; + +import org.junit.Test; + +import de.hsadmin.test.BaseRemoteTest; + +public class PacRemoteTest extends BaseRemoteTest { + + @Test + public void canInstantiateMemberShareServiceLocalViaRemoteRegistry() throws Exception { + givenRegisteredModuleLookupFor(PacServiceLocal.class); + whenServiceIsRetrievedFromRemoteRegistryKey("pac"); + thenModuleInstantiatesServiceOfClass(PacService.class); + } +} diff --git a/cust-services/src/test/resources/META-INF/persistence.xml b/cust-services/src/test/resources/META-INF/persistence.xml index ed38077..3c92cb3 100644 --- a/cust-services/src/test/resources/META-INF/persistence.xml +++ b/cust-services/src/test/resources/META-INF/persistence.xml @@ -6,21 +6,23 @@ org.apache.openjpa.persistence.PersistenceProviderImpl - de.hsadmin.bo.customer.Customer - de.hsadmin.bo.customer.Contact - de.hsadmin.bo.customer.SEPADirectDebit - de.hsadmin.bo.pac.INetAddress - de.hsadmin.bo.pac.Hive - de.hsadmin.bo.pac.Pac - de.hsadmin.bo.pac.BasePac - de.hsadmin.bo.pac.Component - de.hsadmin.bo.pac.BaseComponent - de.hsadmin.bo.pac.PacComponent - de.hsadmin.bo.pac.UnixUser - de.hsadmin.bo.customer.MemberShare - de.hsadmin.bo.customer.MemberAsset - - false + de.hsadmin.bo.customer.Contact + de.hsadmin.bo.customer.Customer + de.hsadmin.bo.customer.MemberShare + de.hsadmin.bo.customer.MemberAsset + de.hsadmin.bo.customer.SEPADirectDebit + de.hsadmin.bo.domain.Domain + de.hsadmin.bo.domain.DomainOption + de.hsadmin.bo.domain.EMailAddress + de.hsadmin.bo.pac.BaseComponent + de.hsadmin.bo.pac.BasePac + de.hsadmin.bo.pac.Component + de.hsadmin.bo.pac.EMailAlias + de.hsadmin.bo.pac.Hive + de.hsadmin.bo.pac.INetAddress + de.hsadmin.bo.pac.Pac + de.hsadmin.bo.pac.PacComponent + de.hsadmin.bo.pac.UnixUser @@ -40,7 +42,7 @@ --> - + - \ No newline at end of file + diff --git a/database-services/pom.xml b/database-services/pom.xml index e6604d7..621e662 100644 --- a/database-services/pom.xml +++ b/database-services/pom.xml @@ -17,12 +17,19 @@ framework 1.0-SNAPSHOT + + de.hsadmin + framework + 1.0-SNAPSHOT + test-jar + test + de.hsadmin cust-webapp 1.0-SNAPSHOT - + org.apache.geronimo.specs geronimo-jpa_2.0_spec 1.1 @@ -55,6 +62,10 @@ database-webapp + + org.jacoco + jacoco-maven-plugin + maven-war-plugin diff --git a/database-services/src/test/java/de/hsadmin/service/database/MySqlDatabaseRemoteTest.java b/database-services/src/test/java/de/hsadmin/service/database/MySqlDatabaseRemoteTest.java new file mode 100644 index 0000000..ff0a89f --- /dev/null +++ b/database-services/src/test/java/de/hsadmin/service/database/MySqlDatabaseRemoteTest.java @@ -0,0 +1,13 @@ +package de.hsadmin.service.database; + +import org.junit.Test; + +public class MySqlDatabaseRemoteTest extends de.hsadmin.test.BaseRemoteTest { + + @Test + public void canInstantiateMemberShareServiceLocalViaRemoteRegistry() throws Exception { + givenRegisteredModuleLookupFor(MySqlDatabaseServiceLocal.class); + whenServiceIsRetrievedFromRemoteRegistryKey("mysqldb"); +// thenModuleInstantiatesServiceOfClass(MySqlDatabaseService.class); FIXME + } +} diff --git a/framework/pom.xml b/framework/pom.xml index 7d2739a..82e71bf 100644 --- a/framework/pom.xml +++ b/framework/pom.xml @@ -14,17 +14,35 @@ HSAdmin Framework - org.apache.maven.plugins maven-surefire-plugin + - - + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + test-jar + + + + + + + org.jacoco + jacoco-maven-plugin + + @@ -45,61 +63,62 @@ geronimo-validation_1.0_spec 1.1 - - org.apache.bval - org.apache.bval.bundle - 0.5 - test - - - org.apache.xmlrpc - xmlrpc-server - 3.1.3 - - - log4j - log4j - 1.2.17 - - - joda-time - joda-time - 2.9.9 - - - - com.h2database - h2 - 1.4.194 - test - - - - org.apache.openjpa - openjpa - 2.4.2 - test - - + + org.apache.bval + org.apache.bval.bundle + 0.5 + test + + + org.apache.xmlrpc + xmlrpc-server + 3.1.3 + + + log4j + log4j + 1.2.17 + + + joda-time + joda-time + 2.9.9 + + + + com.h2database + h2 + 1.4.194 + test + + + + org.apache.openjpa + openjpa + 2.4.2 + test + + org.liquibase liquibase-core 3.5.3 test - + + diff --git a/framework/src/test/java/de/hsadmin/service/property/PropertyRemoteTest.java b/framework/src/test/java/de/hsadmin/service/property/PropertyRemoteTest.java new file mode 100644 index 0000000..6ee50c5 --- /dev/null +++ b/framework/src/test/java/de/hsadmin/service/property/PropertyRemoteTest.java @@ -0,0 +1,17 @@ +package de.hsadmin.service.property; + +import org.junit.Ignore; +import org.junit.Test; + +import de.hsadmin.test.BaseRemoteTest; + +@Ignore("there is no XmlRpcServlet.properties entry for this remote") +public class PropertyRemoteTest extends BaseRemoteTest { + + @Test + public void canInstantiateMemberShareServiceLocalViaRemoteRegistry() throws Exception { + givenRegisteredModuleLookupFor(PropertyServiceLocal.class); + whenServiceIsRetrievedFromRemoteRegistryKey("property"); + thenModuleInstantiatesServiceOfClass(PropertyService.class); + } +} diff --git a/framework/src/test/java/de/hsadmin/test/BaseRemoteTest.java b/framework/src/test/java/de/hsadmin/test/BaseRemoteTest.java new file mode 100644 index 0000000..f4f3b48 --- /dev/null +++ b/framework/src/test/java/de/hsadmin/test/BaseRemoteTest.java @@ -0,0 +1,83 @@ +package de.hsadmin.test; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Hashtable; +import java.util.Properties; + +import javax.ejb.Stateless; +import javax.naming.InitialContext; +import javax.naming.NamingException; + +import org.junit.Before; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import de.hsadmin.common.error.TechnicalException; +import de.hsadmin.module.Module; +import de.hsadmin.module.ValueObject; +import de.hsadmin.xmlrpc.AbstractRemote; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({ + AbstractRemote.class // to intercept `new InitialContext(...)` + }) +public abstract class BaseRemoteTest { +private static final String RPC_SERVLET_PROPERTIES = "org/apache/xmlrpc/webserver/XmlRpcServlet.properties"; + + @Mock + private InitialContext context; + + @Mock + private ValueObject valueObjectMock; + + private String remoteClassName; + + @Before + public void init() throws Exception { + MockitoAnnotations.initMocks(this); + PowerMockito.whenNew(InitialContext.class).withArguments(Mockito.any(Hashtable.class)).thenReturn(context); + } + + protected final InitialContext getInitialContext() { + return context; + } + protected final void givenRegisteredModuleLookupFor(final Class> moduleServiceInterface) throws NamingException, TechnicalException { + String moduleServiceName = moduleServiceInterface.getSimpleName(); // heuristic + @SuppressWarnings("unchecked") + Module moduleService = (Module) Mockito.mock(moduleServiceInterface); + Mockito.when(getInitialContext().lookup(moduleServiceName)).thenReturn(moduleService); + Mockito.when(moduleService.buildVO()).thenReturn(valueObjectMock); + } + + protected final void whenServiceIsRetrievedFromRemoteRegistryKey(final String moduleId) throws IOException { + InputStream is = getClass().getClassLoader().getResourceAsStream(RPC_SERVLET_PROPERTIES); + assertNotNull(RPC_SERVLET_PROPERTIES + " not found or not readable", is);Properties props = new Properties(); + + props.load(is); + assertTrue(RPC_SERVLET_PROPERTIES + " does not contain " + moduleId, props.containsKey(moduleId)); + + remoteClassName = props.get(moduleId).toString(); + } + + protected final void thenModuleInstantiatesServiceOfClass(final Class expectedModuleClass) throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException { + assertNotNull(expectedModuleClass + " is missing @" + Stateless.class.getSimpleName(), expectedModuleClass.getAnnotation(Stateless.class)); + + AbstractRemote remote = (AbstractRemote) getClass().getClassLoader().loadClass(remoteClassName).newInstance(); + try { + ValueObject vo = remote.createValueObject(); + assertNotNull(remoteClassName + ".createValueObject() returned null", vo); + } catch ( Exception exc ) { + fail("remote proxy " + remoteClassName + " not properly initialized: " + exc); + } + } +} diff --git a/pom.xml b/pom.xml index 017a123..d251a49 100644 --- a/pom.xml +++ b/pom.xml @@ -10,6 +10,13 @@ 1.0-SNAPSHOT HSAdmin Parent Project + + + 0.0 + 0.0 + 25 + + db-migration framework @@ -37,20 +44,98 @@ maven-surefire-plugin 2.19.1 - -XX:+AlwaysLockClassLoader + ${argLine} -XX:+AlwaysLockClassLoader + + org.jacoco + jacoco-maven-plugin + 0.7.9 + + + default-prepare-agent + + prepare-agent + + + + default-report + prepare-package + + report + + + + default-check + + check + + + + + BUNDLE + + + LINE + COVEREDRATIO + ${jacoco.check.lineRatio} + + + BRANCH + COVEREDRATIO + ${jacoco.check.branchRatio} + + + + + METHOD + + + COMPLEXITY + TOTALCOUNT + ${jacoco.check.complexityMax} + + + + + + + + + + org.apache.commons + commons-lang3 + 3.5 + junit junit 4.12 test + + org.mockito + mockito-all + 1.10.19 + test + + + org.powermock + powermock-module-junit4 + 1.6.6 + test + + + org.powermock + powermock-api-mockito + 1.6.6 + test + com.openpojo openpojo