o
    èó·i¨£  ã                   @   sd  d dl Z d dlmZ e j dd¡r°d dlmZmZmZ d dlm	Z	m
Z
mZ d dlmZ d dlZd dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZmZmZ d dlm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' G dd„ de(ƒZ)G dd„ dej*ƒZ+G dd„ dej*ƒZ,G dd„ dej*ƒZ-G dd„ dej*ƒZ.G dd„ dej*ƒZ/dS dS )é    NZUSE_TWISTEDF)ÚinlineCallbacksÚDeferredÚreturnValue)ÚsucceedÚfailÚDeferredList)Úunittest)Úutil)ÚApplicationSession)ÚSession)ÚmessageÚroleÚ
serializerÚtypesÚuriÚCloseDetails)ÚCallRequest)ÚApplicationErrorÚNotAuthorized)Ú
InvalidUriÚProtocolError)Úcreate_authenticator)ÚIAuthenticator)ÚTransportDetailsc                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚMockTransportc                 C   s~   d| _ || _t ¡ | _i | _i | _i | _| j | ¡ t	 
¡ | _t ¡ t ¡ dœ}t | j|¡}| j |¡ tƒ | _tƒ | _d S )NF)ZbrokerZdealer)Ú_logÚ_handlerr   ZJsonSerializerÚ_serializerÚ_registrationsÚ_invocationsÚ_subscription_topicsZonOpenr	   ÚidZ_my_session_idr   ZRoleBrokerFeaturesZRoleDealerFeaturesr   ZWelcomeÚ	onMessager
   Ú_fake_router_sessionr   Ú_transport_details)ÚselfÚhandlerZrolesÚmsg© r(   úkC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\autobahn/wamp/test/test_wamp_protocol.pyÚ__init__2   s   

zMockTransport.__init__c                 C   s   | j S ©N)r$   ©r%   r(   r(   r)   Útransport_detailsG   s   zMockTransport.transport_detailsc                 C   s   | j  t d|¡¡ d S )Nr   )r   r"   r   ÚUnregistered)r%   Zreg_idr(   r(   r)   Údrop_registrationJ   s   
ÿzMockTransport.drop_registrationc           	      C   s  | j r| j |¡\}}td |¡ƒ d }t|tjƒrW|j 	d¡r0|j
r.t |j| jj ¡ ¡}�n4t|jƒdkrCt tjj|jd¡}�n!|j 	d¡rK�nt tjj|jd¡}�nt|tjƒrÊ|jdkrltj|jdgd	�}nø|jd
kr|tj|jg d¢d	�}nè|jdkr�tj|jg d¢dddœd�}nÔ|j 	d¡r¿| j|j }| jj ¡ }|| jv r«tdƒ‚|j| j|< tj|||j|j|jd�}n¥t tjj|jd¡}nšt|tjƒré|j| jv rè| j|j }tj||j|j|jd�}n{t|tjƒ�r|j}|| j v rþ| j | }n| jj ¡ }|| j |< t !|j|¡}nSt|tj"ƒ�rt #|j¡}nEt|tj$ƒ�r:| jj ¡ }|| j|j< t %|j|¡}n*t|tj&ƒ�rHt '|j¡}nt|tjƒ�rd| j|j }tjtjj||j(|j|jd�}|�r‚| j �rz| j |¡\}}td |¡ƒ | j) *|¡ d S d S )Nz	Send: {0}z	com.myappr   zwamp.error.invalid_uriznoreply.zwamp.error.not_authorizedúcom.myapp.procedure1éd   ©Úargsúcom.myapp.procedure2©é   é   é   úcom.myapp.procedure3Úbaré   ©ÚfooZbaz©r3   Úkwargszcom.myapp.myproczduplicate invocation)r3   r?   Úreceive_progresszwamp.error.no_such_procedure)r3   r?   ÚprogresszReceive: {0})+r   r   Ú	serializeÚprintÚformatÚ
isinstancer   ZPublishÚtopicÚ
startswithÚacknowledgeZ	PublishedÚrequestr#   Z_request_id_genÚnextÚlenÚErrorZMESSAGE_TYPEÚCallÚ	procedureÚResultr   r   r   Z
Invocationr3   r?   r@   ÚYieldrA   Z	Subscriber    Z
SubscribedZUnsubscribeÚUnsubscribedÚRegisterZ
RegisteredÚ
Unregisterr.   Úerrorr   r"   )	r%   r'   ÚpayloadZisbinaryZreplyÚregistrationrI   rF   Zreply_idr(   r(   r)   ÚsendO   sŠ   €



ü€

ûüzMockTransport.sendc                 C   ó   dS ©NTr(   r,   r(   r(   r)   ÚisOpen£   ó   zMockTransport.isOpenc                 C   ó   d S r+   r(   r,   r(   r(   r)   Úclose¦   r[   zMockTransport.closec                 C   r\   r+   r(   r,   r(   r(   r)   Úabort©   r[   zMockTransport.abortN)
Ú__name__Ú
__module__Ú__qualname__r*   r-   r/   rW   rZ   r]   r^   r(   r(   r(   r)   r   0   s    Tr   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )Ú	TestClosec                 C   s   t ƒ }t|ƒ | d¡ d S )NF)r
   r   ÚonClose)r%   r&   r(   r(   r)   Útest_server_abort­   s   zTestClose.test_server_abortc                 C   s<   t ƒ }t|ƒ ttƒ ƒ}tdd|i ƒ|jd< | tƒ ¡ d S )Nr6   r=   )r
   r   r   Ú	Exceptionr   Z
_call_reqsÚonLeaver   )r%   r&   Údeferredr(   r(   r)   Útest_reject_pendingµ   s
   
zTestClose.test_reject_pendingN)r_   r`   ra   re   ri   r(   r(   r(   r)   rc   ¬   s    rc   c                   @   rb   )ÚTestRegisterDecoratorc                 C   ó„   G dd„ dt ƒ}|ƒ }t ¡ |_|j|dd� |  dt|jjƒ¡ |jjd }|  d|d ¡ | ¡ d d d }|  d|j	¡ d S )	Nc                   @   s   e Zd Ze d¡dd„ ƒZdS )z1TestRegisterDecorator.test_prefix.<locals>.PrefixÚmethod_namec                 S   r\   r+   r(   r,   r(   r(   r)   Úsome_methodÄ   ó   z=TestRegisterDecorator.test_prefix.<locals>.Prefix.some_methodN©r_   r`   ra   r   Úregisterrm   r(   r(   r(   r)   ÚPrefixÂ   ó    rq   zcom.example.prefix.©Úprefixr6   r   rW   zcom.example.prefix.method_name©
r
   ÚmockÚMockÚ
_transportrp   ÚassertEqualrK   Z
mock_callsÚ	call_listrN   )r%   rq   ÚsessionÚcallÚregr(   r(   r)   Útest_prefixÀ   s   
z!TestRegisterDecorator.test_prefixc                 C   rk   )	Nc                   @   s   e Zd Ze d¡dd„ ƒZdS )z3TestRegisterDecorator.test_auto_name.<locals>.MagicNc                 S   r\   r+   r(   r,   r(   r(   r)   rm   Ø   rn   z?TestRegisterDecorator.test_auto_name.<locals>.Magic.some_methodro   r(   r(   r(   r)   ÚMagicÖ   rr   r   zcom.example.rs   r6   r   rW   zcom.example.some_methodru   )r%   r   r{   r|   r}   r(   r(   r)   Útest_auto_nameÔ   s   
z$TestRegisterDecorator.test_auto_nameN)r_   r`   ra   r~   r€   r(   r(   r(   r)   rj   ¾   s    rj   c                   @   sô   e Zd Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd „ ƒZed!d"„ ƒZd#d$„ Zed%d&„ ƒZd'd(„ Zd)S )*ÚTestPublisherc                 c   sü   � t ƒ }t|ƒ | d¡V }|  |d ¡ | dddd¡V }|  |d ¡ |jddddddd�V }|  |d ¡ |jdtjdd	�d
�V }|  |d ¡ |jddddddtjdg d¢d�d�V }|  |d ¡ |jddddddtjdg d¢dd�d�V }|  |d ¡ d S )Núcom.myapp.topic1r6   r7   r8   r;   Úhello©r=   r:   F)Ú
exclude_me©Úoptions©r1   éÈ   i,  )r…   Úexclude©r=   r:   r‡   T)r…   rŠ   Zretain)r
   r   Úpublishry   r   ÚPublishOptions©r%   r&   Úpublicationr(   r(   r)   Útest_publishé   s   €(*zTestPublisher.test_publishc              
   c   s�   � t ƒ }t|ƒ |jdtjdd�d�}tjddd�}| |¡V  z|V  W d S  tyG } z|  d|j	¡ |  d|j
¡ W Y d }~d S d }~ww )Núnoreply.fooT©rH   r†   Útestingúhow are you?©Úreasonr   )r
   r   rŒ   r   r�   r   rg   r   ry   rT   r   )r%   r&   r�   ÚdetailsÚer(   r(   r)   Útest_publish_outstanding_errors   s    €
þ€þz-TestPublisher.test_publish_outstanding_errorsc              
   #   sÊ   � t ƒ }t|ƒ tƒ ‰ |jdtjdd�d�}g ‰‡ ‡fdd„}| |¡ tjddd	�}| |¡ |  	d
t
ˆƒ¡ ˆ  d ¡ z|V  W d S  tyd } z|  	d|j¡ |  	d|j¡ W Y d }~d S d }~ww )Nr‘   Tr’   r†   c                    s   ˆ  | ¡ ˆ S r+   )Úappend)r   ©Zerror_dZ
got_errorsr(   r)   Úerrback(  s   
zLTestPublisher.test_publish_outstanding_errors_async_errback.<locals>.errbackr“   r”   r•   r6   )r
   r   r   rŒ   r   r�   Z
addErrbackr   rg   ry   rK   Úcallbackr   rT   r   )r%   r&   Zpublication_drœ   r—   r˜   r(   r›   r)   Ú-test_publish_outstanding_errors_async_errback  s,   €
þ


€þz;TestPublisher.test_publish_outstanding_errors_async_errbackc                 c   s  � t ƒ }t|ƒ |jdtjdd�d�V }|  t|jƒtk¡ |jddddtjdd�d�V }|  t|jƒtk¡ |jdddddd	tjdd�d
�V }|  t|jƒtk¡ |jdtjddd�d�V }|  t|jƒtk¡ |jdddddd	tjdg d¢dd�d
�V }|  t|jƒtk¡ d S )Nr‚   Tr’   r†   r6   r7   r8   r;   rƒ   r‹   F)r…   rH   rˆ   )r…   rŠ   rH   )	r
   r   rŒ   r   r�   Ú
assertTrueÚtyper!   ÚintrŽ   r(   r(   r)   Útest_publish_acknowledgedA  s   €"*z'TestPublisher.test_publish_acknowledgedc                 c   sP   � t ƒ }t|ƒ tjdd�}|  |jd|d�t¡V  |  |jd|d�t¡V  d S ©NTr’   zde.myapp.topic1r†   Zfoobar)r
   r   r   r�   ÚassertFailurerŒ   r   ©r%   r&   r‡   r(   r(   r)   Ú test_publish_undefined_exceptionU  s   €z.TestPublisher.test_publish_undefined_exceptionc                 c   sd   � t ƒ }t|ƒ tjdd�}| t¡ |  |jd|d�t¡V  | t¡ |  |jd|d�t¡V  d S r£   )	r
   r   r   r�   Zdefiner   r¤   rŒ   r   r¥   r(   r(   r)   Útest_publish_defined_exception_  s   €

z,TestPublisher.test_publish_defined_exceptionc              
   c   sÀ   � t ƒ }t|ƒ | d¡V }|  |d¡ | dddd¡V }|  |d¡ |jddddddd�V }|  |d¡ |jdtjd	d
�d�V }|  |d¡ |jddddddtjd	d
�d�V }|  |d¡ d S )Nr0   r1   r6   r7   r8   r;   rƒ   r„   i'  )Útimeoutr†   r‹   )r
   r   r|   ry   r   ÚCallOptions©r%   r&   Úresr(   r(   r)   Ú	test_calll  s   €"zTestPublisher.test_callc                 c   s†   � t ƒ }t|ƒ | d¡V }|  |tj¡ |  |jd¡ |  |ji ¡ | d¡V }|  |tj¡ |  |jd¡ |  |jdddœ¡ d S )Nr4   r5   r9   r:   r;   r<   )	r
   r   r|   ÚassertIsInstancer   Z
CallResultry   ÚresultsZ	kwresultsrª   r(   r(   r)   Útest_call_with_complex_result€  s   €z+TestPublisher.test_call_with_complex_resultc                 c   sœ   � t ƒ }t|ƒ dd„ }| |d¡V }|  t|jƒtk¡ |j|dtjdd�d�V }|  t|jƒtk¡ |j|dtjddd�d�V }|  t|jƒtk¡ d S )	Nc                  _   ó   t d| |ƒ d S ©Nz	got event©rC   r>   r(   r(   r)   Úon_event”  ó   z.TestPublisher.test_subscribe.<locals>.on_eventr‚   Zwildcard©Úmatchr†   T)r¶   Zget_retained)	r
   r   Ú	subscriberŸ   r    r!   r¡   r   ÚSubscribeOptions©r%   r&   r³   Zsubscriptionr(   r(   r)   Útest_subscribe�  s   €zTestPublisher.test_subscribec                 #   sª   � t ƒ }t|ƒ tƒ ‰ tƒ ‰| ‡ fdd„d¡V }| ‡fdd„d¡V }|  |j|jk¡ |jdtjddd�d�V }| 	t
 |j|j¡¡ |  ˆ jd	¡ |  ˆjd	¡ d S )
Nc                      ó
   ˆ   d¡S ©Né*   ©r�   r(   ©Úevent0r(   r)   Ú<lambda>©  ó   
 z5TestPublisher.test_double_subscribe.<locals>.<lambda>r‚   c                      r»   ©Nr=   r¾   r(   ©Úevent1r(   r)   rÁ   «  rÂ   TF©rH   r…   r†   úMissing callback)r
   r   r   r·   rŸ   r!   rŒ   r   r�   r"   r   ÚEventÚcalled)r%   r&   Úsubscription0Úsubscription1rŒ   r(   )rÀ   rÅ   r)   Útest_double_subscribe   s&   €ÿÿþz#TestPublisher.test_double_subscribec                 #   sÈ   � t ƒ ‰tˆƒ ‡fdd„}|ˆ_tƒ ‰ tƒ ‰ˆ ‡ fdd„d¡V }ˆ ‡fdd„d¡V }|  |j|jk¡ | ¡ V  ˆjdt	j
ddd	�d
�V }ˆ t |j|j¡¡ |  ˆ jd¡ |  ˆj d¡ dS )z}
            Make sure we correctly deal with unsubscribing one of our handlers
            from the same topic.
            c                    s   t | tjƒrJ ‚t ˆ | ¡S r+   )rE   r   rQ   r
   r"   ©r'   )r&   r(   r)   r"   È  s   zITestPublisher.test_double_subscribe_single_unsubscribe.<locals>.onMessagec                      r»   r¼   r¾   r(   r¿   r(   r)   rÁ   Ò  rÂ   zHTestPublisher.test_double_subscribe_single_unsubscribe.<locals>.<lambda>r‚   c                      r»   rÃ   r¾   r(   rÄ   r(   r)   rÁ   Ô  rÂ   TFrÆ   r†   rÇ   úSecond callback fired.N)r
   r   r"   r   r·   rŸ   r!   ÚunsubscriberŒ   r   r�   r   rÈ   rÉ   ©r%   r"   rÊ   rË   rŒ   r(   )rÀ   rÅ   r&   r)   Ú(test_double_subscribe_single_unsubscribe¼  s,   €ÿÿ
þz6TestPublisher.test_double_subscribe_single_unsubscribec                 #   s  � t ƒ ‰tˆƒ tƒ ‰‡‡fdd„}|ˆ_tƒ ‰ tƒ ‰ˆ ‡ fdd„d¡V }ˆ ‡fdd„d¡V }|  |j|jk¡ | ¡ V  | ¡ V  ˆjsIJ ‚ˆj	dt
jddd	�d
�V }zˆ t |j|j¡¡ |  d¡ W n	 tyq   Y nw |  ˆ j d¡ |  ˆj d¡ dS )z
            If we subscribe twice, and unsubscribe twice, we should then get
            an Unsubscribed message.
            c                    s"   t | tjƒrˆ | ¡ t ˆ | ¡S r+   )rE   r   rQ   r�   r
   r"   rÍ   )r&   Úunsubscribed_dr(   r)   r"   ó  s   
zITestPublisher.test_double_subscribe_double_unsubscribe.<locals>.onMessagec                      r»   r¼   r¾   r(   r¿   r(   r)   rÁ   ý  rÂ   zHTestPublisher.test_double_subscribe_double_unsubscribe.<locals>.<lambda>r‚   c                      r»   rÃ   r¾   r(   rÄ   r(   r)   rÁ   ÿ  rÂ   TFrÆ   r†   zExpected ProtocolErrorzFirst callback fired.rÎ   N)r
   r   r   r"   r·   rŸ   r!   rÏ   rÉ   rŒ   r   r�   r   rÈ   r   r   rÐ   r(   )rÀ   rÅ   r&   rÒ   r)   Ú(test_double_subscribe_double_unsubscribeç  s<   €ÿÿ


þÿz6TestPublisher.test_double_subscribe_double_unsubscribec                 #   sØ   � t ƒ }t|ƒ tƒ ‰ tƒ ‰‡‡fdd„}| ‡ fdd„d¡V }| |dtjdd�¡V }ˆ |j|jk¡ |jdtj	dd	d
�d�V }| 
tj|j|jdgd�¡ ˆ ˆ j¡ ˆ ˆj¡ ˆ ˆ jd¡ ˆ ˆjd¡ dS )z²
            Test various error-conditions when we try to add a second
            subscription-handler (its signature must match any
            existing handlers).
            c                     s2   ˆ  d|v ¡ ˆ  t|d tjƒ¡ ˆ  | ¡ d S )NÚboom)rŸ   rE   r   ZEventDetailsr�   )r3   Úkw)rÅ   r%   r(   r)   Úsecond)  s   z:TestPublisher.test_double_subscribe_errors.<locals>.secondc                    s
   ˆ   | ¡S r+   r¾   ©Úargr¿   r(   r)   rÁ   1  rÂ   z<TestPublisher.test_double_subscribe_errors.<locals>.<lambda>r‚   rÔ   ©Zdetails_argTFrÆ   r†   Úarg0r2   )rÚ   N)r
   r   r   r·   r   r¸   rŸ   r!   rŒ   r�   r"   r   rÈ   rÉ   ry   Úresult)r%   r&   rÖ   rÊ   rË   rŒ   r(   )rÀ   rÅ   r%   r)   Útest_double_subscribe_errors  s2   €ÿ
þþÿz*TestPublisher.test_double_subscribe_errorsc                 #   s�   � t ƒ }t|ƒ tdƒ‰ tƒ ‰‡ ‡fdd„}||_‡ fdd„}| |d¡V }|jdtjddd	�d
�V }t	 
|j|j¡}| |¡ |  ˆj¡ dS )zK
            Ensure we handle an exception from the user code.
            zwe have a problemc                    s   ˆ | j krˆ d¡ d S d S rY   )Úvaluer�   ©r˜   r'   ©Úerror_instanceZ	got_err_dr(   r)   ÚobserverW  s   
ÿz?TestPublisher.test_publish_callback_exception.<locals>.observerc                      ó   ˆ ‚r+   r(   r(   )rà   r(   r)   rÔ   \  r[   z;TestPublisher.test_publish_callback_exception.<locals>.boomr‚   TFrÆ   r†   N)r
   r   ÚRuntimeErrorr   ÚonUserErrorr·   rŒ   r   r�   r   rÈ   r!   r"   rŸ   rÉ   )r%   r&   rá   rÔ   ÚsubrŒ   r'   r(   rß   r)   Útest_publish_callback_exceptionL  s    €þ
z-TestPublisher.test_publish_callback_exceptionc                 c   ó4   � t ƒ }t|ƒ dd„ }| |d¡V }| ¡ V  d S )Nc                  _   r°   r±   r²   r>   r(   r(   r)   r³   s  r´   z0TestPublisher.test_unsubscribe.<locals>.on_eventr‚   )r
   r   r·   rÏ   r¹   r(   r(   r)   Útest_unsubscriben  ó   €zTestPublisher.test_unsubscribec                 c   sl   � t ƒ }t|ƒ dd„ }| |d¡V }|  t|jƒtk¡ |j|dtjdd�d�V }|  t|jƒtk¡ d S )Nc                  _   r°   ©Nzgot callr²   r>   r(   r(   r)   Úon_call~  r´   z,TestPublisher.test_register.<locals>.on_callr0   rt   rµ   r†   )	r
   r   rp   rŸ   r    r!   r¡   r   ÚRegisterOptions©r%   r&   rë   rV   r(   r(   r)   Útest_registery  s   €zTestPublisher.test_registerc                 c   rç   )Nc                  _   r°   rê   r²   r>   r(   r(   r)   rë   Œ  r´   z.TestPublisher.test_unregister.<locals>.on_callr0   )r
   r   rp   Ú
unregisterrí   r(   r(   r)   Útest_unregister‡  ré   zTestPublisher.test_unregisterc                 C   sp   t jjdk rd S tƒ }t|ƒ}|  t¡�}| t 	dd¡¡ W d   ƒ n1 s(w   Y  |  
dt|jƒ¡ d S )Né   r   iÒ  z3UNREGISTERED received for non-existant registration)ÚtwistedÚversionÚmajorr
   r   ÚassertRaisesr   rW   r   rS   ÚassertInÚstrÚ	exception)r%   r&   Ú	transportÚctxr(   r(   r)   Ú$test_unregister_no_such_registration’  s   
ÿÿþz2TestPublisher.test_unregister_no_such_registrationc                 #   sL   � t ƒ }t|ƒ}‡ fdd„‰ dˆ _| ˆ d¡V }| |j¡ |  ˆ j¡ d S )Nc                     s
   dˆ _ d S rY   )rÉ   r>   ©rë   r(   r)   rë   ¦  s   
z2TestPublisher.test_unregister_log.<locals>.on_callFr0   )r
   r   rÉ   rp   r/   r!   ZassertFalse)r%   r&   rù   rV   r(   rü   r)   Útest_unregister_log¡  s   €z!TestPublisher.test_unregister_logc                    s\   g ‰ G ‡ fdd„dt ƒ}|ƒ }t|ƒ | d¡ |  tˆ ƒd¡ |  tˆ d d tƒ¡ d S )Nc                       s"   e Zd Z‡ fdd„Zddd„ZdS )z7TestPublisher.test_on_disconnect_error.<locals>.AppSessc                    s   ˆ   |j|f¡ d S r+   ©rš   rÝ   )r%   r˜   r'   ©Úerrorsr(   r)   rä   ²  ó   zCTestPublisher.test_on_disconnect_error.<locals>.AppSess.onUserErrorÚsnarkc                 S   s   t dƒ‚)NzThis shouldn't happen)rã   )r%   r=   r:   Zquuxr(   r(   r)   ÚonDisconnectµ  s   zDTestPublisher.test_on_disconnect_error.<locals>.AppSess.onDisconnectN)r  )r_   r`   ra   rä   r  r(   rÿ   r(   r)   ÚAppSess±  s    r  Fr6   r   )r
   r   rd   ry   rK   rŸ   rE   Ú	TypeError)r%   r  Úsr(   rÿ   r)   Útest_on_disconnect_error®  s   
z&TestPublisher.test_on_disconnect_errorN)r_   r`   ra   r   r�   r™   rž   r¢   r¦   r§   r¬   r¯   rº   rÌ   rÑ   rÓ   rÜ   ræ   rè   rî   rð   rû   rý   r  r(   r(   r(   r)   r�   ç   sN    


(

	





*
4
/
!





r�   c                   @   s„   e Zd Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZdS )ÚTestInvokerc                 c   sB   � t ƒ }t|ƒ dd„ }| |d¡V  | d¡V }|  |d¡ d S )Nc                   S   rX   ©Nr;   r(   r(   r(   r(   r)   Úmyproc1Ë  r[   z(TestInvoker.test_invoke.<locals>.myproc1úcom.myapp.myproc1r;   )r
   r   rp   r|   ry   )r%   r&   r
  r«   r(   r(   r)   Útest_invokeÆ  s   €zTestInvoker.test_invokec                 c   s\   � t ƒ }t|ƒ dd„ }| |d¡V  | d¡}| d¡}t||gƒV }|  |ddg¡ d S )Nc                   S   rX   r	  r(   r(   r(   r(   r)   r
  Ø  r[   z.TestInvoker.test_invoke_twice.<locals>.myproc1r  ©Tr;   )r
   r   rp   r|   r   ry   )r%   r&   r
  Úd0Úd1r«   r(   r(   r)   Útest_invoke_twiceÓ  s   €

zTestInvoker.test_invoke_twicec           	      #   s°   � t ƒ }t ƒ }t|ƒ}t|ƒ}‡fdd„‰|j‰ |j‰‡ ‡fdd„|_‡‡fdd„|_dd„ }| |d¡V  | |d¡V  | d¡}| d¡}t||gƒV }ˆ |d	d	g¡ d
S )zW
            make sure each session independently generates sequential IDs
            c                    sD   t |tjƒrˆ  |jd¡ | |ƒS t |tjƒrˆ  |jd¡ | |ƒS )Nr6   r7   )rE   r   rR   ry   rI   rM   )Úorigr'   r,   r(   r)   Úverify_seq_idî  s   þzCTestInvoker.test_invoke_request_id_sequences.<locals>.verify_seq_idc                    ó
   ˆˆ | ƒS r+   r(   rÍ   )Úorig0r  r(   r)   rÁ   ö  rÂ   z>TestInvoker.test_invoke_request_id_sequences.<locals>.<lambda>c                    r  r+   r(   rÍ   )Úorig1r  r(   r)   rÁ   ÷  rÂ   c                   S   rX   r	  r(   r(   r(   r(   r)   r
  ù  r[   z=TestInvoker.test_invoke_request_id_sequences.<locals>.myproc1r  r  N)r
   r   rW   rp   r|   r   ry   )	r%   Zhandler0Zhandler1Ztrans0Ztrans1r
  r  r  r«   r(   )r  r  r%   r  r)   Ú test_invoke_request_id_sequencesâ  s"   €

z,TestInvoker.test_invoke_request_id_sequencesc              
   #   sÆ   � t ƒ }d|_t|ƒ g ‰ ‡ fdd„}||_tdƒ‰‡fdd„}| |d¡V  z| d¡V  |  d¡ W n tyN } z|  	t
|tƒ¡ W Y d }~nd }~ww |  d	tˆ ƒ¡ |  ˆˆ d
 d
 ¡ d S )NTc                    ó   ˆ   | j|f¡ d S r+   rþ   rÞ   rÿ   r(   r)   Ú	log_error  r  z6TestInvoker.test_invoke_user_raises.<locals>.log_errorr=   c                      râ   r+   r(   r(   )Ú
name_errorr(   r)   Úbing  r[   z1TestInvoker.test_invoke_user_raises.<locals>.bingzcom.myapp.myproc99zExpected an errorr6   r   )r
   Ztraceback_appr   rä   Ú	NameErrorrp   r|   r   rf   rŸ   rE   rã   ry   rK   )r%   r&   r  r  r˜   r(   )r   r  r)   Útest_invoke_user_raises  s&   €€üz#TestInvoker.test_invoke_user_raisesc                 #   s´   � t ƒ }t|ƒ td‡fdd„	ƒ}ttdd„ tdƒƒƒ‰ ‡ fdd„}| |dtjd	d
�¡V  |j	dtj
|d�d�V }ˆ d|¡ tdƒD ]}ˆ ˆ | j¡ ˆ |ˆ | j¡ qDd S )Nc                 3   sN   � ˆ   | d u¡ ˆ   | jd u¡ tdƒD ]}|  |¡ t|ƒV  qtdƒ d S )Né
   r½   )rŸ   rA   Úranger   r   )r—   Úir,   r(   r)   r  *  s   €
z8TestInvoker.test_invoke_progressive_result.<locals>.bingc                 S   s   t ƒ S r+   )r   )Ú_r(   r(   r)   rÁ   3  s    z<TestInvoker.test_invoke_progressive_result.<locals>.<lambda>r  c                    s   ˆ |    | ¡ d S r+   r¾   r×   )Úprogressiver(   r)   rA   5  s   z<TestInvoker.test_invoke_progressive_result.<locals>.progressúcom.myapp.myproc2r—   rÙ   ©Zon_progressr†   r½   r+   )r
   r   r   ÚlistÚmapr  rp   r   rì   r|   r©   ry   rŸ   rÉ   rÛ   )r%   r&   r  rA   r«   r  r(   )r!  r%   r)   Útest_invoke_progressive_result%  s*   €
ý
þþz*TestInvoker.test_invoke_progressive_resultc                 #   sÚ   � t ƒ }t|ƒ td‡fdd„	ƒ}tƒ ‰ tdƒ‰g ‰‡fdd„}||_d‡ ‡‡fdd„	}| |dtjd	d
�¡V  |j	ddtj
|d�dd�V }ˆ d|¡ ˆ ˆ j¡ ˆ dˆ j¡ ˆ dtˆƒ¡ ˆ ˆˆd d ¡ d S )Nc                 3   s\   � ˆ   |d u¡ ˆ   |jd u¡ ˆ  |d¡ ˆ  d| ¡ |jddd� tdƒV  tdƒ d S )NÚwordrØ   ÚlifeÚnothing)Ú	somethingz
meaning ofr½   )rŸ   rA   ry   r   r   )rØ   r—   Úkeyr,   r(   r)   r  M  s   €
z>TestInvoker.test_invoke_progressive_result_error.<locals>.bingr=   c                    r  r+   rþ   rÞ   )Úlogged_errorsr(   r)   Ú	got_error[  r  zCTestInvoker.test_invoke_progressive_result_error.<locals>.got_errorc                    s   ˆ  d|¡ ˆ  | ¡ ˆ‚)Nr)  )ry   r�   )rØ   r*  )Úgot_progressÚprogress_errorr%   r(   r)   rA   _  s   
zBTestInvoker.test_invoke_progressive_result_error.<locals>.progressr"  r—   rÙ   rØ   r#  r'  )r‡   r+  r½   r(  r6   r   )NNr+   )r
   r   r   r   r  rä   rp   r   rì   r|   r©   ry   rŸ   rÉ   rÛ   rK   )r%   r&   r  r-  rA   r«   r(   )r.  r,  r/  r%   r)   Ú$test_invoke_progressive_result_errorH  s6   €	
ý
üz0TestInvoker.test_invoke_progressive_result_errorc                 #   s€   � t ƒ }t|ƒ td‡fdd„	ƒ}tƒ ‰ ‡ fdd„}| |dtjdd�¡V  |jdtj|d�d	�V }ˆ 	d
|¡ ˆ 
ˆ j¡ d S )Nc                 3   s>   � ˆ   | d u¡ ˆ   | jd u¡ |  ¡  tdƒV  tdƒ d S )NTr½   ©rŸ   rA   r   r   ©r—   r,   r(   r)   r  €  s   €
z@TestInvoker.test_invoke_progressive_result_no_args.<locals>.bingc                      s   ˆ   d¡ d S )Nzintentionally left blankr¾   r(   ©r.  r(   r)   rA   Š  ó   zDTestInvoker.test_invoke_progressive_result_no_args.<locals>.progressr"  r—   rÙ   r#  r†   r½   r+   )r
   r   r   r   rp   r   rì   r|   r©   ry   rŸ   rÉ   ©r%   r&   r  rA   r«   r(   ©r.  r%   r)   Ú&test_invoke_progressive_result_no_args{  s$   €
ý
þz2TestInvoker.test_invoke_progressive_result_no_argsc                 #   s�   � t ƒ }t|ƒ td‡fdd„	ƒ}tƒ ‰ d‡ fdd„	}| |dtjdd�¡V  |jdtj|d�d	�V }ˆ 	d
|¡ ˆ 
ˆ j¡ ˆ 	dˆ j¡ d S )Nc                 3   sB   � ˆ   | d u¡ ˆ   | jd u¡ | jdd� tdƒV  tdƒ d S )Nr'  ©r+  Tr½   r1  r2  r,   r(   r)   r     s   €
zDTestInvoker.test_invoke_progressive_result_just_kwargs.<locals>.bingc                    s   ˆ   | ¡ d S r+   r¾   r8  r3  r(   r)   rA   ª  r4  zHTestInvoker.test_invoke_progressive_result_just_kwargs.<locals>.progressr"  r—   rÙ   r#  r†   r½   r'  r+   )r
   r   r   r   rp   r   rì   r|   r©   ry   rŸ   rÉ   rÛ   r5  r(   r6  r)   Ú*test_invoke_progressive_result_just_kwargs›  s&   €
ý
þz6TestInvoker.test_invoke_progressive_result_just_kwargsc              
   #   sº   � t ƒ }t|ƒ tdƒ‰ ‡ fdd„}| |d¡V }z=z| d¡V  |  ¡  W n  tyF } z|  |t¡ |  	| 
¡ d¡ W Y d }~nd }~ww W | ¡ V  d S W | ¡ V  d S | ¡ V  w )Nza simple errorc                      râ   r+   r(   r(   ©rø   r(   r)   ÚraiserÂ  r[   z<TestInvoker.test_call_exception_runtimeerror.<locals>.raiserúcom.myapp.myproc_errorz(wamp.error.runtime_error: a simple error)r
   r   rã   rp   r|   r   rf   r­   r   ry   Úerror_messagerï   ©r%   r&   r;  Zregistration0r˜   r(   r:  r)   Ú test_call_exception_runtimeerror¼  s$   €€þÿþz,TestInvoker.test_call_exception_runtimeerrorc              
   #   s¨   � t ƒ }t|ƒ tƒ ‰ ‡ fdd„}| |d¡V }z5z| d¡V  |  ¡  W n ty= } z|  |t¡ W Y d }~nd }~ww W | ¡ V  d S W | ¡ V  d S | ¡ V  w )Nc                      râ   r+   r(   r(   r:  r(   r)   r;  Õ  r[   z4TestInvoker.test_call_exception_bare.<locals>.raiserr<  )	r
   r   rf   rp   r|   r   r­   r   rï   r>  r(   r:  r)   Útest_call_exception_bareÏ  s"   €€ÿÿþz$TestInvoker.test_call_exception_bareN)r_   r`   ra   r   r  r  r  r  r&  r0  r7  r9  r?  r@  r(   r(   r(   r)   r  Å  s*    


!
 
"
2

 
r  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestAuthenticatorc                 C   s|   t t ¡ ƒ}tdddd�}tdddd�}| |¡ |  t¡�}| |¡ W d   ƒ n1 s.w   Y  dt|jƒv s<J ‚d S )NZwampcraZaliceZp4ssw0rd)ZauthidÚsecretZbobZ
password42Zauthids)	r   rv   rw   r   Úadd_authenticatorrõ   Ú
ValueErrorr÷   rø   )r%   r{   Úauth0Úauth1rú   r(   r(   r)   Útest_inconsistent_authidsó  s    ýý
ÿz+TestAuthenticator.test_inconsistent_authidsc                 C   sd   t t ¡ ƒ}G dd„ dtƒ}|ƒ }dddœ|_i |_|ƒ }dddœ|_i |_| |¡ | |¡ d S )Nc                   @   ó    e Zd ZdZdd„ Zdd„ ZdS )zDTestAuthenticator.test_two_authenticators.<locals>.TestAuthenticatorÚtestc                 S   ó   t ‚r+   ©ÚNotImplementedError©r%   r{   Ú	challenger(   r(   r)   Úon_challenge  r[   zQTestAuthenticator.test_two_authenticators.<locals>.TestAuthenticator.on_challengec                 S   rJ  r+   rK  ©r%   Ú	authextrar(   r(   r)   Ú
on_welcome  r[   zOTestAuthenticator.test_two_authenticators.<locals>.TestAuthenticator.on_welcomeN©r_   r`   ra   ÚnamerO  rR  r(   r(   r(   r)   rA    ó    rA  Úvalue0Úvalue1r„   Úwhat)r:   Zqux)r   rv   rw   r   rQ  Ú_argsrC  )r%   r{   rA  rE  rF  r(   r(   r)   Útest_two_authenticators  s   
þþ
z)TestAuthenticator.test_two_authenticatorsc                 C   sž   t t ¡ ƒ}G dd„ dtƒ}|ƒ }dddœ|_i |_|ƒ }ddi|_i |_| |¡ |  t¡�}| |¡ W d   ƒ n1 s?w   Y  |  	dt
|jƒ¡ d S )Nc                   @   rH  )zHTestAuthenticator.test_inconsistent_authextra.<locals>.TestAuthenticatorrI  c                 S   rJ  r+   rK  rM  r(   r(   r)   rO  *  r[   zUTestAuthenticator.test_inconsistent_authextra.<locals>.TestAuthenticator.on_challengec                 S   rJ  r+   rK  rP  r(   r(   r)   rR  -  r[   zSTestAuthenticator.test_inconsistent_authextra.<locals>.TestAuthenticator.on_welcomeNrS  r(   r(   r(   r)   rA  &  rU  rA  rV  rW  r„   r=   zInconsistent authextra)r   rv   rw   r   rQ  rY  rC  rõ   rD  rö   r÷   rø   )r%   r{   rA  rE  rF  rú   r(   r(   r)   Útest_inconsistent_authextra#  s    
þÿ
ÿz-TestAuthenticator.test_inconsistent_authextraN)r_   r`   ra   rG  rZ  r[  r(   r(   r(   r)   rA  ñ  s    rA  )0ÚosZunittest.mockrv   ÚenvironÚgetZtwisted.internet.deferr   r   r   r   r   r   Ztwisted.trialr   rò   Zautobahnr	   Zautobahn.twisted.wampr
   r   Zautobahn.wampr   r   r   r   r   r   Zautobahn.wamp.requestr   Zautobahn.wamp.exceptionr   r   r   r   Zautobahn.wamp.authr   Zautobahn.wamp.interfacesr   Zautobahn.wamp.typesr   Úobjectr   ZTestCaserc   rj   r�   r  rA  r(   r(   r(   r)   Ú<module>   sH    |)   a  . � � � � � � �¦