<p>George Joseph has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/testsuite/+/16062">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Test for PJSIP message destination parsing<br><br>Also updated contrib/sipp/sipp.dtd to make it<br>match the sipp docs.<br><br>ASTERISK_29404<br><br>Change-Id: I90512f7e85a2e4ce32dbcc8b2cb2dfac801189c6<br>---<br>M contrib/sipp/sipp.dtd<br>A tests/channels/pjsip/message/message_destination_parsing/configs/ast1/extensions.conf<br>A tests/channels/pjsip/message/message_destination_parsing/configs/ast1/pjsip.conf<br>A tests/channels/pjsip/message/message_destination_parsing/sipp/message_recv.xml<br>A tests/channels/pjsip/message/message_destination_parsing/test-config.yaml<br>M tests/channels/pjsip/message/tests.yaml<br>6 files changed, 389 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/testsuite refs/changes/62/16062/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/contrib/sipp/sipp.dtd b/contrib/sipp/sipp.dtd</span><br><span>index e2ba1f5..800b511 100644</span><br><span>--- a/contrib/sipp/sipp.dtd</span><br><span>+++ b/contrib/sipp/sipp.dtd</span><br><span>@@ -67,18 +67,21 @@</span><br><span> <!ELEMENT CallLengthRepartition EMPTY ></span><br><span> <!ATTLIST CallLengthRepartition value CDATA #REQUIRED ></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-<!ELEMENT action ( add | assign | assignstr | closecon | divide | ereg | error | exec | gettimeofday | index | insert | jump | log | lookup | multiply | pauserestore | replace | rtp_echo | sample | setdest | strcmp | subtract | test | todouble | trim | urldecode | urlencode | verifyauth | warning )+ ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ELEMENT action ( add | assign | assignstr | divide | ereg | exec | gettimeofday | insert | jump | log | lookup | multiply | replace | rtp_echo | sample | setdest | strcmp | subtract | test | todouble | urldecode | urlencode | verifyauth | warning )+ ></span><br><span> </span><br><span> <!-- BEGIN actions --></span><br><span> </span><br><span> <!ELEMENT ereg EMPTY ></span><br><span> <!ATTLIST ereg assign_to CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST ereg case_indep (true|false) #IMPLIED ></span><br><span> <!ATTLIST ereg check_it (true|false) "false" ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST ereg check_it_inverse (true|false) "false" ></span><br><span> <!ATTLIST ereg header NMTOKEN #IMPLIED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST ereg occurence CDATA #IMPLIED ></span><br><span> <!ATTLIST ereg regexp CDATA #REQUIRED ></span><br><span> <!ATTLIST ereg search_in (msg|hdr) "msg" ></span><br><span> <!ATTLIST ereg start_line (true|false) #IMPLIED ></span><br><span style="color: hsl(0, 100%, 40%);">-<!ATTLIST ereg occurence CDATA #IMPLIED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST ereg variable CDATA #IMPLIED ></span><br><span> </span><br><span> </span><br><span> <!ELEMENT log EMPTY ></span><br><span>@@ -110,10 +113,66 @@</span><br><span> <!ATTLIST test value CDATA #REQUIRED ></span><br><span> <!ATTLIST test variable CDATA #REQUIRED ></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+<!ELEMENT add EMPTY ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST add assign_to CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST add variable CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<!ELEMENT subtract EMPTY ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST subtract assign_to CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST subtract variable CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<!ELEMENT multiply EMPTY ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST multiply assign_to CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST multiply variable CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<!ELEMENT divide EMPTY ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST divide assign_to CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST divide variable CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> <!ELEMENT assign EMPTY ></span><br><span> <!ATTLIST assign assign_to CDATA #REQUIRED ></span><br><span> <!ATTLIST assign variable CDATA #REQUIRED ></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+<!ELEMENT assignstr EMPTY ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST assignstr assign_to CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST assignstr variable CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<!ELEMENT gettimeofday EMPTY ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST gettimeofday assign_to CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<!ELEMENT insert EMPTY ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST insert file CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST insert value CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<!ELEMENT jump EMPTY ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST jump value CDATA #IMPLIED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST jump variable CDATA #IMPLIED ></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<!ELEMENT lookup EMPTY ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST lookup assign_to CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST lookup file CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST lookup key CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<!ELEMENT replace EMPTY ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST replace file CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST replace line CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST replace value CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<!ELEMENT sample EMPTY ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST sample assign_to CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST sample distribution CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST sample mean CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST sample stdev CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<!ELEMENT setdest EMPTY ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST setdest host CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST setdest port CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST setdest protocol CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<!ELEMENT todouble EMPTY ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST todouble assign_to CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST todouble variable CDATA #REQUIRED ></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> <!ELEMENT urldecode EMPTY ></span><br><span> <!ATTLIST urldecode variable CDATA #REQUIRED ></span><br><span> </span><br><span>diff --git a/tests/channels/pjsip/message/message_destination_parsing/configs/ast1/extensions.conf b/tests/channels/pjsip/message/message_destination_parsing/configs/ast1/extensions.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..ab109a1</span><br><span>--- /dev/null</span><br><span>+++ b/tests/channels/pjsip/message/message_destination_parsing/configs/ast1/extensions.conf</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[default]</span><br><span>diff --git a/tests/channels/pjsip/message/message_destination_parsing/configs/ast1/pjsip.conf b/tests/channels/pjsip/message/message_destination_parsing/configs/ast1/pjsip.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..619401c</span><br><span>--- /dev/null</span><br><span>+++ b/tests/channels/pjsip/message/message_destination_parsing/configs/ast1/pjsip.conf</span><br><span>@@ -0,0 +1,48 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[global]</span><br><span style="color: hsl(120, 100%, 40%);">+type=global</span><br><span style="color: hsl(120, 100%, 40%);">+default_outbound_endpoint=default_endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[local]</span><br><span style="color: hsl(120, 100%, 40%);">+type=transport</span><br><span style="color: hsl(120, 100%, 40%);">+protocol=udp</span><br><span style="color: hsl(120, 100%, 40%);">+bind=127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[default_endpoint]</span><br><span style="color: hsl(120, 100%, 40%);">+type=endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+context=default</span><br><span style="color: hsl(120, 100%, 40%);">+direct_media=no</span><br><span style="color: hsl(120, 100%, 40%);">+disallow=all</span><br><span style="color: hsl(120, 100%, 40%);">+allow=ulaw</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp]</span><br><span style="color: hsl(120, 100%, 40%);">+type=aor</span><br><span style="color: hsl(120, 100%, 40%);">+contact=sip:127.0.0.2 ; default to 5060</span><br><span style="color: hsl(120, 100%, 40%);">+max_contacts=1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp2]</span><br><span style="color: hsl(120, 100%, 40%);">+type=aor</span><br><span style="color: hsl(120, 100%, 40%);">+contact=sip:harry@127.0.0.2:5061</span><br><span style="color: hsl(120, 100%, 40%);">+max_contacts=1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp]</span><br><span style="color: hsl(120, 100%, 40%);">+type=endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+context=default</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp,sipp2</span><br><span style="color: hsl(120, 100%, 40%);">+direct_media=no</span><br><span style="color: hsl(120, 100%, 40%);">+disallow=all</span><br><span style="color: hsl(120, 100%, 40%);">+allow=ulaw</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp_contact_user]</span><br><span style="color: hsl(120, 100%, 40%);">+type=aor</span><br><span style="color: hsl(120, 100%, 40%);">+contact=sip:someuser@127.0.0.2:5062</span><br><span style="color: hsl(120, 100%, 40%);">+max_contacts=1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp_contact_user]</span><br><span style="color: hsl(120, 100%, 40%);">+type=endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+context=default</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp_contact_user</span><br><span style="color: hsl(120, 100%, 40%);">+direct_media=no</span><br><span style="color: hsl(120, 100%, 40%);">+disallow=all</span><br><span style="color: hsl(120, 100%, 40%);">+allow=ulaw</span><br><span>diff --git a/tests/channels/pjsip/message/message_destination_parsing/sipp/message_recv.xml b/tests/channels/pjsip/message/message_destination_parsing/sipp/message_recv.xml</span><br><span>new file mode 100644</span><br><span>index 0000000..a490fc7</span><br><span>--- /dev/null</span><br><span>+++ b/tests/channels/pjsip/message/message_destination_parsing/sipp/message_recv.xml</span><br><span>@@ -0,0 +1,32 @@</span><br><span style="color: hsl(120, 100%, 40%);">+<?xml version="1.0" encoding="ISO-8859-1" ?></span><br><span style="color: hsl(120, 100%, 40%);">+<!DOCTYPE scenario SYSTEM "../../../../../../contrib/sipp/sipp.dtd"></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<scenario name="Receive MESSAGE"></span><br><span style="color: hsl(120, 100%, 40%);">+    <recv request="MESSAGE" crlf="true"></span><br><span style="color: hsl(120, 100%, 40%);">+                <action></span><br><span style="color: hsl(120, 100%, 40%);">+                        <!-- We need to ensure that a display name never makes it into the request uri --></span><br><span style="color: hsl(120, 100%, 40%);">+                      <ereg regexp='MESSAGE\s+\"[^a-zA-Z]+\"' search_in="msg"</span><br><span style="color: hsl(120, 100%, 40%);">+                                check_it_inverse="false" assign_to="junk"/></span><br><span style="color: hsl(120, 100%, 40%);">+                    <!-- We need to ensure that <> never makes it into the request uri --></span><br><span style="color: hsl(120, 100%, 40%);">+                    <ereg regexp='MESSAGE\s+&lt;.+&gt;' search_in="msg"</span><br><span style="color: hsl(120, 100%, 40%);">+                              check_it_inverse="false" assign_to="junk"/></span><br><span style="color: hsl(120, 100%, 40%);">+            </action></span><br><span style="color: hsl(120, 100%, 40%);">+       </recv></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <send></span><br><span style="color: hsl(120, 100%, 40%);">+    <![CDATA[</span><br><span style="color: hsl(120, 100%, 40%);">+      SIP/2.0 202 Accepted</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Via:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_From:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_To:];tag=[call_number]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Call-ID:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_CSeq:]</span><br><span style="color: hsl(120, 100%, 40%);">+      Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH</span><br><span style="color: hsl(120, 100%, 40%);">+      Supported: replaces, timer</span><br><span style="color: hsl(120, 100%, 40%);">+      Content-Length: 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ]]></span><br><span style="color: hsl(120, 100%, 40%);">+    </send></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <Reference variables="junk"/></span><br><span style="color: hsl(120, 100%, 40%);">+</scenario></span><br><span>diff --git a/tests/channels/pjsip/message/message_destination_parsing/test-config.yaml b/tests/channels/pjsip/message/message_destination_parsing/test-config.yaml</span><br><span>new file mode 100644</span><br><span>index 0000000..adc4fbc</span><br><span>--- /dev/null</span><br><span>+++ b/tests/channels/pjsip/message/message_destination_parsing/test-config.yaml</span><br><span>@@ -0,0 +1,246 @@</span><br><span style="color: hsl(120, 100%, 40%);">+testinfo:</span><br><span style="color: hsl(120, 100%, 40%);">+    summary: 'Test Destination Parsing'</span><br><span style="color: hsl(120, 100%, 40%);">+    description: |</span><br><span style="color: hsl(120, 100%, 40%);">+        Test various permutations of MessageSend destinations to ensure we</span><br><span style="color: hsl(120, 100%, 40%);">+        can parse and locate an endpoint and URI.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+properties:</span><br><span style="color: hsl(120, 100%, 40%);">+    dependencies:</span><br><span style="color: hsl(120, 100%, 40%);">+        - app : 'sipp'</span><br><span style="color: hsl(120, 100%, 40%);">+        - asterisk : 'res_pjsip'</span><br><span style="color: hsl(120, 100%, 40%);">+        - asterisk : 'res_pjsip_messaging'</span><br><span style="color: hsl(120, 100%, 40%);">+        - buildoption: 'TEST_FRAMEWORK'</span><br><span style="color: hsl(120, 100%, 40%);">+    tags:</span><br><span style="color: hsl(120, 100%, 40%);">+        - pjsip</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+test-modules:</span><br><span style="color: hsl(120, 100%, 40%);">+    test-object:</span><br><span style="color: hsl(120, 100%, 40%);">+        config-section: test-object-config</span><br><span style="color: hsl(120, 100%, 40%);">+        typename: 'sipp.SIPpTestCase'</span><br><span style="color: hsl(120, 100%, 40%);">+    modules:</span><br><span style="color: hsl(120, 100%, 40%);">+        -</span><br><span style="color: hsl(120, 100%, 40%);">+            config-section: ami-config</span><br><span style="color: hsl(120, 100%, 40%);">+            typename: 'pluggable_modules.EventActionModule'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+test-object-config:</span><br><span style="color: hsl(120, 100%, 40%);">+    stop-after-scenarios: true</span><br><span style="color: hsl(120, 100%, 40%);">+    test-iterations:</span><br><span style="color: hsl(120, 100%, 40%);">+        -</span><br><span style="color: hsl(120, 100%, 40%);">+             scenarios:</span><br><span style="color: hsl(120, 100%, 40%);">+             # We're running 3 identical scenarios, each on a different port so</span><br><span style="color: hsl(120, 100%, 40%);">+             # we can make sure the proper contact URIs are being used.</span><br><span style="color: hsl(120, 100%, 40%);">+             # '-m' is set to the number of MessageSend actions to each port so</span><br><span style="color: hsl(120, 100%, 40%);">+             # sipp will stop the scenario cleanly when the correct number of</span><br><span style="color: hsl(120, 100%, 40%);">+             # MESSAGE messages have been processed.  The test stops when all the</span><br><span style="color: hsl(120, 100%, 40%);">+             # scenarios end.</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': { 'scenario':'message_recv.xml', '-i': '127.0.0.2', '-p':'5060', '-m':'6' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': [ '-bind_local' ] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': { 'scenario':'message_recv.xml', '-i': '127.0.0.2', '-p':'5061', '-m':'4' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': [ '-bind_local' ] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': { 'scenario':'message_recv.xml', '-i': '127.0.0.2', '-p':'5062', '-m':'5' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': [ '-bind_local' ] }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ami-config:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    # Notes:</span><br><span style="color: hsl(120, 100%, 40%);">+    #</span><br><span style="color: hsl(120, 100%, 40%);">+    # The RequestURIs returned on the TestEvent may have things like display</span><br><span style="color: hsl(120, 100%, 40%);">+    # name and <> in them which aren't valid for a real RequestURI.  That's OK</span><br><span style="color: hsl(120, 100%, 40%);">+    # as pjproject strips those out for us automatically.  The sipp scenario</span><br><span style="color: hsl(120, 100%, 40%);">+    # ensures that neither a display name nor the <> make it out in the</span><br><span style="color: hsl(120, 100%, 40%);">+    # MESSAGE RequestURI.</span><br><span style="color: hsl(120, 100%, 40%);">+    #</span><br><span style="color: hsl(120, 100%, 40%);">+    # Don't forget that all of the condition match values are regexes.</span><br><span style="color: hsl(120, 100%, 40%);">+    # This means that without the ^ and $ anchors, a match value that starts</span><br><span style="color: hsl(120, 100%, 40%);">+    # with "sipp" will match anything that starts with sipp.  That's why the ^</span><br><span style="color: hsl(120, 100%, 40%);">+    # and $ are in the MdataDestination match values.</span><br><span style="color: hsl(120, 100%, 40%);">+    #</span><br><span style="color: hsl(120, 100%, 40%);">+    # It's just not possible to test every single variation of destination</span><br><span style="color: hsl(120, 100%, 40%);">+    # but the below test _should_ test all of the code branches in</span><br><span style="color: hsl(120, 100%, 40%);">+    # res_pjsip_messaging.c</span><br><span style="color: hsl(120, 100%, 40%);">+    #</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-start:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # We're actually going to test some failures first since they'll never</span><br><span style="color: hsl(120, 100%, 40%);">+        # generate SIP messages.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to non-existent endpoint sippppp. We need the '/nada' to force</span><br><span style="color: hsl(120, 100%, 40%);">+        # sipppp to be recognized as an endpoint name.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:sippppp/nada',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12331' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { MdataDestination: '^sippppp/nada$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_ENDPOINT_URI_FAIL' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to non-existent endpoint sippppp.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:sippppp/user@somedest.com',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12332' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { MdataDestination: '^sippppp/nada$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_ENDPOINT_URI_FAIL' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to non-existent endpoint sippppp using dialplan style destination.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:PJSIP/user@sippppp',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12333' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { MdataDestination: '^PJSIP/user@sippppp$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_ENDPOINT_URI_FAIL' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to non-existent endpoint sippppp using dialplan style destination.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:PJSIP/sippppp',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12334' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { MdataDestination: '^PJSIP/sippppp$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_ENDPOINT_URI_FAIL' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # The endpoint exists but this format should never be used</span><br><span style="color: hsl(120, 100%, 40%);">+        # without a user preceeding the endpoint.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:PJSIP/sipp',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12361' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { MdataDestination: '^PJSIP/sipp$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_ENDPOINT_URI_FAIL' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Start of the real tests</span><br><span style="color: hsl(120, 100%, 40%);">+        # This set tests the endpoint/ scenarios</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Just send to endpoint sipp using its default aor and its configured</span><br><span style="color: hsl(120, 100%, 40%);">+        # contact uri 'sip:127.0.0.2'</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:sipp',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12341' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'sipp',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: 'sip:127.0.0.2',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^sipp$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to endpoint sipp using its sipp2 configured contact's uri</span><br><span style="color: hsl(120, 100%, 40%);">+        # 'sip:harry@127.0.0.2:5061'</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:sipp/sipp2',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12342' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'sipp',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: 'sip:harry@127.0.0.2:5061',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^sipp/sipp2$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to endpoint sipp with domain somedomain.com appended.</span><br><span style="color: hsl(120, 100%, 40%);">+        # Domain should be discarded and default aor used.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:sipp@somedomain.com',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12343' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'sipp',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: 'sip:127.0.0.2',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^sipp@somedomain.com$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to endpoint sipp with specified contact uri with no user or port.</span><br><span style="color: hsl(120, 100%, 40%);">+        # The endpoint's aors should be ignored.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:sipp/127.0.0.2',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12344' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'sipp',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: 'sip:127.0.0.2',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^sipp/127.0.0.2$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to endpoint sipp with specified contact uri with no port.</span><br><span style="color: hsl(120, 100%, 40%);">+        # The endpoint's aors should be ignored.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:sipp/charlie@127.0.0.2',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12345' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'sipp',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: 'sip:charlie@127.0.0.2',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^sipp/charlie@127.0.0.2$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to endpoint sipp with specified contact uri with no <> or user.</span><br><span style="color: hsl(120, 100%, 40%);">+        # The endpoint's aors should be ignored.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:sipp/127.0.0.2:5062',</span><br><span style="color: hsl(120, 100%, 40%);">+                Body: 'Test Message', Action: 'MessageSend', ActionID: '12346' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'sipp',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: 'sip:127.0.0.2:5062',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^sipp/127.0.0.2:5062$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to endpoint sipp with specified contact uri with no <> but with user.</span><br><span style="color: hsl(120, 100%, 40%);">+        # The endpoint's aors should be ignored.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:sipp/frank@127.0.0.2:5062',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12347' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'sipp',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: 'sip:frank@127.0.0.2:5062',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^sipp/frank@127.0.0.2:5062$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to endpoint sipp with specified contact uri with <>, display name and user.</span><br><span style="color: hsl(120, 100%, 40%);">+        # The endpoint's aors should be ignored.</span><br><span style="color: hsl(120, 100%, 40%);">+        # Although RequestURI shows the display name and <>, (which a real</span><br><span style="color: hsl(120, 100%, 40%);">+        # Request URI shouldn't have), pjproject will strip it out and sipp will</span><br><span style="color: hsl(120, 100%, 40%);">+        # verify that that happened.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:sipp/"Frankie" <sip:frank@127.0.0.2:5061>',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12348' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'sipp',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: '"Frankie" <sip:frank@127.0.0.2:5061>',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^sipp/"Frankie" <sip:frank@127.0.0.2:5061>$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # The following tests are URI only and should all use the default endpoint (which doesn't have an aor)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to specified contact uri with just host.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:127.0.0.2',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12351' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'default_endpoint',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: 'sip:127.0.0.2',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^127.0.0.2$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to specified contact uri with host and port.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:127.0.0.2:5062',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12352' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'default_endpoint',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: 'sip:127.0.0.2:5062',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^127.0.0.2:5062$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to specified contact uri with user, host and port.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:alice@127.0.0.2:5062',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12353' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'default_endpoint',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: 'sip:alice@127.0.0.2:5062',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^alice@127.0.0.2:5062$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to specified contact uri with scheme, user, host and port.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:sip:alice@127.0.0.2:5062',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12354' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'default_endpoint',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: 'sip:alice@127.0.0.2:5062',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^sip:alice@127.0.0.2:5062$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to specified contact uri with scheme, user, host and port. Add the <> to boot.</span><br><span style="color: hsl(120, 100%, 40%);">+        # Although RequestURI shows the <> (which a real Request URI shouldn't have), pjproject will</span><br><span style="color: hsl(120, 100%, 40%);">+        # strip it out and sipp will verify that that happened.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:<sip:alice@127.0.0.2:5061>',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12355' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'default_endpoint',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: '<sip:alice@127.0.0.2:5061>',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^<sip:alice@127.0.0.2:5061>$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Send to specified contact uri with scheme, user, host and port.</span><br><span style="color: hsl(120, 100%, 40%);">+        # Add the display name and <> to boot.</span><br><span style="color: hsl(120, 100%, 40%);">+        # Although RequestURI shows the display name and <> (which a real Request</span><br><span style="color: hsl(120, 100%, 40%);">+        # URI shouldn't have), pjproject will strip it out and sipp will verify</span><br><span style="color: hsl(120, 100%, 40%);">+        # that that happened.</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:"Alice" <sip:alice@127.0.0.2:5061>',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12356' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'default_endpoint',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: '"Alice" <sip:alice@127.0.0.2:5061>',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^"Alice" <sip:alice@127.0.0.2:5061>$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # The final test is for the dialstring format</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions: { action: { To: 'pjsip:PJSIP/8005551212@sipp',</span><br><span style="color: hsl(120, 100%, 40%);">+            Body: 'Test Message', Action: 'MessageSend', ActionID: '12361' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    -   ami-events: { conditions: { match: { Endpoint: 'sipp',</span><br><span style="color: hsl(120, 100%, 40%);">+            RequestURI: 'sip:8005551212@127.0.0.2',</span><br><span style="color: hsl(120, 100%, 40%);">+            MdataDestination: '^PJSIP/8005551212@sipp$',</span><br><span style="color: hsl(120, 100%, 40%);">+            Event: 'TestEvent', State: 'MSG_FROMTO_URI' } }, count: 1 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/channels/pjsip/message/tests.yaml b/tests/channels/pjsip/message/tests.yaml</span><br><span>index ab504d9..bc99fa0 100644</span><br><span>--- a/tests/channels/pjsip/message/tests.yaml</span><br><span>+++ b/tests/channels/pjsip/message/tests.yaml</span><br><span>@@ -10,3 +10,4 @@</span><br><span>     - test: 'message_send_ami'</span><br><span>     - test: 'message_to_uri'</span><br><span>     - test: 'message_confbridge'</span><br><span style="color: hsl(120, 100%, 40%);">+    - test: 'message_destination_parsing'</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/testsuite/+/16062">change 16062</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/testsuite/+/16062"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: testsuite </div>
<div style="display:none"> Gerrit-Branch: 16 </div>
<div style="display:none"> Gerrit-Change-Id: I90512f7e85a2e4ce32dbcc8b2cb2dfac801189c6 </div>
<div style="display:none"> Gerrit-Change-Number: 16062 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>