/* * 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 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 static org.junit.Assert.assertEquals; import javax.servlet.http.HttpServletRequest; import org.apache.vysper.xml.fragment.Renderer; import org.apache.vysper.xmpp.addressing.EntityImpl; import org.apache.vysper.xmpp.protocol.NamespaceURIs; 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.Test; public class BoshBackedSessionContextTest { private IMocksControl mocksControl; private BoshHandler boshHandler; private ServerRuntimeContext serverRuntimeContext; private InactivityChecker inactivityChecker; @Before public void setUp() throws Exception { mocksControl = createControl(); boshHandler = mocksControl.createMock(BoshHandler.class); serverRuntimeContext = mocksControl.createMock(ServerRuntimeContext.class); expect(serverRuntimeContext.getNextSessionId()).andReturn("123"); expect(serverRuntimeContext.getServerEnitity()).andReturn(new EntityImpl(null, "vysper.org", null)); expect(serverRuntimeContext.getDefaultXMLLang()).andReturn("en"); inactivityChecker = new InactivityChecker(); // inactivityChecker.start(); } @After public void tearDown() throws Exception { // inactivityChecker.interrupt(); } @Test public void testWrite0() { Continuation continuation = mocksControl.createMock(Continuation.class); HttpServletRequest httpServletRequest = mocksControl.createMock(HttpServletRequest.class); expect(httpServletRequest.getAttribute(Continuation.ATTRIBUTE)).andReturn(continuation); expectLastCall().atLeastOnce(); continuation.setTimeout(anyLong()); continuation.setAttribute(eq("request"), EasyMock.<BoshRequest> notNull()); continuation.suspend(); continuation.resume(); continuation.addContinuationListener(EasyMock.<ContinuationListener> anyObject()); Capture<BoshResponse> captured = new Capture<BoshResponse>(); continuation.setAttribute(eq("response"), EasyMock.<BoshResponse> capture(captured)); mocksControl.replay(); BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(boshHandler, serverRuntimeContext, inactivityChecker); Stanza body = new StanzaBuilder("body", NamespaceURIs.XEP0124_BOSH).build(); boshBackedSessionContext.insertRequest(new BoshRequest(httpServletRequest, body, 1L)); boshBackedSessionContext.write0(body); mocksControl.verify(); BoshResponse boshResponse = captured.getValue(); assertEquals(BoshServlet.XML_CONTENT_TYPE, boshResponse.getContentType()); assertEquals(new Renderer(body).getComplete(), new String(boshResponse.getContent())); } @Test public void testSetBoshVersion1() { mocksControl.replay(); BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(boshHandler, serverRuntimeContext, inactivityChecker); boshBackedSessionContext.setBoshVersion("1.8"); assertEquals("1.8", boshBackedSessionContext.getBoshVersion()); mocksControl.verify(); } @Test public void testSetBoshVersion2() { mocksControl.replay(); BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(boshHandler, serverRuntimeContext, inactivityChecker); boshBackedSessionContext.setBoshVersion("2.0"); assertEquals("1.9", boshBackedSessionContext.getBoshVersion()); mocksControl.verify(); } @Test public void testRequestExpired() { Stanza body = new StanzaBuilder("body", NamespaceURIs.XEP0124_BOSH).build(); // addRequest HttpServletRequest httpServletRequest = mocksControl.createMock(HttpServletRequest.class); Continuation continuation = mocksControl.createMock(Continuation.class); expect(httpServletRequest.getAttribute(Continuation.ATTRIBUTE)).andReturn(continuation); expectLastCall().atLeastOnce(); continuation.setTimeout(anyLong()); continuation.suspend(); continuation.setAttribute(eq("request"), EasyMock.<BoshRequest> notNull()); Capture<ContinuationListener> listenerCaptured = new Capture<ContinuationListener>(); continuation.addContinuationListener(EasyMock.<ContinuationListener> capture(listenerCaptured)); BoshRequest br = new BoshRequest(httpServletRequest, body, 1L); // requestExpired expect(continuation.getAttribute("request")).andReturn(br); Capture<BoshResponse> responseCaptured = new Capture<BoshResponse>(); continuation.setAttribute(eq("response"), EasyMock.<BoshResponse> capture(responseCaptured)); expect(boshHandler.getEmptyResponse()).andReturn(body); expectLastCall().atLeastOnce(); // write0 continuation.resume(); mocksControl.replay(); BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(boshHandler, serverRuntimeContext, inactivityChecker); boshBackedSessionContext.insertRequest(br); listenerCaptured.getValue().onTimeout(continuation); mocksControl.verify(); assertEquals(new Renderer(body).getComplete(), new String(responseCaptured.getValue().getContent())); assertEquals(BoshServlet.XML_CONTENT_TYPE, responseCaptured.getValue().getContentType()); } @Test public void testAddRequest() { // addRequest HttpServletRequest httpServletRequest1 = mocksControl.createMock(HttpServletRequest.class); HttpServletRequest httpServletRequest2 = mocksControl.createMock(HttpServletRequest.class); Continuation continuation1 = mocksControl.createMock(Continuation.class); Continuation continuation2 = mocksControl.createMock(Continuation.class); expect(httpServletRequest1.getAttribute(Continuation.ATTRIBUTE)).andReturn(continuation1); expectLastCall().atLeastOnce(); expect(httpServletRequest2.getAttribute(Continuation.ATTRIBUTE)).andReturn(continuation2); expectLastCall().atLeastOnce(); continuation1.setTimeout(anyLong()); continuation1.suspend(); Capture<BoshRequest> br1 = new Capture<BoshRequest>(); continuation1.setAttribute(eq("request"), EasyMock.<BoshRequest> capture(br1)); continuation2.setTimeout(anyLong()); continuation2.suspend(); Capture<BoshRequest> br2 = new Capture<BoshRequest>(); continuation2.setAttribute(eq("request"), EasyMock.<BoshRequest> capture(br2)); continuation1.addContinuationListener(EasyMock.<ContinuationListener> anyObject()); continuation2.addContinuationListener(EasyMock.<ContinuationListener> anyObject()); Stanza body = new StanzaBuilder("body", NamespaceURIs.XEP0124_BOSH).build(); expect(boshHandler.addAttribute(eq(body), eq("ack"), Long.toString(EasyMock.anyLong()))).andReturn(body); // write0 Capture<BoshResponse> captured = new Capture<BoshResponse>(); continuation1.setAttribute(eq("response"), EasyMock.<BoshResponse> capture(captured)); continuation1.resume(); mocksControl.replay(); BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(boshHandler, serverRuntimeContext, inactivityChecker); boshBackedSessionContext.setHold(2); // consecutive writes with RID 1 and 2 boshBackedSessionContext.insertRequest(new BoshRequest(httpServletRequest1, body, 1L)); boshBackedSessionContext.insertRequest(new BoshRequest(httpServletRequest2, body, 2L)); boshBackedSessionContext.write0(body); mocksControl.verify(); assertEquals(httpServletRequest1, br1.getValue().getHttpServletRequest()); assertEquals(httpServletRequest2, br2.getValue().getHttpServletRequest()); assertEquals(new Renderer(body).getComplete(), new String(captured.getValue().getContent())); assertEquals(BoshServlet.XML_CONTENT_TYPE, captured.getValue().getContentType()); } @Test public void testAddRequestWithDelayedResponses() { HttpServletRequest httpServletRequest = mocksControl.createMock(HttpServletRequest.class); Continuation continuation = mocksControl.createMock(Continuation.class); expect(httpServletRequest.getAttribute(Continuation.ATTRIBUTE)).andReturn(continuation); expectLastCall().atLeastOnce(); continuation.setTimeout(anyLong()); continuation.suspend(); continuation.setAttribute(eq("request"), EasyMock.<BoshRequest> notNull()); continuation.addContinuationListener(EasyMock.<ContinuationListener> anyObject()); Stanza body1 = mocksControl.createMock(Stanza.class); Stanza body2 = mocksControl.createMock(Stanza.class); Stanza body = new StanzaBuilder("body", NamespaceURIs.XEP0124_BOSH).build(); expect(boshHandler.mergeResponses(EasyMock.<Stanza> anyObject(), EasyMock.<Stanza> anyObject())) .andReturn(body); expectLastCall().times(2); continuation.setAttribute(eq("response"), EasyMock.<BoshResponse> anyObject()); continuation.resume(); mocksControl.replay(); BoshBackedSessionContext boshBackedSessionContext = new BoshBackedSessionContext(boshHandler, serverRuntimeContext, inactivityChecker); boshBackedSessionContext.write0(body1); boshBackedSessionContext.write0(body2); boshBackedSessionContext.insertRequest(new BoshRequest(httpServletRequest, body, 1L)); mocksControl.verify(); } }