You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2014/08/14 12:06:12 UTC

git commit: Reuse the already installed EventBus in MyApp#init. Just set TesterBroadcaster for testing purposes.

Repository: wicket
Updated Branches:
  refs/heads/wicket-atmosphere-tester 6155d89e8 -> db748c16c


Reuse the already installed EventBus in MyApp#init. Just set TesterBroadcaster for testing purposes.

Add APIs to make it possible to assert on the suspended (by Atmosphere) http response


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

Branch: refs/heads/wicket-atmosphere-tester
Commit: db748c16c643b1b4f7cd583ddd5ea84790b51b3d
Parents: 6155d89
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Aug 14 12:05:00 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Aug 14 12:05:00 2014 +0200

----------------------------------------------------------------------
 .../wicket/util/tester/BaseWicketTester.java    |  10 +-
 .../org/apache/wicket/atmosphere/EventBus.java  |  27 ++-
 .../atmosphere/tester/AtmosphereTester.java     | 183 +++++++++++++++----
 .../tester/TesterAtmosphereBehavior.java        |  65 +++++++
 .../atmosphere/tester/TesterBroadcaster.java    |   6 +-
 .../atmosphere/tester/TesterEventBus.java       |  54 ------
 .../wicket/atmosphere/AtmosphereTest.java       |  68 -------
 .../wicket/atmosphere/AtmosphereTesterTest.java | 108 +++++++++++
 8 files changed, 358 insertions(+), 163 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/db748c16/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
index 90285bb..15f0785 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
@@ -510,6 +510,14 @@ public class BaseWicketTester
 	}
 
 	/**
+	 * @param response
+	 */
+	public void setLastResponse(final MockHttpServletResponse response)
+	{
+		this.lastResponse = response;
+	}
+
+	/**
 	 * @return session
 	 */
 	public Session getSession()
@@ -788,7 +796,7 @@ public class BaseWicketTester
 	private void recordRequestResponse()
 	{
 		lastRequest = request;
-		lastResponse = response;
+		setLastResponse(response);
 
 		previousRequests.add(request);
 		previousResponses.add(response);

http://git-wip-us.apache.org/repos/asf/wicket/blob/db748c16/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
index a87a9c5..e60ca01 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
@@ -102,9 +102,16 @@ public class EventBus implements UnboundListener
 		return eventBus;
 	}
 
-	private final WebApplication application;
+	/**
+	 * @param application
+	 * @return {@code true} if there is an installed EventBus to the given application
+	 */
+	public static boolean isInstalled(Application application)
+	{
+		return application.getMetaData(EVENT_BUS_KEY) != null;
+	}
 
-	private final Broadcaster broadcaster;
+	private final WebApplication application;
 
 	private final Multimap<PageKey, EventSubscription> subscriptions = HashMultimap.create();
 
@@ -114,6 +121,8 @@ public class EventBus implements UnboundListener
 
 	private final AtmosphereParameters parameters = new AtmosphereParameters();
 
+	private Broadcaster broadcaster;
+
 	/**
 	 * Creates and registers an {@code EventBus} for the given application. The first broadcaster
 	 * returned by the {@code BroadcasterFactory} is used.
@@ -122,7 +131,7 @@ public class EventBus implements UnboundListener
 	 */
 	public EventBus(WebApplication application)
 	{
-		this(application, lookupDefaultBroadcaster());
+		this(application, null);
 	}
 
 	private static Broadcaster lookupDefaultBroadcaster()
@@ -184,7 +193,13 @@ public class EventBus implements UnboundListener
 	 */
 	public Broadcaster getBroadcaster()
 	{
-		return broadcaster;
+		return broadcaster != null ? broadcaster : lookupDefaultBroadcaster();
+	}
+
+	public EventBus setBroadcaster(Broadcaster broadcaster)
+	{
+		this.broadcaster = broadcaster;
+		return this;
 	}
 
 	/**
@@ -388,7 +403,7 @@ public class EventBus implements UnboundListener
 				Collections.unmodifiableCollection(subscriptions.get(key)), new EventFilter(event));
 		}
 		if (key == null)
-			broadcaster.removeAtmosphereResource(resource);
+			getBroadcaster().removeAtmosphereResource(resource);
 		else if (!subscriptionsForPage.isEmpty())
 			post(resource, key, subscriptionsForPage, event);
 	}
@@ -415,7 +430,7 @@ public class EventBus implements UnboundListener
 			subscriptionsForPage, event);
 		Response response = new AtmosphereWebResponse(resource.getResponse());
 		if (application.createRequestCycle(request, response).processRequestAndDetach())
-			broadcaster.broadcast(response.toString(), resource);
+			getBroadcaster().broadcast(response.toString(), resource);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/db748c16/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
index 91ea64e..eb1cf1b 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
@@ -16,63 +16,182 @@
  */
 package org.apache.wicket.atmosphere.tester;
 
+import java.util.List;
+
 import org.apache.wicket.Page;
 import org.apache.wicket.atmosphere.AtmosphereBehavior;
+import org.apache.wicket.atmosphere.EventBus;
 import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.protocol.http.mock.MockHttpServletResponse;
 import org.apache.wicket.util.tester.WicketTester;
-import org.atmosphere.cpr.AtmosphereRequest;
+import org.atmosphere.cpr.AtmosphereConfig;
+import org.atmosphere.cpr.AtmosphereFramework;
 import org.atmosphere.cpr.AtmosphereResource;
-import org.atmosphere.cpr.AtmosphereResourceImpl;
-import org.atmosphere.cpr.AtmosphereResponse;
 import org.atmosphere.cpr.HeaderConfig;
-import org.atmosphere.handler.AtmosphereHandlerAdapter;
 
 /**
- *
+ * A helper for testing Atmosphere enabled pages
  */
 public class AtmosphereTester
 {
-	private final TesterEventBus eventBus;
+	/**
+	 * The EventBus that will be used to post/push messages
+	 * to the suspended http response
+	 */
+	private final EventBus eventBus;
+
+	private final WicketTester wicketTester;
+	
+	/**
+	 * The response which will be suspended by Atmosphere and
+	 * all pushes/post will go to
+	 */
+	private MockHttpServletResponse suspendedResponse;
 
+	private MockHttpServletResponse lastResponse;
+	
+	/**
+	 * Constructor.
+	 *
+	 * @param wicketTester
+	 *          The testing helper
+	 * @param page
+	 *          The page to test
+	 */
 	public AtmosphereTester(final WicketTester wicketTester, Page page)
 	{
+		this.wicketTester = wicketTester;
+
 		WebApplication application = wicketTester.getApplication();
-		this.eventBus = new TesterEventBus(application);
 
-		AtmosphereBehavior atmosphereBehavior = new AtmosphereBehavior()
+		TesterBroadcaster broadcaster = createBroadcaster();
+
+		if (EventBus.isInstalled(application))
+		{
+			this.eventBus = EventBus.get(application);
+			this.eventBus.setBroadcaster(broadcaster);
+		}
+		else
 		{
-			@Override
-			public void onRequest()
-			{
-				TesterBroadcaster broadcaster = eventBus.getBroadcaster();
-
-				AtmosphereResource atmosphereResource = new AtmosphereResourceImpl();
-				AtmosphereRequest atmosphereRequest = AtmosphereRequest.wrap(wicketTester.getRequest());
-				AtmosphereResponse atmosphereResponse = AtmosphereResponse.wrap(wicketTester.getResponse());
-				TesterAsyncSupport asyncSupport = new TesterAsyncSupport();
-				atmosphereResource.initialize(broadcaster.getApplicationConfig(), broadcaster, atmosphereRequest, atmosphereResponse,
-						asyncSupport, new AtmosphereHandlerAdapter());
-
-				atmosphereResource.setBroadcaster(broadcaster);
-				broadcaster.addAtmosphereResource(atmosphereResource);
-
-				String uuid = atmosphereResource.uuid();
-				Page page = getComponent().getPage();
-
-				page.setMetaData(ATMOSPHERE_UUID, uuid);
-				eventBus.registerPage(uuid, page);
-			}
-		};
+			this.eventBus = new EventBus(application, broadcaster);
+		}
+
+		initialize(wicketTester, page);
+	}
+
+	private void initialize(final WicketTester wicketTester, Page page)
+	{
+		// remove any already installed AtmosphereBehaviors on the page
+		List<AtmosphereBehavior> behaviors = page.getBehaviors(AtmosphereBehavior.class);
+		page.remove(behaviors.toArray(new AtmosphereBehavior[behaviors.size()]));
+
+		// install AtmosphereBehavior that doesn't use Meteor
+		AtmosphereBehavior atmosphereBehavior = new TesterAtmosphereBehavior(wicketTester, eventBus);
 		page.add(atmosphereBehavior);
 
+		// start the page to collect all @Subscribe methods in the component hierarchy
 		wicketTester.startPage(page);
+
+		// pretend it is a websocket connection
 		wicketTester.getRequest().setHeader(HeaderConfig.X_ATMOSPHERE_TRANSPORT, AtmosphereResource.TRANSPORT.WEBSOCKET.name());
+
+		// start the "upgrade" connection
+		suspendedResponse = wicketTester.getResponse();
 		wicketTester.executeBehavior(atmosphereBehavior);
 	}
 
-	public AtmosphereTester post(Object payload)
+	private TesterBroadcaster createBroadcaster()
+	{
+		TesterBroadcaster broadcaster = new TesterBroadcaster();
+
+		AtmosphereFramework framework = new AtmosphereFramework();
+		AtmosphereConfig config = new AtmosphereConfig(framework);
+
+		TesterBroadcasterFactory broadcasterFactory = new TesterBroadcasterFactory(config, broadcaster);
+		framework.setBroadcasterFactory(broadcasterFactory);
+
+		broadcaster.initialize("wicket-atmosphere-tester", config);
+
+		return broadcaster;
+	}
+
+	/**
+	 * @return The collected so far pushed data in the suspended response
+	 */
+	public String getPushedResponse()
 	{
-		eventBus.post(payload);
+		return suspendedResponse != null ? suspendedResponse.getDocument() : null;
+	}
+
+	/**
+	 * Resets the suspended response to be empty
+	 * @return this instance, for chaining
+	 */
+	public AtmosphereTester resetResponse()
+	{
+		if (suspendedResponse != null)
+		{
+			suspendedResponse.reset();
+		}
+		return this;
+	}
+
+	/**
+	 * Posts a message to all suspended responses
+	 *
+	 * @param message
+	 *          The message to push
+	 * @return this instance, for chaining
+	 */
+	public AtmosphereTester post(Object message)
+	{
+		eventBus.post(message);
+		return this;
+	}
+
+	/**
+	 * Posts a message to the suspended response with the given uuid
+	 *
+	 * @param message
+	 *          The message to push
+	 * @param resourceUuid
+	 *          The identifier of the suspended http response
+	 * @return this instance, for chaining
+	 */
+	public AtmosphereTester post(Object message, String resourceUuid)
+	{
+		eventBus.post(message, resourceUuid);
+		return this;
+	}
+
+	/**
+	 * Switches the current <em>lastResponse</em> with the <em>suspendedResponse</em>
+	 * so the application test can use WicketTester's assert methods.
+	 *
+	 * Note: Make sure to call {@linkplain #switchOffTestMode()} later to be able to
+	 * assert on non-Atmosphere related responses
+	 *
+	 * @return this instance, for chaining
+	 */
+	public AtmosphereTester switchOnTestMode()
+	{
+		lastResponse = wicketTester.getLastResponse();
+		wicketTester.setLastResponse(suspendedResponse);
+		return this;
+	}
+
+	/**
+	 * Sets back the <em>lastResponse</em> with the saved on by {@link #switchOnTestMode()}.
+	 *
+	 * @return this instance, for chaining
+	 */
+	public AtmosphereTester switchOffTestMode()
+	{
+		if (lastResponse != null)
+		{
+			wicketTester.setLastResponse(lastResponse);
+			lastResponse = null;
+		}
 		return this;
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/db748c16/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAtmosphereBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAtmosphereBehavior.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAtmosphereBehavior.java
new file mode 100644
index 0000000..d6632fe
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAtmosphereBehavior.java
@@ -0,0 +1,65 @@
+/*
+ * 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.atmosphere.tester;
+
+import org.apache.wicket.Page;
+import org.apache.wicket.atmosphere.AtmosphereBehavior;
+import org.apache.wicket.atmosphere.EventBus;
+import org.apache.wicket.util.tester.WicketTester;
+import org.atmosphere.cpr.AtmosphereRequest;
+import org.atmosphere.cpr.AtmosphereResource;
+import org.atmosphere.cpr.AtmosphereResourceImpl;
+import org.atmosphere.cpr.AtmosphereResponse;
+import org.atmosphere.handler.AtmosphereHandlerAdapter;
+
+/**
+ * A specialization that doesn't use Meteor to create AtmosphereResource
+ * but creates it manually by using the WicketTester's http request and response
+ */
+class TesterAtmosphereBehavior extends AtmosphereBehavior
+{
+	private final EventBus eventBus;
+	private final WicketTester wicketTester;
+
+	TesterAtmosphereBehavior(WicketTester wicketTester, EventBus eventBus)
+	{
+		this.wicketTester = wicketTester;
+		this.eventBus = eventBus;
+	}
+
+	@Override
+	public void onRequest()
+	{
+		TesterBroadcaster broadcaster = (TesterBroadcaster) eventBus.getBroadcaster();
+
+		AtmosphereResource atmosphereResource = new AtmosphereResourceImpl();
+		AtmosphereRequest atmosphereRequest = AtmosphereRequest.wrap(wicketTester.getRequest());
+		AtmosphereResponse atmosphereResponse = AtmosphereResponse.wrap(wicketTester.getResponse());
+		TesterAsyncSupport asyncSupport = new TesterAsyncSupport();
+		atmosphereResource.initialize(broadcaster.getApplicationConfig(), broadcaster, atmosphereRequest, atmosphereResponse,
+				asyncSupport, new AtmosphereHandlerAdapter());
+
+		atmosphereResource.setBroadcaster(broadcaster);
+		broadcaster.addAtmosphereResource(atmosphereResource);
+
+		String uuid = atmosphereResource.uuid();
+		Page page = getComponent().getPage();
+
+		page.setMetaData(ATMOSPHERE_UUID, uuid);
+		eventBus.registerPage(uuid, page);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/db748c16/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
index 4fae2da..7452d6a 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
@@ -19,6 +19,8 @@ package org.apache.wicket.atmosphere.tester;
 import org.atmosphere.cpr.AtmosphereConfig;
 import org.atmosphere.cpr.AtmosphereResource;
 import org.atmosphere.cpr.AtmosphereResponse;
+import org.atmosphere.cpr.BroadcasterConfig;
+import org.atmosphere.cpr.DefaultBroadcaster;
 import org.atmosphere.cpr.Entry;
 import org.atmosphere.util.SimpleBroadcaster;
 
@@ -33,9 +35,9 @@ class TesterBroadcaster extends SimpleBroadcaster
 	}
 
 	@Override
-	protected void executeBlockingWrite(AtmosphereResource resource, Entry entry)
+	protected void push(Entry entry)
 	{
-		AtmosphereResponse response = resource.getResponse();
+		AtmosphereResponse response = entry.resource.getResponse();
 		String message = entry.message.toString();
 		response.write(message);
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/db748c16/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
deleted file mode 100644
index 48e97cb..0000000
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
+++ /dev/null
@@ -1,54 +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.atmosphere.tester;
-
-import org.apache.wicket.atmosphere.EventBus;
-import org.apache.wicket.protocol.http.WebApplication;
-import org.atmosphere.cpr.AtmosphereConfig;
-import org.atmosphere.cpr.AtmosphereFramework;
-
-/**
- *
- */
-class TesterEventBus extends EventBus
-{
-	public TesterEventBus(WebApplication application)
-	{
-		super(application, createBroadcaster());
-	}
-
-	private static TesterBroadcaster createBroadcaster()
-	{
-		TesterBroadcaster broadcaster = new TesterBroadcaster();
-
-		AtmosphereFramework framework = new AtmosphereFramework();
-		AtmosphereConfig config = new AtmosphereConfig(framework);
-
-		TesterBroadcasterFactory broadcasterFactory = new TesterBroadcasterFactory(config, broadcaster);
-		framework.setBroadcasterFactory(broadcasterFactory);
-
-		broadcaster.initialize("wicket-atmosphere-tester", config);
-
-		return broadcaster;
-	}
-
-	@Override
-	public TesterBroadcaster getBroadcaster()
-	{
-		return (TesterBroadcaster) super.getBroadcaster();
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/db748c16/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
deleted file mode 100644
index 368367d..0000000
--- a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
+++ /dev/null
@@ -1,68 +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.atmosphere;
-
-import java.util.Date;
-
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.atmosphere.tester.AtmosphereTester;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.util.tester.WicketTester;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- *
- */
-public class AtmosphereTest extends Assert
-{
-	@Test
-	public void atmospherePush()
-	{
-		final String updateTimeIsExecuted = "updateTime is executed!";
-
-		WicketTester tester = new WicketTester();
-		HomePage page = new HomePage(new PageParameters())
-		{
-			@Subscribe
-			public void updateTime(AjaxRequestTarget target, Date event)
-			{
-				super.updateTime(target, event);
-
-				target.appendJavaScript(updateTimeIsExecuted);
-			}
-
-			@Subscribe(contextAwareFilter = ReceiverFilter.class)
-			public void receiveMessage(AjaxRequestTarget target, ChatMessage message)
-			{
-				super.receiveMessage(target, message);
-
-				System.err.println("receiveMessage");
-			}
-		};
-
-		AtmosphereTester waTester = new AtmosphereTester(tester, page);
-
-		Date payload = new Date();
-		waTester.post(payload);
-
-//		System.err.println("Ajax response:\n" + tester.getLastResponseAsString());
-		tester.assertContains(updateTimeIsExecuted);
-
-		tester.destroy();
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/db748c16/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTesterTest.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTesterTest.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTesterTest.java
new file mode 100644
index 0000000..c8f2773
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTesterTest.java
@@ -0,0 +1,108 @@
+/*
+ * 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.atmosphere;
+
+import static org.hamcrest.CoreMatchers.is;
+
+import java.util.Date;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.atmosphere.tester.AtmosphereTester;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.tester.FormTester;
+import org.apache.wicket.util.tester.WicketTester;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class AtmosphereTesterTest extends Assert
+{
+	final AtomicBoolean updateTimeCalled = new AtomicBoolean(false);
+	final AtomicBoolean receiveMessageCalled = new AtomicBoolean(false);
+
+	@Test
+	public void atmospherePush()
+	{
+		final String updateTimeIsExecuted = "updateTime is executed!";
+
+		WicketTester tester = new WicketTester();
+		HomePage page = new HomePage(new PageParameters())
+		{
+			@Subscribe
+			public void updateTime(AjaxRequestTarget target, Date event)
+			{
+				super.updateTime(target, event);
+
+				updateTimeCalled.set(true);
+
+				target.appendJavaScript(updateTimeIsExecuted);
+			}
+
+			@Subscribe(contextAwareFilter = ReceiverFilter.class)
+			public void receiveMessage(AjaxRequestTarget target, ChatMessage message)
+			{
+				super.receiveMessage(target, message);
+				receiveMessageCalled.set(true);
+			}
+		};
+
+		AtmosphereTester waTester = new AtmosphereTester(tester, page);
+
+		assertThat(updateTimeCalled.get(), is(false));
+		assertThat(receiveMessageCalled.get(), is(false));
+
+		Date payload = new Date();
+		waTester.post(payload);
+
+		assertThat(updateTimeCalled.get(), is(true));
+		assertThat(receiveMessageCalled.get(), is(false));
+
+		tester.assertContains(updateTimeIsExecuted);
+
+		final FormTester form = tester.newFormTester("form");
+
+		form.setValue("input", "Atmosphere rocks!");
+
+		form.submit("send");
+
+		assertThat(updateTimeCalled.get(), is(true));
+		assertThat(receiveMessageCalled.get(), is(true));
+
+		// get the the collected so far content of the suspended response
+		// Note: it may contain several <ajax-response>s.
+		// use waTester.resetResponse() to remove the collected data
+		String atmosphereResponse = waTester.getPushedResponse();
+//		System.out.println("RES:" + atmosphereResponse);
+
+		// assert
+		Assert.assertFalse("<?xml version=\"1.0\" encoding=\"UTF-8\"?><ajax-response></ajax-response>"
+				.equals(atmosphereResponse));
+
+		waTester.switchOnTestMode();
+		// now the assertions are against the Atmosphere's suspended response data
+		tester.assertComponentOnAjaxResponse("message");
+		waTester.switchOffTestMode();
+		// now the assertions will be the real last response
+
+		tester.assertLabel("message", "Atmosphere rocks!");
+
+		tester.destroy();
+	}
+}