[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