§
    Ètºfš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 n# e$ r dZY nw xY wddlmZ d	d
                     dd¦  «        z   Zd                     dd¦  «        Zd                     dd¦  «        Zd                     dd¦  «        Zd                     dd¦  «        Zd                     dd¦  «        Zd                     dd¦  «        Zd                     dd¦  «        Z G d„ d¦  «        Z G d„ de
j        ¦  «        Z G d„ de¦  «        Z G d„ de
j        ¦  «        Z G d„ de
j        ¦  «        Z G d„ de
j        ¦  «        Z G d „ d!e
j        ¦  «        Z  eej!        ¦  «         G d"„ d#¦  «        ¦   «         Z" eej!        ¦  «         G d$„ d%¦  «        ¦   «         Z# G d&„ d'e
j        ¦  «        Z$ G d(„ d)e
j        ¦  «        Z% G d*„ d+ej&        ¦  «        Z' G d,„ d-e
j        ¦  «        Z(dS ).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dS )Ú	TestRealmc                 ó"   — t           j        d d„ fS )Nc                  ó   — d S ©N© r   ó    úT/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/test/test_sip.pyú<lambda>z)TestRealm.requestAvatar.<locals>.<lambda>€   s   € ¨4€ 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#   € € € € € ð0ð 0ð 0ð 0ð 0r   r   c                   óJ   — 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S )ÚMessageParsingTestsc                 óZ   — g | _         t          j        | j         j        ¦  «        | _        d S r   )Úlr   ÚMessagesParserÚappendÚparser©r   s    r   ÚsetUpzMessageParsingTests.setUp„   s#   € ØˆŒÝÔ(¨¬¬Ñ7Ô7ˆŒˆˆr   c                 ól   — | j                              |¦  «         | j                              ¦   «          d S r   ©r$   ÚdataReceivedÚdataDone)r   Úmessages     r   ÚfeedMessagezMessageParsingTests.feedMessageˆ   s2   € ØŒ× Ò  Ñ)Ô)Ð)ØŒ×ÒÑÔÐÐÐr   c                 ó8  — |                       |j        |¦  «         |                       |j                             ¦   «         |¦  «         |                       |j        |¦  «         |                       |j        |¦  «         |                       |j        d¦  «         dS )z$
        Validate Requests.
        é   N)ÚassertEqualÚmethodÚuriÚtoStringÚheadersÚbodyÚfinished)r   Úmr0   r1   r3   r4   s         r   ÚvalidateMessagez#MessageParsingTests.validateMessageŒ   sŒ   € ð 	×Ò˜œ 6Ñ*Ô*Ð*Ø×Ò˜œŸšÑ)Ô)¨3Ñ/Ô/Ð/Ø×Ò˜œ GÑ,Ô,Ð,Ø×Ò˜œ Ñ&Ô&Ð&Ø×Ò˜œ QÑ'Ô'Ð'Ð'Ð'r   c           	      óÚ   — | j         }|                      t          ¦  «         |                      t	          |¦  «        d¦  «         |                      |d         dddgdgdgdœd	¦  «         d S ©
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ˆØ×Ò�Ñ"Ô"Ð"Ø×Ò�˜Q™œ Ñ#Ô#Ð#Ø×ÒØˆaŒDØØØ�V E 7¸s¸eÐDÐDØñ	
ô 	
ð 	
ð 	
ð 	
r   c           	      óV  — | j         }|                      t          ¦  «         |                      t          ¦  «         |                      t          |¦  «        d¦  «         |                      |d         dddgdgdgdœd	¦  «         |                      |d
         dddgdgdœd¦  «         d S )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ˆØ×Ò�Ñ"Ô"Ð"Ø×Ò�Ñ"Ô"Ð"Ø×Ò�˜Q™œ Ñ#Ô#Ð#Ø×ÒØˆaŒDØØØ�V E 7¸s¸eÐDÐDØñ	
ô 	
ð 	
ð 	×ÒØˆaŒD�(˜I°°¸u¸gÐ'FÐ'FÈñ	
ô 	
ð 	
ð 	
ð 	
r   c           	      óÚ   — | j         }|                      t          ¦  «         |                      t	          |¦  «        d¦  «         |                      |d         dddgdgdgdœd	¦  «         d S )
Nr.   r   r:   r;   r<   r=   r>   r?   rJ   )r!   r,   Úrequest3r/   rD   r7   rE   s     r   ÚtestGarbagezMessageParsingTests.testGarbage²   rG   r   c           	      ór  — | j         }|                      t          ¦  «         |                      t	          |¦  «        d¦  «         |                      |d         dddgdgdgdœd	¦  «         |                      |d
         dddgdgdgdœd¦  «         |                      |d         dddgdgdgdœd¦  «         d S )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ˆØ×Ò�Ñ"Ô"Ð"Ø×Ò�˜Q™œ Ñ#Ô#Ð#Ø×ÒØˆaŒDØØØ�V E 7¸s¸eÐDÐDØñ	
ô 	
ð 	
ð 	×ÒØˆaŒDØØØ�W U GÀ¸uÐEÐEØñ	
ô 	
ð 	
ð 	×ÒØˆaŒDØØØ�W U GÀ¸uÐEÐEØñ	
ô 	
ð 	
ð 	
ð 	
r   c           	      óÚ   — | j         }|                      t          ¦  «         |                      t	          |¦  «        d¦  «         |                      |d         dddgdgdgdœd	¦  «         d S r9   )r!   r,   Úrequest_shortr/   rD   r7   rE   s     r   Ú	testShortzMessageParsingTests.testShortØ   s~   € ØŒFˆØ×Ò�Ñ'Ô'Ð'Ø×Ò�˜Q™œ Ñ#Ô#Ð#Ø×ÒØˆaŒDØØØ�V E 7¸s¸eÐDÐDØñ	
ô 	
ð 	
ð 	
ð 	
r   c                 óº  — | j         }|                      t          ¦  «         |                      t	          |¦  «        d¦  «         |d         }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        dgdgdgdœ¦  «         |                      |j        d	¦  «         |                      |j	        d¦  «         d S )
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ˆØ×Ò�Ñ#Ô#Ð#Ø×Ò�˜Q™œ Ñ#Ô#Ð#ØˆaŒDˆØ×Ò˜œ Ñ%Ô%Ð%Ø×Ò˜œ 4Ñ(Ô(Ð(Ø×ÒØŒI  °¨wÈ3È%ÐPÐPñ	
ô 	
ð 	
ð 	×Ò˜œ Ñ$Ô$Ð$Ø×Ò˜œ QÑ'Ô'Ð'Ð'Ð'r   c                 óˆ  — | j         }|                      t          ¦  «         |                      t	          |¦  «        d¦  «         |d         }|                      |j        d         d         d¦  «         |                      |j        d         d         d¦  «         |                      |j        d         d         d¦  «         dS )	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ˆØ×ÒÕ+Ñ,Ô,Ð,Ø×Ò�˜Q™œ Ñ#Ô#Ð#ØˆaŒDˆØ×ÒØŒI�eÔ˜QÔð7ñ	
ô 	
ð 	
ð
 	×ÒØŒI�eÔ˜QÔð?ñ	
ô 	
ð 	
ð
 	×ÒØŒI�eÔ˜QÔð:ñ	
ô 	
ð 	
ð 	
ð 	
r   N)r   r   r   r&   r,   r7   rF   rL   rO   rW   rZ   rb   rf   r   r   r   r   r   ƒ   sª   € € € € € ð8ð 8ð 8ðð ð ð(ð (ð (ð

ð 

ð 

ð
ð 
ð 
ð 

ð 

ð 

ð
ð 
ð 
ð4

ð 

ð 

ð(ð (ð (ð
ð 
ð 
ð 
ð 
r   r   c                   ó   — e Zd ZdZd„ ZdS )Ú%MessageParsingFeedDataCharByCharTestsz9
    Same as base class, but feed data char by char.
    c                 óv   — |D ]}| j                              |¦  «         Œ| j                              ¦   «          d S r   r(   )r   r+   Úcs      r   r,   z1MessageParsingFeedDataCharByCharTests.feedMessage  sD   € Øð 	(ð 	(ˆAØŒ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dS )ÚMakeMessageTestsc                 ó¬   — t          j        dd¦  «        }|                     dd¦  «         |                      |                     ¦   «         d¦  «         d S )Nr:   r;   rT   rU   z$INVITE sip:foo SIP/2.0
Foo: bar

)r   ÚRequestÚ	addHeaderr/   r2   ©r   Úrs     r   ÚtestRequestzMakeMessageTests.testRequest  sL   € ÝŒK˜ )Ñ,Ô,ˆØ	�Š�E˜5Ñ!Ô!Ð!Ø×Ò˜Ÿš™œÐ'SÑTÔTÐTÐTÐTr   c                 ó  — t          j        dd¦  «        }|                     dd¦  «         |                     dd¦  «         |                     d¦  «         |                      |                     ¦   «         d¦  «         d S )	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  s€   € ÝŒL˜˜dÑ#Ô#ˆØ	�Š�E˜5Ñ!Ô!Ð!Ø	�ŠÐ$ cÑ*Ô*Ð*Ø	×Ò˜6Ñ"Ô"Ð"Ø×ÒØ�JŠJ‰LŒLÐWñ	
ô 	
ð 	
ð 	
ð 	
r   c                 ó~   — t          j        d¦  «        }|                      |                     ¦   «         d¦  «         d S )Nr\   zSIP/2.0 200 OK

)r   ru   r/   r2   rq   s     r   ÚtestStatusCodezMakeMessageTests.testStatusCode%  s6   € ÝŒL˜ÑÔˆØ×Ò˜Ÿš™œÐ'?Ñ@Ô@Ð@Ð@Ð@r   N)r   r   r   rs   rw   ry   r   r   r   rm   rm     sI   € € € € € ðUð Uð Uð

ð 
ð 
ðAð Að Að Að Ar   rm   c                   óJ   — 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S )ÚViaTestsc                 ó¢   — |                      ¦   «         }|                      |t          j        |¦  «                              ¦   «         ¦  «         d S r   )r2   r/   r   ÚparseViaHeader)r   ÚvÚss      r   ÚcheckRoundtripzViaTests.checkRoundtrip+  sB   € Ø�JŠJ‰LŒLˆØ×Ò˜�CÔ.¨qÑ1Ô1×:Ò:Ñ<Ô<Ñ=Ô=Ð=Ð=Ð=r   c                 ó  — t          j        d¦  «        }t          j        d¦  «        }|                      |j        |j        ¦  «         |                      |j        |j        ¦  «         |                      |j        |j        ¦  «         d S )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/  sx   € ÝÔÐ >Ñ?Ô?ˆÝÔÐ BÑCÔCˆØ×Ò˜œ r¤|Ñ4Ô4Ð4Ø×Ò˜œ "¤'Ñ*Ô*Ð*Ø×Ò˜œ "¤'Ñ*Ô*Ð*Ð*Ð*r   c                 óÂ  — d}t          j        |¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        ¦  «         |                      |j        ¦  «         |  	                    |j
        ¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |                     ¦   «         d	¦  «         |                      |¦  «         d
S )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  sN  € ð
,ð 	
õ Ô˜qÑ!Ô!ˆØ×Ò˜œ eÑ,Ô,Ð,Ø×Ò˜œÐ!4Ñ5Ô5Ð5Ø×Ò˜œ Ñ&Ô&Ð&Ø×Ò˜!œ'Ñ"Ô"Ð"Ø×Ò˜!œ,Ñ'Ô'Ð'Ø×Ò˜Ô)Ñ*Ô*Ð*Ø×Ò˜œ Ñ#Ô#Ð#Ø×Ò˜œ +Ñ.Ô.Ð.Ø×Ò˜œ <Ñ0Ô0Ð0Ø×Ò˜œ 1Ñ%Ô%Ð%Ø×ÒØ�JŠJ‰LŒLð8ñ	
ô 	
ð 	
ð
 	×Ò˜AÑÔÐÐÐr   c                 óº  — d}t          j        |¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        ¦  «         |                      |j        ¦  «         |  	                    |j
        ¦  «         |                      |j        ¦  «         |                      |j        ¦  «         |                      |j        ¦  «         |                      |j        ¦  «         |                      |                     ¦   «         d¦  «         |                      |¦  «         dS )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  s3  € ð -ˆÝÔ˜qÑ!Ô!ˆØ×Ò˜œ eÑ,Ô,Ð,Ø×Ò˜œ Ñ/Ô/Ð/Ø×Ò˜œ Ñ&Ô&Ð&Ø×Ò˜!œ'Ñ"Ô"Ð"Ø×Ò˜!œ,Ñ'Ô'Ð'Ø×Ò˜Ô)Ñ*Ô*Ð*Ø×Ò˜!œ%Ñ Ô Ð Ø×Ò˜!œ'Ñ"Ô"Ð"Ø×Ò˜!œ(Ñ#Ô#Ð#Ø�Š˜œÑ!Ô!Ð!Ø×Ò˜Ÿš™œÐ'LÑMÔMÐMØ×Ò˜AÑÔÐÐÐr   c                 óX   — t          j        d¦  «        }|                      |¦  «         d S )Nr˜   )r   ÚViar€   ©r   r~   s     r   ÚtestSimplerzViaTests.testSimplerc  s+   € ÝŒG�MÑ"Ô"ˆØ×Ò˜AÑÔÐÐÐr   c                 ó.  — t          j        dd¬¦  «        }|                      | j        g¬¦  «        }|                      t          |¦  «        d¦  «         |                      |d         d         d¦  «         |                      |d         d	         t          ¦  «         |                      |                     ¦   «         d
¦  «         |                      |j	        ¦  «         |                      |j
        ¦  «         |                      |j        ¦  «         dS )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�I TÐ*Ñ*Ô*ˆà×%Ò%¸$Ô:SÐ9TÐ%ÑUÔUˆØ×Ò�˜X™œ¨Ñ*Ô*Ð*Ø×ÒØ�QŒK˜	Ô"Ð$Qñ	
ô 	
ð 	
ð 	×Ò˜ !œ ZÔ0Õ2DÑEÔEÐEà×Ò˜Ÿš™œÐ'GÑHÔHÐHØ�Š˜œÑ Ô Ð Ø�Š˜Ô(Ñ)Ô)Ð)Ø×Ò˜!œ,Ñ'Ô'Ð'Ð'Ð'r   c                 óê   — t          j        dd¬¦  «        }|                      |                     ¦   «         d¦  «         |                      |j        ¦  «         |                      |j        ¦  «         dS )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  sh   € õ ŒG�I TÐ*Ñ*Ô*ˆØ×Ò˜Ÿš™œÐ'GÑHÔHÐHØ�Š˜Ô(Ñ)Ô)Ð)Ø×Ò˜!œ,Ñ'Ô'Ð'Ð'Ð'r   c                 ó"  — t          j        dd¬¦  «        }|                      |                     ¦   «         d¦  «         |                      |j        ¦  «         |                      |j        d¦  «         |                      |j        d¦  «         dS )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ƒ  s„   € õ
 ŒG�I QÐ'Ñ'Ô'ˆØ×Ò˜Ÿš™œÐ'IÑJÔJÐJØ×Ò˜Ô)Ñ*Ô*Ð*Ø×Ò˜œ qÑ)Ô)Ð)Ø×Ò˜œ !Ñ$Ô$Ð$Ð$Ð$r   c                 ó¶  — d}t          j        |¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      | 	                    ¦   «          
                    d¦  «        d¦  «         d S )	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Ô1Ð1Ø×Ò˜œ %Ñ(Ô(Ð(à×Ò˜AŸJšJ™LœL×-Ò-¨mÑ<Ô<¸bÑAÔAÐAÐAÐAr   c                 ó‚   — d}t          j        |¦  «        }|                      |                     ¦   «         |¦  «         dS )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™  s>   € ð NˆÝÔ˜qÑ!Ô!ˆØ×Ò˜Ÿš™œ qÑ)Ô)Ð)Ð)Ð)r   N)r   r   r   r€   r‡   r–   r›   rŸ   r©   r­   r¯   r¶   r¸   r   r   r   r{   r{   *  s­   € € € € € ð>ð >ð >ð+ð +ð +ðð ð ð4ð ð ð&ð ð ð(ð (ð (ð&(ð (ð (ð	%ð 	%ð 	%ð	Bð 	Bð 	Bð*ð *ð *ð *ð *r   r{   c                   ó   — e Zd Zd„ Zd„ ZdS )ÚURLTestsc                 ó„   — dD ]<}|                       t          j        |¦  «                             ¦   «         |¦  «         Œ=d S )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£  sR   € ð
ð 	@ð 	@ˆCð ×Ò�Sœ\¨#Ñ.Ô.×7Ò7Ñ9Ô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 ])\  }}|                      t          ||¦  «        |¦  «         Œ*d S )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˜1‰oŒoˆà Ø ØØØ Ø!ØØØ Ø�v˜yÐ)Ð*Ø˜c¨Ð,Ð,Ð-ð
ð 	1ð 	1‰DˆAˆqð ×Ò�W S¨!™_œ_¨aÑ0Ô0Ð0Ð0ð	1ð 	1r   N)r   r   r   r¾   rÒ   r   r   r   rº   rº   ¢  s5   € € € € € ð@ð @ð @ð1ð 1ð 1ð 1ð 1r   rº   c                   ó   — e Zd Zd„ ZdS )Ú
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 ]s\  }}}}t          j        |¦  «        \  }}}|                      ||¦  «         |                      |                     ¦   «         |¦  «         |                      ||¦  «         Œtd S )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°GÑ#<Ô#<Ñ ˆE�4˜Ø×Ò˜T 5Ñ)Ô)Ð)Ø×Ò˜TŸ]š]™_œ_¨dÑ3Ô3Ð3Ø×Ò˜W fÑ-Ô-Ð-Ð-ð)	.ð 	.r   N)r   r   r   rá   r   r   r   rÔ   rÔ   Â  s#   € € € € € ð.ð .ð .ð .ð .r   rÔ   c                   ó   — e Zd Zd„ ZdS )ÚDummyLocatorc                 óR   — t          j        t          j        dd¬¦  «        ¦  «        S )Nú
server.comr™   ©r„   )r   Úsucceedr   ÚURL©r   Ú
logicalURLs     r   Ú
getAddresszDummyLocator.getAddressÝ  s!   € ÝŒ}�SœW \¸Ð=Ñ=Ô=Ñ>Ô>Ð>r   N©r   r   r   rë   r   r   r   rã   rã   Û  s#   € € € € € ð?ð ?ð ?ð ?ð ?r   rã   c                   ó   — e Zd Zd„ ZdS )ÚFailingLocatorc                 óB   — t          j        t          ¦   «         ¦  «        S r   )r   ÚfailÚLookupErrorré   s     r   rë   zFailingLocator.getAddressã  s   € ÝŒz�+™-œ-Ñ(Ô(Ð(r   Nrì   r   r   r   rî   rî   á  s#   € € € € € ð)ð )ð )ð )ð )r   rî   c                   óD   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )Ú
ProxyTestsc                 ó–   ‡ — t          j        d¦  «        ‰ _        t          ¦   «         ‰ j        _        g ‰ _        ˆ fd„‰ j        _        d S )Nú	127.0.0.1c                 ó<   •— ‰j                              | |f¦  «        S r   ©Úsentr#   ©ÚdestÚmsgr   s     €r   r   z"ProxyTests.setUp.<locals>.<lambda>ì  ó   ø€ °4´9×3CÒ3CÀTÈ3ÀKÑ3PÔ3P€ r   )r   ÚProxyÚproxyrã   Úlocatorrø   ÚsendMessager%   s   `r   r&   zProxyTests.setUpè  sB   ø€ Ý”Y˜{Ñ+Ô+ˆŒ
Ý)™^œ^ˆŒ
ÔØˆŒ	Ø!PÐ!PÐ!PÐ!PˆŒ
ÔÐÐr   c                 ó¨  — t          j        dd¦  «        }|                     dt          j        d¦  «                             ¦   «         ¦  «         |                     dt          j        d¦  «                             ¦   «         ¦  «         |                     dd¦  «         |                     dd	¦  «         |                     d
d¦  «         | j                             |                     ¦   «         d¦  «         |                      t          | j	        ¦  «        d¦  «         | j	        d         \  }}|                      |j
        d¦  «         |                      |j        d¦  «         |                      |j                             ¦   «         d¦  «         |                      |j        d¦  «         |                      |j        d         g d¢¦  «         d S )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î  s˜  € ÝŒK˜ )Ñ,Ô,ˆØ	�Š�E�3œ7 9Ñ-Ô-×6Ò6Ñ8Ô8Ñ9Ô9Ð9Ø	�Š�E�3œ7 9Ñ-Ô-×6Ò6Ñ8Ô8Ñ9Ô9Ð9Ø	�Š�E˜5Ñ!Ô!Ð!Ø	�Š�DÐ0Ñ1Ô1Ð1Ø	�Š�IÐ2Ñ3Ô3Ð3ØŒ
×#Ò# A§J¢J¡L¤LÐ2CÑDÔDÐDØ×Ò�˜TœY™œ¨Ñ+Ô+Ð+Ø”)˜A”,‰ˆˆaØ×Ò˜œ DÑ)Ô)Ð)Ø×Ò˜œ LÑ1Ô1Ð1Ø×Ò˜œŸšÑ)Ô)¨9Ñ5Ô5Ð5Ø×Ò˜œ 8Ñ,Ô,Ð,Ø×ÒØŒI�eÔðð ð ñ	
ô 	
ð 	
ð 	
ð 	
r   c                 óè  — t          j        dd¦  «        }|                     dt          j        d¦  «                             ¦   «         ¦  «         |                     dd¦  «         |                     dd¦  «         |                     d	d
¦  «         | j                             |                     ¦   «         d¦  «         | j        d         \  }}|                      |j	        d         ddg¦  «         d S )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˜ )Ñ,Ô,ˆØ	�Š�E�3œ7 9Ñ-Ô-×6Ò6Ñ8Ô8Ñ9Ô9Ð9Ø	�Š�E˜5Ñ!Ô!Ð!Ø	�Š�DÐ0Ñ1Ô1Ð1Ø	�Š�IÐ2Ñ3Ô3Ð3ØŒ
×#Ò# A§J¢J¡L¤LÐ2CÑDÔDÐDØ”)˜A”,‰ˆˆaØ×ÒØŒI�eÔØ)Ð+VÐWñ	
ô 	
ð 	
ð 	
ð 	
r   c                 óL  — t          j        d¦  «        }|                     dt          j        d¦  «                             ¦   «         ¦  «         | j                             |                     ¦   «         d¦  «         |                      t          | j	        ¦  «        d¦  «         d S )Nr\   rd   úfoo.comr  r   )
r   ru   rp   r�   r2   rþ   r  r/   rD   rø   rq   s     r   ÚtestResponseWrongViazProxyTests.testResponseWrongVia  s€   € åŒL˜ÑÔˆØ	�Š�E�3œ7 9Ñ-Ô-×6Ò6Ñ8Ô8Ñ9Ô9Ð9ØŒ
×#Ò# A§J¢J¡L¤LÐ2CÑDÔDÐDØ×Ò�˜TœY™œ¨Ñ+Ô+Ð+Ð+Ð+r   c                 ó¢  — t          j        d¦  «        }|                     dt          j        d¦  «                             ¦   «         ¦  «         |                     dt          j        dd¬¦  «                             ¦   «         ¦  «         | j                             |                     ¦   «         d¦  «         |                      t          | j	        ¦  «        d¦  «         | j	        d	         \  }}|                      |j
        |j        fd
¦  «         |                      |j        d¦  «         |                      |j        d         dg¦  «         d S )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˜ÑÔˆØ	�Š�E�3œ7 ;Ñ/Ô/×8Ò8Ñ:Ô:Ñ;Ô;Ð;Ø	�Š�E�3œ7 <°dÐ;Ñ;Ô;×DÒDÑFÔFÑGÔGÐGØŒ
×#Ò# A§J¢J¡L¤LÐ2CÑDÔDÐDØ×Ò�˜TœY™œ¨Ñ+Ô+Ð+Ø”)˜A”,‰ˆˆaØ×Ò˜$œ) T¤YÐ/Ð1EÑFÔFÐFØ×Ò˜œ Ñ%Ô%Ð%Ø×Ò˜œ 5Ô)Ð,IÐ+JÑKÔKÐKÐKÐKr   c                 ó(  — t          j        d¦  «        }|                     dt          j        d¦  «                             ¦   «         ¦  «         |                     dt          j        dd¬¦  «                             ¦   «         ¦  «         | j                             |                     ¦   «         d¦  «         |                      t          | j	        ¦  «        d¦  «         | j	        d	         \  }}|                      |j
        |j        fd
¦  «         d S )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˜ÑÔˆØ	�Š�E�3œ7 ;Ñ/Ô/×8Ò8Ñ:Ô:Ñ;Ô;Ð;Ø	�Š�E�3œ7 :¸ÐEÑEÔE×NÒNÑPÔPÑQÔQÐQØŒ
×#Ò# A§J¢J¡L¤LÐ2CÑDÔDÐDØ×Ò�˜TœY™œ¨Ñ+Ô+Ð+Ø”)˜A”,‰ˆˆaØ×Ò˜$œ) T¤YÐ/Ð1EÑFÔFÐFÐFÐFr   c                 ó*  ‡— t          j        d¦  «        }|                     dt          j        d¦  «                             ¦   «         ¦  «         g Šˆfd„| j        _        | j                             |                     ¦   «         d¦  «         |                      t          ‰¦  «        d¦  «         ‰d         \  }}|                      t          |j
                             dg ¦  «        ¦  «        d¦  «         |                      |j        d¦  «         d S )Nr\   rd   rõ   c                  ó.   •— ‰                      | ¦  «        S r   )r#   )rÏ   r!   s    €r   r   z-ProxyTests.testResponseToUs.<locals>.<lambda>1  s   ø€ ¨A¯HªH°Q©K¬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˜ÑÔˆØ	�Š�E�3œ7 ;Ñ/Ô/×8Ò8Ñ:Ô:Ñ;Ô;Ð;ØˆØ!7Ð!7Ð!7Ð!7ˆŒ
ÔØŒ
×#Ò# A§J¢J¡L¤LÐ2CÑDÔDÐDØ×Ò�˜Q™œ Ñ#Ô#Ð#Ø�A”$‰ˆˆ4Ø×Ò�˜QœYŸ]š]¨5°"Ñ5Ô5Ñ6Ô6¸Ñ:Ô:Ð:Ø×Ò˜œ Ñ%Ô%Ð%Ð%Ð%r   c                 ó¨  — t          j        dd¦  «        }|                     dt          j        d¦  «                             ¦   «         ¦  «         |                     dt          j        d¦  «                             ¦   «         ¦  «         | j                             |                     ¦   «         d¦  «         |                      | j        g ¦  «         d S )Nr:   r;   rd   rÊ   rõ   r  )	r   ro   rp   r�   r2   rþ   r  r/   rø   rq   s     r   ÚtestLoopzProxyTests.testLoop8  s¦   € ÝŒK˜ )Ñ,Ô,ˆØ	�Š�E�3œ7 9Ñ-Ô-×6Ò6Ñ8Ô8Ñ9Ô9Ð9Ø	�Š�E�3œ7 ;Ñ/Ô/×8Ò8Ñ:Ô:Ñ;Ô;Ð;ØŒ
×#Ò# A§J¢J¡L¤LÐ2FÑGÔGÐGØ×Ò˜œ BÑ'Ô'Ð'Ð'Ð'r   c                 óˆ  — t          j        dd¦  «        }|                     dt          j        d¦  «                             ¦   «         ¦  «         |                     dd¦  «         t          ¦   «         | j        _        | j                             |                     ¦   «         d¦  «         |  	                    t          | j        ¦  «        d¦  «         | j        d	         \  }}|  	                    |j        |j        fd¦  «         |  	                    |j        d
¦  «         |  	                    |j        d         dg¦  «         d S )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˜ )Ñ,Ô,ˆØ	�Š�E�3œ7 9Ñ-Ô-×6Ò6Ñ8Ô8Ñ9Ô9Ð9Ø	�Š�DÐ0Ñ1Ô1Ð1Ý+Ñ-Ô-ˆŒ
ÔØŒ
×#Ò# A§J¢J¡L¤LÐ2CÑDÔDÐDØ×Ò�˜TœY™œ¨Ñ+Ô+Ð+Ø”)˜A”,‰ˆˆaØ×Ò˜$œ) T¤YÐ/Ð1BÑCÔCÐCØ×Ò˜œ Ñ%Ô%Ð%Ø×Ò˜œ 5Ô)Ð,FÐ+GÑHÔHÐHÐHÐHr   N)r   r   r   r&   r	  r  r  r  r  r  r  r   r   r   r   ró   ró   ç  s©   € € € € € ðQð Qð Qð
ð 
ð 
ð.
ð 
ð 
ð,ð ,ð ,ð	Lð 	Lð 	LðGð Gð Gð	&ð 	&ð 	&ð(ð (ð (ð
Ið 
Ið 
Ið 
Ið 
Ir   ró   c                   óV   — 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dS )ÚRegistrationTestsc                 óÔ   ‡ — t          j        d¬¦  «        ‰ _        t          j        d¦  «        ‰ _        ‰ j        x‰ j        _        ‰ j        _        g ‰ _        ˆ fd„‰ j        _        d S )Nrõ   ©rƒ   úbell.example.comc                 ó<   •— ‰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  sa   ø€ ÝÔ&¨KÐ8Ñ8Ô8ˆŒ
ÝÔ,Ð-?Ñ@Ô@ˆŒØ37´=Ð@ˆŒ
Ô˜dœjÔ0ØˆŒ	Ø!PÐ!PÐ!PÐ!PˆŒ
ÔÐÐr   c                 óz   — | j         j                             ¦   «         D ]\  }}|                     ¦   «          Œ| `d S r   )r)  ÚusersÚvaluesÚcancelrþ   )r   rÎ   r1   s      r   ÚtearDownzRegistrationTests.tearDownT  s>   € Ø”mÔ)×0Ò0Ñ2Ô2ð 	ð 	‰FˆAˆsØ�HŠH‰JŒJˆJˆJØˆJˆJˆJr   c                 óV  — t          j        dd¦  «        }|                     dd¦  «         |                     dd¦  «         |                     dt          j        d¦  «                             ¦   «         ¦  «         | j                             |                     ¦   «         d	¦  «         d S )
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  s�   € ÝŒK˜
Ð$:Ñ;Ô;ˆØ	�Š�DÐ4Ñ5Ô5Ð5Ø	�Š�IÐ8Ñ9Ô9Ð9Ø	�Š�E�3œ7 <Ñ0Ô0×9Ò9Ñ;Ô;Ñ<Ô<Ð<ØŒ
×#Ò# A§J¢J¡L¤LÐ2FÑGÔGÐGÐGÐGr   c                 ó‚  — t          j        dd¦  «        }|                     dd¦  «         |                     dd¦  «         |                     dt          j        d¦  «                             ¦   «         ¦  «         |                     d	d
¦  «         | j                             |                     ¦   «         d¦  «         d S )Nr0  r1  rA   r2  r  Ú*rd   r  ÚexpiresrR   r  r4  rq   s     r   Ú
unregisterzRegistrationTests.unregister`  s¢   € ÝŒK˜
Ð$:Ñ;Ô;ˆØ	�Š�DÐ4Ñ5Ô5Ð5Ø	�Š�I˜sÑ#Ô#Ð#Ø	�Š�E�3œ7 <Ñ0Ô0×9Ò9Ñ;Ô;Ñ<Ô<Ð<Ø	�Š�I˜sÑ#Ô#Ð#ØŒ
×#Ò# A§J¢J¡L¤LÐ2FÑGÔGÐGÐGÐGr   c                 óÔ  — |                       ¦   «          | j        d         \  }}|                      |j        |j        fd¦  «         |                      |j        d¦  «         |                      |j        d         dg¦  «         |                      |j        d         dg¦  «         |                      |j        d         d	g¦  «         t          t          ¦  «        t          k    r5|  
                    t          |j        d
         d         ¦  «        dv ¦  «         |                      t          | j        j        ¦  «        d¦  «         | j        j        d         \  }}|                      |                     ¦   «         d	¦  «         | j        j                             t'          j        dd¬¦  «        ¦  «        }|                     d„ ¦  «         |                     | 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                 ó   — | 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  s¯  € Ø�Š‰ŒˆØ”)˜A”,‰ˆˆaØ×Ò˜$œ) T¤YÐ/Ð1EÑFÔFÐFØ×Ò˜œ Ñ%Ô%Ð%Ø×Ò˜œ 5Ô)Ð,IÐ+JÑKÔKÐKØ×Ò˜œ 4œÐ+EÐ*FÑGÔGÐGØ×Ò˜œ 9Ô-Ð0IÐ/JÑKÔKÐKõ •‰=Œ=Õ2Ò2Ð2Ø�OŠO�C ¤	¨)Ô 4°QÔ 7Ñ8Ô8Ð<TÐTÑUÔUÐUØ×Ò�˜Tœ]Ô0Ñ1Ô1°1Ñ5Ô5Ð5Ø”-Ô% eÔ,‰ˆˆCØ×Ò˜Ÿš™œÐ)BÑCÔCÐCØŒJÔ×)Ò)ÝŒG˜UÐ);Ð<Ñ<Ô<ñ
ô 
ˆð 	
�ŠÐBÐBÑCÔCÐCØ	�Š�dÔ&Ð(<Ñ=Ô=Ð=Øˆr   c                 ó@  — |                       ¦   «          |                      ¦   «          | j        d         \  }}|                      |j        |j        fd¦  «         |                      |j        d¦  «         |                      |j        d         dg¦  «         |                      |j        d         dg¦  «         |                      |j        d         d	g¦  «         |                      |j        d
         dg¦  «         |                      | j        j	        i ¦  «         d S )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Ð/Ð1EÑFÔFÐFØ×Ò˜œ Ñ%Ô%Ð%Ø×Ò˜œ 5Ô)Ð,IÐ+JÑKÔKÐKØ×Ò˜œ 4œÐ+EÐ*FÑGÔGÐGØ×Ò˜œ 9Ô-Ð0IÐ/JÑKÔKÐKØ×Ò˜œ 9Ô-°¨uÑ5Ô5Ð5Ø×Ò˜œÔ,¨bÑ1Ô1Ð1Ð1Ð1r   c                 óÞ   — t          ¦   «         }t          j        |¦  «        }t          j        ¦   «         }|                     dd¦  «         |                     |¦  «         || j        _        d S )NzuserXname@127.0.0.1Ú	passXword)r   r   ÚPortalr   Ú'InMemoryUsernamePasswordDatabaseDontUseÚaddUserÚregisterCheckerrþ   )r   rr   Úprj   s       r   Ú	addPortalzRegistrationTests.addPortal‹  sa   € Ý‰KŒKˆÝŒM˜!ÑÔˆÝÔ<Ñ>Ô>ˆØ	�	Š	Ð'¨Ñ5Ô5Ð5Ø	×Ò˜!ÑÔÐØˆŒ
ÔÐÐr   c                 óV  — |                       ¦   «          |                      ¦   «          |                      t          | j        j        ¦  «        d¦  «         |                      t          | j        ¦  «        d¦  «         | j        d         \  }}|                      |j        d¦  «         d S )Nr   r.   i‘  )rP  r5  r/   rD   r)  r+  rø   r_   rG  s      r   ÚtestFailedAuthenticationz*RegistrationTests.testFailedAuthentication“  s�   € Ø�ŠÑÔÐØ�Š‰Œˆà×Ò�˜Tœ]Ô0Ñ1Ô1°1Ñ5Ô5Ð5Ø×Ò�˜TœY™œ¨Ñ+Ô+Ð+Ø”)˜A”,‰ˆˆaØ×Ò˜œ Ñ%Ô%Ð%Ð%Ð%r   c                 ó¦  — t          j        dd¦  «        }|                     dd¦  «         |                     dd¦  «         |                     dt          j        d¦  «                             ¦   «         ¦  «         | j                             |                     ¦   «         d	¦  «         |                      t          | j	        ¦  «        d
¦  «         d S )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˜
 OÑ4Ô4ˆØ	�Š�DÐ4Ñ5Ô5Ð5Ø	�Š�IÐ8Ñ9Ô9Ð9Ø	�Š�E�3œ7 <Ñ0Ô0×9Ò9Ñ;Ô;Ñ<Ô<Ð<ØŒ
×#Ò# A§J¢J¡L¤LÐ2FÑGÔGÐGØ×Ò�˜TœY™œ¨Ñ+Ô+Ð+Ð+Ð+r   c                 ó¦  — t          j        dd¦  «        }|                     dd¦  «         |                     dd¦  «         |                     dt          j        d¦  «                             ¦   «         ¦  «         | j                             |                     ¦   «         d	¦  «         |                      t          | j	        ¦  «        d
¦  «         d S )Nr0  r1  rA   zsip:joe@foo.comr  r3  rd   r  r  r   rT  rq   s     r   ÚtestWrongToDomainRegisterz+RegistrationTests.testWrongToDomainRegister¤  s­   € ÝŒK˜
Ð$:Ñ;Ô;ˆØ	�Š�DÐ+Ñ,Ô,Ð,Ø	�Š�IÐ8Ñ9Ô9Ð9Ø	�Š�E�3œ7 <Ñ0Ô0×9Ò9Ñ;Ô;Ñ<Ô<Ð<ØŒ
×#Ò# A§J¢J¡L¤LÐ2FÑGÔGÐGØ×Ò�˜TœY™œ¨Ñ+Ô+Ð+Ð+Ð+r   c                 óÎ   — |                       ¦   «          t          j        dd¬¦  «        }| j        j                             |¦  «        }|                      |t          ¦  «         |S )Nr=   r  r=  ©r5  r   rè   rþ   rÿ   rë   ÚassertFailurerñ   ©r   r½   rÎ   s      r   ÚtestWrongDomainLookupz'RegistrationTests.testWrongDomainLookup¬  sV   € Ø�Š‰ŒˆÝŒg˜u¨9Ð5Ñ5Ô5ˆØŒJÔ×)Ò)¨#Ñ.Ô.ˆØ×Ò˜1�kÑ*Ô*Ð*Øˆr   c                 óÎ   — |                       ¦   «          t          j        dd¬¦  «        }| j        j                             |¦  «        }|                      |t          ¦  «         |S )NÚjaner%  r=  rY  r[  s      r   ÚtestNoContactLookupz%RegistrationTests.testNoContactLookup³  sW   € Ø�Š‰ŒˆÝŒg˜vÐ,>Ð?Ñ?Ô?ˆØŒ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  sÑ   € € € € € ðQð Qð Qðð ð ð
Hð Hð HðHð Hð Hðð ð ð.
2ð 
2ð 
2ðð ð ð&ð &ð &ð,ð ,ð ,ð,ð ,ð ,ðð ð ðð ð ð ð r   r"  c                   ó   — e Zd Zd„ Zd„ ZdS )ÚClientc                 ó‚   — t           j                             | ¦  «         g | _        t	          j        ¦   «         | _        d S r   )r   ÚBaseÚ__init__r³   r   ÚDeferredÚdeferredr%   s    r   rd  zClient.__init__¼  s2   € ÝŒ×Ò˜$ÑÔÐØˆŒÝœÑ(Ô(ˆŒˆˆr   c                 óx   — | j                              |¦  «         | j                             | j         ¦  «         d S r   )r³   r#   rf  Úcallback)r   Úresponser  s      r   Úhandle_responsezClient.handle_responseÁ  s6   € ØŒ×Ò˜XÑ&Ô&Ð&ØŒ×Ò˜tœ}Ñ-Ô-Ð-Ð-Ð-r   N)r   r   r   rd  rj  r   r   r   ra  ra  »  s2   € € € € € ð)ð )ð )ð
.ð .ð .ð .ð .r   ra  c                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )Ú	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        f| _        d S )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Ñ8Ô8ˆŒ
ÝÔ,Ð-?Ñ@Ô@ˆŒØ37´=Ð@ˆŒ
Ô˜dœjÔ0Ý!Ô+¨A¨t¬zÀ[ÐQÑQÔQˆŒÝ‘h”hˆŒÝ!Ô+¨A¨t¬{ÀkÐRÑRÔRˆŒàŒO×#Ò#Ñ%Ô%Ô*ØŒO×#Ò#Ñ%Ô%Ô*ð
ˆÔÐÐr   c                 ó  — | j         j                             ¦   «         D ]\  }}|                     ¦   «          Œ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Ó  st   € Ø”mÔ)×0Ò0Ñ2Ô2ð 	ð 	‰FˆAˆsØ�HŠH‰JŒJˆJˆJÝÔ  ¤Ô!>Ñ?Ô?ˆÝÔ  ¤Ô!>Ñ?Ô?ˆÝÔ" B¨ 8Ñ,Ô,Ð,r   c                 ó  ‡ — ‰ j                              ¦   «         j        }t          j        dd¦  «        }|                     dd¦  «         |                     dd|z  ¦  «         |                     dt          j        d|¬	¦  «                             ¦   «         ¦  «         ‰ j         	                    t          j
        d‰ j        d
         ¬¦  «        |¦  «         ‰ j        j        }ˆ fd„}|                     |¦  «         |S )Nr0  r1  rA   r2  r  úsip:joe@127.0.0.1:%drd   rõ   ræ   r.   r?  c                 ó”   •— ‰                      t          | ¦  «        d¦  «         | d         }‰                      |j        d¦  «         d S ©Nr.   r   r\   ©r/   rD   r_   ©r³   rr   r   s     €r   Úcheckz%LiveTests.testRegister.<locals>.checkå  óF   ø€ Ø×Ò�S ™]œ]¨AÑ.Ô.Ð.Ø˜”ˆAØ×Ò˜Qœ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×#Ò#Ñ%Ô%Ô*ˆÝŒK˜
Ð$:Ñ;Ô;ˆØ	�Š�DÐ4Ñ5Ô5Ð5Ø	�Š�IÐ5¸Ñ9Ñ:Ô:Ð:Ø	�Š�E�3œ7 ;°QÐ7Ñ7Ô7×@Ò@ÑBÔBÑCÔCÐCØŒ×ÒÝŒG˜¨4Ô+=¸aÔ+@ÐAÑAÔAÀ1ñ	
ô 	
ð 	
ð ŒKÔ ˆð	*ð 	*ð 	*ð 	*ð 	*ð
 	
�Š�eÑÔÐØˆr   c                 ó  ‡ — ‰ j                              ¦   «         j        }t          j        dd¦  «        }|                     dd¦  «         |                     dd|z  ¦  «         |                     dt          j        d|d	¬
¦  «                             ¦   «         ¦  «         ‰                      ‰ j	        g¬¦  «        }‰  
                    t          |¦  «        d¦  «         ‰  
                    |d         d         d¦  «         ‰  
                    |d         d         t          ¦  «         ‰ j                             t          j        d‰ j        d         ¬¦  «        |¦  «         ‰ j        j        }ˆ fd„}|                     |¦  «         |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                 ó”   •— ‰                      t          | ¦  «        d¦  «         | d         }‰                      |j        d¦  «         d S 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í  s‚  ø€ ð ŒO×#Ò#Ñ%Ô%Ô*ˆÝŒK˜
Ð$:Ñ;Ô;ˆØ	�Š�DÐ4Ñ5Ô5Ð5Ø	�Š�IÐ5¸Ñ9Ñ:Ô:Ð:Ø	�Š�E�3œ7 ;°Q¸dÐCÑCÔC×LÒLÑNÔNÑOÔOÐOØ×%Ò%¸$Ô:OÐ9PÐ%ÑQÔQˆØ×Ò�˜X™œ¨Ñ*Ô*Ð*Ø×ÒØ�QŒK˜	Ô"Ð$Qñ	
ô 	
ð 	
ð 	×Ò˜ !œ ZÔ0Õ2DÑEÔEÐEØŒ×ÒÝŒG˜¨4Ô+=¸aÔ+@ÐAÑAÔAÀ1ñ	
ô 	
ð 	
ð ŒKÔ ˆð	*ð 	*ð 	*ð 	*ð 	*ð
 	
�Š�eÑÔÐØˆr   N)r   r   r   r&   r.  rE  r…  r   r   r   rl  rl  Æ  sP   € € € € € ð

ð 

ð 

ð-ð -ð -ðð ð ð&ð ð ð ð 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‘     sv  ðð
ð ð *Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø !Ð !Ð !Ð !Ð !Ð !Ø "Ð "Ð "Ð "Ð "Ð "ð"ØFÐFÐFÐFÐFÐFÐFøØð "ð "ð "Ø!ÐÐÐð"øøøð 'Ð &Ð &Ð &Ð &Ð &ð ð÷ 	ŠØˆfñ	ô 	ñ	ð 	ð÷ 	ŠØˆ&ñ	ô 	ð	 	ð÷ Š7Øˆ&ñô ð 	ð÷ 	ŠØˆ&ñ	ô 	ð 	ð(÷
 ‚GØˆ&ñô ð 
ð÷ 	ŠØˆ&ñ	ô 	ð ð÷ ‚GØˆ&ñô ð	 ð÷ ‚gØˆ&ñô ð ð(0ð 0ð 0ð 0ð 0ñ 0ô 0ð 0ð
E
ð E
ð E
ð E
ð E
˜(Ô+ñ E
ô E
ð E
ðPð ð ð ð Ð,?ñ ô ð ðAð Að Að Að A�xÔ(ñ Aô Að Að(u*ð u*ð u*ð u*ð u*ˆxÔ ñ u*ô u*ð u*ðp1ð 1ð 1ð 1ð 1ˆxÔ ñ 1ô 1ð 1ð@.ð .ð .ð .ð .�Ô"ñ .ô .ð .ð2 €ˆSŒ\ÑÔð?ð ?ð ?ð ?ð ?ñ ?ô ?ñ Ôð?ð
 €ˆSŒ\ÑÔð)ð )ð )ð )ð )ñ )ô )ñ Ôð)ð
bIð bIð bIð bIð bI�Ô"ñ bIô bIð bIðJlð lð lð lð l˜Ô)ñ lô lð lð^.ð .ð .ð .ð .ˆSŒXñ .ô .ð .ðFð Fð Fð Fð F�Ô!ñ Fô Fð Fð Fð Fs    ' §1°1