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


Reply via email to