Ë
    ojšc  ã                   ó¼  — d Z ddlmZmZ ddlmZmZ ddlmZ ddl	m
Z
 	 ddlmZ ddlmZ d	d
j!                  dd«      z   Zdj!                  dd«      Zdj!                  dd«      Zdj!                  dd«      Zdj!                  dd«      Zdj!                  dd«      Zdj!                  dd«      Zdj!                  dd«      Z G d„ d«      Z G d„ de
j4                  «      Z G d„ de«      Z G d„ de
j4                  «      Z G d„ de
j4                  «      Z G d„ de
j4                  «      Z G d „ d!e
j4                  «      Z  eejB                  «       G d"„ d#«      «       Z" eejB                  «       G d$„ d%«      «       Z# G d&„ d'e
j4                  «      Z$ G d(„ d)e
j4                  «      Z% G d*„ d+ejL                  «      Z' G d,„ d-e
j4                  «      Z(y# e$ r dZY �Œ´w xY w).z(
Session Initialization Protocol tests.
é    )ÚcheckersÚportal)ÚdeferÚreactor)Úsip)Úunittest)ÚAsyncioSelectorReactorN)Úimplementerz


z?INVITE sip:foo SIP/2.0
From: mo
To: joe
Content-Length: 4

abcdú
z
z-INVITE sip:foo SIP/2.0
From: mo
To: joe

1234zHINVITE sip:foo SIP/2.0
From: mo
To: joe
Content-Length: 4

1234

lalalalz½INVITE sip:foo SIP/2.0
From: mo
To: joe
Content-Length: 0

INVITE sip:loop SIP/2.0
From: foo
To: bar
Content-Length: 4

abcdINVITE sip:loop SIP/2.0
From: foo
To: bar
Content-Length: 4

1234z4SIP/2.0 200 OK
From:  foo
To:bar
Content-Length: 0

z.INVITE sip:foo SIP/2.0
f: mo
t: joe
l: 4

abcdz=INVITE sip:foo SIP/2.0
Via: SIP/2.0/UDP 10.0.0.1:5060;rport

aý  SIP/2.0 200 OK
Via: SIP/2.0/UDP server10.biloxi.com
    ;branch=z9hG4bKnashds8;received=192.0.2.3
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com
    ;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com
    ;branch=z9hG4bK776asdhds ;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 INVITE
Contact: <sip:bob@192.0.2.4>
Content-Type: application/sdp
Content-Length: 0

c                   ó   — e Zd Zd„ Zy)Ú	TestRealmc                 ó*   — t         j                  d d„ fS )Nc                   ó   — y ©N© r   ó    ú7/usr/lib/python3/dist-packages/twisted/test/test_sip.pyú<lambda>z)TestRealm.requestAvatar.<locals>.<lambda>€   s   � r   )r   ÚIContact)ÚselfÚavatarIdÚmindÚ
interfacess       r   ÚrequestAvatarzTestRealm.requestAvatar   s   € Ü�|‰|˜T¡<Ð/Ð/r   N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   ~   s   „ ó0r   r   c                   óH   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zy)ÚMessageParsingTestsc                 ón   — g | _         t        j                  | j                   j                  «      | _        y r   )Úlr   ÚMessagesParserÚappendÚparser©r   s    r   ÚsetUpzMessageParsingTests.setUp„   s#   € ØˆŒÜ×(Ñ(¨¯©¯©Ó7ˆ�r   c                 ón   — | j                   j                  |«       | j                   j                  «        y r   ©r$   ÚdataReceivedÚdataDone)r   Úmessages     r   ÚfeedMessagezMessageParsingTests.feedMessageˆ   s$   € Ø�‰× Ñ  Ô)Ø�‰×ÑÕr   c                 ó8  — | j                  |j                  |«       | j                  |j                  j                  «       |«       | j                  |j                  |«       | j                  |j
                  |«       | j                  |j                  d«       y)z$
        Validate Requests.
        é   N)ÚassertEqualÚmethodÚuriÚtoStringÚheadersÚbodyÚfinished)r   Úmr0   r1   r3   r4   s         r   ÚvalidateMessagez#MessageParsingTests.validateMessageŒ   so   € ð 	×Ñ˜Ÿ™ 6Ô*Ø×Ñ˜Ÿ™Ÿ™Ó)¨3Ô/Ø×Ñ˜Ÿ™ GÔ,Ø×Ñ˜Ÿ™ Ô&Ø×Ñ˜Ÿ™ QÕ'r   c           	      óº   — | j                   }| j                  t        «       | j                  t	        |«      d«       | j                  |d   dddgdgdgdœd	«       y ©
Nr.   r   ÚINVITEúsip:fooÚmoÚjoeÚ4©ÚfromÚtozcontent-lengthÚabcd)r!   r,   Úrequest1r/   Úlenr7   ©r   r!   s     r   Ú
testSimplezMessageParsingTests.testSimple–   ó[   € Ø�F‰FˆØ×ÑœÔ"Ø×Ñœ˜Q› Ô#Ø×ÑØˆa‰DØØØ�V E 7¸s¸eÑDØõ	
r   c           	      ó  — | j                   }| j                  t        «       | j                  t        «       | j	                  t        |«      d«       | j                  |d   dddgdgdgdœd	«       | j                  |d
   dddgdgdœd«       y )Né   r   r:   r;   r<   r=   r>   r?   rB   r.   )r@   rA   Ú1234)r!   r,   rC   Úrequest2r/   rD   r7   rE   s     r   ÚtestTwoMessagesz#MessageParsingTests.testTwoMessages¢   s‘   € Ø�F‰FˆØ×ÑœÔ"Ø×ÑœÔ"Ø×Ñœ˜Q› Ô#Ø×ÑØˆa‰DØØØ�V E 7¸s¸eÑDØô	
ð 	×ÑØˆa‰D�(˜I°°¸u¸gÑ'FÈõ	
r   c           	      óº   — | j                   }| j                  t        «       | j                  t	        |«      d«       | j                  |d   dddgdgdgdœd	«       y )
Nr.   r   r:   r;   r<   r=   r>   r?   rJ   )r!   r,   Úrequest3r/   rD   r7   rE   s     r   ÚtestGarbagezMessageParsingTests.testGarbage²   rG   r   c           	      ó6  — | j                   }| j                  t        «       | j                  t	        |«      d«       | j                  |d   dddgdgdgdœd	«       | j                  |d
   dddgdgdgdœd«       | j                  |d   dddgdgdgdœd«       y )Né   r   r:   r;   r<   r=   Ú0r?   Ú r.   zsip:loopÚfooÚbarr>   rB   rI   rJ   )r!   r,   Úrequest4r/   rD   r7   rE   s     r   ÚtestThreeInOnez"MessageParsingTests.testThreeInOne¾   s»   € Ø�F‰FˆØ×ÑœÔ"Ø×Ñœ˜Q› Ô#Ø×ÑØˆa‰DØØØ�V E 7¸s¸eÑDØô	
ð 	×ÑØˆa‰DØØØ�W U GÀ¸uÑEØô	
ð 	×ÑØˆa‰DØØØ�W U GÀ¸uÑEØõ	
r   c           	      óº   — | j                   }| j                  t        «       | j                  t	        |«      d«       | j                  |d   dddgdgdgdœd	«       y r9   )r!   r,   Úrequest_shortr/   rD   r7   rE   s     r   Ú	testShortzMessageParsingTests.testShortØ   s[   € Ø�F‰FˆØ×ÑœÔ'Ø×Ñœ˜Q› Ô#Ø×ÑØˆa‰DØØØ�V E 7¸s¸eÑDØõ	
r   c                 ó¬  — | j                   }| j                  t        «       | j                  t	        |«      d«       |d   }| j                  |j
                  d«       | j                  |j                  d«       | j                  |j                  dgdgdgdœ«       | j                  |j                  d	«       | j                  |j                  d«       y )
Nr.   r   éÈ   ÚOKrT   rU   rR   r?   rS   )
r!   r,   Ú	response1r/   rD   ÚcodeÚphraser3   r4   r5   ©r   r!   r6   s      r   ÚtestSimpleResponsez&MessageParsingTests.testSimpleResponseä   s¬   € Ø�F‰FˆØ×ÑœÔ#Ø×Ñœ˜Q› Ô#Øˆa‰DˆØ×Ñ˜Ÿ™ Ô%Ø×Ñ˜Ÿ™ 4Ô(Ø×ÑØ�I‰I  °¨wÈ3È%ÑPô	
ð 	×Ñ˜Ÿ™ Ô$Ø×Ñ˜Ÿ™ QÕ'r   c                 óR  — | j                   }| j                  t        «       | j                  t	        |«      d«       |d   }| j                  |j
                  d   d   d«       | j                  |j
                  d   d   d«       | j                  |j
                  d   d   d«       y)	zv
        A header may be split across multiple lines.  Subsequent lines begin
        with C{" "} or C{"\t"}.
        r.   r   ÚviazHSIP/2.0/UDP server10.biloxi.com;branch=z9hG4bKnashds8;received=192.0.2.3zVSIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2rI   zHSIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.1N)r!   r,   Úresponse_multiliner/   rD   r3   ra   s      r   Útest_multiLinez"MessageParsingTests.test_multiLineñ   s©   € ð
 �F‰FˆØ×ÑÔ+Ô,Ø×Ñœ˜Q› Ô#Øˆa‰DˆØ×ÑØ�I‰I�eÑ˜QÑð7ô	
ð
 	×ÑØ�I‰I�eÑ˜QÑð?ô	
ð
 	×ÑØ�I‰I�eÑ˜QÑð:õ	
r   N)r   r   r   r&   r,   r7   rF   rL   rO   rW   rZ   rb   rf   r   r   r   r   r   ƒ   s4   „ ò8òò(ò

ò
ò 

ò
ò4

ò(ó
r   r   c                   ó   — e Zd ZdZd„ Zy)Ú%MessageParsingFeedDataCharByCharTestsz9
    Same as base class, but feed data char by char.
    c                 ó|   — |D ]  }| j                   j                  |«       Œ | j                   j                  «        y r   r(   )r   r+   Úcs      r   r,   z1MessageParsingFeedDataCharByCharTests.feedMessage  s3   € Øò 	(ˆAØ�K‰K×$Ñ$ QÕ'ð	(à�‰×ÑÕr   N)r   r   r   Ú__doc__r,   r   r   r   rh   rh     s   „ ñór   rh   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚMakeMessageTestsc                 ó”   — t        j                  dd«      }|j                  dd«       | j                  |j	                  «       d«       y )Nr:   r;   rT   rU   z$INVITE sip:foo SIP/2.0
Foo: bar

)r   ÚRequestÚ	addHeaderr/   r2   ©r   Úrs     r   ÚtestRequestzMakeMessageTests.testRequest  s7   € Ü�K‰K˜ )Ó,ˆØ	�‰�E˜5Ô!Ø×Ñ˜Ÿ™›Ð'SÕTr   c                 óÚ   — t        j                  dd«      }|j                  dd«       |j                  dd«       |j                  d«       | j	                  |j                  «       d«       y )	Nr\   r]   rT   rU   zContent-Lengthr>   rJ   z3SIP/2.0 200 OK
Foo: bar
Content-Length: 4

1234)r   ÚResponserp   ÚbodyDataReceivedr/   r2   rq   s     r   ÚtestResponsezMakeMessageTests.testResponse  sW   € Ü�L‰L˜˜dÓ#ˆØ	�‰�E˜5Ô!Ø	�‰Ð$ cÔ*Ø	×Ñ˜6Ô"Ø×ÑØ�J‰J‹LÐWõ	
r   c                 ón   — t        j                  d«      }| j                  |j                  «       d«       y )Nr\   zSIP/2.0 200 OK

)r   ru   r/   r2   rq   s     r   ÚtestStatusCodezMakeMessageTests.testStatusCode%  s'   € Ü�L‰L˜ÓˆØ×Ñ˜Ÿ™›Ð'?Õ@r   N)r   r   r   rs   rw   ry   r   r   r   rm   rm     s   „ òUò

óAr   rm   c                   óH   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zy)ÚViaTestsc                 óŠ   — |j                  «       }| j                  |t        j                  |«      j                  «       «       y r   )r2   r/   r   ÚparseViaHeader)r   ÚvÚss      r   ÚcheckRoundtripzViaTests.checkRoundtrip+  s1   € Ø�J‰J‹LˆØ×Ñ˜œC×.Ñ.¨qÓ1×:Ñ:Ó<Õ=r   c                 ó<  — t        j                  d«      }t        j                  d«      }| j                  |j                  |j                  «       | j                  |j                  |j                  «       | j                  |j
                  |j
                  «       y )NzSIP/2.0/UDP 192.168.1.1:5060z SIP/2.0/UDP     192.168.1.1:5060)r   r}   r/   Ú	transportÚhostÚport)r   Úv1Úv2s      r   ÚtestExtraWhitespacezViaTests.testExtraWhitespace/  sl   € Ü×ÑÐ >Ó?ˆÜ×ÑÐ BÓCˆØ×Ñ˜Ÿ™ r§|¡|Ô4Ø×Ñ˜Ÿ™ "§'¡'Ô*Ø×Ñ˜Ÿ™ "§'¡'Õ*r   c                 ó¾  — d}t        j                  |«      }| j                  |j                  d«       | j                  |j                  d«       | j                  |j
                  d«       | j                  |j                  «       | j                  |j                  «       | j                  |j                  «       | j                  |j                  d«       | j                  |j                  d«       | j                  |j                  d«       | j                  |j                  d«       | j                  |j                  «       d	«       | j!                  |«       y
)zC
        Test parsing a Via header with one of everything.
        zVSIP/2.0/UDP first.example.com:4000;ttl=16;maddr=224.2.0.1 ;branch=a7c6a8dlze (Example)ÚUDPzfirst.example.comi   é   z	224.2.0.1Ú
a7c6a8dlzer   zKSIP/2.0/UDP first.example.com:4000;ttl=16;branch=a7c6a8dlze;maddr=224.2.0.1N)r   r}   r/   r‚   rƒ   r„   ÚassertIsNoneÚrportÚ
rportValueÚassertFalseÚrportRequestedÚttlÚmaddrÚbranchÚhiddenr2   r€   ©r   r   r~   s      r   Útest_complexzViaTests.test_complex6  s  € ð
,ð 	
ô ×Ñ˜qÓ!ˆØ×Ñ˜Ÿ™ eÔ,Ø×Ñ˜Ÿ™Ð!4Ô5Ø×Ñ˜Ÿ™ Ô&Ø×Ñ˜!Ÿ'™'Ô"Ø×Ñ˜!Ÿ,™,Ô'Ø×Ñ˜×)Ñ)Ô*Ø×Ñ˜Ÿ™ Ô#Ø×Ñ˜Ÿ™ +Ô.Ø×Ñ˜Ÿ™ <Ô0Ø×Ñ˜Ÿ™ 1Ô%Ø×ÑØ�J‰J‹Lð8ô	
ð
 	×Ñ˜AÕr   c                 ó¶  — d}t        j                  |«      }| j                  |j                  d«       | j                  |j                  d«       | j                  |j
                  d«       | j                  |j                  «       | j                  |j                  «       | j                  |j                  «       | j                  |j                  «       | j                  |j                  «       | j                  |j                  «       | j                  |j                  «       | j                  |j!                  «       d«       | j#                  |«       y)z3
        Test parsing a simple Via header.
        zSIP/2.0/UDP example.com;hiddenr‰   úexample.coméÄ  z#SIP/2.0/UDP example.com:5060;hiddenN)r   r}   r/   r‚   rƒ   r„   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   Ú
assertTruer”   r2   r€   r•   s      r   Útest_simplezViaTests.test_simpleP  sø   € ð -ˆÜ×Ñ˜qÓ!ˆØ×Ñ˜Ÿ™ eÔ,Ø×Ñ˜Ÿ™ Ô/Ø×Ñ˜Ÿ™ Ô&Ø×Ñ˜!Ÿ'™'Ô"Ø×Ñ˜!Ÿ,™,Ô'Ø×Ñ˜×)Ñ)Ô*Ø×Ñ˜!Ÿ%™%Ô Ø×Ñ˜!Ÿ'™'Ô"Ø×Ñ˜!Ÿ(™(Ô#Ø�‰˜Ÿ™Ô!Ø×Ñ˜Ÿ™›Ð'LÔMØ×Ñ˜AÕr   c                 óP   — t        j                  d«      }| j                  |«       y )Nr˜   )r   ÚViar€   ©r   r~   s     r   ÚtestSimplerzViaTests.testSimplerc  s   € Ü�G‰G�MÓ"ˆØ×Ñ˜AÕr   c                 óì  — t        j                  dd¬«      }| j                  | j                  g¬«      }| j	                  t        |«      d«       | j	                  |d   d   d«       | j	                  |d   d	   t        «       | j	                  |j                  «       d
«       | j                  |j                  «       | j                  |j                  «       | j                  |j                  «       y)z|
        Setting rport to True is deprecated, but still produces a Via header
        with the expected properties.
        úfoo.barT©r�   ©ÚoffendingFunctionsr.   r   r+   ú+rport=True is deprecated since Twisted 9.0.ÚcategoryúSIP/2.0/UDP foo.bar:5060;rportN)r   r�   ÚflushWarningsÚtest_deprecatedRPortr/   rD   ÚDeprecationWarningr2   rš   r�   r�   rŒ   rŽ   )r   r~   Úwarningss      r   r©   zViaTests.test_deprecatedRPortg  sÈ   € ô
 �G‰G�I TÔ*ˆà×%Ñ%¸$×:SÑ:SÐ9TÐ%ÓUˆØ×Ñœ˜X›¨Ô*Ø×ÑØ�Q‰K˜	Ñ"Ð$Qô	
ð 	×Ñ˜ !™ ZÑ0Ô2DÔEà×Ñ˜Ÿ™›Ð'GÔHØ�‰˜Ÿ™Ô Ø�‰˜×(Ñ(Ô)Ø×Ñ˜!Ÿ,™,Õ'r   c                 óÞ   — t        j                  dd¬«      }| j                  |j                  «       d«       | j	                  |j
                  «       | j                  |j                  «       y)zU
        An rport setting of None should insert the parameter with no value.
        r¡   Nr¢   r§   )r   r�   r/   r2   rš   r�   rŒ   rŽ   rž   s     r   Ú
test_rportzViaTests.test_rportz  sO   € ô �G‰G�I TÔ*ˆØ×Ñ˜Ÿ™›Ð'GÔHØ�‰˜×(Ñ(Ô)Ø×Ñ˜!Ÿ,™,Õ'r   c                 ó  — t        j                  dd¬«      }| j                  |j                  «       d«       | j	                  |j
                  «       | j                  |j                  d«       | j                  |j                  d«       y)zk
        An rport numeric setting should insert the parameter with the number
        value given.
        r¡   r.   r¢   z SIP/2.0/UDP foo.bar:5060;rport=1N)r   r�   r/   r2   r�   r�   rŽ   r�   rž   s     r   Útest_rportValuezViaTests.test_rportValueƒ  sg   € ô
 �G‰G�I QÔ'ˆØ×Ñ˜Ÿ™›Ð'IÔJØ×Ñ˜×)Ñ)Ô*Ø×Ñ˜Ÿ™ qÔ)Ø×Ñ˜Ÿ™ !Õ$r   c                 ó¨  — d}t        j                  |«      }| j                  |j                  d«       | j                  |j                  d«       | j                  |j
                  d«       | j                  |j                  d«       | j                  |j                  d«       | j                  |j                  «       j                  d«      d«       y )	Nz8SIP/2.0/UDP 10.0.0.1:5060;received=22.13.1.5;rport=12345r‰   ú10.0.0.1r™   z	22.13.1.5i90  zrport=12345éÿÿÿÿ)r   r}   r/   r‚   rƒ   r„   Úreceivedr�   ÚassertNotEqualr2   Úfindr•   s      r   ÚtestNATzViaTests.testNATŽ  sœ   € ØFˆÜ×Ñ˜qÓ!ˆØ×Ñ˜Ÿ™ eÔ,Ø×Ñ˜Ÿ™ Ô,Ø×Ñ˜Ÿ™ Ô&Ø×Ñ˜Ÿ™ [Ô1Ø×Ñ˜Ÿ™ %Ô(à×Ñ˜AŸJ™J›L×-Ñ-¨mÓ<¸bÕAr   c                 ór   — d}t        j                  |«      }| j                  |j                  «       |«       y)zZ
        Parsing and serializing Via headers with unknown parameters should work.
        z?SIP/2.0/UDP example.com:5060;branch=a12345b;bogus;pie=deliciousN)r   r}   r/   r2   r•   s      r   Útest_unknownParamszViaTests.test_unknownParams™  s0   € ð NˆÜ×Ñ˜qÓ!ˆØ×Ñ˜Ÿ™› qÕ)r   N)r   r   r   r€   r‡   r–   r›   rŸ   r©   r­   r¯   r¶   r¸   r   r   r   r{   r{   *  s5   „ ò>ò+òò4ò&ò(ò&(ò	%ò	Bó*r   r{   c                   ó   — e Zd Zd„ Zd„ Zy)ÚURLTestsc                 óx   — dD ]5  }| j                  t        j                  |«      j                  «       |«       Œ7 y )N)zsip:j.doe@big.comz&sip:j.doe:secret@big.com;transport=tcpz!sip:j.doe@big.com?subject=projectzsip:example.com)r/   r   ÚparseURLr2   )r   Úurls     r   ÚtestRoundtripzURLTests.testRoundtrip£  s9   € ð
ò 	@ˆCð ×ÑœSŸ\™\¨#Ó.×7Ñ7Ó9¸3Õ?ñ	@r   c                 ó¦   — d}t        j                  |«      }dddddddd	d
dddgfddddœffD ]!  \  }}| j                  t        ||«      |«       Œ# y )Nzesip:user:pass@hosta:123;transport=udp;user=phone;method=foo;ttl=12;maddr=1.2.3.4;blah;goo=bar?a=b&c=d)ÚusernameÚuser)ÚpasswordÚpass)rƒ   Úhosta)r„   é{   )r‚   Úudp)ÚusertypeÚphone)r0   rT   )r‘   é   )r’   ú1.2.3.4ÚotherÚblahzgoo=barr3   ÚbÚd)Úarj   )r   r¼   r/   Úgetattr)r   r   r½   Úkr~   s        r   ÚtestComplexzURLTests.testComplex¬  s}   € ð8ð 	
ô �l‰l˜1‹oˆà Ø ØØØ Ø!ØØØ Ø�v˜yÐ)Ð*Ø˜c¨Ñ,Ð-ð
ò 	1‰DˆAˆqð ×ÑœW S¨!›_¨aÕ0ñ	1r   N)r   r   r   r¾   rÒ   r   r   r   rº   rº   ¢  s   „ ò@ó1r   rº   c                   ó   — e Zd Zd„ Zy)Ú
ParseTestsc           
      ó  — dddi fdddi fdddi fdddi fdd	dd
ddœffD ]d  \  }}}}t        j                  |«      \  }}}| j                  ||«       | j                  |j                  «       |«       | j                  ||«       Œf y )Nz""A. G. Bell" <sip:foo@example.com>z
A. G. Bellzsip:foo@example.comzAnon <sip:foo@example.com>ÚAnonrS   z<sip:foo@example.com>z)foo <sip:foo@example.com>;tag=bar;foo=bazrT   rU   Úbaz)ÚtagrT   )r   ÚparseAddressr/   r2   )r   ÚaddressÚnameÚurlsÚparamsÚgnameÚgurlÚgparamss           r   ÚtestParseAddresszParseTests.testParseAddressÃ  s½   € ð 5ØØ%Øð	ð *¨6Ð3HÈ"ÐMØ" BÐ(=¸rÐBØ$ bÐ*?ÀÐDà;ØØ%Ø eÑ,ð	ð,
ò 	.Ñ'ˆG�T˜4 ô" $'×#3Ñ#3°GÓ#<Ñ ˆE�4˜Ø×Ñ˜T 5Ô)Ø×Ñ˜TŸ]™]›_¨dÔ3Ø×Ñ˜W fÕ-ñ)	.r   N)r   r   r   rá   r   r   r   rÔ   rÔ   Â  s   „ ó.r   rÔ   c                   ó   — e Zd Zd„ Zy)ÚDummyLocatorc                 óV   — t        j                  t        j                  dd¬«      «      S )Nú
server.comr™   ©r„   )r   Úsucceedr   ÚURL©r   Ú
logicalURLs     r   Ú
getAddresszDummyLocator.getAddressÝ  s   € Ü�}‰}œSŸW™W \¸Ô=Ó>Ð>r   N©r   r   r   rë   r   r   r   rã   rã   Û  s   „ ó?r   rã   c                   ó   — e Zd Zd„ Zy)ÚFailingLocatorc                 ó<   — t        j                  t        «       «      S r   )r   ÚfailÚLookupErrorré   s     r   rë   zFailingLocator.getAddressã  s   € Ü�z‰zœ+›-Ó(Ð(r   Nrì   r   r   r   rî   rî   á  s   „ ó)r   rî   c                   óB   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy
)Ú
ProxyTestsc                 ó¢   ‡ — t        j                  d«      ‰ _        t        «       ‰ j                  _        g ‰ _        ˆ fd„‰ j                  _        y )Nú	127.0.0.1c                 ó>   •— ‰j                   j                  | |f«      S r   ©Úsentr#   ©ÚdestÚmsgr   s     €r   r   z"ProxyTests.setUp.<locals>.<lambda>ì  ó   ø€ °4·9±9×3CÑ3CÀTÈ3ÀKÓ3P€ r   )r   ÚProxyÚproxyrã   Úlocatorrø   ÚsendMessager%   s   `r   r&   zProxyTests.setUpè  s4   ø€ Ü—Y‘Y˜{Ó+ˆŒ
Ü)›^ˆ�
‰
ÔØˆŒ	Û!Pˆ�
‰
Õr   c                 óh  — t        j                  dd«      }|j                  dt        j                  d«      j	                  «       «       |j                  dt        j                  d«      j	                  «       «       |j                  dd«       |j                  dd	«       |j                  d
d«       | j
                  j                  |j	                  «       d«       | j                  t        | j                  «      d«       | j                  d   \  }}| j                  |j                  d«       | j                  |j                  d«       | j                  |j                  j	                  «       d«       | j                  |j                  d«       | j                  |j                  d   g d¢«       y )Nr:   r;   rd   rÊ   z1.2.3.5rT   rU   rA   ú<sip:joe@server.com>Úcontactz<sip:joe@1.2.3.5>©rÊ   r™   r.   r   r™   rå   )úSIP/2.0/UDP 127.0.0.1:5060úSIP/2.0/UDP 1.2.3.4:5060zSIP/2.0/UDP 1.2.3.5:5060)r   ro   rp   r�   r2   rþ   ÚdatagramReceivedr/   rD   rø   r„   rƒ   r1   r0   r3   ©r   rr   rú   r6   s       r   ÚtestRequestForwardzProxyTests.testRequestForwardî  s8  € Ü�K‰K˜ )Ó,ˆØ	�‰�Eœ3Ÿ7™7 9Ó-×6Ñ6Ó8Ô9Ø	�‰�Eœ3Ÿ7™7 9Ó-×6Ñ6Ó8Ô9Ø	�‰�E˜5Ô!Ø	�‰�DÐ0Ô1Ø	�‰�IÐ2Ô3Ø�
‰
×#Ñ# A§J¡J£LÐ2CÔDØ×Ñœ˜TŸY™Y›¨Ô+Ø—)‘)˜A‘,‰ˆˆaØ×Ñ˜Ÿ™ DÔ)Ø×Ñ˜Ÿ™ LÔ1Ø×Ñ˜Ÿ™Ÿ™Ó)¨9Ô5Ø×Ñ˜Ÿ™ 8Ô,Ø×ÑØ�I‰I�eÑòõ	
r   c                 ó¼  — t        j                  dd«      }|j                  dt        j                  d«      j	                  «       «       |j                  dd«       |j                  dd«       |j                  d	d
«       | j
                  j                  |j	                  «       d«       | j                  d   \  }}| j                  |j                  d   ddg«       y )Nr:   r;   rd   rÊ   rT   rU   rA   r  r  z<sip:joe@1.2.3.4>©z1.1.1.1r™   r   r  z)SIP/2.0/UDP 1.2.3.4:5060;received=1.1.1.1)
r   ro   rp   r�   r2   rþ   r  rø   r/   r3   r  s       r   ÚtestReceivedRequestForwardz%ProxyTests.testReceivedRequestForward  s­   € Ü�K‰K˜ )Ó,ˆØ	�‰�Eœ3Ÿ7™7 9Ó-×6Ñ6Ó8Ô9Ø	�‰�E˜5Ô!Ø	�‰�DÐ0Ô1Ø	�‰�IÐ2Ô3Ø�
‰
×#Ñ# A§J¡J£LÐ2CÔDØ—)‘)˜A‘,‰ˆˆaØ×ÑØ�I‰I�eÑØ)Ð+VÐWõ	
r   c                 ó2  — t        j                  d«      }|j                  dt        j                  d«      j	                  «       «       | j
                  j                  |j	                  «       d«       | j                  t        | j                  «      d«       y )Nr\   rd   úfoo.comr  r   )
r   ru   rp   r�   r2   rþ   r  r/   rD   rø   rq   s     r   ÚtestResponseWrongViazProxyTests.testResponseWrongVia  sc   € ä�L‰L˜ÓˆØ	�‰�Eœ3Ÿ7™7 9Ó-×6Ñ6Ó8Ô9Ø�
‰
×#Ñ# A§J¡J£LÐ2CÔDØ×Ñœ˜TŸY™Y›¨Õ+r   c                 óˆ  — t        j                  d«      }|j                  dt        j                  d«      j	                  «       «       |j                  dt        j                  dd¬«      j	                  «       «       | j
                  j                  |j	                  «       d«       | j                  t        | j                  «      d«       | j                  d	   \  }}| j                  |j                  |j                  fd
«       | j                  |j                  d«       | j                  |j                  d   dg«       y )Nr\   rd   rõ   ú
client.coméÒ  ræ   r  r.   r   )r  r  zSIP/2.0/UDP client.com:1234)r   ru   rp   r�   r2   rþ   r  r/   rD   rø   rƒ   r„   r_   r3   r  s       r   ÚtestResponseForwardzProxyTests.testResponseForward  så   € Ü�L‰L˜ÓˆØ	�‰�Eœ3Ÿ7™7 ;Ó/×8Ñ8Ó:Ô;Ø	�‰�Eœ3Ÿ7™7 <°dÔ;×DÑDÓFÔGØ�
‰
×#Ñ# A§J¡J£LÐ2CÔDØ×Ñœ˜TŸY™Y›¨Ô+Ø—)‘)˜A‘,‰ˆˆaØ×Ñ˜$Ÿ)™) T§Y¡YÐ/Ð1EÔFØ×Ñ˜Ÿ™ Ô%Ø×Ñ˜Ÿ™ 5Ñ)Ð,IÐ+JÕKr   c                 ó  — t        j                  d«      }|j                  dt        j                  d«      j	                  «       «       |j                  dt        j                  dd¬«      j	                  «       «       | j
                  j                  |j	                  «       d«       | j                  t        | j                  «      d«       | j                  d	   \  }}| j                  |j                  |j                  fd
«       y )Nr\   rd   rõ   r±   r  )r³   r  r.   r   ©r  r™   )r   ru   rp   r�   r2   rþ   r  r/   rD   rø   rƒ   r„   r  s       r   ÚtestReceivedResponseForwardz&ProxyTests.testReceivedResponseForward$  s´   € Ü�L‰L˜ÓˆØ	�‰�Eœ3Ÿ7™7 ;Ó/×8Ñ8Ó:Ô;Ø	�‰�Eœ3Ÿ7™7 :¸ÔE×NÑNÓPÔQØ�
‰
×#Ñ# A§J¡J£LÐ2CÔDØ×Ñœ˜TŸY™Y›¨Ô+Ø—)‘)˜A‘,‰ˆˆaØ×Ñ˜$Ÿ)™) T§Y¡YÐ/Ð1EÕFr   c                 óþ  ‡— t        j                  d«      }|j                  dt        j                  d«      j	                  «       «       g Šˆfd„| j
                  _        | j
                  j                  |j	                  «       d«       | j                  t        ‰«      d«       ‰d   \  }}| j                  t        |j                  j                  dg «      «      d«       | j                  |j                  d«       y )Nr\   rd   rõ   c                  ó&   •— ‰j                  | «      S r   )r#   )rÏ   r!   s    €r   r   z-ProxyTests.testResponseToUs.<locals>.<lambda>1  s   ø€ ¨A¯H©H°Q«K€ r   r  r.   r   )r   ru   rp   r�   r2   rþ   ÚgotResponser  r/   rD   r3   Úgetr_   )r   rr   r6   Úaddrr!   s       @r   ÚtestResponseToUszProxyTests.testResponseToUs-  s¶   ø€ Ü�L‰L˜ÓˆØ	�‰�Eœ3Ÿ7™7 ;Ó/×8Ñ8Ó:Ô;ØˆÛ!7ˆ�
‰
ÔØ�
‰
×#Ñ# A§J¡J£LÐ2CÔDØ×Ñœ˜Q› Ô#Ø�A‘$‰ˆˆ4Ø×Ñœ˜QŸY™YŸ]™]¨5°"Ó5Ó6¸Ô:Ø×Ñ˜Ÿ™ Õ%r   c                 óˆ  — t        j                  dd«      }|j                  dt        j                  d«      j	                  «       «       |j                  dt        j                  d«      j	                  «       «       | j
                  j                  |j	                  «       d«       | j                  | j                  g «       y )Nr:   r;   rd   rÊ   rõ   r  )	r   ro   rp   r�   r2   rþ   r  r/   rø   rq   s     r   ÚtestLoopzProxyTests.testLoop8  s�   € Ü�K‰K˜ )Ó,ˆØ	�‰�Eœ3Ÿ7™7 9Ó-×6Ñ6Ó8Ô9Ø	�‰�Eœ3Ÿ7™7 ;Ó/×8Ñ8Ó:Ô;Ø�
‰
×#Ñ# A§J¡J£LÐ2FÔGØ×Ñ˜Ÿ™ BÕ'r   c                 óv  — t        j                  dd«      }|j                  dt        j                  d«      j	                  «       «       |j                  dd«       t        «       | j                  _        | j                  j                  |j	                  «       d«       | j                  t        | j                  «      d«       | j                  d	   \  }}| j                  |j                  |j                  fd«       | j                  |j                  d
«       | j                  |j                  d   dg«       y )Nr:   r;   rd   rÊ   rA   r  r  r.   r   i”  r  )r   ro   rp   r�   r2   rî   rþ   rÿ   r  r/   rD   rø   rƒ   r„   r_   r3   r  s       r   ÚtestCantForwardRequestz!ProxyTests.testCantForwardRequest?  sã   € Ü�K‰K˜ )Ó,ˆØ	�‰�Eœ3Ÿ7™7 9Ó-×6Ñ6Ó8Ô9Ø	�‰�DÐ0Ô1Ü+Ó-ˆ�
‰
ÔØ�
‰
×#Ñ# A§J¡J£LÐ2CÔDØ×Ñœ˜TŸY™Y›¨Ô+Ø—)‘)˜A‘,‰ˆˆaØ×Ñ˜$Ÿ)™) T§Y¡YÐ/Ð1BÔCØ×Ñ˜Ÿ™ Ô%Ø×Ñ˜Ÿ™ 5Ñ)Ð,FÐ+GÕHr   N)r   r   r   r&   r	  r  r  r  r  r  r  r   r   r   r   ró   ró   ç  s3   „ òQò
ò.
ò,ò	LòGò	&ò(ó
Ir   ró   c                   óT   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zy)ÚRegistrationTestsc                 óþ   ‡ — t        j                  d¬«      ‰ _        t        j                  d«      ‰ _        ‰ j                  x‰ j                  _        ‰ j                  _        g ‰ _        ˆ fd„‰ j                  _        y )Nrõ   ©rƒ   úbell.example.comc                 ó>   •— ‰j                   j                  | |f«      S r   r÷   rù   s     €r   r   z)RegistrationTests.setUp.<locals>.<lambda>R  rü   r   )r   ÚRegisterProxyrþ   ÚInMemoryRegistryÚregistryrÿ   rø   r   r%   s   `r   r&   zRegistrationTests.setUpM  sW   ø€ Ü×&Ñ&¨KÔ8ˆŒ
Ü×,Ñ,Ð-?Ó@ˆŒØ37·=±=Ð@ˆ�
‰
Ô˜dŸj™jÔ0ØˆŒ	Û!Pˆ�
‰
Õr   c                 ó€   — | j                   j                  j                  «       D ]  \  }}|j                  «        Œ | `y r   )r)  ÚusersÚvaluesÚcancelrþ   )r   rÎ   r1   s      r   ÚtearDownzRegistrationTests.tearDownT  s6   € Ø—m‘m×)Ñ)×0Ñ0Ó2ò 	‰FˆAˆsØ�H‰H�Jð	à‰Jr   c                 ó2  — t        j                  dd«      }|j                  dd«       |j                  dd«       |j                  dt        j                  d«      j	                  «       «       | j
                  j                  |j	                  «       d	«       y )
NÚREGISTERúsip:bell.example.comrA   úsip:joe@bell.example.comr  úsip:joe@client.com:1234rd   r  r  ©r   ro   rp   r�   r2   rþ   r  rq   s     r   ÚregisterzRegistrationTests.registerY  sl   € Ü�K‰K˜
Ð$:Ó;ˆØ	�‰�DÐ4Ô5Ø	�‰�IÐ8Ô9Ø	�‰�Eœ3Ÿ7™7 <Ó0×9Ñ9Ó;Ô<Ø�
‰
×#Ñ# A§J¡J£LÐ2FÕGr   c                 óV  — t        j                  dd«      }|j                  dd«       |j                  dd«       |j                  dt        j                  d«      j	                  «       «       |j                  d	d
«       | j
                  j                  |j	                  «       d«       y )Nr0  r1  rA   r2  r  Ú*rd   r  ÚexpiresrR   r  r4  rq   s     r   Ú
unregisterzRegistrationTests.unregister`  sy   € Ü�K‰K˜
Ð$:Ó;ˆØ	�‰�DÐ4Ô5Ø	�‰�I˜sÔ#Ø	�‰�Eœ3Ÿ7™7 <Ó0×9Ñ9Ó;Ô<Ø	�‰�I˜sÔ#Ø�
‰
×#Ñ# A§J¡J£LÐ2FÕGr   c                 ó¼  — | j                  «        | j                  d   \  }}| j                  |j                  |j                  fd«       | j                  |j
                  d«       | j                  |j                  d   dg«       | j                  |j                  d   dg«       | j                  |j                  d   d	g«       t        t        «      t        k7  r,| j                  t        |j                  d
   d   «      dv «       | j                  t        | j                  j                  «      d«       | j                  j                  d   \  }}| j                  |j                  «       d	«       | j                   j"                  j%                  t'        j(                  dd¬«      «      }|j+                  d„ «       |j+                  | j                  d«       |S )Nr   r  r\   rd   úSIP/2.0/UDP client.com:5060rA   r2  r  úsip:joe@client.com:5060r8  )i  i  i  i  r.   r=   r%  ©rÀ   rƒ   c                 ó2   — | j                   | j                  fS r   ©rƒ   r„   )Údesturls    r   r   z0RegistrationTests.testRegister.<locals>.<lambda>{  s   €  w§|¡|°W·\±\Ð&B€ r   )r5  rø   r/   rƒ   r„   r_   r3   Útyper   r	   rš   ÚintrD   r)  r+  r2   rþ   rÿ   rë   r   rè   ÚaddCallback)r   rú   r6   Údcr1   rÎ   s         r   ÚtestRegisterzRegistrationTests.testRegisterh  sx  € Ø�‰ŒØ—)‘)˜A‘,‰ˆˆaØ×Ñ˜$Ÿ)™) T§Y¡YÐ/Ð1EÔFØ×Ñ˜Ÿ™ Ô%Ø×Ñ˜Ÿ™ 5Ñ)Ð,IÐ+JÔKØ×Ñ˜Ÿ™ 4™Ð+EÐ*FÔGØ×Ñ˜Ÿ™ 9Ñ-Ð0IÐ/JÔKô ”‹=Ô2Ò2Ø�O‰OœC §	¡	¨)Ñ 4°QÑ 7Ó8Ð<TÐTÔUØ×Ñœ˜TŸ]™]×0Ñ0Ó1°1Ô5Ø—-‘-×%Ñ% eÑ,‰ˆˆCØ×Ñ˜Ÿ™›Ð)BÔCØ�J‰J×Ñ×)Ñ)Ü�G‰G˜UÐ);Ô<ó
ˆð 	
�‰ÑBÔCØ	�‰�d×&Ñ&Ð(<Ô=Øˆr   c                 ó<  — | j                  «        | j                  «        | j                  d   \  }}| j                  |j                  |j
                  fd«       | j                  |j                  d«       | j                  |j                  d   dg«       | j                  |j                  d   dg«       | j                  |j                  d   d	g«       | j                  |j                  d
   dg«       | j                  | j                  j                  i «       y )Nr.   r  r\   rd   r;  rA   r2  r  r<  r8  rR   )
r5  r9  rø   r/   rƒ   r„   r_   r3   r)  r+  ©r   rú   r6   s      r   ÚtestUnregisterz RegistrationTests.testUnregister  sã   € Ø�‰ŒØ�‰ÔØ—)‘)˜A‘,‰ˆˆaØ×Ñ˜$Ÿ)™) T§Y¡YÐ/Ð1EÔFØ×Ñ˜Ÿ™ Ô%Ø×Ñ˜Ÿ™ 5Ñ)Ð,IÐ+JÔKØ×Ñ˜Ÿ™ 4™Ð+EÐ*FÔGØ×Ñ˜Ÿ™ 9Ñ-Ð0IÐ/JÔKØ×Ñ˜Ÿ™ 9Ñ-°¨uÔ5Ø×Ñ˜Ÿ™×,Ñ,¨bÕ1r   c                 óÒ   — t        «       }t        j                  |«      }t        j                  «       }|j                  dd«       |j                  |«       || j                  _        y )NzuserXname@127.0.0.1Ú	passXword)r   r   ÚPortalr   Ú'InMemoryUsernamePasswordDatabaseDontUseÚaddUserÚregisterCheckerrþ   )r   rr   Úprj   s       r   Ú	addPortalzRegistrationTests.addPortal‹  sN   € Ü‹KˆÜ�M‰M˜!ÓˆÜ×<Ñ<Ó>ˆØ	�	‰	Ð'¨Ô5Ø	×Ñ˜!ÔØˆ�
‰
Õr   c                 óH  — | j                  «        | j                  «        | j                  t        | j                  j
                  «      d«       | j                  t        | j                  «      d«       | j                  d   \  }}| j                  |j                  d«       y )Nr   r.   i‘  )rP  r5  r/   rD   r)  r+  rø   r_   rG  s      r   ÚtestFailedAuthenticationz*RegistrationTests.testFailedAuthentication“  sq   € Ø�‰ÔØ�‰Œà×Ñœ˜TŸ]™]×0Ñ0Ó1°1Ô5Ø×Ñœ˜TŸY™Y›¨Ô+Ø—)‘)˜A‘,‰ˆˆaØ×Ñ˜Ÿ™ Õ%r   c                 ó|  — t        j                  dd«      }|j                  dd«       |j                  dd«       |j                  dt        j                  d«      j	                  «       «       | j
                  j                  |j	                  «       d	«       | j                  t        | j                  «      d
«       y )Nr0  zsip:wrong.comrA   r2  r  r3  rd   r  r  r   ©
r   ro   rp   r�   r2   rþ   r  r/   rD   rø   rq   s     r   ÚtestWrongDomainRegisterz)RegistrationTests.testWrongDomainRegisterœ  sƒ   € Ü�K‰K˜
 OÓ4ˆØ	�‰�DÐ4Ô5Ø	�‰�IÐ8Ô9Ø	�‰�Eœ3Ÿ7™7 <Ó0×9Ñ9Ó;Ô<Ø�
‰
×#Ñ# A§J¡J£LÐ2FÔGØ×Ñœ˜TŸY™Y›¨Õ+r   c                 ó|  — t        j                  dd«      }|j                  dd«       |j                  dd«       |j                  dt        j                  d«      j	                  «       «       | j
                  j                  |j	                  «       d	«       | j                  t        | j                  «      d
«       y )Nr0  r1  rA   zsip:joe@foo.comr  r3  rd   r  r  r   rT  rq   s     r   ÚtestWrongToDomainRegisterz+RegistrationTests.testWrongToDomainRegister¤  s„   € Ü�K‰K˜
Ð$:Ó;ˆØ	�‰�DÐ+Ô,Ø	�‰�IÐ8Ô9Ø	�‰�Eœ3Ÿ7™7 <Ó0×9Ñ9Ó;Ô<Ø�
‰
×#Ñ# A§J¡J£LÐ2FÔGØ×Ñœ˜TŸY™Y›¨Õ+r   c                 óÊ   — | j                  «        t        j                  dd¬«      }| j                  j                  j                  |«      }| j                  |t        «       |S )Nr=   r  r=  ©r5  r   rè   rþ   rÿ   rë   ÚassertFailurerñ   ©r   r½   rÎ   s      r   ÚtestWrongDomainLookupz'RegistrationTests.testWrongDomainLookup¬  sJ   € Ø�‰ŒÜ�g‰g˜u¨9Ô5ˆØ�J‰J×Ñ×)Ñ)¨#Ó.ˆØ×Ñ˜1œkÔ*Øˆr   c                 óÊ   — | j                  «        t        j                  dd¬«      }| j                  j                  j                  |«      }| j                  |t        «       |S )NÚjaner%  r=  rY  r[  s      r   ÚtestNoContactLookupz%RegistrationTests.testNoContactLookup³  sK   € Ø�‰ŒÜ�g‰g˜vÐ,>Ô?ˆØ�J‰J×Ñ×)Ñ)¨#Ó.ˆØ×Ñ˜1œkÔ*Øˆr   N)r   r   r   r&   r.  r5  r9  rE  rH  rP  rR  rU  rW  r\  r_  r   r   r   r"  r"  L  sA   „ òQòò
HòHòò.
2òò&ò,ò,òór   r"  c                   ó   — e Zd Zd„ Zd„ Zy)ÚClientc                 ó‚   — t         j                  j                  | «       g | _        t	        j
                  «       | _        y r   )r   ÚBaseÚ__init__r³   r   ÚDeferredÚdeferredr%   s    r   rd  zClient.__init__¼  s)   € Ü�‰×Ñ˜$ÔØˆŒÜŸ™Ó(ˆ�r   c                 ó„   — | j                   j                  |«       | j                  j                  | j                   «       y r   )r³   r#   rf  Úcallback)r   Úresponser  s      r   Úhandle_responsezClient.handle_responseÁ  s*   € Ø�‰×Ñ˜XÔ&Ø�‰×Ñ˜tŸ}™}Õ-r   N)r   r   r   rd  rj  r   r   r   ra  ra  »  s   „ ò)ó
.r   ra  c                   ó$   — e Zd Zd„ Zd„ Zd„ Zd„ Zy)Ú	LiveTestsc                 ó  — t        j                  d¬«      | _        t        j                  d«      | _        | j                  x| j                  _        | j                  _        t        j                  d| j                  d¬«      | _        t        «       | _
        t        j                  d| j                  d¬«      | _        | j                  j                  «       j                  | j                  j                  «       j                  f| _        y )Nrõ   r$  r%  r   )Ú	interface)r   r'  rþ   r(  r)  rÿ   r   Ú	listenUDPÚ
serverPortra  ÚclientÚ
clientPortÚgetHostrƒ   r„   ÚserverAddressr%   s    r   r&   zLiveTests.setUpÇ  s¶   € Ü×&Ñ&¨KÔ8ˆŒ
Ü×,Ñ,Ð-?Ó@ˆŒØ37·=±=Ð@ˆ�
‰
Ô˜dŸj™jÔ0Ü!×+Ñ+¨A¨t¯z©zÀ[ÔQˆŒÜ“hˆŒÜ!×+Ñ+¨A¨t¯{©{ÀkÔRˆŒà�O‰O×#Ñ#Ó%×*Ñ*Ø�O‰O×#Ñ#Ó%×*Ñ*ð
ˆÕr   c                 óL  — | j                   j                  j                  «       D ]  \  }}|j                  «        Œ t	        j
                  | j                  j                  «      }t	        j
                  | j                  j                  «      }t	        j                  ||g«      S r   )
r)  r+  r,  r-  r   ÚmaybeDeferredrr  ÚstopListeningrp  ÚgatherResults)r   rÎ   r1   Úd1Úd2s        r   r.  zLiveTests.tearDownÓ  sz   € Ø—m‘m×)Ñ)×0Ñ0Ó2ò 	‰FˆAˆsØ�H‰H�Jð	ä× Ñ  §¡×!>Ñ!>Ó?ˆÜ× Ñ  §¡×!>Ñ!>Ó?ˆÜ×"Ñ" B¨ 8Ó,Ð,r   c                 ó  ‡ — ‰ j                   j                  «       j                  }t        j                  dd«      }|j                  dd«       |j                  dd|z  «       |j                  dt        j                  d|¬	«      j                  «       «       ‰ j                  j                  t        j                  d‰ j                  d
   ¬«      |«       ‰ j                  j                  }ˆ fd„}|j                  |«       |S )Nr0  r1  rA   r2  r  úsip:joe@127.0.0.1:%drd   rõ   ræ   r.   r?  c                 ó~   •— ‰j                  t        | «      d«       | d   }‰j                  |j                  d«       y ©Nr.   r   r\   ©r/   rD   r_   ©r³   rr   r   s     €r   Úcheckz%LiveTests.testRegister.<locals>.checkå  ó4   ø€ Ø×ÑœS ›]¨AÔ.Ø˜‘ˆAØ×Ñ˜QŸV™V SÕ)r   )rr  rs  r„   r   ro   rp   r�   r2   rq  r   rè   rt  rf  rC  )r   rO  rr   rÎ   r�  s   `    r   rE  zLiveTests.testRegisterÚ  sÇ   ø€ Ø�O‰O×#Ñ#Ó%×*Ñ*ˆÜ�K‰K˜
Ð$:Ó;ˆØ	�‰�DÐ4Ô5Ø	�‰�IÐ5¸Ñ9Ô:Ø	�‰�Eœ3Ÿ7™7 ;°QÔ7×@Ñ@ÓBÔCØ�‰×ÑÜ�G‰G˜¨4×+=Ñ+=¸aÑ+@ÔAÀ1ô	
ð �K‰K× Ñ ˆô	*ð
 	
�‰�eÔØˆr   c                 óâ  ‡ — ‰ j                   j                  «       j                  }t        j                  dd«      }|j                  dd«       |j                  dd|z  «       |j                  dt        j                  d|d	¬
«      j                  «       «       ‰ j                  ‰ j                  g¬«      }‰ j                  t        |«      d«       ‰ j                  |d   d   d«       ‰ j                  |d   d   t        «       ‰ j                  j                  t        j                  d‰ j                   d   ¬«      |«       ‰ j                  j"                  }ˆ fd„}|j%                  |«       |S )ap  
        rport is allowed without a value, apparently because server
        implementors might be too stupid to check the received port
        against 5060 and see if they're equal, and because client
        implementors might be too stupid to bind to port 5060, or set a
        value on the rport parameter they send if they bind to another
        port.
        r0  r1  rA   r2  r  r|  rd   rõ   T)r„   r�   r£   r.   r   r+   r¥   r¦   r?  c                 ó~   •— ‰j                  t        | «      d«       | d   }‰j                  |j                  d«       y r~  r  r€  s     €r   r�  z)LiveTests.test_amoralRPort.<locals>.check  r‚  r   )rr  rs  r„   r   ro   rp   r�   r2   r¨   Útest_amoralRPortr/   rD   rª   rq  r   rè   rt  rf  rC  )r   rO  rr   r«   rÎ   r�  s   `     r   r…  zLiveTests.test_amoralRPortí  s4  ø€ ð �O‰O×#Ñ#Ó%×*Ñ*ˆÜ�K‰K˜
Ð$:Ó;ˆØ	�‰�DÐ4Ô5Ø	�‰�IÐ5¸Ñ9Ô:Ø	�‰�Eœ3Ÿ7™7 ;°Q¸dÔC×LÑLÓNÔOØ×%Ñ%¸$×:OÑ:OÐ9PÐ%ÓQˆØ×Ñœ˜X›¨Ô*Ø×ÑØ�Q‰K˜	Ñ"Ð$Qô	
ð 	×Ñ˜ !™ ZÑ0Ô2DÔEØ�‰×ÑÜ�G‰G˜¨4×+=Ñ+=¸aÑ+@ÔAÀ1ô	
ð �K‰K× Ñ ˆô	*ð
 	
�‰�eÔØˆr   N)r   r   r   r&   r.  rE  r…  r   r   r   rl  rl  Æ  s   „ ò

ò-òó&r   rl  ))rk   Útwisted.credr   r   Útwisted.internetr   r   Útwisted.protocolsr   Útwisted.trialr   Útwisted.internet.asyncioreactorr	   ÚBaseExceptionÚzope.interfacer
   ÚreplacerC   rK   rN   rV   r^   rY   Úrequest_nattedre   r   ÚTestCaser   rh   rm   r{   rº   rÔ   ÚILocatorrã   rî   ró   r"  rc  ra  rl  r   r   r   ú<module>r‘     s-  ðñ
÷ *ß +Ý !Ý "ð"ÝFõ 'ð ð÷ 	‰Øˆfó	ñ	ð 	ð÷ 	‰Øˆ&ó	ð	 	ð÷ ‰7Øˆ&óð 	ð÷ 	‰Øˆ&ó	ð 	ð(÷
 �GØˆ&óð 
ð÷ 	‰Øˆ&ó	ð ð÷ �GØˆ&óð	 ð÷ �gØˆ&óð ÷(0ñ 0ô
E
˜(×+Ñ+ô E
ôPÐ,?ô ôA�x×(Ñ(ô Aô(u*ˆx× Ñ ô u*ôp1ˆx× Ñ ô 1ô@.�×"Ñ"ô .ñ2 ˆS�\‰\Ó÷?ð ?ó ð?ñ
 ˆS�\‰\Ó÷)ð )ó ð)ô
bI�×"Ñ"ô bIôJl˜×)Ñ)ô lô^.ˆS�X‰Xô .ôF�×!Ñ!õ Føðm ò "Ø!Óð"ús    G ÇGÇG