[Asterisk-code-review] Test for PJSIP message destination parsing (testsuite[16])

George Joseph asteriskteam at digium.com
Wed Jun 9 17:01:40 CDT 2021


George Joseph has uploaded this change for review. ( https://gerrit.asterisk.org/c/testsuite/+/16062 )


Change subject: Test for PJSIP message destination parsing
......................................................................

Test for PJSIP message destination parsing

Also updated contrib/sipp/sipp.dtd to make it
match the sipp docs.

ASTERISK_29404

Change-Id: I90512f7e85a2e4ce32dbcc8b2cb2dfac801189c6
---
M contrib/sipp/sipp.dtd
A tests/channels/pjsip/message/message_destination_parsing/configs/ast1/extensions.conf
A tests/channels/pjsip/message/message_destination_parsing/configs/ast1/pjsip.conf
A tests/channels/pjsip/message/message_destination_parsing/sipp/message_recv.xml
A tests/channels/pjsip/message/message_destination_parsing/test-config.yaml
M tests/channels/pjsip/message/tests.yaml
6 files changed, 389 insertions(+), 2 deletions(-)



  git pull ssh://gerrit.asterisk.org:29418/testsuite refs/changes/62/16062/1

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

-- 
To view, visit https://gerrit.asterisk.org/c/testsuite/+/16062
To unsubscribe, or for help writing mail filters, visit https://gerrit.asterisk.org/settings

Gerrit-Project: testsuite
Gerrit-Branch: 16
Gerrit-Change-Id: I90512f7e85a2e4ce32dbcc8b2cb2dfac801189c6
Gerrit-Change-Number: 16062
Gerrit-PatchSet: 1
Gerrit-Owner: George Joseph <gjoseph at digium.com>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20210609/8a7c290a/attachment-0001.html>


More information about the asterisk-code-review mailing list