Author: ngn
Date: Mon Jul 19 07:41:40 2010
New Revision: 965377
URL: http://svn.apache.org/viewvc?rev=965377&view=rev
Log:
Adding test for BoshHandler (VYSPER-219, by Bogdan Pistol)
Added:
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/XMLUtil.java
Modified:
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandlerTest.java
Modified:
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandlerTest.java
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandlerTest.java?rev=965377&r1=965376&r2=965377&view=diff
==============================================================================
---
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandlerTest.java
(original)
+++
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandlerTest.java
Mon Jul 19 07:41:40 2010
@@ -19,20 +19,52 @@
*/
package org.apache.vysper.xmpp.extension.xep0124;
-import static org.junit.Assert.*;
-
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import static org.easymock.EasyMock.anyLong;
+import static org.easymock.EasyMock.createControl;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+
+import java.io.IOException;
+import java.util.Collections;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.vysper.xml.fragment.XMLElement;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.authorization.SASLMechanism;
import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.server.ServerFeatures;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.easymock.Capture;
+import org.easymock.EasyMock;
+import org.easymock.IMocksControl;
+import org.eclipse.jetty.continuation.Continuation;
+import org.eclipse.jetty.continuation.ContinuationListener;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
+import org.xml.sax.SAXException;
public class BoshHandlerTest {
+
+ private IMocksControl mocksControl;
+
+ private ServerRuntimeContext serverRuntimeContext;
+
+ private BoshHandler boshHandler;
@Before
public void setUp() throws Exception {
+ mocksControl = createControl();
+ serverRuntimeContext =
mocksControl.createMock(ServerRuntimeContext.class);
+ boshHandler = new BoshHandler();
+ boshHandler.setServerRuntimeContext(serverRuntimeContext);
}
@After
@@ -40,10 +72,51 @@ public class BoshHandlerTest {
}
@Test
- @Ignore("Not yet implemented")
- public void testProcess() {
+ public void testProcessSessionCreation() throws IOException, SAXException {
+ HttpServletRequest httpServletRequest =
mocksControl.createMock(HttpServletRequest.class);
+ expect(serverRuntimeContext.getNextSessionId()).andReturn("200");
+ expect(serverRuntimeContext.getServerEnitity()).andReturn(new
EntityImpl(null, "vysper.org", null));
+ expect(serverRuntimeContext.getDefaultXMLLang()).andReturn("en");
+ Continuation continuation =
mocksControl.createMock(Continuation.class);
+
expect(httpServletRequest.getAttribute(Continuation.ATTRIBUTE)).andReturn(continuation);
+ expectLastCall().atLeastOnce();
+ continuation.setTimeout(anyLong());
+ continuation.setAttribute("request", httpServletRequest);
+ continuation.addContinuationListener(EasyMock.<ContinuationListener>
anyObject());
+ continuation.suspend();
+
+ ServerFeatures serverFeatures =
mocksControl.createMock(ServerFeatures.class);
+
expect(serverRuntimeContext.getServerFeatures()).andReturn(serverFeatures);
+
expect(serverFeatures.getAuthenticationMethods()).andReturn(Collections.<SASLMechanism>
emptyList());
+
+ Capture<BoshResponse> captured = new Capture<BoshResponse>();
+ continuation.setAttribute(eq("response"), EasyMock.<BoshResponse>
capture(captured));
+ continuation.resume();
+ mocksControl.replay();
+
+ Stanza boshRequest = createSessionRequest();
+ boshHandler.process(httpServletRequest, boshRequest);
+ mocksControl.verify();
+
+ Stanza response = new XMLUtil(new
String(captured.getValue().getContent())).parse();
+ assertNotNull(response);
+ assertEquals("body", response.getName());
+ assertEquals(NamespaceURIs.XEP0124_BOSH, response.getNamespaceURI());
+ assertEquals("200", response.getAttributeValue("sid"));
+ assertEquals("vysper.org", response.getAttributeValue("from"));
+ assertEquals("60", response.getAttributeValue("wait"));
+ assertEquals("1", response.getAttributeValue("hold"));
+ assertEquals("1.9", response.getAttributeValue("ver"));
+ assertEquals(1, response.getInnerElements().size());
+ XMLElement streamFeatures = response.getInnerElements().get(0);
+ assertEquals("features", streamFeatures.getName());
+ assertEquals(NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS,
streamFeatures.getNamespaceURI());
+ assertEquals(1, streamFeatures.getInnerElements().size());
+ XMLElement saslMechanisms = streamFeatures.getInnerElements().get(0);
+ assertEquals("mechanisms", saslMechanisms.getName());
+ assertEquals(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL,
saslMechanisms.getNamespaceURI());
}
-
+
@Test
@Ignore("Not yet implemented")
public void testGetSessionCreationStanza() {
@@ -58,6 +131,18 @@ public class BoshHandlerTest {
@Ignore("Not yet implemented")
public void testMergeStanzas() {
}
+
+ private Stanza createSessionRequest() {
+ StanzaBuilder body = new StanzaBuilder("body",
NamespaceURIs.XEP0124_BOSH);
+ body.addAttribute("rid", "100");
+ body.addAttribute("to", "vysper.org");
+ body.addAttribute(NamespaceURIs.XML, "lang", "en");
+ body.addAttribute("wait", "60");
+ body.addAttribute("hold", "1");
+ body.addAttribute("ver", "1.9");
+ body.addAttribute(NamespaceURIs.URN_XMPP_XBOSH, "version", "1.0");
+ return body.build();
+ }
private Stanza createPingRequestStanza(String to, String id) {
StanzaBuilder body = new StanzaBuilder("body",
NamespaceURIs.XEP0124_BOSH);
@@ -76,5 +161,5 @@ public class BoshHandlerTest {
body.endInnerElement();
return body.build();
}
-
+
}
\ No newline at end of file
Added:
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/XMLUtil.java
URL:
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/XMLUtil.java?rev=965377&view=auto
==============================================================================
---
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/XMLUtil.java
(added)
+++
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/XMLUtil.java
Mon Jul 19 07:41:40 2010
@@ -0,0 +1,148 @@
+/*
+ * 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.vysper.xmpp.extension.xep0124;
+
+import java.io.IOException;
+
+import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.vysper.charset.CharsetUtil;
+import org.apache.vysper.mina.codec.StanzaBuilderFactory;
+import org.apache.vysper.xml.decoder.XMLElementBuilderFactory;
+import org.apache.vysper.xml.fragment.AbstractXMLElementBuilder;
+import org.apache.vysper.xml.fragment.XMLElement;
+import org.apache.vysper.xml.sax.NonBlockingXMLReader;
+import org.apache.vysper.xml.sax.impl.DefaultNonBlockingXMLReader;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+
+public class XMLUtil implements ContentHandler {
+
+ private final XMLElementBuilderFactory builderFactory;
+
+ private final IoBuffer input;
+
+ private final NonBlockingXMLReader reader;
+
+ @SuppressWarnings("rawtypes")
+ private AbstractXMLElementBuilder builder;
+
+ private int depth = 0;
+
+ private boolean isBodyPayloadDecoded = false;
+
+ private Stanza retStanza;
+
+ public XMLUtil(String xml) {
+ input = IoBuffer.allocate(xml.length());
+ input.setAutoExpand(true);
+ input.put(xml.getBytes());
+ input.flip();
+ builderFactory = new StanzaBuilderFactory();
+ reader = new DefaultNonBlockingXMLReader();
+ reader.setContentHandler(this);
+ }
+
+ public Stanza parse() throws IOException, SAXException {
+ reader.parse(input, CharsetUtil.UTF8_DECODER);
+ return retStanza;
+ }
+
+ public void characters(char[] ch, int start, int length) throws
SAXException {
+ // TODO handle start and length
+ if (builder != null) {
+ builder.addText(new String(ch));
+ }
+ }
+
+ public void endElement(String uri, String localName, String qName) throws
SAXException {
+ depth--;
+ if (depth == 0 && !isBodyPayloadDecoded) {
+ // complete body, emit
+ emitStanza();
+ } else {
+ builder.endInnerElement();
+ }
+ }
+
+ private void emitStanza() {
+ isBodyPayloadDecoded = true;
+ XMLElement element = builder.build();
+ retStanza = (Stanza) element;
+ builder = null;
+ }
+
+ public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
+ depth++;
+ if (builder == null) {
+ builder = builderFactory.createBuilder(localName, uri,
extractPrefix(qName), null, null);
+ } else {
+ builder.startInnerElement(localName, uri);
+ }
+
+ for (int i = 0; i < atts.getLength(); i++) {
+ builder.addAttribute(atts.getURI(i), atts.getLocalName(i),
atts.getValue(i));
+ }
+ }
+
+ private String extractPrefix(String qname) {
+ int index = qname.indexOf(':');
+ if (index > -1) {
+ return qname.substring(0, index);
+ } else {
+ return "";
+ }
+ }
+
+ public void setDocumentLocator(Locator locator) {
+ // ignore
+ }
+
+ public void startDocument() throws SAXException {
+ // ignore
+ }
+
+ public void endDocument() throws SAXException {
+ // ignore
+ }
+
+ public void startPrefixMapping(String prefix, String uri) throws
SAXException {
+ // ignore
+ }
+
+ public void endPrefixMapping(String prefix) throws SAXException {
+ // ignore
+ }
+
+ public void ignorableWhitespace(char[] ch, int start, int length) throws
SAXException {
+ // ignore
+ }
+
+ public void processingInstruction(String target, String data) throws
SAXException {
+ // ignore
+ }
+
+ public void skippedEntity(String name) throws SAXException {
+ // ignore
+ }
+
+}
\ No newline at end of file