svn commit: r1872442 - in /db/torque/torque4/trunk: torque-site/src/site/xdoc/developer-info/ torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/

[email protected]
Newsgroups gmane.comp.jakarta.turbine.torque.devel
Message-ID <[email protected]>
Author: gk
Date: Tue Jan  7 14:08:40 2020
New Revision: 1872442

URL: http://svn.apache.org/viewvc?rev=1872442&view=rev
Log:
- cleanup code, use intermediate parent class DockerDatabaseAbstractExtension for configuration docker database
- add some docker-testcontainer info in site
- add Documented to annotations

Added:
    db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerDatabaseAbstractExtension.java   (with props)
Modified:
    db/torque/torque4/trunk/torque-site/src/site/xdoc/developer-info/developer-guide.xml
    db/torque/torque4/trunk/torque-site/src/site/xdoc/developer-info/test-project.xml
    db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallback.java
    db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackExtension.java
    db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackMySQLExtension.java
    db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackPostgreSQLExtension.java
    db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerMySQLCallback.java
    db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerPostGresCallback.java

Modified: db/torque/torque4/trunk/torque-site/src/site/xdoc/developer-info/developer-guide.xml
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-site/src/site/xdoc/developer-info/developer-guide.xml?rev=1872442&r1=1872441&r2=1872442&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-site/src/site/xdoc/developer-info/developer-guide.xml (original)
+++ db/torque/torque4/trunk/torque-site/src/site/xdoc/developer-info/developer-guide.xml Tue Jan  7 14:08:40 2020
@@ -34,8 +34,7 @@
     <section name="Building from SVN">
       <p>
         The Torque build process uses 
-        <a href="http://maven.apache.org">Maven 3</a> for building;
-        the recommended version is Maven 3.2.3.
+        <a href="http://maven.apache.org">Maven 3</a> for building.
         <br/>
         You need to check out the <code>torque4/trunk</code> 
         part of the <code>db/torque</code> SVN repository.
@@ -47,7 +46,7 @@
         <p>
           Change into the directory into which you checked out the
           torque 4 trunk. Run <code>mvn install</code>.
-          The runtime, generator, templates, maven 2 generator plugin
+          The runtime, generator, templates, maven 3 generator plugin
           and ant tasks will be built in turn and installed
           in your local maven 2 repository.
         </p>
@@ -121,6 +120,10 @@
             That's it.
           </li>
         </ul>
+       To later change or update a project change into the module directory and run 
+       <code>mvn eclipse:eclipse</code>.
+       or in case of the "special" test module torque-test run 
+       <code>mvn -Phsqldb eclipse:configure-workspace eclipse:clean eclipse:eclipse</code>.
       </subsection>
     </section>
 

Modified: db/torque/torque4/trunk/torque-site/src/site/xdoc/developer-info/test-project.xml
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-site/src/site/xdoc/developer-info/test-project.xml?rev=1872442&r1=1872441&r2=1872442&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-site/src/site/xdoc/developer-info/test-project.xml (original)
+++ db/torque/torque4/trunk/torque-site/src/site/xdoc/developer-info/test-project.xml Tue Jan  7 14:08:40 2020
@@ -54,7 +54,7 @@
     </section>
     <section name="Running the test project">
       <p>
-        In order to run the test project using maven 2, use the following 
+        In order to run the test project using maven, use the following 
         procedure:
         <ul>
           <li>
@@ -85,6 +85,21 @@
             For example, if you want to test against mysql, run
             <code>mvn -Pmysql clean test</code>.
           </li>
+          <li>
+            If you do not want or have a database installed locally, you may use the docker-testcontainer profile. 
+            Run the command <code>mvn -P${profile},docker-testcontainer,managers,beans clean test</code>
+            to run some tests*, replacing the variable 
+            <code>${profile}</code> with the name of your chosen database
+            profile. Currently only mysql and postgresql type is supported.<br/>
+            For example, if you want to test against mysql, run
+            <code>mvn -Pmysql,docker-testcontainer,managers,beans clean test</code>.
+            * JUnit 5 not yet supports test suites, only some selected tests are triggered 
+            (see package org.apache.torque.testcontainer).
+            Hint (e.g. if adding new database profile): To test local Dockerfile run it locally to shortcut / 
+            exclude other failures e.g. in docker-test/target directory with 
+            <code>docker build -t build -f Dockerfile  ./ </code> and inspecting the image with on the fly container:
+            <code>docker run --rm -it build bash</code>.
+          </li>
         </ul>
       </p>
       <p>

Modified: db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallback.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallback.java?rev=1872442&r1=1872441&r2=1872442&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallback.java (original)
+++ db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallback.java Tue Jan  7 14:08:40 2020
@@ -35,9 +35,9 @@ import org.testcontainers.junit.jupiter.
  * {@code @DockerCallback} is used to signal that the annotated test class or
  * test method is using Docker {@link Testcontainers} and Torque initialized accordingly.
  * 
- * It is currently enabled by overridign the default
+ * It is currently enabled by overriding the default
  * 
- * @author gkallidis
+ * @author gk
  *
  */
 // may have ParameterizedTest in test class -> Possible configuration error

Modified: db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackExtension.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackExtension.java?rev=1872442&r1=1872441&r2=1872442&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackExtension.java (original)
+++ db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackExtension.java Tue Jan  7 14:08:40 2020
@@ -44,20 +44,22 @@ import org.apache.torque.TorqueException
 import org.apache.torque.adapter.Adapter;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.extension.BeforeAllCallback;
-import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
 import org.junit.jupiter.api.extension.ConditionEvaluationResult;
 import org.junit.jupiter.api.extension.ExecutionCondition;
 import org.junit.jupiter.api.extension.ExtensionContext;
 import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
 
 /**
- * Docker Test configuration
+ * Docker Test configuration, updates Torque configuration files in {@link #getTargetFileName()}, 
+ * which is set by database or default annotation {@link DockerCallback#targetFileName()}.
+ * 
+ * Uses by default a base configuration found in <code>src/test/profile/%s/Torque4Test.xml</code>.
  * 
  * @author gk
  *
  */
 
-public class DockerCallbackExtension implements BeforeAllCallback, BeforeTestExecutionCallback, ExecutionCondition {
+public class DockerCallbackExtension implements BeforeAllCallback, ExecutionCondition {
 
     protected static final String DEFAULT_TEST_PROFILE_TORQUE4_TEST_XML = "src/test/profile/%s/Torque4Test.xml";
 
@@ -65,7 +67,6 @@ public class DockerCallbackExtension imp
 
     private static Logger log = LogManager.getLogger();
 
-    protected static int SERVICE_PORT = 3306;
     protected static Adapter defaultAdapter;
     
     private String adapterProfileFallback;
@@ -126,11 +127,6 @@ public class DockerCallbackExtension imp
     }
     
     
-    @Override
-    public void beforeTestExecution(ExtensionContext context) throws Exception {
-        // log.info("starting call test context "+ context);
-    }
-    
     protected void torqueInit(ExtensionContext context)
             throws TorqueException, UnsupportedOperationException, IOException, InterruptedException {
 

Modified: db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackMySQLExtension.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackMySQLExtension.java?rev=1872442&r1=1872441&r2=1872442&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackMySQLExtension.java (original)
+++ db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackMySQLExtension.java Tue Jan  7 14:08:40 2020
@@ -22,11 +22,9 @@ package org.apache.torque.testcontainer.
 import static org.junit.jupiter.api.extension.ConditionEvaluationResult.enabled;
 
 import java.io.File;
-import java.io.IOException;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.apache.torque.TorqueException;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.extension.BeforeAllCallback;
 import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
@@ -35,41 +33,41 @@ import org.junit.jupiter.api.extension.E
 import org.junit.jupiter.api.extension.ExtensionContext;
 import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
 import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.containers.wait.strategy.Wait;
 import org.testcontainers.images.builder.ImageFromDockerfile;
 import org.testcontainers.junit.jupiter.Container;
 import org.testcontainers.junit.jupiter.Testcontainers;
 
 /**
- * Testcontainer configuration
+ * Testcontainer configuration for database Mysql
+ * 
+ * Requires some configuration data found for example in {@link DockerMySQLCallback}.
  * 
  * @author gk
  *
  */
 @Testcontainers
-public class DockerCallbackMySQLExtension extends DockerCallbackExtension implements BeforeAllCallback, BeforeTestExecutionCallback, ExecutionCondition {
-
-    private static Logger log = LogManager.getLogger();
+public class DockerCallbackMySQLExtension extends DockerDatabaseAbstractExtension implements BeforeAllCallback, BeforeTestExecutionCallback, ExecutionCondition {
 
-    private static int SERVICE_PORT = 3306;
+    static Logger log = LogManager.getLogger();
     
-    protected static String DATABASE_NAME = "bookstore";
-
-    // copied from src/test/profile/mysql/docker-resources/db/
-    protected static final String DOCKERFILE = "./target/Dockerfile";
-
-    protected static final ConditionEvaluationResult ENABLED_BY_DEFAULT = enabled(
-            "DockerCallbackExtension is enabled by default - checking internal state only");
+    private static int SERVICE_PORT = 3306;
 
     @Container
     public static GenericContainer DATABASE_CONTAINER = new GenericContainer<>(
-            new ImageFromDockerfile().withDockerfile(new File(DOCKERFILE).toPath())).withExposedPorts(SERVICE_PORT) 
-                    .withEnv("MYSQL_DATABASE", DATABASE_NAME).withEnv("MYSQL_USER", "torque")
-                    .withEnv("MYSQL_PASSWORD", "torque").withEnv("MYSQL_ROOT_PASSWORD", "torque");
-                    //.withLogConsumer(new Slf4jLogConsumer(log));;
+                new ImageFromDockerfile().withDockerfile(new File(DOCKERFILE).toPath())).withExposedPorts(SERVICE_PORT) 
+                        .withEnv("MYSQL_DATABASE", DATABASE_NAME).withEnv("MYSQL_USER", "torque")
+                        .withEnv("MYSQL_PASSWORD", "torque").withEnv("MYSQL_ROOT_PASSWORD", "torque");
 
+    
+    public DockerCallbackMySQLExtension() {
+       setDbContainer(DATABASE_CONTAINER);
+       setServicePort(SERVICE_PORT);
+    }
+    
+    protected static final ConditionEvaluationResult ENABLED_BY_DEFAULT = enabled(
+            "DockerCallbackExtension is enabled by default - checking internal state only");
 
+    @Override
     public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) {
         String actual = System.getProperty("torque.callback");
         if (actual == null) {
@@ -89,65 +87,34 @@ public class DockerCallbackMySQLExtensio
      * Should be called first 
      * @see BeforeAll
      */
+    @Override
     public void beforeAll(ExtensionContext context) throws Exception {
         Class<?> clazz = context.getRequiredTestClass();
         log.warn("found and get annotation : {}", (Object[] )context.getRequiredTestClass().getAnnotations());
         DockerMySQLCallback dockerCallback = clazz.getAnnotation(DockerMySQLCallback.class);
-        setSkipConfigurationCheck(dockerCallback.skipConfigurationCheck());
-        setCustomUrlKey(dockerCallback.customUrlKey());
-        setTargetConfigName(dockerCallback.targetConfigName());
-        setTargetFileName(dockerCallback.targetFileName());
-        setAdapterProfileFallback(dockerCallback.adapterProfileFallback());
+        if (dockerCallback != null) {
+            setSkipConfigurationCheck(dockerCallback.skipConfigurationCheck());
+            setCustomUrlKey(dockerCallback.customUrlKey());
+            setTargetConfigName(dockerCallback.targetConfigName());
+            setTargetFileName(dockerCallback.targetFileName());
+            setAdapterProfileFallback(dockerCallback.adapterProfileFallback());
+        } else {
+            super.beforeAll(context);
+        }
         
-        // log.info("starting call context "+ context);
-        dbInit(context);
-        String jdbcConnectionString = generateJdbcUrl();
+        try {
+            dbInit(context);
+        } catch (Exception e) {
+            final String logs = getDbContainer().getLogs();
+            log.info("fetched container logs: {} ", logs);
+            throw e;
+        }
+        String jdbcConnectionString = generateJdbcUrl("?loggerLevel=OFF");
         context.getStore(Namespace.GLOBAL).put("jdbcConnectionString", jdbcConnectionString);
-        context.getStore(Namespace.GLOBAL).put("container", DATABASE_CONTAINER);
+        context.getStore(Namespace.GLOBAL).put("container", getDbContainer());
         context.getStore(Namespace.GLOBAL).put("annotatedClass", dockerCallback);
         
         torqueInit(context);
     }
 
-
-    private void dbInit(ExtensionContext context)
-            throws TorqueException, UnsupportedOperationException, IOException, InterruptedException {
-        log.info("Starting from dockerfile: {}", DOCKERFILE);
-        // before torque init
-        DATABASE_CONTAINER.setStartupAttempts(3);
-        startDatabaseContainer();
-        
-    }
-
-    private static void startDatabaseContainer() {
-        if (!DATABASE_CONTAINER.isRunning()) {
-            DATABASE_CONTAINER.waitingFor(Wait.forListeningPort());
-            DATABASE_CONTAINER.start();
-        }
-        if (!DATABASE_CONTAINER.isRunning()) {
-            throw new RuntimeException("Could not find RUNNING database container");
-        }
-    }
-
-    /**
-     * 
-     * @returns the JDBC string with mapped port binding
-     */
-    private static String generateJdbcUrl() {
-        startDatabaseContainer();
-        if (!DATABASE_CONTAINER.isRunning()) {
-            throw new RuntimeException("Could not find RUNNING database container");
-        }
-        // MY_SQL_CONTAINER.withCreateContainerCmdModifier(modifier) //
-        String serviceHost = DATABASE_CONTAINER.getContainerIpAddress();
-        Integer mappedPort = DATABASE_CONTAINER.getMappedPort(SERVICE_PORT);// e.g. 32811
-        log.info("generate jdbc url from {}, mapped Port: {}, bounded port: {}", serviceHost, mappedPort,
-                DATABASE_CONTAINER.getBoundPortNumbers());
-
-        String targetJDBC = // genJDBC;
-                String.format("jdbc:mysql://%s:%d/%s?loggerLevel=OFF", serviceHost, mappedPort, DATABASE_NAME);
-        log.info("used connect url: {}", targetJDBC);
-        return targetJDBC;
-    }
-
 }

Modified: db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackPostgreSQLExtension.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackPostgreSQLExtension.java?rev=1872442&r1=1872441&r2=1872442&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackPostgreSQLExtension.java (original)
+++ db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerCallbackPostgreSQLExtension.java Tue Jan  7 14:08:40 2020
@@ -22,9 +22,7 @@ package org.apache.torque.testcontainer.
 import static org.junit.jupiter.api.extension.ConditionEvaluationResult.enabled;
 
 import java.io.File;
-import java.io.IOException;
 
-import org.apache.torque.TorqueException;
 import org.junit.jupiter.api.extension.BeforeAllCallback;
 import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
 import org.junit.jupiter.api.extension.ConditionEvaluationResult;
@@ -34,28 +32,24 @@ import org.junit.jupiter.api.extension.E
 import org.slf4j.LoggerFactory;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.containers.wait.strategy.Wait;
 import org.testcontainers.images.builder.ImageFromDockerfile;
 import org.testcontainers.junit.jupiter.Container;
 import org.testcontainers.junit.jupiter.Testcontainers;
 
 /**
- * Testcontainer configuration
+ * Testcontainer configuration for database Postgres
+ * 
+ * Requires some configuration data found for example in {@link DockerPostGresCallback}.
  * 
  * @author gk
  *
  */
 @Testcontainers
-public class DockerCallbackPostgreSQLExtension extends DockerCallbackExtension implements BeforeAllCallback, BeforeTestExecutionCallback, ExecutionCondition {
+public class DockerCallbackPostgreSQLExtension extends DockerDatabaseAbstractExtension implements BeforeAllCallback, BeforeTestExecutionCallback, ExecutionCondition {
 
     private static org.slf4j.Logger log = LoggerFactory.getLogger(DockerCallbackPostgreSQLExtension.class);
 
     private static int SERVICE_PORT = 5432;
-    
-    protected static String DATABASE_NAME = "bookstore";
-
-    // copied from src/test/profile/mysql/docker-resources/db/
-    protected static final String DOCKERFILE = "./target/Dockerfile";
 
     private static final ConditionEvaluationResult ENABLED_BY_DEFAULT = enabled(
             "DockerCallbackExtension is enabled by default - checking internal state only");
@@ -66,6 +60,11 @@ public class DockerCallbackPostgreSQLExt
                     .withEnv("POSTGRES_DB", DATABASE_NAME).withEnv("POSTGRES_USER", "torque")
                     .withEnv("POSTGRES_PASSWORD", "torque").withLogConsumer(new Slf4jLogConsumer(log));
     
+    public DockerCallbackPostgreSQLExtension() {
+        setDbContainer(DATABASE_CONTAINER);
+        setServicePort(SERVICE_PORT);
+    }
+    
     @Override
     public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) {
         String actual = System.getProperty("torque.callback");
@@ -101,12 +100,12 @@ public class DockerCallbackPostgreSQLExt
             log.info("fetched container logs: {} ", logs);
             throw e;
         }
-        String jdbcConnectionString = generateJdbcUrl();
+        String jdbcConnectionString = generateJdbcUrl("");
         context.getStore(Namespace.GLOBAL).put("jdbcConnectionString", jdbcConnectionString);
         context.getStore(Namespace.GLOBAL).put("container", DATABASE_CONTAINER);
         context.getStore(Namespace.GLOBAL).put("annotatedClass", dockerCallback);
         
-        torqueInit(context);   
+        torqueInit(context);
     }
 
     @Override
@@ -114,44 +113,5 @@ public class DockerCallbackPostgreSQLExt
         // log.info("starting call test context "+ context);
     }
 
-    private void dbInit(ExtensionContext context)
-            throws TorqueException, UnsupportedOperationException, IOException, InterruptedException {
-        log.info("Starting from dockerfile: {} with image name: {}", DOCKERFILE , DATABASE_CONTAINER.getDockerImageName() );
-        // before torque init
-        DATABASE_CONTAINER.setStartupAttempts(3);
-        startDatabaseContainer();
-    }
-
-    private static void startDatabaseContainer() {
-        if (!DATABASE_CONTAINER.isRunning()) {
-            log.info("Waiting for running/ listening port..., binds: {}", DATABASE_CONTAINER.getBinds());
-            DATABASE_CONTAINER.waitingFor(Wait.forListeningPort());
-            DATABASE_CONTAINER.start();
-        }
-        if (!DATABASE_CONTAINER.isRunning()) {
-            throw new RuntimeException("Could not find RUNNING database container");
-        }
-    }
-
-    /**
-     * 
-     * @returns the JDBC string with mapped port binding
-     */
-    private static String generateJdbcUrl() {
-        startDatabaseContainer();
-        if (!DATABASE_CONTAINER.isRunning()) {
-            throw new RuntimeException("Could not find RUNNING database container");
-        }
-
-        String serviceHost = DATABASE_CONTAINER.getContainerIpAddress();
-        Integer mappedPort = DATABASE_CONTAINER.getMappedPort(SERVICE_PORT);// e.g. 32811
-        log.info("generate jdbc url from {}, mapped Port: {}, bounded port: {}", serviceHost, mappedPort,
-                DATABASE_CONTAINER.getBoundPortNumbers());
-
-        String targetJDBC = // genJDBC;
-                String.format("jdbc:postgresql://%s:%d/%s", serviceHost, mappedPort, DATABASE_NAME);
-        log.info("used connect url: {}", targetJDBC);
-        return targetJDBC;
-    }
 
 }

Added: db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerDatabaseAbstractExtension.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerDatabaseAbstractExtension.java?rev=1872442&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerDatabaseAbstractExtension.java (added)
+++ db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerDatabaseAbstractExtension.java Tue Jan  7 14:08:40 2020
@@ -0,0 +1,112 @@
+package org.apache.torque.testcontainer.junit5.extension;
+
+import java.io.IOException;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.torque.TorqueException;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.wait.strategy.Wait;
+
+/**
+ * {@link #dbContainer} and  {@link #servicePort} has to be set by implementing class
+ * 
+ * @author gk
+ * @version $Id$
+ *
+ */
+public abstract class DockerDatabaseAbstractExtension extends DockerCallbackExtension {
+
+    static Logger log = LogManager.getLogger();
+    
+    protected static String DATABASE_NAME = "bookstore";
+    protected static final String DOCKERFILE = "./target/Dockerfile";
+    
+    GenericContainer dbContainer;
+    
+    private int servicePort;
+    
+    public DockerDatabaseAbstractExtension() {
+        super();
+    }
+    
+
+    /**
+     * If database {@link #dbContainer} is not running, start it after port is bound.
+     * If it is still not running throw RuntimeException
+     */
+    private void startDatabaseContainer() {
+        if (!getDbContainer().isRunning()) {
+            log.info("Waiting for running/ listening port..., binds: {}", getDbContainer().getBinds());
+            getDbContainer().waitingFor(Wait.forListeningPort());
+            getDbContainer().start();
+        }
+        if (!getDbContainer().isRunning()) {
+            throw new RuntimeException("Could not find RUNNING database container ");
+        }
+    }
+
+    /**
+     * Builds and returns database specific JDBC string <code>jdbc:%s://%s:%d/%s%s</code> with parameters as configured in 
+     * <ul>
+     * @see #getAdapterProfileFallback(),
+     * {@link #getDbContainer} container ip address,
+     * {@link #getDbContainer()} mapped port,
+     * {@value #DATABASE_NAME} and  param queryContext.
+     * 
+     * 
+     * @param queryContext Optional query string including question mark
+     * @return the database specific JDBC string with mapped port binding
+     */
+    protected String generateJdbcUrl(String queryContext) {
+        startDatabaseContainer();
+        if (!getDbContainer().isRunning()) {
+            throw new RuntimeException("Could not find RUNNING database container");
+        }
+        // MY_SQL_CONTAINER.withCreateContainerCmdModifier(modifier) //
+        String serviceHost = getDbContainer().getContainerIpAddress();
+        Integer mappedPort = getDbContainer().getMappedPort(getServicePort());// e.g. 32811
+        log.info("generate jdbc url from {}, mapped Port: {}, bounded port: {}", serviceHost, mappedPort,
+                getDbContainer().getBoundPortNumbers());
+    
+        if (queryContext == null) {
+            queryContext = "";
+        }
+        String targetJDBC = // genJDBC;
+                String.format("jdbc:%s://%s:%d/%s%s", getAdapterProfileFallback(), serviceHost, mappedPort, DATABASE_NAME, queryContext);
+        log.info("used connect url: {}", targetJDBC);
+        return targetJDBC;
+    }
+
+    protected void dbInit(ExtensionContext context)
+            throws TorqueException, UnsupportedOperationException, IOException, InterruptedException {
+                log.info("Starting from dockerfile: {} with image name: {}", DOCKERFILE , getDbContainer().getDockerImageName() );
+                // before torque init
+                getDbContainer().setStartupAttempts(3);
+                startDatabaseContainer();
+    }
+
+    public DockerDatabaseAbstractExtension(String adapterProfileFallback) {
+        super(adapterProfileFallback);
+    }
+
+    public GenericContainer getDbContainer() {
+        return dbContainer;
+    }
+
+    public void setDbContainer(GenericContainer dbContainer) {
+        this.dbContainer = dbContainer;
+    }
+
+
+    public int getServicePort() {
+        return servicePort;
+    }
+
+
+    public void setServicePort(int servicePort) {
+        this.servicePort = servicePort;
+    }
+
+}
\ No newline at end of file

Propchange: db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerDatabaseAbstractExtension.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerMySQLCallback.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerMySQLCallback.java?rev=1872442&r1=1872441&r2=1872442&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerMySQLCallback.java (original)
+++ db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerMySQLCallback.java Tue Jan  7 14:08:40 2020
@@ -1,5 +1,7 @@
 package org.apache.torque.testcontainer.junit5.extension;
 
+import java.lang.annotation.Documented;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -32,22 +34,23 @@ import org.junit.jupiter.api.extension.E
 import org.testcontainers.junit.jupiter.Testcontainers;
 
 /**
- * {@code @DockerCallback} is used to signal that the annotated test class or
- * test method is using Docker {@link Testcontainers} and Torque initialized accordingly.
+ * {@link DockerMySQLCallback} is used to signal that the annotated test class or
+ * test method is using Docker {@link Testcontainers} with database MySQL and Torque initialized accordingly.
  * 
- * It is currently enabled by overridign the default
+ * It is currently enabled by overriding the default.
  * 
  * @author gkallidis
+ * @version $Id$
  *
  */
 // may have ParameterizedTest in test class -> Possible configuration error
 @Tag("DockerMySQLCallback")
 @Inherited
-//@DockerCallback2(adapterProfileFallback="mysql")
 @Target( { ElementType.TYPE, ElementType.METHOD, ElementType.ANNOTATION_TYPE } )
 @Retention(RetentionPolicy.RUNTIME)
 @ExtendWith(AdapterParameterResolver.class)
 @ExtendWith(DockerCallbackMySQLExtension.class)
+@Documented
 public @interface DockerMySQLCallback {
     
     String value() default "";

Modified: db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerPostGresCallback.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerPostGresCallback.java?rev=1872442&r1=1872441&r2=1872442&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerPostGresCallback.java (original)
+++ db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/testcontainer/junit5/extension/DockerPostGresCallback.java Tue Jan  7 14:08:40 2020
@@ -1,5 +1,7 @@
 package org.apache.torque.testcontainer.junit5.extension;
 
+import java.lang.annotation.Documented;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -32,22 +34,23 @@ import org.junit.jupiter.api.extension.E
 import org.testcontainers.junit.jupiter.Testcontainers;
 
 /**
- * {@code @DockerCallback} is used to signal that the annotated test class or
- * test method is using Docker {@link Testcontainers} and Torque initialized accordingly.
+ * {@link DockerPostGresCallback} is used to signal that the annotated test class or
+ * test method is using Docker {@link Testcontainers} with database Postgres and Torque initialized accordingly.
  * 
- * It is currently enabled by overridign the default
+ * It is currently enabled by overriding the default
  * 
- * @author gkallidis
+ * @author gk
+ * @version $Id$
  *
  */
 // may have ParameterizedTest in test class -> Possible configuration error
 @Tag("DockerPostGresCallback")
 @Inherited
-//@DockerCallback2(adapterProfileFallback="mysql")
 @Target( { ElementType.TYPE, ElementType.METHOD, ElementType.ANNOTATION_TYPE } )
 @Retention(RetentionPolicy.RUNTIME)
 @ExtendWith(AdapterParameterResolver.class)
 @ExtendWith(DockerCallbackPostgreSQLExtension.class)
+@Documented
 public @interface DockerPostGresCallback {
     
     String value() default "";
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.