You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pa...@apache.org on 2013/11/27 22:00:02 UTC

git commit: Massive improvements in testcases voor wicket-cdi

Updated Branches:
  refs/heads/wicket-6.x be7783803 -> c3a35e74e


Massive improvements in testcases voor wicket-cdi


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/c3a35e74
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/c3a35e74
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/c3a35e74

Branch: refs/heads/wicket-6.x
Commit: c3a35e74ed34cf4149f6519253b924f0c459e09c
Parents: be77838
Author: Emond Papegaaij <em...@topicus.nl>
Authored: Wed Nov 27 21:59:51 2013 +0100
Committer: Emond Papegaaij <em...@topicus.nl>
Committed: Wed Nov 27 21:59:51 2013 +0100

----------------------------------------------------------------------
 .../java/org/apache/wicket/WicketTestCase.java  | 161 -------------------
 .../apache/wicket/cdi/CdiConfigurationTest.java |   2 +-
 .../org/apache/wicket/cdi/CdiWicketTester.java  | 131 +++++++++++++++
 .../org/apache/wicket/cdi/ContextManager.java   | 105 ++++++++++++
 .../wicket/cdi/ConversationPropagatorTest.java  |  85 +++-------
 .../apache/wicket/cdi/WicketCdiTestCase.java    | 129 ++++++++++++++-
 .../cdi/testapp/TestConversationBean.java       |   5 +
 .../cdi/testapp/TestConversationPage.java       |  13 +-
 .../cdi/testapp/TestConversationalPage.java     |   6 +-
 .../testapp/TestNonAutoConversationalPage.html  |  12 --
 .../testapp/TestNonAutoConversationalPage.java  |  88 ----------
 .../cdi/testapp/TestNonConversationalPage.java  |   6 +-
 .../wicket/cdi/util/tester/CdiWicketTester.java | 122 --------------
 .../wicket/cdi/util/tester/ContextManager.java  | 105 ------------
 14 files changed, 389 insertions(+), 581 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/c3a35e74/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/WicketTestCase.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/WicketTestCase.java b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/WicketTestCase.java
deleted file mode 100644
index eaed456..0000000
--- a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/WicketTestCase.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket;
-
-import org.apache.wicket.behavior.AbstractAjaxBehavior;
-import org.apache.wicket.mock.MockApplication;
-import org.apache.wicket.protocol.http.WebApplication;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.util.tester.WicketTester;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-
-/**
- * Base class for tests which require comparing wicket response with a file.
- * <p>
- * To create/replace the expected result file with the new content, define the system property like
- * -Dwicket.replace.expected.results=true
- */
-public abstract class WicketTestCase extends Assert
-{
-	/** */
-	protected WicketTester tester;
-
-	/**
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	@Before
-	public void commonBefore()
-	{
-		// make sure no leaked threadlocals are present
-		ThreadContext.detach();
-
-		WebApplication application = newApplication();
-		tester = newWicketTester(application);
-	}
-
-	/**
-	 * @return the application that should be used for the test
-	 */
-	protected WebApplication newApplication()
-	{
-		return new MockApplication();
-	}
-
-	/**
-	 * In case you need to subclass WicketTester and want to be independent on possible changes in
-	 * setUp().
-	 * 
-	 * @param app
-	 * @return WIcketTester
-	 */
-	protected WicketTester newWicketTester(final WebApplication app)
-	{
-		return new WicketTester(app);
-	}
-
-	/**
-	 * 
-	 */
-	@After
-	public void commonAfter()
-	{
-		tester.destroy();
-	}
-
-	/**
-	 * Use <code>-Dwicket.replace.expected.results=true</code> to automatically replace the expected
-	 * output file.
-	 * 
-	 * @param <T>
-	 * 
-	 * @param pageClass
-	 * @param filename
-	 * @throws Exception
-	 */
-	protected <T extends Page> void executeTest(final Class<T> pageClass, final String filename)
-		throws Exception
-	{
-		tester.executeTest(getClass(), pageClass, filename);
-	}
-
-	/**
-	 * Use <code>-Dwicket.replace.expected.results=true</code> to automatically replace the expected
-	 * output file.
-	 * 
-	 * @param page
-	 * @param filename
-	 * @throws Exception
-	 */
-	protected void executeTest(final Page page, final String filename) throws Exception
-	{
-		tester.executeTest(getClass(), page, filename);
-	}
-
-	/**
-	 * Use <code>-Dwicket.replace.expected.results=true</code> to automatically replace the expected
-	 * output file.
-	 * 
-	 * @param <T>
-	 * 
-	 * @param pageClass
-	 * @param parameters
-	 * @param filename
-	 * @throws Exception
-	 */
-	protected <T extends Page> void executeTest(final Class<T> pageClass,
-		PageParameters parameters, final String filename) throws Exception
-	{
-		tester.executeTest(getClass(), pageClass, parameters, filename);
-	}
-
-	/**
-	 * 
-	 * @param component
-	 * @param filename
-	 * @throws Exception
-	 */
-	protected void executeListener(final Component component, final String filename)
-		throws Exception
-	{
-		tester.executeListener(getClass(), component, filename);
-	}
-
-	/**
-	 * 
-	 * @param behavior
-	 * @param filename
-	 * @throws Exception
-	 */
-	protected void executeBehavior(final AbstractAjaxBehavior behavior, final String filename)
-		throws Exception
-	{
-		tester.executeBehavior(getClass(), behavior, filename);
-	}
-
-	/**
-	 * Returns the current Maven build directory taken from the <tt>basedir</tt> system property, or
-	 * null if not set
-	 * 
-	 * @return path with a trailing slash
-	 */
-	public String getBasedir()
-	{
-		return WicketTester.getBasedir();
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/c3a35e74/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/CdiConfigurationTest.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/CdiConfigurationTest.java b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/CdiConfigurationTest.java
index 7e89c10..723db16 100644
--- a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/CdiConfigurationTest.java
+++ b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/CdiConfigurationTest.java
@@ -41,7 +41,7 @@ public class CdiConfigurationTest extends WicketCdiTestCase
 		tester.startPage(TestConversationPage.class);
 		for (int i = 0; i < 20; i++)
 		{
-			tester.assertLabel("count", i + "");
+			tester.assertCount(i);
 			tester.clickLink("increment");
 		}
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/c3a35e74/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/CdiWicketTester.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/CdiWicketTester.java b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/CdiWicketTester.java
new file mode 100644
index 0000000..3a1870e
--- /dev/null
+++ b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/CdiWicketTester.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.cdi;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+
+import org.apache.wicket.Page;
+import org.apache.wicket.cdi.CdiConfiguration;
+import org.apache.wicket.cdi.ConversationPropagator;
+import org.apache.wicket.cdi.NonContextual;
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.util.tester.WicketTester;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author jsarman
+ */
+public class CdiWicketTester extends WicketTester
+{
+	private static final Pattern COUNT_PATTERN = Pattern.compile("COUNT=x([0-9]+)x");
+	private static final Logger logger = LoggerFactory.getLogger(CdiWicketTester.class);
+
+	@Inject
+	ContextManager contextManager;
+
+	public CdiWicketTester(WebApplication app)
+	{
+		super(app);
+		NonContextual.of(CdiWicketTester.class).inject(this);
+	}
+
+	/**
+	 * Process the request by first activating the contexts on initial call.
+	 * This call is called recursively in the super class so keep track of the
+	 * topmost call and only activate and deactivate the contexts during that
+	 * time.
+	 * 
+	 * @param forcedRequest
+	 * @param forcedRequestHandler
+	 * @param redirect
+	 * @return
+	 */
+	@Override
+	protected boolean processRequest(final MockHttpServletRequest forcedRequest,
+			final IRequestHandler forcedRequestHandler, final boolean redirect)
+	{
+		if (getLastRequest() != null)
+		{
+			contextManager.deactivateContexts();
+		}
+		contextManager.activateContexts(forcedRequest == null ? getRequest() : forcedRequest);
+		return super.processRequest(forcedRequest, forcedRequestHandler, redirect);
+	}
+
+	@Override
+	public Url urlFor(IRequestHandler handler)
+	{
+		Url ret = super.urlFor(handler);
+		final CdiConfiguration configuration = CdiConfiguration.get(getApplication());
+		Page page = ConversationPropagator.getPage(handler);
+		if (configuration.getPropagation().propagatesVia(handler, page))
+		{
+			if (page != null)
+			{
+				String cid = ConversationPropagator.getConversationIdFromPage(page);
+				ret.addQueryParameter(ConversationPropagator.CID, cid);
+			}
+		}
+		return ret;
+	}
+
+	@PreDestroy
+	public void finish()
+	{
+		try
+		{
+			logger.debug("Destroying Cdi Wicket Tester");
+			if (getLastRequest() != null)
+			{
+				contextManager.deactivateContexts();
+			}
+			contextManager.destroy();
+			destroy();
+		}
+		catch (Throwable t)
+		{
+		}
+	}
+
+	/**
+	 * Asserts that the respons contains the right count. This can only be done
+	 * by parsing the markup because models only contain valid values during a
+	 * request, not after.
+	 * 
+	 * @param count
+	 *            TODO
+	 */
+	public void assertCount(int count)
+	{
+		assertTrue("Response does not contain a count",
+				getLastResponseAsString().contains("COUNT=x"));
+		Matcher matcher = COUNT_PATTERN.matcher(getLastResponseAsString());
+		assertTrue(matcher.find());
+		assertEquals(Integer.toString(count), matcher.group(1));
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/c3a35e74/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/ContextManager.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/ContextManager.java b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/ContextManager.java
new file mode 100644
index 0000000..3e22aef
--- /dev/null
+++ b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/ContextManager.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.cdi;
+
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.jboss.weld.bean.builtin.BeanManagerProxy;
+import org.jboss.weld.servlet.HttpContextLifecycle;
+import org.jboss.weld.servlet.spi.helpers.AcceptingHttpContextActivationFilter;
+import org.jglue.cdiunit.internal.LifecycleAwareRequest;
+
+/**
+ * @author jsarman
+ */
+@ApplicationScoped
+public class ContextManager
+{
+	private HttpServletRequest currentRequest;
+
+	@Inject
+	private BeanManager beanManager;
+
+	private HttpContextLifecycle lifecycle;
+
+	private HttpSession currentSession;
+
+	@PostConstruct
+	public void setup()
+	{
+		try
+		{
+			lifecycle = new HttpContextLifecycle(BeanManagerProxy.unwrap(beanManager),
+					AcceptingHttpContextActivationFilter.INSTANCE, true, true);
+		}
+		catch (NoSuchMethodError e)
+		{
+			try
+			{
+				lifecycle = HttpContextLifecycle.class.getConstructor(BeanManager.class,
+						AcceptingHttpContextActivationFilter.class).newInstance(
+						BeanManagerProxy.unwrap(beanManager),
+						AcceptingHttpContextActivationFilter.INSTANCE);
+			}
+			catch (Exception e1)
+			{
+				throw new RuntimeException(e1);
+			}
+		}
+		lifecycle.setConversationActivationEnabled(true);
+	}
+
+	public void activateContexts(HttpServletRequest request)
+	{
+		if (currentRequest != null)
+			return;
+
+		currentRequest = new LifecycleAwareRequest(lifecycle, request, currentSession);
+		lifecycle.requestInitialized(currentRequest, null);
+	}
+
+	public void deactivateContexts()
+	{
+		lifecycle.requestDestroyed(currentRequest);
+		currentSession = currentRequest.getSession(false);
+		currentRequest = null;
+	}
+
+	public void destroy()
+	{
+		if (currentRequest != null)
+		{
+			currentSession = currentRequest.getSession(false);
+		}
+
+		if (currentSession != null)
+		{
+			lifecycle.sessionDestroyed(currentSession);
+			currentSession = null;
+		}
+	}
+
+	public boolean isRequestActive()
+	{
+		return currentRequest != null;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/c3a35e74/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/ConversationPropagatorTest.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/ConversationPropagatorTest.java b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/ConversationPropagatorTest.java
index d827b11..eefebde 100644
--- a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/ConversationPropagatorTest.java
+++ b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/ConversationPropagatorTest.java
@@ -19,7 +19,6 @@ package org.apache.wicket.cdi;
 import org.apache.wicket.cdi.testapp.TestConversationPage;
 import org.apache.wicket.cdi.testapp.TestConversationalPage;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -28,7 +27,6 @@ import org.junit.Test;
 public class ConversationPropagatorTest extends WicketCdiTestCase
 {
 	@Test
-	@Ignore("Testcase and auto conversations do not match")
 	public void testAutoConversationNonBookmarkable()
 	{
 		configure(new CdiConfiguration());
@@ -37,34 +35,18 @@ public class ConversationPropagatorTest extends WicketCdiTestCase
 		int i;
 		for (i = 0; i < 3; i++)
 		{
-			tester.assertLabel("count", i + "");
+			tester.assertCount(i);
 			tester.clickLink("increment");
 		}
 		tester.clickLink("next");
-		// at this point counter = 3, auto conversation is still enabled and
-		// remains enabled, because TestConversationalPage is part of this
-		// request
 		for (; i < 6; i++)
 		{
-			// first iteration: i == 3, counter == 3, conversation active
-			// second iteration: i == 4, counter == 4, conversation transient
-			// third iteration: i == 5, counter == 1: FAIL
-			tester.assertLabel("count", i + "");
-
-			// first iteration: conversation is still long-running, counter is
-			// incremented, after which auto conversation is disabled and the
-			// conversation ended
-
-			// second iteration: transient conversation, counter starts at 1,
-			// conversation remains transient
 			tester.clickLink("increment");
-
+			tester.assertCount(1);
 		}
-
 	}
 
 	@Test
-	@Ignore("Testcase and auto conversations do not match")
 	public void testAutoConversationBookmarkable()
 	{
 		configure(new CdiConfiguration());
@@ -75,18 +57,14 @@ public class ConversationPropagatorTest extends WicketCdiTestCase
 		int i;
 		for (i = 0; i < 3; i++)
 		{
-			tester.assertLabel("count", i + "");
+			tester.assertCount(i);
 			tester.clickLink("increment");
 		}
 		tester.clickLink("next");
-		// The conversation should auto end and not create another one
-		// so the next page just keeps getting 1 because the conversationscoped
-		// bean
-		// doesnt persist across requests.
 		for (i = 0; i < 3; i++)
 		{
 			tester.clickLink("increment");
-			tester.assertLabel("count", 1 + "");
+			tester.assertCount(1);
 		}
 	}
 
@@ -99,16 +77,15 @@ public class ConversationPropagatorTest extends WicketCdiTestCase
 		int i;
 		for (i = 0; i < 3; i++)
 		{
-			tester.assertLabel("count", i + "");
+			tester.assertCount(i);
 			tester.clickLink("increment");
 		}
 		tester.clickLink("next");
 		for (; i < 6; i++)
 		{
-			tester.assertLabel("count", i + "");
+			tester.assertCount(i);
 			tester.clickLink("increment");
 		}
-
 	}
 
 	@Test
@@ -121,79 +98,55 @@ public class ConversationPropagatorTest extends WicketCdiTestCase
 		int i;
 		for (i = 0; i < 3; i++)
 		{
-			tester.assertLabel("count", i + "");
-			tester.clickLink("increment");
-		}
-		tester.clickLink("next");
-		for (; i < 6; i++)
-		{
-			tester.assertLabel("count", i + "");
-			tester.clickLink("increment");
-		}
-
-	}
-
-	@Test
-	public void testPropagationNone()
-	{
-		configure(new CdiConfiguration().setPropagation(ConversationPropagation.NONE));
-
-		tester.startPage(TestConversationPage.class);
-		int i;
-		for (i = 0; i < 3; i++)
-		{
+			tester.assertCount(i);
 			tester.clickLink("increment");
-			tester.assertLabel("count", "1");
 		}
 		tester.clickLink("next");
 		for (; i < 6; i++)
 		{
+			tester.assertCount(i);
 			tester.clickLink("increment");
-			tester.assertLabel("count", "1");
 		}
-
 	}
 
 	@Test
-	@Ignore("Testcase and auto conversations do not match")
-	public void testGlobalAutoSettingNonBookmarkable()
+	public void testPropagationNonBookmarkable()
 	{
 		configure(new CdiConfiguration());
 
-		tester.startPage(TestConversationPage.class, new PageParameters().add("auto", true));
+		tester.startPage(TestConversationPage.class,
+				new PageParameters().add("pageType", "bookmarkable"));
 		int i;
 		for (i = 0; i < 3; i++)
 		{
-			tester.assertLabel("count", i + "");
+			tester.assertCount(i);
 			tester.clickLink("increment");
 		}
 		tester.clickLink("next");
 		for (; i < 6; i++)
 		{
-			tester.assertLabel("count", i + "");
 			tester.clickLink("increment");
+			tester.assertCount(1);
 		}
 	}
 
 	@Test
-	@Ignore("Testcase and auto conversations do not match")
-	public void testGlobalAutoSettingBookmarkable()
+	public void testPropagationNone()
 	{
-		configure(new CdiConfiguration());
+		configure(new CdiConfiguration().setPropagation(ConversationPropagation.NONE));
 
-		tester.startPage(TestConversationPage.class,
-				new PageParameters().add("auto", true).add("pageType", "bookmarkable"));
+		tester.startPage(TestConversationPage.class);
 		int i;
 		for (i = 0; i < 3; i++)
 		{
-			tester.assertLabel("count", i + "");
 			tester.clickLink("increment");
+			tester.assertCount(1);
 		}
 		tester.clickLink("next");
-		for (i = 0; i < 3; i++)
+		for (; i < 6; i++)
 		{
-			tester.assertLabel("count", i + "");
 			tester.clickLink("increment");
+			tester.assertCount(1);
 		}
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/c3a35e74/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/WicketCdiTestCase.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/WicketCdiTestCase.java b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/WicketCdiTestCase.java
index 496d092..3f82075 100644
--- a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/WicketCdiTestCase.java
+++ b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/WicketCdiTestCase.java
@@ -18,17 +18,22 @@ package org.apache.wicket.cdi;
 
 import javax.inject.Inject;
 
-import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.Component;
+import org.apache.wicket.Page;
+import org.apache.wicket.ThreadContext;
+import org.apache.wicket.behavior.AbstractAjaxBehavior;
 import org.apache.wicket.cdi.testapp.TestAppScope;
 import org.apache.wicket.cdi.testapp.TestCdiApplication;
 import org.apache.wicket.cdi.testapp.TestConversationBean;
-import org.apache.wicket.cdi.util.tester.CdiWicketTester;
-import org.apache.wicket.cdi.util.tester.ContextManager;
+import org.apache.wicket.mock.MockApplication;
 import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.tester.WicketTester;
 import org.jglue.cdiunit.AdditionalClasses;
 import org.jglue.cdiunit.CdiRunner;
 import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
 import org.junit.runner.RunWith;
 
 /**
@@ -40,13 +45,14 @@ import org.junit.runner.RunWith;
 		ConversationPropagator.class, DetachEventEmitter.class, SessionInjector.class,
 		TestAppScope.class, TestConversationBean.class, TestCdiApplication.class,
 		AutoConversation.class })
-public abstract class WicketCdiTestCase extends WicketTestCase
+public abstract class WicketCdiTestCase extends Assert
 {
 	@Inject
 	private ContextManager contextManager;
+	/** */
+	protected CdiWicketTester tester;
 
-	@Override
-	protected WicketTester newWicketTester(WebApplication app)
+	protected CdiWicketTester newWicketTester(WebApplication app)
 	{
 		return new CdiWicketTester(app);
 	}
@@ -65,4 +71,115 @@ public abstract class WicketCdiTestCase extends WicketTestCase
 			contextManager.destroy();
 		}
 	}
+
+	/**
+	 * @see junit.framework.TestCase#setUp()
+	 */
+	@Before
+	public void commonBefore()
+	{
+		// make sure no leaked threadlocals are present
+		ThreadContext.detach();
+
+		WebApplication application = newApplication();
+		tester = newWicketTester(application);
+	}
+
+	/**
+	 * @return the application that should be used for the test
+	 */
+	protected WebApplication newApplication()
+	{
+		return new MockApplication();
+	}
+
+	/**
+	 * 
+	 */
+	@After
+	public void commonAfter()
+	{
+		tester.destroy();
+	}
+
+	/**
+	 * Use <code>-Dwicket.replace.expected.results=true</code> to automatically
+	 * replace the expected output file.
+	 * 
+	 * @param <T>
+	 * 
+	 * @param pageClass
+	 * @param filename
+	 * @throws Exception
+	 */
+	protected <T extends Page> void executeTest(final Class<T> pageClass, final String filename)
+			throws Exception
+	{
+		tester.executeTest(getClass(), pageClass, filename);
+	}
+
+	/**
+	 * Use <code>-Dwicket.replace.expected.results=true</code> to automatically
+	 * replace the expected output file.
+	 * 
+	 * @param page
+	 * @param filename
+	 * @throws Exception
+	 */
+	protected void executeTest(final Page page, final String filename) throws Exception
+	{
+		tester.executeTest(getClass(), page, filename);
+	}
+
+	/**
+	 * Use <code>-Dwicket.replace.expected.results=true</code> to automatically
+	 * replace the expected output file.
+	 * 
+	 * @param <T>
+	 * 
+	 * @param pageClass
+	 * @param parameters
+	 * @param filename
+	 * @throws Exception
+	 */
+	protected <T extends Page> void executeTest(final Class<T> pageClass,
+			PageParameters parameters, final String filename) throws Exception
+	{
+		tester.executeTest(getClass(), pageClass, parameters, filename);
+	}
+
+	/**
+	 * 
+	 * @param component
+	 * @param filename
+	 * @throws Exception
+	 */
+	protected void executeListener(final Component component, final String filename)
+			throws Exception
+	{
+		tester.executeListener(getClass(), component, filename);
+	}
+
+	/**
+	 * 
+	 * @param behavior
+	 * @param filename
+	 * @throws Exception
+	 */
+	protected void executeBehavior(final AbstractAjaxBehavior behavior, final String filename)
+			throws Exception
+	{
+		tester.executeBehavior(getClass(), behavior, filename);
+	}
+
+	/**
+	 * Returns the current Maven build directory taken from the <tt>basedir</tt>
+	 * system property, or null if not set
+	 * 
+	 * @return path with a trailing slash
+	 */
+	public String getBasedir()
+	{
+		return WicketTester.getBasedir();
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/c3a35e74/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationBean.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationBean.java b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationBean.java
index ef61441..140ecdb 100644
--- a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationBean.java
+++ b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationBean.java
@@ -42,6 +42,11 @@ public class TestConversationBean implements Serializable
 		return counter.get();
 	}
 
+	public String getCountStr()
+	{
+		return "COUNT=x" + getCount() + "x";
+	}
+
 	public void increment()
 	{
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/c3a35e74/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationPage.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationPage.java b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationPage.java
index cb0138d..d421e39 100644
--- a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationPage.java
+++ b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationPage.java
@@ -16,8 +16,6 @@
  */
 package org.apache.wicket.cdi.testapp;
 
-import java.util.Random;
-
 import javax.enterprise.context.Conversation;
 import javax.inject.Inject;
 
@@ -41,8 +39,6 @@ public class TestConversationPage extends WebPage
 	@Inject
 	TestConversationBean counter;
 
-	Random random = new Random();
-
 	public TestConversationPage()
 	{
 		this(new PageParameters());
@@ -52,13 +48,10 @@ public class TestConversationPage extends WebPage
 	{
 		super(parameters);
 
-		if (!parameters.get("auto").toBoolean())
-		{
-			conversation.begin();
+		conversation.begin();
+		System.out.println("Opened Conversion with id = " + conversation.getId());
 
-			System.out.println("Opened Conversion with id = " + conversation.getId());
-		}
-		add(new Label("count", new PropertyModel<Integer>(this, "counter.count")));
+		add(new Label("count", new PropertyModel<String>(this, "counter.countStr")));
 
 		add(new Link<Void>("increment")
 		{

http://git-wip-us.apache.org/repos/asf/wicket/blob/c3a35e74/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationalPage.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationalPage.java b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationalPage.java
index a106936..5e41fd5 100644
--- a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationalPage.java
+++ b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationalPage.java
@@ -16,8 +16,6 @@
  */
 package org.apache.wicket.cdi.testapp;
 
-import java.util.Random;
-
 import javax.inject.Inject;
 
 import org.apache.wicket.cdi.ConversationalComponent;
@@ -40,8 +38,6 @@ public class TestConversationalPage extends WebPage implements ConversationalCom
 	@Inject
 	TestConversationBean counter;
 
-	Random random = new Random();
-
 	public TestConversationalPage()
 	{
 		this(new PageParameters());
@@ -52,7 +48,7 @@ public class TestConversationalPage extends WebPage implements ConversationalCom
 	{
 		logger.debug("Starting TestConversationalPage");
 
-		add(new Label("count", new PropertyModel<Integer>(this, "counter.count")));
+		add(new Label("count", new PropertyModel<String>(this, "counter.countStr")));
 
 		add(new Link<Void>("increment")
 		{

http://git-wip-us.apache.org/repos/asf/wicket/blob/c3a35e74/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonAutoConversationalPage.html
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonAutoConversationalPage.html b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonAutoConversationalPage.html
deleted file mode 100644
index b3550f1..0000000
--- a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonAutoConversationalPage.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:wicket>
-<head>
-    <title></title>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-</head>
-<body>
-<span wicket:id="count">100</span>
-<a wicket:id="increment">increment</a>
-<a wicket:id="next">next</a>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/c3a35e74/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonAutoConversationalPage.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonAutoConversationalPage.java b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonAutoConversationalPage.java
deleted file mode 100644
index 2a78914..0000000
--- a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonAutoConversationalPage.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.cdi.testapp;
-
-import java.util.Random;
-
-import javax.enterprise.context.Conversation;
-import javax.inject.Inject;
-
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.link.Link;
-import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author jsarman
- */
-public class TestNonAutoConversationalPage extends WebPage
-{
-	private static final long serialVersionUID = 1L;
-	private static final Logger logger = LoggerFactory.getLogger(TestConversationPage.class);
-	@Inject
-	TestConversationBean counter;
-
-	@Inject
-	Conversation conversation;
-
-	Random random = new Random();
-
-	public TestNonAutoConversationalPage()
-	{
-		this(new PageParameters());
-	}
-
-
-	public TestNonAutoConversationalPage(final PageParameters pp)
-	{
-		if (pp.get("startConveration").toBoolean(true))
-		{
-			conversation.begin();
-		}
-		logger.debug("Starting TestConversationalPage");
-
-		add(new Label("count", new PropertyModel<Integer>(this, "counter.count")));
-
-		add(new Link<Void>("increment")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClick()
-			{
-				counter.increment();
-			}
-		});
-		add(new Link<Void>("next")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClick()
-			{
-				String pageType = pp.get("pageType").toString("nonbookmarkable");
-				if ("bookmarkable".equals(pageType.toLowerCase()))
-					setResponsePage(TestNonConversationalPage.class);
-				else
-					setResponsePage(new TestNonConversationalPage());
-			}
-		});
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/c3a35e74/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonConversationalPage.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonConversationalPage.java b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonConversationalPage.java
index 8af7bac..7728e81 100644
--- a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonConversationalPage.java
+++ b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonConversationalPage.java
@@ -16,8 +16,6 @@
  */
 package org.apache.wicket.cdi.testapp;
 
-import java.util.Random;
-
 import javax.inject.Inject;
 
 import org.apache.wicket.markup.html.WebPage;
@@ -38,12 +36,10 @@ public class TestNonConversationalPage extends WebPage
 	@Inject
 	TestConversationBean counter;
 
-	Random random = new Random();
-
 	public TestNonConversationalPage()
 	{
 		logger.debug("Starting TestConversationalPage");
-		add(new Label("count", new PropertyModel<Integer>(this, "counter.count")));
+		add(new Label("count", new PropertyModel<String>(this, "counter.countStr")));
 
 		add(new Link<Void>("increment")
 		{

http://git-wip-us.apache.org/repos/asf/wicket/blob/c3a35e74/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/util/tester/CdiWicketTester.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/util/tester/CdiWicketTester.java b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/util/tester/CdiWicketTester.java
deleted file mode 100644
index b5d4eb7..0000000
--- a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/util/tester/CdiWicketTester.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.cdi.util.tester;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-import javax.annotation.PreDestroy;
-import javax.inject.Inject;
-
-import org.apache.wicket.Page;
-import org.apache.wicket.cdi.CdiConfiguration;
-import org.apache.wicket.cdi.ConversationPropagator;
-import org.apache.wicket.cdi.NonContextual;
-import org.apache.wicket.protocol.http.WebApplication;
-import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.util.tester.WicketTester;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author jsarman
- */
-public class CdiWicketTester extends WicketTester
-{
-	private static final Logger logger = LoggerFactory.getLogger(CdiWicketTester.class);
-
-	@Inject
-	ContextManager contextManager;
-
-	private AtomicInteger count = new AtomicInteger();
-
-	public CdiWicketTester(WebApplication app)
-	{
-		super(app);
-		NonContextual.of(CdiWicketTester.class).inject(this);
-	}
-
-	/**
-	 * Process the request by first activating the contexts on initial call.
-	 * This call is called recursively in the super class so keep track of the
-	 * topmost call and only activate and deactivate the contexts during that
-	 * time.
-	 * 
-	 * @param forcedRequest
-	 * @param forcedRequestHandler
-	 * @param redirect
-	 * @return
-	 */
-	@Override
-	protected boolean processRequest(final MockHttpServletRequest forcedRequest,
-			final IRequestHandler forcedRequestHandler, final boolean redirect)
-	{
-		if (count.getAndIncrement() == 0)
-		{
-
-			if (getLastRequest() != null)
-			{
-				contextManager.deactivateContexts();
-			}
-			contextManager.activateContexts(forcedRequest == null ? getRequest() : forcedRequest);
-		}
-		try
-		{
-			return super.processRequest(forcedRequest, forcedRequestHandler, redirect);
-		}
-		finally
-		{
-			count.decrementAndGet();
-		}
-	}
-
-	@Override
-	public Url urlFor(IRequestHandler handler)
-	{
-		Url ret = super.urlFor(handler);
-		final CdiConfiguration configuration = CdiConfiguration.get(getApplication());
-		Page page = ConversationPropagator.getPage(handler);
-		if (configuration.getPropagation().propagatesVia(handler, page))
-		{
-			if (page != null)
-			{
-				String cid = ConversationPropagator.getConversationIdFromPage(page);
-				ret.addQueryParameter(ConversationPropagator.CID, cid);
-			}
-		}
-		return ret;
-	}
-
-	@PreDestroy
-	public void finish()
-	{
-		try
-		{
-			logger.debug("Destroying Cdi Wicket Tester");
-			if (getLastRequest() != null)
-			{
-				contextManager.deactivateContexts();
-			}
-			contextManager.destroy();
-			destroy();
-		}
-		catch (Throwable t)
-		{
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/c3a35e74/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/util/tester/ContextManager.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/util/tester/ContextManager.java b/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/util/tester/ContextManager.java
deleted file mode 100644
index fb9eeb1..0000000
--- a/wicket-experimental/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/util/tester/ContextManager.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.cdi.util.tester;
-
-import javax.annotation.PostConstruct;
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
-import org.jboss.weld.bean.builtin.BeanManagerProxy;
-import org.jboss.weld.servlet.HttpContextLifecycle;
-import org.jboss.weld.servlet.spi.helpers.AcceptingHttpContextActivationFilter;
-import org.jglue.cdiunit.internal.LifecycleAwareRequest;
-
-/**
- * @author jsarman
- */
-@ApplicationScoped
-public class ContextManager
-{
-	private HttpServletRequest currentRequest;
-
-	@Inject
-	private BeanManager beanManager;
-
-	private HttpContextLifecycle lifecycle;
-
-	private HttpSession currentSession;
-
-	@PostConstruct
-	public void setup()
-	{
-		try
-		{
-			lifecycle = new HttpContextLifecycle(BeanManagerProxy.unwrap(beanManager),
-					AcceptingHttpContextActivationFilter.INSTANCE, true, true);
-		}
-		catch (NoSuchMethodError e)
-		{
-			try
-			{
-				lifecycle = HttpContextLifecycle.class.getConstructor(BeanManager.class,
-						AcceptingHttpContextActivationFilter.class).newInstance(
-						BeanManagerProxy.unwrap(beanManager),
-						AcceptingHttpContextActivationFilter.INSTANCE);
-			}
-			catch (Exception e1)
-			{
-				throw new RuntimeException(e1);
-			}
-		}
-		lifecycle.setConversationActivationEnabled(true);
-	}
-
-	public void activateContexts(HttpServletRequest request)
-	{
-		if (currentRequest != null)
-			return;
-
-		currentRequest = new LifecycleAwareRequest(lifecycle, request, currentSession);
-		lifecycle.requestInitialized(currentRequest, null);
-	}
-
-	public void deactivateContexts()
-	{
-		lifecycle.requestDestroyed(currentRequest);
-		currentSession = currentRequest.getSession(false);
-		currentRequest = null;
-	}
-
-	public void destroy()
-	{
-		if (currentRequest != null)
-		{
-			currentSession = currentRequest.getSession(false);
-		}
-
-		if (currentSession != null)
-		{
-			lifecycle.sessionDestroyed(currentSession);
-			currentSession = null;
-		}
-	}
-
-	public boolean isRequestActive()
-	{
-		return currentRequest != null;
-	}
-}