Author: davsclaus
Date: Thu May 12 08:17:09 2011
New Revision: 1102199

URL: http://svn.apache.org/viewvc?rev=1102199&view=rev
Log:
CAMEL-3960: camel-testng now also supports create camel context per class. And 
aligned the code from camel-test to camel-testng.

Added:
    
camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterCreateCamelContextPerClassTest.java
      - copied, changed from r1102162, 
camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterTestNGTest.java
Modified:
    
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/CamelTestSupport.java
    
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/TestSupport.java
    camel/trunk/components/camel-testng/src/test/resources/log4j.properties

Modified: 
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/CamelTestSupport.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/CamelTestSupport.java?rev=1102199&r1=1102198&r2=1102199&view=diff
==============================================================================
--- 
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/CamelTestSupport.java
 (original)
+++ 
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/CamelTestSupport.java
 Thu May 12 08:17:09 2011
@@ -21,7 +21,7 @@ import java.util.Hashtable;
 import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
-
+import java.util.concurrent.atomic.AtomicBoolean;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 
@@ -40,13 +40,19 @@ import org.apache.camel.component.mock.M
 import org.apache.camel.impl.BreakpointSupport;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.DefaultDebugger;
+import org.apache.camel.impl.InterceptSendToMockEndpointStrategy;
 import org.apache.camel.impl.JndiRegistry;
 import org.apache.camel.management.JmxSystemPropertyKeys;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Language;
 import org.apache.camel.spring.CamelBeanPostProcessor;
+import org.junit.AfterClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.testng.annotations.AfterMethod;
+import org.testng.annotations.AfterTest;
 import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeTest;
 
 /**
  * A useful base class which creates a {@link org.apache.camel.CamelContext} 
with some routes
@@ -56,13 +62,20 @@ import org.testng.annotations.BeforeMeth
  */
 public abstract class CamelTestSupport extends TestSupport {
 
-    protected volatile CamelContext context;
-    protected volatile ProducerTemplate template;
-    protected volatile ConsumerTemplate consumer;
+    protected static volatile CamelContext context;
+    protected static volatile ProducerTemplate template;
+    protected static volatile ConsumerTemplate consumer;
+    protected static volatile Service camelContextService;
+    private static final Logger LOG = 
LoggerFactory.getLogger(TestSupport.class);
+    private static final AtomicBoolean INIT = new AtomicBoolean();
     private boolean useRouteBuilder = true;
-    private Service camelContextService;
     private final DebugBreakpoint breakpoint = new DebugBreakpoint();
 
+    /**
+     * Use the RouteBuilder or not
+     * @return <tt>true</tt> then {@link CamelContext} will be auto started,
+     *        <tt>false</tt> then {@link CamelContext} will <b>not</b> be auto 
started (you will have to start it manually)
+     */
     public boolean isUseRouteBuilder() {
         return useRouteBuilder;
     }
@@ -71,6 +84,32 @@ public abstract class CamelTestSupport e
         this.useRouteBuilder = useRouteBuilder;
     }
 
+    /**
+     * Override to control whether {@link CamelContext} should be setup per 
test or per class.
+     * <p/>
+     * By default it will be setup/teardown per test (per test method). If you 
want to re-use
+     * {@link CamelContext} between test methods you can override this method 
and return <tt>true</tt>
+     * <p/>
+     * <b>Important:</b> Use this with care as the {@link CamelContext} will 
carry over state
+     * from previous tests, such as endpoints, components etc. So you cannot 
use this in all your tests.
+     *
+     * @return <tt>true</tt> per class, <tt>false</tt> per test.
+     */
+    public boolean isCreateCamelContextPerClass() {
+        return false;
+    }
+
+    /**
+     * Override to enable auto mocking endpoints based on the pattern.
+     * <p/>
+     * Return <tt>*</tt> to mock all endpoints.
+     *
+     * @see org.apache.camel.util.EndpointHelper#matchEndpoint(String, String)
+     */
+    public String isMockEndpoints() {
+        return null;
+    }
+
     public Service getCamelContextService() {
         return camelContextService;
     }
@@ -80,12 +119,33 @@ public abstract class CamelTestSupport e
      * and stop the context; such as for Spring when the ApplicationContext is
      * started and stopped, rather than directly stopping the CamelContext
      */
-    public void setCamelContextService(Service camelContextService) {
-        this.camelContextService = camelContextService;
+    public void setCamelContextService(Service service) {
+        camelContextService = service;
     }
 
     @BeforeMethod
     public void setUp() throws Exception {
+        
log.info("********************************************************************************");
+        log.info("Testing: " + getTestMethodName() + "(" + 
getClass().getName() + ")");
+        
log.info("********************************************************************************");
+
+        boolean first = INIT.compareAndSet(false, true);
+        if (isCreateCamelContextPerClass()) {
+            // test is per class, so only setup once (the first time)
+            if (first) {
+                doSetUp();
+            } else {
+                // and in between tests we must do IoC and reset mocks
+                postProcessTest();
+                resetMocks();
+            }
+        } else {
+            // test is per test so always setup
+            doSetUp();
+        }
+    }
+
+    protected void doSetUp() throws Exception {
         log.debug("setUp test");
         if (!useJmx()) {
             disableJMX();
@@ -109,6 +169,12 @@ public abstract class CamelTestSupport e
         consumer = context.createConsumerTemplate();
         consumer.start();
 
+        // enable auto mocking if enabled
+        String pattern = isMockEndpoints();
+        if (pattern != null) {
+            context.addRegisterEndpointCallback(new 
InterceptSendToMockEndpointStrategy(pattern));
+        }
+
         postProcessTest();
 
         if (isUseRouteBuilder()) {
@@ -117,30 +183,45 @@ public abstract class CamelTestSupport e
                 log.debug("Using created route builder: " + builder);
                 context.addRoutes(builder);
             }
-            startCamelContext();
-            log.debug("Routing Rules are: " + context.getRoutes());
+            if 
(!"true".equalsIgnoreCase(System.getProperty("skipStartingCamelContext"))) {
+                startCamelContext();
+            } else {
+                log.info("Skipping starting CamelContext as system property 
skipStartingCamelContext is set to be true.");
+            }
         } else {
             log.debug("Using route builder from the created context: " + 
context);
         }
         log.debug("Routing Rules are: " + context.getRoutes());
 
         assertValidContext(context);
+
+        INIT.set(true);
     }
 
     @AfterMethod
     public void tearDown() throws Exception {
-        log.info("Testing done: " + this);
+        
log.info("********************************************************************************");
+        log.info("Testing done: " + getTestMethodName() + "(" + 
getClass().getName() + ")");
+        
log.info("********************************************************************************");
+
+        if (isCreateCamelContextPerClass()) {
+            // we tear down in after class
+            return;
+        }
 
         log.debug("tearDown test");
-        if (consumer != null) {
-            consumer.stop();
-        }
-        if (template != null) {
-            template.stop();
-        }
+        doStopTemplates();
         stopCamelContext();
     }
 
+    @AfterClass
+    public static void tearDownAfterClass() throws Exception {
+        INIT.set(false);
+        LOG.debug("tearDownAfterClass test");
+        doStopTemplates();
+        doStopCamelContext();
+    }
+
     /**
      * Returns the timeout to use when shutting down (unit in seconds).
      * <p/>
@@ -169,7 +250,7 @@ public abstract class CamelTestSupport e
      * @return <tt>true</tt> by default.
      */
     protected boolean isLazyLoadingTypeConverter() {
-        return false;
+        return true;
     }
 
     /**
@@ -183,15 +264,32 @@ public abstract class CamelTestSupport e
     }
 
     protected void stopCamelContext() throws Exception {
+        doStopCamelContext();
+    }
+
+    private static void doStopCamelContext() throws Exception {
         if (camelContextService != null) {
             camelContextService.stop();
+            camelContextService = null;
         } else {
             if (context != null) {
                 context.stop();
+                context = null;
             }
         }
     }
 
+    private static void doStopTemplates() throws Exception {
+        if (consumer != null) {
+            consumer.stop();
+            consumer = null;
+        }
+        if (template != null) {
+            template.stop();
+            template = null;
+        }
+    }
+
     protected void startCamelContext() throws Exception {
         if (camelContextService != null) {
             camelContextService.start();

Modified: 
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/TestSupport.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/TestSupport.java?rev=1102199&r1=1102198&r2=1102199&view=diff
==============================================================================
--- 
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/TestSupport.java
 (original)
+++ 
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/TestSupport.java
 Thu May 12 08:17:09 2011
@@ -480,10 +480,16 @@ public abstract class TestSupport extend
      * Is this Java 1.5
      *
      * @return <tt>true</tt> if its Java 1.5, <tt>false</tt> if its not (for 
example Java 1.6 or better)
+     * @deprecated will be removed in the near future as Camel now requires 
JDK1.6+
      */
+    @Deprecated
     public static boolean isJava15() {
         String javaVersion = 
System.getProperty("java.version").toLowerCase(Locale.US);
         return javaVersion.startsWith("1.5");
     }
 
+    public String getTestMethodName() {
+        return "";
+    }
+
 }

Copied: 
camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterCreateCamelContextPerClassTest.java
 (from r1102162, 
camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterTestNGTest.java)
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterCreateCamelContextPerClassTest.java?p2=camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterCreateCamelContextPerClassTest.java&p1=camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterTestNGTest.java&r1=1102162&r2=1102199&rev=1102199&view=diff
==============================================================================
--- 
camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterTestNGTest.java
 (original)
+++ 
camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterCreateCamelContextPerClassTest.java
 Thu May 12 08:17:09 2011
@@ -29,7 +29,7 @@ import org.testng.annotations.Test;
  *
  * @version $Revision$
  */
-public class FilterTestNGTest extends CamelTestSupport {
+public class FilterCreateCamelContextPerClassTest extends CamelTestSupport {
 
     @EndpointInject(uri = "mock:result")
     protected MockEndpoint resultEndpoint;
@@ -37,6 +37,14 @@ public class FilterTestNGTest extends Ca
     @Produce(uri = "direct:start")
     protected ProducerTemplate template;
 
+    @Override
+    public boolean isCreateCamelContextPerClass() {
+        // we override this method and return true, to tell Camel test-kit that
+        // it should only create CamelContext once (per class), so we will
+        // re-use the CamelContext between each test method in this class
+        return false;
+    }
+
     @Test
     public void testSendMatchingMessage() throws Exception {
         String expectedBody = "<matched/>";

Modified: 
camel/trunk/components/camel-testng/src/test/resources/log4j.properties
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-testng/src/test/resources/log4j.properties?rev=1102199&r1=1102198&r2=1102199&view=diff
==============================================================================
--- camel/trunk/components/camel-testng/src/test/resources/log4j.properties 
(original)
+++ camel/trunk/components/camel-testng/src/test/resources/log4j.properties Thu 
May 12 08:17:09 2011
@@ -22,6 +22,7 @@ log4j.rootLogger=INFO, file
 
 log4j.logger.org.springframework=WARN
 #log4j.logger.org.apache.camel=DEBUG
+#log4j.logger.org.apache.camel.testng=DEBUG
 
 # CONSOLE appender not used by default
 log4j.appender.out=org.apache.log4j.ConsoleAppender


Reply via email to