Revision: 16694
Author: [email protected]
Date: Wed Jan 26 06:46:26 2011
Log: Fixes Issue 1053
http://code.google.com/p/mobicents/source/detail?r=16694
Added:
/trunk/servers/sip-servlets/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/simple/rfc3263
/trunk/servers/sip-servlets/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/simple/rfc3263/ShootistSipServletRFC3263Test.java
Modified:
/trunk/servers/sip-servlets/sip-servlets-impl/src/main/java/org/mobicents/servlet/sip/message/SipServletRequestImpl.java
/trunk/servers/sip-servlets/sip-servlets-test-suite/.classpath
/trunk/servers/sip-servlets/sip-servlets-test-suite/testsuite/pom.xml
/trunk/servers/sip-servlets/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/ProtocolObjects.java
/trunk/servers/sip-servlets/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/TestSipListener.java
=======================================
--- /dev/null
+++
/trunk/servers/sip-servlets/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/simple/rfc3263/ShootistSipServletRFC3263Test.java
Wed Jan 26 06:46:26 2011
@@ -0,0 +1,279 @@
+/*
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.mobicents.servlet.sip.testsuite.simple.rfc3263;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import javax.sip.SipProvider;
+import javax.sip.message.Response;
+
+import org.apache.catalina.deploy.ApplicationParameter;
+import org.apache.log4j.Logger;
+import org.mobicents.ext.javax.sip.dns.DNSLookupPerformer;
+import org.mobicents.ext.javax.sip.dns.DefaultDNSLookupPerformer;
+import org.mobicents.servlet.sip.SipServletTestCase;
+import org.mobicents.servlet.sip.core.session.SipStandardManager;
+import org.mobicents.servlet.sip.startup.SipContextConfig;
+import org.mobicents.servlet.sip.startup.SipStandardContext;
+import org.mobicents.servlet.sip.startup.SipStandardService;
+import org.mobicents.servlet.sip.testsuite.ProtocolObjects;
+import org.mobicents.servlet.sip.testsuite.TestSipListener;
+import org.xbill.DNS.DClass;
+import org.xbill.DNS.NAPTRRecord;
+import org.xbill.DNS.Name;
+import org.xbill.DNS.Record;
+import org.xbill.DNS.SRVRecord;
+import org.xbill.DNS.TextParseException;
+
+public class ShootistSipServletRFC3263Test extends SipServletTestCase {
+ private static transient Logger logger =
Logger.getLogger(ShootistSipServletRFC3263Test.class);
+ private static final String TRANSPORT = "udp";
+ private static final boolean AUTODIALOG = true;
+ private static final int TIMEOUT = 80000;
+ private static final int DIALOG_TIMEOUT = 40000;
+// private static final int TIMEOUT = 100000000;
+
+ TestSipListener receiver;
+ ProtocolObjects receiverProtocolObjects;
+
+ TestSipListener badReceiver;
+ ProtocolObjects badReceiverProtocolObjects;
+
+ public ShootistSipServletRFC3263Test(String name) {
+ super(name);
+ startTomcatOnStartup = false;
+ autoDeployOnStartup = false;
+ }
+
+ @Override
+ public void deployApplication() {
+ assertTrue(tomcat.deployContext(
+ projectHome
+ "/sip-servlets-test-suite/applications/shootist-sip-servlet/src/main/sipapp",
+ "sip-test-context", "sip-test"));
+ }
+
+ public SipStandardContext deployApplication(String name, String value) {
+ SipStandardContext context = new SipStandardContext();
+ context.setDocBase(projectHome
+ "/sip-servlets-test-suite/applications/shootist-sip-servlet/src/main/sipapp");
+ context.setName("sip-test-context");
+ context.setPath("sip-test");
+ context.addLifecycleListener(new SipContextConfig());
+ context.setManager(new SipStandardManager());
+ ApplicationParameter applicationParameter = new
ApplicationParameter();
+ applicationParameter.setName(name);
+ applicationParameter.setValue(value);
+ context.addApplicationParameter(applicationParameter);
+ assertTrue(tomcat.deployContext(context));
+ return context;
+ }
+
+ public SipStandardContext deployApplication(Map<String, String> params)
{
+ SipStandardContext context = new SipStandardContext();
+ context.setDocBase(projectHome
+ "/sip-servlets-test-suite/applications/shootist-sip-servlet/src/main/sipapp");
+ context.setName("sip-test-context");
+ context.setPath("sip-test");
+ context.addLifecycleListener(new SipContextConfig());
+ context.setManager(new SipStandardManager());
+ for (Entry<String, String> param : params.entrySet()) {
+ ApplicationParameter applicationParameter = new
ApplicationParameter();
+ applicationParameter.setName(param.getKey());
+ applicationParameter.setValue(param.getValue());
+ context.addApplicationParameter(applicationParameter);
+ }
+ assertTrue(tomcat.deployContext(context));
+ return context;
+ }
+
+ public SipStandardContext deployApplicationServletListenerTest() {
+ SipStandardContext context = new SipStandardContext();
+ context.setDocBase(projectHome
+ "/sip-servlets-test-suite/applications/shootist-sip-servlet/src/main/sipapp");
+ context.setName("sip-test-context");
+ context.setPath("sip-test");
+ context.addLifecycleListener(new SipContextConfig());
+ context.setManager(new SipStandardManager());
+ ApplicationParameter applicationParameter = new
ApplicationParameter();
+ applicationParameter.setName("testServletListener");
+ applicationParameter.setValue("true");
+ context.addApplicationParameter(applicationParameter);
+ assertTrue(tomcat.deployContext(context));
+ return context;
+ }
+
+ @Override
+ protected String getDarConfigurationFile() {
+ return "file:///" + projectHome
+ "/sip-servlets-test-suite/testsuite/src/test/resources/" +
+
"org/mobicents/servlet/sip/testsuite/simple/shootist-sip-servlet-dar.properties";
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ /*
+ * Making sure the procedures of retrying the next hop of RFC 3263 are
working
+ */
+ public void testShootist() throws Exception {
+// receiver.sendInvite();
+ receiverProtocolObjects =new ProtocolObjects(
+ "receiver", "gov.nist", TRANSPORT, AUTODIALOG,
null, null, null);
+ receiver = new TestSipListener(5080, 5070, receiverProtocolObjects,
false);
+ SipProvider receiverProvider = receiver.createProvider();
+ receiverProvider.addSipListener(receiver);
+ receiverProtocolObjects.start();
+
+ badReceiverProtocolObjects =new ProtocolObjects(
+ "bad-receiver", "gov.nist", TRANSPORT,
AUTODIALOG, null, null, null);
+ badReceiver = new TestSipListener(5081, 5070,
badReceiverProtocolObjects, false);
+ SipProvider badReceiverProvider = badReceiver.createProvider();
+ badReceiverProvider.addSipListener(badReceiver);
+ badReceiverProtocolObjects.start();
+ badReceiver.setDropRequest(true);
+ String host = "mobicents.org";
+
+ tomcat.startTomcat();
+
+ mockDNSLookup(host);
+
+ deployApplication("host", host);
+ Thread.sleep(TIMEOUT);
+ assertFalse(badReceiver.getByeReceived());
+ assertTrue(receiver.getByeReceived());
+ }
+
+ private void mockDNSLookup(String host) throws TextParseException {
+ DNSLookupPerformer dnsLookupPerformer =
mock(DefaultDNSLookupPerformer.class);
+ //mocking the DNS Lookups to match our test cases
+
tomcat.getSipService().getSipApplicationDispatcher().getDNSServerLocator().setDnsLookupPerformer(dnsLookupPerformer);
+
+ Set<String> supportedTransports = new HashSet<String>();
+ supportedTransports.add(TRANSPORT);
+
+ List<NAPTRRecord> mockedNAPTRRecords = new
LinkedList<NAPTRRecord>();
+ // mocking the name because localhost is not absolute and localhost.
cannot be resolved
+ Name name = mock(Name.class);
+ when(name.isAbsolute()).thenReturn(true);
+ when(name.toString()).thenReturn("localhost");
+ mockedNAPTRRecords.add(new NAPTRRecord(new Name(host + "."), DClass.IN,
1000, 0, 0, "s", "SIP+D2U", "", new Name("_sip._" + TRANSPORT.toLowerCase()
+ "." + host + ".")));
+ when(dnsLookupPerformer.performNAPTRLookup(host, false,
supportedTransports)).thenReturn(mockedNAPTRRecords);
+ List<Record> mockedSRVRecords = new LinkedList<Record>();
+ mockedSRVRecords.add(new SRVRecord(new Name("_sip._" +
TRANSPORT.toLowerCase() + "." + host + "."), DClass.IN, 1000L, 1, 0, 5080,
name));
+ mockedSRVRecords.add(new SRVRecord(new Name("_sip._" +
TRANSPORT.toLowerCase() + "." + host + "."), DClass.IN, 1000L, 0, 0, 5081,
name));
+ when(dnsLookupPerformer.performSRVLookup("_sip._" +
TRANSPORT.toLowerCase() + "." + host + ".")).thenReturn(mockedSRVRecords);
+ }
+ /*
+ * Making sure the procedures of retrying the next hop of RFC 3263 are
working
+ * and that the same hop is used for CANCEL
+ */
+ public void testShootistCancel() throws Exception {
+// receiver.sendInvite();
+ receiverProtocolObjects =new ProtocolObjects(
+ "receiver", "gov.nist", TRANSPORT, AUTODIALOG,
null, null, null);
+ receiver = new TestSipListener(5080, 5070, receiverProtocolObjects,
false);
+ receiver.setWaitForCancel(true);
+ SipProvider receiverProvider = receiver.createProvider();
+ receiverProvider.addSipListener(receiver);
+
+ badReceiverProtocolObjects =new ProtocolObjects(
+ "bad-receiver", "gov.nist", TRANSPORT,
AUTODIALOG, null, null, null);
+ badReceiver = new TestSipListener(5081, 5070,
badReceiverProtocolObjects, false);
+ SipProvider badReceiverProvider = badReceiver.createProvider();
+ badReceiverProvider.addSipListener(badReceiver);
+ badReceiverProtocolObjects.start();
+ badReceiver.setDropRequest(true);
+
+ String host = "mobicents.org";
+
+ mockDNSLookup(host);
+
+ receiverProtocolObjects.start();
+ tomcat.startTomcat();
+ Map<String, String> params = new HashMap<String, String>();
+ params.put("host", host);
+ params.put("cancelOn1xx", "true");
+ deployApplication(params);
+
+ Thread.sleep(DIALOG_TIMEOUT + TIMEOUT);
+ assertFalse(badReceiver.getByeReceived());
+ assertFalse(badReceiver.isCancelReceived());
+ assertTrue(receiver.isCancelReceived());
+ List<String> allMessagesContent =
receiver.getAllMessagesContent();
+ assertTrue(allMessagesContent.size() >= 2);
+ assertTrue("sipSessionReadyToInvalidate",
allMessagesContent.contains("sipSessionReadyToInvalidate"));
+ assertTrue("sipAppSessionReadyToInvalidate",
allMessagesContent.contains("sipAppSessionReadyToInvalidate"));
+ }
+
+ /*
+ * Making sure the procedures of retrying the next hop of RFC 3263 are
working
+ * and that the ACK to an error response uses the same hop
+ */
+ public void testShootistErrorResponse() throws Exception {
+ Map<String, String> additionalProps = new HashMap<String,
String>();
+
additionalProps.put(SipStandardService.PASS_INVITE_NON_2XX_ACK_TO_LISTENER, "true");
+
+ receiverProtocolObjects =new ProtocolObjects(
+ "receiver", "gov.nist", TRANSPORT, AUTODIALOG, null, null, null,
additionalProps);
+ receiver = new TestSipListener(5080, 5070, receiverProtocolObjects,
false);
+ receiver.setProvisionalResponsesToSend(new
ArrayList<Integer>());
+ receiver.setFinalResponseToSend(Response.SERVER_INTERNAL_ERROR);
+ SipProvider receiverProvider = receiver.createProvider();
+ receiverProvider.addSipListener(receiver);
+ receiverProtocolObjects.start();
+
+ badReceiverProtocolObjects =new ProtocolObjects(
+ "bad-receiver", "gov.nist", TRANSPORT, AUTODIALOG, null, null, null,
additionalProps);
+ badReceiver = new TestSipListener(5081, 5070,
badReceiverProtocolObjects, false);
+ SipProvider badReceiverProvider = badReceiver.createProvider();
+ badReceiverProvider.addSipListener(badReceiver);
+ badReceiverProtocolObjects.start();
+ badReceiver.setDropRequest(true);
+ String host = "mobicents.org";
+
+ tomcat.startTomcat();
+
+ mockDNSLookup(host);
+
+ Map<String, String> params = new HashMap<String, String>();
+ params.put("host", host);
+ params.put("testErrorResponse", "true");
+ deployApplication(params);
+
+ Thread.sleep(DIALOG_TIMEOUT + TIMEOUT);
+ assertFalse(badReceiver.isAckReceived());
+ assertTrue(receiver.isAckReceived());
+ List<String> allMessagesContent =
receiver.getAllMessagesContent();
+ assertEquals(2,allMessagesContent.size());
+ assertTrue("sipSessionReadyToInvalidate",
allMessagesContent.contains("sipSessionReadyToInvalidate"));
+ assertTrue("sipAppSessionReadyToInvalidate",
allMessagesContent.contains("sipAppSessionReadyToInvalidate"));
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ receiverProtocolObjects.destroy();
+ logger.info("Test completed");
+ super.tearDown();
+ }
+}
=======================================
---
/trunk/servers/sip-servlets/sip-servlets-impl/src/main/java/org/mobicents/servlet/sip/message/SipServletRequestImpl.java
Wed Jan 26 05:01:11 2011
+++
/trunk/servers/sip-servlets/sip-servlets-impl/src/main/java/org/mobicents/servlet/sip/message/SipServletRequestImpl.java
Wed Jan 26 06:46:26 2011
@@ -84,6 +84,7 @@
import javax.sip.header.ToHeader;
import javax.sip.header.ViaHeader;
import javax.sip.header.WWWAuthenticateHeader;
+import javax.sip.message.Message;
import javax.sip.message.Request;
import javax.sip.message.Response;
@@ -1429,8 +1430,9 @@
// therefore constitutes a new SIP
transaction).
ViaHeader viaHeader = (ViaHeader)
getMessage().getHeader(ViaHeader.NAME);
viaHeader.removeParameter("branch");
+ message = (Message) message.clone();
if(logger.isDebugEnabled()) {
- logger.debug("sending request " + getMessage() + " to next hop " +
nextHop + "discovered through RFC3263 mechanisms.");
+ logger.debug("sending request " + getMessage() + " to next hop " +
nextHop + " discovered through RFC3263 mechanisms.");
}
setTransaction(null);
// That request is sent to the next element in the list as specified
by RFC 2782.
=======================================
--- /trunk/servers/sip-servlets/sip-servlets-test-suite/.classpath Thu Oct
28 13:12:24 2010
+++ /trunk/servers/sip-servlets/sip-servlets-test-suite/.classpath Wed Jan
26 06:46:26 2011
@@ -42,6 +42,7 @@
<classpathentry combineaccessrules="false" kind="src"
path="/sip-servlets-impl"/>
<classpathentry kind="var"
path="M2_REPO/concurrent/concurrent/1.3.4/concurrent-1.3.4.jar"/>
<classpathentry kind="var"
path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+ <classpathentry kind="var"
path="M2_REPO/org/mockito/mockito-all/1.8.5/mockito-all-1.8.5.jar"/>
<classpathentry kind="var"
path="M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar"/>
<classpathentry kind="lib" path="testsuite/lib/sipunit.jar"
sourcepath="/sipunit/src"/>
<classpathentry kind="var"
path="M2_REPO/org/apache/tomcat/catalina/6.0.29/catalina-6.0.29.jar"
sourcepath="/TOMCAT_HOME/java"/>
@@ -59,6 +60,8 @@
<classpathentry kind="var"
path="M2_REPO/javax/sip/jain-sip-api/1.2/jain-sip-api-1.2.jar"/>
<classpathentry kind="var"
path="M2_REPO/javax/sip/jain-sip-ri/1.2.X-SNAPSHOT/jain-sip-ri-1.2.X-SNAPSHOT.jar"/>
<classpathentry kind="var"
path="M2_REPO/org/mobicents/ha/javax/sip/mobicents-jain-sip-jboss4/0.6/mobicents-jain-sip-jboss4-0.6.jar"/>
+ <classpathentry kind="var"
path="M2_REPO/org/mobicents/javax/sip/mobicents-jain-sip-ext/1.0-SNAPSHOT/mobicents-jain-sip-ext-1.0-SNAPSHOT.jar"/>
+ <classpathentry kind="var"
path="M2_REPO/dnsjava/dnsjava/2.1.0/dnsjava-2.1.0.jar"/>
<classpathentry combineaccessrules="false" kind="src"
path="/sip-servlets-client"/>
<classpathentry kind="var"
path="M2_REPO/javax/activation/activation/1.1.1/activation-1.1.1.jar"/>
<classpathentry kind="var"
path="M2_REPO/javax/mail/mail/1.4/mail-1.4.jar"/>
=======================================
--- /trunk/servers/sip-servlets/sip-servlets-test-suite/testsuite/pom.xml
Tue Dec 21 13:15:57 2010
+++ /trunk/servers/sip-servlets/sip-servlets-test-suite/testsuite/pom.xml
Wed Jan 26 06:46:26 2011
@@ -10,12 +10,20 @@
<packaging>jar</packaging>
<name>Mobicents Sip Servlets Test Suite</name>
<dependencies>
+ <!-- testing dependency -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-all</artifactId>
+ <version>1.8.5</version>
+ <scope>test</scope>
+ </dependency>
+
<dependency>
<groupId>org.mobicents.servlet.sip</groupId>
<artifactId>sip-servlets-spec</artifactId>
@@ -157,6 +165,18 @@
<version>${mobicents.jain.sip.ha.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.mobicents.javax.sip</groupId>
+ <artifactId>mobicents-jain-sip-ext</artifactId>
+ <version>${mobicents.jain.sip.ext.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>dnsjava</groupId>
+ <artifactId>dnsjava</artifactId>
+ <version>2.1.0</version>
+ </dependency>
+
<dependency>
<groupId>org.mobicents.ha.javax.sip</groupId>
<artifactId>mobicents-jain-sip-jboss4</artifactId>
=======================================
---
/trunk/servers/sip-servlets/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/ProtocolObjects.java
Fri Oct 29 01:26:25 2010
+++
/trunk/servers/sip-servlets/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/ProtocolObjects.java
Wed Jan 26 06:46:26 2011
@@ -17,6 +17,7 @@
package org.mobicents.servlet.sip.testsuite;
import java.util.HashSet;
+import java.util.Map;
import java.util.Properties;
import javax.sip.ObjectInUseException;
@@ -52,8 +53,7 @@
private boolean isStarted;
public ProtocolObjects(String stackname, String pathname, String
transport,
- boolean autoDialog, String outboundProxy, String threadPoolSize, String
reentrantListener) {
-
+ boolean autoDialog, String outboundProxy, String threadPoolSize, String
reentrantListener, Map<String, String> additionalProperties) {
this.transport = transport;
SipFactory sipFactory = SipFactory.getInstance();
sipFactory.resetFactory();
@@ -92,6 +92,10 @@
properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL",
Integer.valueOf(
logLevel).toString());
+ if(additionalProperties != null) {
+ properties.putAll(additionalProperties);
+ }
+
try {
// Create SipStack object
sipStack = sipFactory.createSipStack(properties);
@@ -114,6 +118,12 @@
throw new RuntimeException(ex);
}
}
+
+ public ProtocolObjects(String stackname, String pathname, String
transport,
+ boolean autoDialog, String outboundProxy, String threadPoolSize, String
reentrantListener) {
+
+ this(stackname, pathname, transport, autoDialog, outboundProxy,
threadPoolSize, reentrantListener, null);
+ }
public synchronized void destroy() {
HashSet<SipProvider> hashSet = new HashSet<SipProvider>();
=======================================
---
/trunk/servers/sip-servlets/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/TestSipListener.java
Mon Jan 3 05:51:04 2011
+++
/trunk/servers/sip-servlets/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/TestSipListener.java
Wed Jan 26 06:46:26 2011
@@ -303,6 +303,8 @@
private boolean testNextNonce =false;
private String nextNonce = null;
+
+ private boolean dropRequest = false;
class MyEventSource implements Runnable {
private TestSipListener notifier;
@@ -567,7 +569,6 @@
this.transactionCount++;
logger.info("shootist: Sending OK.");
logger.info("Dialog State = " + dialog.getState());
-
} catch (Exception ex) {
ex.printStackTrace();
}
@@ -1015,6 +1016,10 @@
Request request = requestEvent.getRequest();
inviteRequest = request;
logger.info("shootme: got an Invite " + request);
+ if(dropRequest) {
+ logger.warn("dropping " + request);
+ return;
+ }
try {
if(challengeRequests) {
// Verify AUTHORIZATION !!!!!!!!!!!!!!!!
@@ -1115,7 +1120,7 @@
Header rseqHeader =
protocolObjects.headerFactory.createRSeqHeader(rseqNumber.getAndIncrement());
response.addHeader(rseqHeader);
dialog.sendReliableProvisionalResponse(response);
- } else {
+ } else {
st.sendResponse(response);
}
}
@@ -1541,6 +1546,7 @@
}
} else if(response.getStatusCode() == Response.RINGING &&
sendUpdateOn180) {
Request updateRequest =
dialog.createRequest(Request.UPDATE);
+
ClientTransaction ct = sipProvider
.getNewClientTransaction(updateRequest);
dialog.sendRequest(ct);
@@ -2891,5 +2897,19 @@
public void setTestNextNonce(boolean b) {
this.testNextNonce = b;
}
+
+ /**
+ * @param dropRequest the dropRequest to set
+ */
+ public void setDropRequest(boolean dropRequest) {
+ this.dropRequest = dropRequest;
+ }
+
+ /**
+ * @return the dropRequest
+ */
+ public boolean isDropRequest() {
+ return dropRequest;
+ }
}