B
    u9aØÖ  ã               @   sò  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZ	 d dl
Zd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ yd dlZW n ek
rÀ   dZY nX dddddge	 d	¡d	ed	ƒd
dde	 d¡e	 d¡e	 e dddddd¡¡dœg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!G dd „ d ejƒZ"d a# a$a%dLd!d"„Z&dMd#d$„Z'd%d&„ Z(d'd(„ Z)G d)d*„ d*ejƒZ*G d+d,„ d,e*ƒZ+G d-d.„ d.e*ƒZ,G d/d0„ d0e*ƒZ-G d1d2„ d2e*ƒZ.G d3d4„ d4e.ƒZ/G d5d6„ d6e.ƒZ0e 1edkd7¡G d8d9„ d9e*ƒƒZ2e 1edkd7¡G d:d;„ d;ejƒƒZ3G d<d=„ d=ejƒZ4G d>d?„ d?ejj5ƒZ6G d@dA„ dAejƒZ7ej8dNdCdD„ƒZ9G dEdF„ dFejƒZ:G dGdH„ dHejƒZ;ej<dIdJ„ ƒZ=e>dKkrîe=ƒ  dS )Oé    N)Úmock)Úsupportzfoo@bar.baz.spamgHázns¼@i   é   z.zyx.41s   my dog has fleasFu	   ä€€æ€€è€€zregular valuez20050210T11:41:23)	iÕ  r   é
   é   é)   é   r   é   éÿÿÿÿiÕ  r   r   r   r   )ZastringZafloatZanintZ
ashortlongZanotherlistZabase64Zb64bytesZb64bytearrayZbooleanZunicodeu   ukeyä€€Z	datetime1Z	datetime2Z	datetime3c               @   s´   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d„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd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 ),ÚXMLRPCTestCasec             C   s.   t  tf¡}t  |¡}|  t|d d ¡ d S )Nr   )Ú	xmlrpclibÚdumpsÚalistÚloadsÚassertEqual)ÚselfÚdumpÚload© r   ú!/usr/lib/python3.7/test_xmlrpc.pyÚtest_dump_load,   s    
zXMLRPCTestCase.test_dump_loadc             C   s6  t   dddddd¡}|  |t d¡¡ t |f¡}tj|dd	\}}|\}|  ||¡ |  t|ƒt j ¡ |  |¡ tj|d
d	\}}|\}|  ||¡ |  t|ƒtj¡ |  |¡ tj|dd\}}|\}|  ||¡ |  t|ƒt j ¡ |  |¡ tj|d
d\}}|\}|  ||¡ |  t|ƒtj¡ |  |¡ d S )NiÕ  r   r   r   r   r   z20050210T11:41:23T)Úuse_builtin_typesF)Zuse_datetime)	Údatetimer   r   ÚDateTimer   r   ÚassertIsÚtypeÚassertIsNone)r   ÚdtÚsÚresultÚmÚnewdtr   r   r   Útest_dump_bare_datetime1   s.    


z&XMLRPCTestCase.test_dump_bare_datetimec             C   s¶   t   dddddd¡}|  |t d¡¡ t |f¡}tj|dd	\}}|\}|  ||¡ |  t|ƒt j ¡ |  |¡ tj|d
d	\}}|\}|  ||¡ |  t|ƒtj¡ |  |¡ d S )Nr	   r   r   r   r   r   z00010210T11:41:23T)r   F)	r   r   r   r   r   r   r   r   r   )r   r   r   r   r    r!   r   r   r   Útest_datetime_before_1900S   s    
z(XMLRPCTestCase.test_datetime_before_1900c             C   sR   t  ¡ }t  t j|fdd¡\\}}|  |jt¡ t j|fdd}|  |t¡ d S )NT)Úmethodresponse)r   r   r   r   ZassertIsInstanceÚvalueÚstr)r   ÚdZnew_dÚdummyr   r   r   r   Útest_bug_1164912e   s    zXMLRPCTestCase.test_bug_1164912c             C   sL   G dd„ dt ƒ}|ƒ }d|_d|_t t |f¡¡\\}}|  ||j¡ d S )Nc               @   s   e Zd ZdS )z-XMLRPCTestCase.test_newstyle_class.<locals>.TN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   ÚTp   s   r-   éd   ZHello)ÚobjectÚxÚyr   r   r   r   Ú__dict__)r   r-   ÚtÚt2r(   r   r   r   Útest_newstyle_classo   s    z"XMLRPCTestCase.test_newstyle_classc             C   s   |   ttjdd f¡ d S )Nr   éc   )ÚassertRaisesÚOverflowErrorr   r   )r   r   r   r   Útest_dump_big_longx   s    z!XMLRPCTestCase.test_dump_big_longc             C   s   |   ttjddif¡ d S )N)r	   r   é   r	   )r7   Ú	TypeErrorr   r   )r   r   r   r   Útest_dump_bad_dict{   s    z!XMLRPCTestCase.test_dump_bad_dictc             C   s6   dddg}ddd|g}|  |¡ |  ttj|f¡ d S )Nr	   r   r:   é   é   )Úappendr7   r;   r   r   )r   Úlr3   r   r   r   Útest_dump_recursive_seq~   s    

z&XMLRPCTestCase.test_dump_recursive_seqc             C   s2   dddœ}d|dœ}||d< |   ttj|f¡ d S )Nr	   )Ú1Ú2r:   )Ú3r'   r3   )r7   r;   r   r   )r   r'   r3   r   r   r   Útest_dump_recursive_dict„   s    

z'XMLRPCTestCase.test_dump_recursive_dictc             C   sÂ   t jdkr |  ttjtdƒf¡ t tjtjf¡ |  ttjtjd f¡ |  ttjtjd f¡ dd„ }t 	¡ }| 
tj|¡ | 
tj|¡ |  t|j
tjd |¡ |  t|j
tjd |¡ d S )Niÿÿÿl        r	   c             S   s   d S )Nr   )r   r   r   r   Údummy_write•   s    z5XMLRPCTestCase.test_dump_big_int.<locals>.dummy_write)ÚsysÚmaxsizer7   r8   r   r   ÚintÚMAXINTÚMININTÚ
MarshallerZdump_int)r   rF   r    r   r   r   Útest_dump_big_intŠ   s     





z XMLRPCTestCase.test_dump_big_intc             C   s    t  tdƒf¡ t  tt jƒtt jƒf¡ t  tt jd ƒtt jd ƒf¡ dd„ }t  ¡ }| t j|¡ | t j|¡ | t jd |¡ | t jd |¡ d S )Nl        é*   c             S   s   d S )Nr   )r   r   r   r   rF   §   s    z4XMLRPCTestCase.test_dump_double.<locals>.dummy_write)r   r   ÚfloatrJ   rK   rL   Zdump_double)r   rF   r    r   r   r   Útest_dump_double    s    zXMLRPCTestCase.test_dump_doublec             C   sT   t d g }t d g f}tj|dd}|  |t |¡d d ¡ |  ttj|f¡ d S )NT)Ú
allow_noner   )r   r   r   r   r   r7   r;   )r   r%   Zarg1Ústrgr   r   r   Útest_dump_none°   s    
zXMLRPCTestCase.test_dump_nonec             C   sü   ddi}t j|fdd}d| }|  t  |¡d d |¡ | dd¡}|  t  |¡d d |¡ t j|fddd	}|  t  |¡d d |¡ | dd¡}|  t  |¡d d |¡ d
}t j|fd|d}|  t  |¡d d |¡ |  t  |¡d |¡ d S )Nu   keyâ‚¬Â¤u
   valueâ‚¬Â¤ziso-8859-15)Úencodingz,<?xml version='1.0' encoding='iso-8859-15'?>r   ÚxmlcharrefreplaceT)rT   r$   u   methodâ‚¬Â¤)rT   Ú
methodnamer	   )r   r   r   r   Úencode)r   r%   rR   rV   r   r   r   Útest_dump_encoding¸   s"    

z!XMLRPCTestCase.test_dump_encodingc             C   sÂ   d}|   |t |¡¡ x¦tttjfD ]–}||ƒ}t |f¡}tj|dd\}}|\}|   ||¡ |  t|ƒt¡ |  	|¡ tj|dd\}}|\}|   ||¡ |  t|ƒtj¡ |  	|¡ q$W d S )Ns   my dog has fleasT)r   F)
r   r   ÚBinaryÚbytesÚ	bytearrayr   r   r   r   r   )r   ZsampleZtype_r%   r   r   r    Únewvaluer   r   r   Útest_dump_bytesÍ   s    
zXMLRPCTestCase.test_dump_bytesc             C   sF   t j}d}|  |t j|¡ d}|  |t j|¡ d}|  |t j|¡ d S )Nz6<params><param><value><spam/></value></param></params>zT<params><param><value><array><value><spam/></value></array></value></param></params>zª<params><param><value><struct><member><name>a</name><value><spam/></value></member><member><name>b</name><value><spam/></value></member></struct></value></param></params>)r   ÚResponseErrorr7   r   )r   r^   Údatar   r   r   Útest_loads_unsupportedà   s    z%XMLRPCTestCase.test_loads_unsupportedc             K   sN   d| }t j|f|Ž\}}|\}|  ||¡ |  t|ƒt|ƒ¡ |  |¡ d S )Nz1<params><param><value>%s</value></param></params>)r   r   r   r   r   r   )r   r   r%   Úkwargsr   r   r    r\   r   r   r   Úcheck_loadsî   s    zXMLRPCTestCase.check_loadsc          
   C   sÄ   | j }|ddƒ |ddƒ |ddƒ |ddƒ |ddƒ |d	dƒ |d
dƒ |ddƒ |dt d¡ƒ |dddd |dt d¡ƒ |dt dddddd¡dd |dddgƒ |ddddœƒ d S )NÚstringz<string>string</string>u4   <string>ð”˜ð”«ð”¦ð” ð”¬ð”¡ð”¢ string</string>u#   ð”˜ð”«ð”¦ð” ð”¬ð”¡ð”¢ stringz<int>2056183947</int>i‹àŽzz<int>-2056183947</int>iuq…z<i4>2056183947</i4>z<double>46093.78125</double>g    ¹æ@z<boolean>0</boolean>Fz%<base64>AGJ5dGUgc3RyaW5n/w==</base64>s    byte stringÿT)r   z6<dateTime.iso8601>20050210T11:41:23</dateTime.iso8601>z20050210T11:41:23iÕ  r   r   r   r   r   zR<array><data><value><int>1</int></value><value><int>2</int></value></data></array>r	   z…<struct><member><name>b</name><value><int>2</int></value></member><member><name>a</name><value><int>1</int></value></member></struct>)ÚaÚb)rb   r   rY   r   r   )r   Úcheckr   r   r   Útest_load_standard_typesö   s,    









z'XMLRPCTestCase.test_load_standard_typesc             C   s`   | j }|dd ƒ |dd ƒ |ddƒ |ddƒ |ddƒ |d	d
ƒ |ddƒ |dt d¡ƒ d S )Nz<nil/>z	<ex:nil/>z<i1>205</i1>éÍ   z<i2>20561</i2>iQP  z<i8>9876543210</i8>l   ê`	 z-<biginteger>98765432100123456789</biginteger>l   5¤?Ú4*UU z<float>93.78125</float>g     rW@z.<bigdecimal>9876543210.0123456789</bigdecimal>z9876543210.0123456789)rb   ÚdecimalZDecimal)r   rf   r   r   r   Útest_load_extension_types  s    





z(XMLRPCTestCase.test_load_extension_typesc             C   s(   t j ¡ }|  | d¡ddgi f¡ d S )Nzuser@host.tldzhost.tld)ZAuthorizationzBasic dXNlcg==)ÚxmlrpcÚclientÚ	Transportr   Zget_host_info)r   Ztranspr   r   r   Útest_get_host_info  s    
z!XMLRPCTestCase.test_get_host_infoc             C   s€   ydd l }W n tk
r$   d}Y nX d}ytj d¡ ¡  W n< tk
r^   |  |d¡ Y n tk
rz   |  	|¡ Y nX d S )Nr   FTzhttps://localhost:9999z&xmlrpc client's error with SSL support)
ÚsslÚImportErrorrk   rl   ÚServerProxyZbad_functionÚNotImplementedErrorZassertFalseÚOSErrorÚ
assertTrue)r   ro   Zhas_sslr   r   r   Útest_ssl_presence%  s    
z XMLRPCTestCase.test_ssl_presencec          	      s¦   G dd„ dt jjƒ}‡ fdd„}t j tjdf|¡‰ |  ˆ j¡ tj	|d}| 
¡  |  |j¡ djˆ jŽ }t |¡&}|  | ¡ d¡ |  | ¡ d¡ W d Q R X d S )	Nc               @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )z@XMLRPCTestCase.test_keepalive_disconnect.<locals>.RequestHandlerzHTTP/1.1Fc             S   s„   t | j d¡ƒ}| j |¡ | jr,d| _d S tjddd}| 	¡ }|  
tjj¡ |  dt|ƒ¡ |  ¡  | j |¡ d| _d| _d S )NzContent-LengthT)r>   )r$   F)rI   ÚheadersÚgetZrfileÚreadÚhandledZclose_connectionr   r   rW   Zsend_responseÚhttpZ
HTTPStatusZOKZsend_headerÚlenZend_headersZwfileÚwrite)r   ÚlengthÚresponser   r   r   Údo_POST8  s    zHXMLRPCTestCase.test_keepalive_disconnect.<locals>.RequestHandler.do_POSTc             W   s   d S )Nr   )r   ÚformatÚargsr   r   r   Úlog_messageG  s    zLXMLRPCTestCase.test_keepalive_disconnect.<locals>.RequestHandler.log_messageN)r*   r+   r,   Úprotocol_versionry   r   r‚   r   r   r   r   ÚRequestHandler4  s   r„   c                  s$   ˆ j  tdƒ¡ ˆ  ¡  ˆ  ¡  d S )Nr	   )ÚsocketÚ
settimeoutrO   Úhandle_requestr   )Úserverr   r   Ú
run_serverK  s    z<XMLRPCTestCase.test_keepalive_disconnect.<locals>.run_serverr   )Útargetzhttp://{}:{}/r>   )rz   rˆ   ZBaseHTTPRequestHandlerZ
HTTPServerr   ZHOSTÚ
addCleanupÚserver_closeÚ	threadingÚThreadÚstartÚjoinr€   Zserver_addressr   rq   r   Úmethod)r   r„   r‰   ÚthreadÚurlÚpr   )rˆ   r   Útest_keepalive_disconnect3  s    z(XMLRPCTestCase.test_keepalive_disconnectN)r*   r+   r,   r   r"   r#   r)   r5   r9   r<   rA   rE   rM   rP   rS   rX   r]   r`   rb   rg   rj   rn   ru   r•   r   r   r   r   r   *   s*   "
	r   c               @   sL   e Zd ZG dd„ deƒZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dS )ÚSimpleXMLRPCDispatcherTestCasec               @   s   e Zd ZdZdS )z*SimpleXMLRPCDispatcherTestCase.DispatchExczSRaised inside the dispatched functions when checking for
        chained exceptionsN)r*   r+   r,   Ú__doc__r   r   r   r   ÚDispatchExc\  s   r˜   c          	      sz   d}‡ fdd„}t j ¡ }| |¡ ˆ  ˆ j¡}| d|¡ W dQ R X ˆ  |jj	|f¡ ˆ  
|jj¡ ˆ  
|jj¡ dS )z$Calls explicitly registered function)r	   r   r:   c                 s   ˆ   | ¡‚d S )N)r˜   )Úparams)r   r   r   Údispatched_funcg  s    zQSimpleXMLRPCDispatcherTestCase.test_call_registered_func.<locals>.dispatched_funcrš   N)rk   rˆ   ÚSimpleXMLRPCDispatcherÚregister_functionr7   r˜   Ú	_dispatchr   Ú	exceptionr   r   Ú	__cause__Ú__context__)r   Ú
exp_paramsrš   Ú
dispatcherÚexc_ctxr   )r   r   Útest_call_registered_func`  s    

z8SimpleXMLRPCDispatcherTestCase.test_call_registered_funcc          	   C   s~   d}G dd„ dƒ}t j ¡ }| |ƒ ¡ |  | j¡}| d|¡ W dQ R X |  |jj	|f¡ |  
|jj¡ |  
|jj¡ dS )z3Calls a registered instance attribute as a function)r	   r   r:   c               @   s   e Zd Zdd„ ZdS )zOSimpleXMLRPCDispatcherTestCase.test_call_instance_func.<locals>.DispatchedClassc             W   s   t  |¡‚d S )N)r–   r˜   )r   r™   r   r   r   rš   z  s    z_SimpleXMLRPCDispatcherTestCase.test_call_instance_func.<locals>.DispatchedClass.dispatched_funcN)r*   r+   r,   rš   r   r   r   r   ÚDispatchedClassy  s   r¥   rš   N)rk   rˆ   r›   Úregister_instancer7   r˜   r   r   rž   r   r   rŸ   r    )r   r¡   r¥   r¢   r£   r   r   r   Útest_call_instance_funcr  s    
z6SimpleXMLRPCDispatcherTestCase.test_call_instance_funcc          	   C   s„   d}d}G dd„ dƒ}t j ¡ }| |ƒ ¡ |  | j¡}| ||¡ W dQ R X |  |jj	||f¡ |  
|jj¡ |  
|jj¡ dS )z4Calls the registered instance's `_dispatch` functionr‘   )r	   r   r:   c               @   s   e Zd Zdd„ ZdS )zLSimpleXMLRPCDispatcherTestCase.test_call_dispatch_func.<locals>.TestInstancec             S   s   t  ||¡‚d S )N)r–   r˜   )r   r‘   r™   r   r   r   r   Ž  s    zVSimpleXMLRPCDispatcherTestCase.test_call_dispatch_func.<locals>.TestInstance._dispatchN)r*   r+   r,   r   r   r   r   r   ÚTestInstance  s   r¨   N)rk   rˆ   r›   r¦   r7   r˜   r   r   rž   r   r   rŸ   r    )r   Z
exp_methodr¡   r¨   r¢   r£   r   r   r   Útest_call_dispatch_func…  s    
z6SimpleXMLRPCDispatcherTestCase.test_call_dispatch_funcc          	   C   s@   t j ¡ }|jddd |  td¡ | dd¡ W dQ R X dS )z2Calls explicitly registered function which is NoneNr‘   )Úname)Úparam)rk   rˆ   r›   rœ   ÚassertRaisesRegexÚ	Exceptionr   )r   r¢   r   r   r   Útest_registered_func_is_noneš  s    
z;SimpleXMLRPCDispatcherTestCase.test_registered_func_is_nonec          	   C   s>   t j ¡ }| tƒ ¡ |  td¡ | dd¡ W dQ R X dS )z>Attempts to call nonexistent function on a registered instancer‘   )r«   N)rk   rˆ   r›   r¦   r/   r¬   r­   r   )r   r¢   r   r   r   Útest_instance_has_no_func¢  s    
z8SimpleXMLRPCDispatcherTestCase.test_instance_has_no_funcc          	   C   s2   t j ¡ }|  td¡ | dd¡ W dQ R X dS )z2Calls a function that the dispatcher cannot locater‘   )r«   N)rk   rˆ   r›   r¬   r­   r   )r   r¢   r   r   r   Útest_cannot_locate_funcª  s    
z6SimpleXMLRPCDispatcherTestCase.test_cannot_locate_funcN)r*   r+   r,   r­   r˜   r¤   r§   r©   r®   r¯   r°   r   r   r   r   r–   [  s   r–   c               @   s   e Zd Zdd„ ZdS )ÚHelperTestCasec             C   s:   |   t d¡d¡ |   t d¡d¡ |   t d¡d¡ d S )Nza&bza&amp;bza<bza&lt;bza>bza&gt;b)r   r   Úescape)r   r   r   r   Útest_escape³  s    zHelperTestCase.test_escapeN)r*   r+   r,   r³   r   r   r   r   r±   ²  s   r±   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚFaultTestCasec             C   s4   t  dd¡}|  t|ƒd¡ |  t|ƒt|ƒ¡ d S )NrN   z
Test Faultz<Fault 42: 'Test Fault'>)r   ÚFaultr   Úreprr&   )r   Úfr   r   r   Ú	test_repr¹  s    zFaultTestCase.test_reprc             C   sj   t  dd¡}t  |f¡}t  |¡\\}}|  |dddœ¡ |  |d ¡ t  ¡  |¡}|  t jt j|¡ d S )NrN   z
Test Fault)Ú	faultCodeÚfaultString)r   rµ   r   r   r   rL   r7   )r   r·   r   Znewfr    r   r   r   Útest_dump_fault¾  s    zFaultTestCase.test_dump_faultc             C   s,   |   ttjjtd¡ |  tj td¡¡ d S )NÚ__addÚtitle)r7   ÚAttributeErrorrk   rˆ   Úresolve_dotted_attributer&   rt   )r   r   r   r   Útest_dotted_attributeÈ  s    z#FaultTestCase.test_dotted_attributeN)r*   r+   r,   r¸   r»   rÀ   r   r   r   r   r´   ¸  s   
r´   c               @   sL   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d„ Z
dS )ÚDateTimeTestCasec             C   sd   t  d¡P}t dddddddddg	¡}||_t ¡ }t ¡ }|  t	|ƒt 
d	|¡¡ W d Q R X d S )
Nztime.localtimeiÝ  é   é   r   é   é1   éÄ   z%Y%m%dT%H:%M:%S)r   ZpatchÚtimeZstruct_timeZreturn_valueÚ	localtimer   r   r   r&   Ústrftime)r   Zlocaltime_mockZtime_structrÈ   r3   r   r   r   Útest_defaultÐ  s    
zDateTimeTestCase.test_defaultc          	   C   s0   d}t  |¡}|  t|ƒt dt |¡¡¡ d S )Ngl]‚Þ®šÑAz%Y%m%dT%H:%M:%S)r   r   r   r&   rÇ   rÉ   rÈ   )r   r'   r3   r   r   r   Ú	test_timeÚ  s    

zDateTimeTestCase.test_timec             C   s"   d}t  |¡}|  t|ƒd¡ d S )N)	i×  é   é	   r   é&   é2   r>   é    r   z20070609T10:38:50)r   r   r   r&   )r   r'   r3   r   r   r   Útest_time_tupleà  s    
z DateTimeTestCase.test_time_tuplec             C   s0   t  d¡}t |¡}|  t|ƒt  d|¡¡ d S )Ngl]‚Þ®šÑAz%Y%m%dT%H:%M:%S)rÇ   rÈ   r   r   r   r&   rÉ   )r   r'   r3   r   r   r   Útest_time_structå  s    

z!DateTimeTestCase.test_time_structc             C   s2   t   dddddd¡}t |¡}|  t|ƒd¡ d S )Ni×  r	   r   r:   r=   r>   z20070102T03:04:05)r   r   r   r   r&   )r   r'   r3   r   r   r   Útest_datetime_datetimeê  s    
z'DateTimeTestCase.test_datetime_datetimec             C   s>   t   dddddd¡}t |¡}dt|ƒ }|  t|ƒ|¡ d S )Ni×  r	   r   r:   r=   r>   z%<DateTime '20070102T03:04:05' at %#x>)r   r   r   Úidr   r¶   )r   r'   r3   Úvalr   r   r   r¸   ï  s    
zDateTimeTestCase.test_reprc          
   C   sV   d}t  ¡ }| |¡ t  t dddddd¡¡}|  ||¡ t  |¡}|  ||¡ d S )Nz 20070908T07:11:13  i×  rÍ   é   rÂ   r   é   )r   r   Údecoder   r   Z	_datetime)r   r'   Út1Ztrefr4   r   r   r   Útest_decodeõ  s    

zDateTimeTestCase.test_decodec          	   C   sÂ  t j  ¡ }t | ¡ ¡}|  ||k¡ |  ||k¡ |t jdd }|  ||k¡ |  ||k ¡ | d¡}|  ||k¡ |  ||k¡ t | ¡ ¡}|  ||k¡ |  ||k ¡ | d¡}| ¡ }|  	t
¡ |dk W d Q R X |  	t
¡ ||k W d Q R X |  	t
¡ |t|ƒk W d Q R X |  	t
¡ ||k W d Q R X |  	t
¡ |tdƒk  W d Q R X |  	t
¡ ||k W d Q R X |  	t
¡ |t|ƒk W d Q R X |  	t
¡ ||k W d Q R X d S )Nr=   )Zsecondsz%Y%m%dT%H:%M:%SÚasciii²  )r   Únowr   r   Z	timetuplert   Z	timedeltarÉ   rW   r7   r;   r[   rO   )r   rÜ   ZdtimeZthenZdstrZ
dtime_thenZdbytesZdtupler   r   r   Útest_comparisonÿ  s>    


z DateTimeTestCase.test_comparisonN)r*   r+   r,   rÊ   rË   rÑ   rÒ   rÓ   r¸   rÚ   rÝ   r   r   r   r   rÁ   Ï  s   

rÁ   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚBinaryTestCasec             C   s   t  ¡ }|  t|ƒd¡ d S )NÚ )r   rY   r   r&   )r   r3   r   r   r   rÊ   -  s    zBinaryTestCase.test_defaultc             C   s(   d}t  |¡}|  t|ƒt|dƒ¡ d S )Ns   abc123ÿþzlatin-1)r   rY   r   r&   )r   r'   r3   r   r   r   Útest_string1  s    
zBinaryTestCase.test_stringc             C   sZ   d}t  |¡}t ¡ }| |¡ |  t|ƒt|dƒ¡ t |¡}|  t|ƒt|dƒ¡ d S )Ns   abc123ÿþzlatin-1)Úbase64Zencodebytesr   rY   rØ   r   r&   Z_binary)r   r'   ÚderÙ   r4   r   r   r   rÚ   6  s    


zBinaryTestCase.test_decodeN)r*   r+   r,   rÊ   rà   rÚ   r   r   r   r   rÞ   &  s   rÞ   c       
      C   s0  G dd„ dƒ}G dd„ dt jjƒ}|s.t jj}|d||ddd}zÒy´| ¡  |j ¡ \aadttf a	| 
¡  | ¡  | ¡  | t¡ | d	d
„ d¡ |jdd„ ƒ}|jdddd„ ƒ}|ƒ }	|j|	dd |  ¡  x|dkrò| ¡  |d8 }qØW W n tjk
r   Y nX W d |j ¡  d a|  ¡  X d S )Nc               @   s*   e Zd Zdd„ Zdd„ ZG dd„ dƒZdS )z&http_server.<locals>.TestInstanceClassc             S   s   || S )Nr   )r   r0   r1   r   r   r   ÚdivH  s    z*http_server.<locals>.TestInstanceClass.divc             S   s   |dkrdS d S )Nrã   zThis is the div functionr   )r   rª   r   r   r   Ú_methodHelpK  s    z2http_server.<locals>.TestInstanceClass._methodHelpc               @   s   e Zd Zedd„ ƒZdS )z.http_server.<locals>.TestInstanceClass.Fixturec               S   s   dS )NÚ42r   r   r   r   r   ÚgetDataP  s    z6http_server.<locals>.TestInstanceClass.Fixture.getDataN)r*   r+   r,   Ústaticmethodræ   r   r   r   r   ÚFixtureO  s   rè   N)r*   r+   r,   rã   rä   rè   r   r   r   r   ÚTestInstanceClassG  s   ré   c               @   s   e Zd Zdd„ ZdS )z#http_server.<locals>.MyXMLRPCServerc             S   s    | j  ¡ \}}| d¡ ||fS )NT)r…   ÚacceptÚsetblocking)r   r   Úportr   r   r   Úget_requestU  s    
z/http_server.<locals>.MyXMLRPCServer.get_requestN)r*   r+   r,   rí   r   r   r   r   ÚMyXMLRPCServerT  s   rî   )Ú	localhostr   F)rT   ÚlogRequestsÚbind_and_activatezhttp://%s:%dc             S   s   | S )Nr   )r0   r   r   r   Ú<lambda>n  ó    zhttp_server.<locals>.<lambda>u   tÃªÅ¡tc               S   s   dS )zThis is my functionTr   r   r   r   r   Úmy_functiono  s    z http_server.<locals>.my_functionÚadd)rª   c             S   s   | | S )Nr   )r0   r1   r   r   r   Ú_s  s    zhttp_server.<locals>._T)Zallow_dotted_namesr   r	   )rk   rˆ   ÚSimpleXMLRPCServerÚSimpleXMLRPCRequestHandlerÚserver_bindr…   ÚgetsocknameÚADDRÚPORTÚURLÚserver_activateÚ register_introspection_functionsÚregister_multicall_functionsrœ   Úpowr¦   Úsetr‡   ÚtimeoutÚclose)
ÚevtÚnumrequestsÚrequestHandlerrT   ré   rî   Úservrô   rö   ZtestInstancer   r   r   Úhttp_serverF  s:    




r	  c             C   sx  G dd„ dƒ}dd„ }G dd„ dt jjƒ}|s6t jj}G dd„ d|ƒ}G d	d
„ d
ƒ}|d|ddd}|j d¡ | ¡  zâyÄ|j ¡ \aa	dtt	f a
| ¡  ddg}	x.|	D ]&}
| |
t j ¡ ¡}| ¡  | ¡  q¬W | |	d ¡ t¡ | |	d ¡ dd„ d¡ | d|ƒ ¡ |  ¡  x |dkr:| ¡  |d8 }qW W n tjk
rV   Y nX W d |j ¡  d a	|  ¡  X d S )Nc               @   s   e Zd Zdd„ Zdd„ ZdS )z,http_multi_server.<locals>.TestInstanceClassc             S   s   || S )Nr   )r   r0   r1   r   r   r   rã   ˆ  s    z0http_multi_server.<locals>.TestInstanceClass.divc             S   s   |dkrdS d S )Nrã   zThis is the div functionr   )r   rª   r   r   r   rä   ‹  s    z8http_multi_server.<locals>.TestInstanceClass._methodHelpN)r*   r+   r,   rã   rä   r   r   r   r   ré   ‡  s   ré   c               S   s   dS )zThis is my functionTr   r   r   r   r   rô     s    z&http_multi_server.<locals>.my_functionc               @   s   e Zd Zdd„ ZdS )z)http_multi_server.<locals>.MyXMLRPCServerc             S   s    | j  ¡ \}}| d¡ ||fS )NT)r…   rê   rë   )r   r   rì   r   r   r   rí   ”  s    
z5http_multi_server.<locals>.MyXMLRPCServer.get_requestN)r*   r+   r,   rí   r   r   r   r   rî   “  s   rî   c               @   s   e Zd Zg ZdS )z+http_multi_server.<locals>.MyRequestHandlerN)r*   r+   r,   Z	rpc_pathsr   r   r   r   ÚMyRequestHandler  s   r
  c               @   s   e Zd Zddd„ZdS )z+http_multi_server.<locals>.BrokenDispatcherNc             S   s   t dƒ‚d S )Nzbroken dispatcher)ÚRuntimeError)r   r_   Zdispatch_methodÚpathr   r   r   Ú_marshaled_dispatch¡  s    z?http_multi_server.<locals>.BrokenDispatcher._marshaled_dispatch)NN)r*   r+   r,   r  r   r   r   r   ÚBrokenDispatcher   s   r  )rï   r   F)rð   rñ   r:   zhttp://%s:%dz/fooz/foo/barr   r	   c             S   s   | | S )Nr   )r0   r1   r   r   r   rò   ·  ró   z#http_multi_server.<locals>.<lambda>rõ   z
/is/broken)rk   rˆ   ZMultiPathXMLRPCServerrø   r…   r†   rù   rú   rû   rü   rý   rþ   Zadd_dispatcherr›   rÿ   r   Zget_dispatcherrœ   r  r  r‡   r  r  )r  r  r  ré   rô   rî   r
  r  r  Úpathsr  r'   r   r   r   Úhttp_multi_server†  s@    



r  c             C   s^   y(| j dks| jdkrdS | j d¡}W n tk
rD   t| ƒ}Y nX |rZd| ¡ krZdS dS )zÇReturns True if the given ProtocolError is the product of a server-side
       exception caused by the 'temporarily unavailable' response sometimes
       given by operations on non-blocking sockets.r
   NTzX-exceptionztemporarily unavailable)Zerrcoderv   rw   r¾   r&   Úlower)ÚeZexc_messr   r   r   Úis_unavailable_exceptionÉ  s    r  c                s   | sdd„ S ‡ fdd„}|S )Nc             S   s   | S )Nr   )Úfuncr   r   r   rò   Þ  ró   z)make_request_and_skipIf.<locals>.<lambda>c                s   ‡ fdd„}|S )Nc          
      sT   yt  t¡ ¡  W n2 t jtfk
rD } zt|ƒs4‚ W d d }~X Y nX t ˆ ¡‚d S )N)	r   rq   rý   rô   ÚProtocolErrorrs   r  ÚunittestZSkipTest)r   r  )Úreasonr   r   Úmake_request_and_skipà  s    zImake_request_and_skipIf.<locals>.decorator.<locals>.make_request_and_skipr   )r  r  )r  r   r   Ú	decoratorß  s    z*make_request_and_skipIf.<locals>.decoratorr   )Z	conditionr  r  r   )r  r   Úmake_request_and_skipIfÚ  s    	r  c               @   s,   e Zd ZdZdZeeƒZdd„ Zdd„ Z	dS )ÚBaseServerTestCaseNr	   c             C   s`   dt jj_t ¡ | _| j| j| jf}tj	| j
|d}| ¡  |  |j¡ | j ¡  | j ¡  d S )NT)rŠ   r   )rk   rˆ   r÷   Ú_send_traceback_headerr   ÚEventr  Úrequest_countr  rŽ   Ú
threadFuncr   r‹   r   ÚwaitÚclear)r   Ú	serv_argsr’   r   r   r   ÚsetUpï  s    


zBaseServerTestCase.setUpc             C   s   | j  ¡  dtjj_d S )NF)r  r   rk   rˆ   r÷   r  )r   r   r   r   ÚtearDownþ  s    
zBaseServerTestCase.tearDown)
r*   r+   r,   r  r  rç   r	  r  r#  r$  r   r   r   r   r  ê  s
   r  c               @   s¦   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	e
ejjdkdƒdd„ ƒZdd„ Zd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 )&ÚSimpleServerTestCasec             C   sr   y"t  t¡}|  | dd¡d¡ W nJ t jtfk
rl } z&t|ƒs\|  d|t	|ddƒf ¡ W d d }~X Y nX d S )NrÌ   rÖ   i ¡ z%s
%srv   rß   )
r   rq   rý   r   r  r  rs   r  ÚfailÚgetattr)r   r”   r  r   r   r   Útest_simple1  s    
z!SimpleServerTestCase.test_simple1c             C   s~   d}d}y&t  t¡}|  | ||¡|| ¡ W nJ t jtfk
rx } z&t|ƒsh|  d|t	|ddƒf ¡ W d d }~X Y nX d S )Nu   PÅ·tu   hÆ¡nz%s
%srv   rß   )
r   rq   rý   r   rõ   r  rs   r  r&  r'  )r   Ústart_stringÚ
end_stringr”   r  r   r   r   Útest_nonascii  s    
z"SimpleServerTestCase.test_nonasciic             C   s„   d}d}y*t jtdd}|  | ||¡|| ¡ W nL t jtjfk
r~ } z&t|ƒsn|  	d|t
|ddƒf ¡ W d d }~X Y nX d S )Nu   â‚¬õ   Â¤ziso-8859-15)rT   z%s
%srv   rß   )r   rq   rý   r   rõ   r  r…   Úerrorr  r&  r'  )r   r)  r*  r”   r  r   r   r   Útest_client_encoding  s    z)SimpleServerTestCase.test_client_encodingc             C   sv   y$t jtdd}|  | d¡d¡ W nL t jtjfk
rp } z&t|ƒs`|  	d|t
|ddƒf ¡ W d d }~X Y nX d S )NrÛ   )rT   rN   z%s
%srv   rß   )r   rq   rý   r   t   tÃªÅ¡tr  r…   r-  r  r&  r'  )r   r”   r  r   r   r   Útest_nonascii_methodname+  s    z-SimpleServerTestCase.test_nonascii_methodnamec             C   sJ   t j tt¡}| dd¡ | ¡ }| ¡  |  |j	d¡ |  |j
d¡ d S )NZPOSTz/this-is-not-validi”  z	Not Found)rz   rl   ÚHTTPConnectionrû   rü   ZrequestZgetresponser  r   Ústatusr  )r   Úconnr~   r   r   r   Útest_4045  s    zSimpleServerTestCase.test_404c             C   s”   t ddddddddd	d
g
ƒ}y(t t¡}|j ¡ }|  t |ƒ|¡ W nJ tjtfk
rŽ } z&t	|ƒs~|  
d|t|ddƒf ¡ W d d }~X Y nX d S )Nr  rã   rô   rõ   u   tÃªÅ¡tzsystem.listMethodszsystem.methodHelpzsystem.methodSignaturezsystem.multicallrè   z%s
%srv   rß   )r  r   rq   rý   ÚsystemZlistMethodsr   r  rs   r  r&  r'  )r   Zexpected_methodsr”   Zmethr  r   r   r   Útest_introspection1@  s    

z(SimpleServerTestCase.test_introspection1c             C   sv   y&t  t¡}|j d¡}|  |d¡ W nJ t jtfk
rp } z&t|ƒs`|  	d|t
|ddƒf ¡ W d d }~X Y nX d S )Nrã   zThis is the div functionz%s
%srv   rß   )r   rq   rý   r4  Ú
methodHelpr   r  rs   r  r&  r'  )r   r”   Zdivhelpr  r   r   r   Útest_introspection2P  s    
z(SimpleServerTestCase.test_introspection2r   z)Docstrings are omitted with -O2 and abovec             C   sv   y&t  t¡}|j d¡}|  |d¡ W nJ t jtfk
rp } z&t|ƒs`|  	d|t
|ddƒf ¡ W d d }~X Y nX d S )Nrô   zThis is my functionz%s
%srv   rß   )r   rq   rý   r4  r6  r   r  rs   r  r&  r'  )r   r”   Z
myfunctionr  r   r   r   Útest_introspection3\  s    
z(SimpleServerTestCase.test_introspection3c             C   sv   y&t  t¡}|j d¡}|  |d¡ W nJ t jtfk
rp } z&t|ƒs`|  	d|t
|ddƒf ¡ W d d }~X Y nX d S )Nrã   zsignatures not supportedz%s
%srv   rß   )r   rq   rý   r4  ZmethodSignaturer   r  rs   r  r&  r'  )r   r”   Zdivsigr  r   r   r   Útest_introspection4j  s    
z(SimpleServerTestCase.test_introspection4c             C   s¼   ylt  t¡}t  |¡}| dd¡ | dd¡ | dd¡ |ƒ \}}}|  |d¡ |  |d¡ |  |d¡ W nJ t jt	fk
r¶ } z&t
|ƒs¦|  d	|t|d
dƒf ¡ W d d }~X Y nX d S )Nr   r:   rÌ   rÖ   é   rN   r>   i ¡ z%s
%srv   rß   )r   rq   rý   Ú	MultiCallrõ   r  rã   r   r  rs   r  r&  r'  )r   r”   Ú	multicallZ
add_resultZ
pow_resultZ
div_resultr  r   r   r   Útest_multicallw  s    

z#SimpleServerTestCase.test_multicallc             C   s¢   yRt  t¡}t  |¡}| ¡  |ƒ }|  |jd d d¡ |  |jd d d¡ W nJ t jtfk
rœ } z&t	|ƒsŒ|  
d|t|ddƒf ¡ W d d }~X Y nX d S )	Nr   r¹   r	   rº   z@<class 'Exception'>:method "this_is_not_exists" is not supportedz%s
%srv   rß   )r   rq   rý   r;  Zthis_is_not_existsr   Úresultsr  rs   r  r&  r'  )r   r”   r<  r   r  r   r   r   Útest_non_existing_multicallˆ  s    


z0SimpleServerTestCase.test_non_existing_multicallc             C   s4   |   ttjjtd¡ |  tj td¡¡ |  ¡  d S )Nr¼   r½   )r7   r¾   rk   rˆ   r¿   r&   rt   r(  )r   r   r   r   rÀ     s    z*SimpleServerTestCase.test_dotted_attributec             C   s,   t  dttf ¡}|j ¡ }|  |d¡ d S )Nzhttp://%s:%d/RPC2rå   )r   rq   rû   rü   rè   ræ   r   )r   rˆ   r_   r   r   r   Útest_allow_dotted_names_true§  s    
z1SimpleServerTestCase.test_allow_dotted_names_truec             C   s*   t  dttf ¡}|  | dd¡d¡ d S )Nzhttp://%s:%d/RPC2rd   õ   Ã©u   aÃ©)r   rq   rû   rü   r   rõ   )r   rˆ   r   r   r   Útest_unicode_host­  s    z&SimpleServerTestCase.test_unicode_hostc             C   s8   t j tt¡}| dt› dt› d d¡¡ | ¡  d S )Nz@POST /RPC2 HTTP/1.0
Content-Length: 100

bye HTTP/1.1
Host: ú:z2
Accept-Encoding: identity
Content-Length: 0

rÛ   )rz   rl   r0  rû   rü   ÚsendrW   r  )r   r2  r   r   r   Útest_partial_post±  s    z&SimpleServerTestCase.test_partial_postc          	   C   sJ   t  t¡$}| dd¡ |  |dƒjd¡ W d Q R X |  |dƒjd¡ d S )Nr   r:   Ú	transport)NN)r   rq   rý   rõ   ZassertNotEqualÚ_connectionr   )r   rˆ   r   r   r   Útest_context_manager¼  s    z)SimpleServerTestCase.test_context_managerc          	   C   sT   y&t  t¡}| dd¡ W d Q R X W n t jk
r<   Y nX |  |dƒjd¡ d S )Nr   rd   rF  )NN)r   rq   rý   rõ   rµ   r   rG  )r   rˆ   r   r   r   Ú!test_context_manager_method_errorÄ  s    z6SimpleServerTestCase.test_context_manager_method_errorN)r*   r+   r,   r(  r+  r.  r/  r3  r5  r7  r  rG   ÚflagsÚoptimizer8  r9  r=  r?  rÀ   r@  rB  rE  rH  rI  r   r   r   r   r%    s$   


r%  c               @   s"   e Zd Zeddd„ƒZdd„ ZdS )ÚSimpleServerEncodingTestCaseNc             C   s   t | ||dƒ d S )Nziso-8859-15)r	  )r  r  r  rT   r   r   r   r  Ï  s    z'SimpleServerEncodingTestCase.threadFuncc             C   s€   d}d}y&t  t¡}|  | ||¡|| ¡ W nL t jtjfk
rz } z&t|ƒsj|  	d|t
|ddƒf ¡ W d d }~X Y nX d S )Nu   â‚¬r,  z%s
%srv   rß   )r   rq   rý   r   rõ   r  r…   r-  r  r&  r'  )r   r)  r*  r”   r  r   r   r   Útest_server_encodingÓ  s    
z1SimpleServerEncodingTestCase.test_server_encoding)NN)r*   r+   r,   rç   r  rM  r   r   r   r   rL  Î  s   rL  c               @   s0   e Zd ZeeƒZdZdd„ Zdd„ Zdd„ Z	dS )	ÚMultiPathServerTestCaser   c             C   s:   t  td ¡}|  | dd¡d¡ |  t j|jdd¡ d S )Nz/foorÌ   rÖ   i ¡ )r   rq   rý   r   r  r7   rµ   rõ   )r   r”   r   r   r   Ú
test_path1å  s    z"MultiPathServerTestCase.test_path1c             C   s:   t  td ¡}|  | dd¡d¡ |  t j|jdd¡ d S )Nz/foo/barrÌ   rÖ   é   )r   rq   rý   r   rõ   r7   rµ   r  )r   r”   r   r   r   Ú
test_path2ê  s    z"MultiPathServerTestCase.test_path2c             C   s&   t  td ¡}|  t j|jdd¡ d S )Nz
/is/brokenrÌ   rÖ   )r   rq   rý   r7   rµ   rõ   )r   r”   r   r   r   Ú
test_path3ï  s    z"MultiPathServerTestCase.test_path3N)
r*   r+   r,   rç   r  r  r  rO  rQ  rR  r   r   r   r   rN  â  s
   rN  c               @   s,   e Zd ZG dd„ dejjƒZeZdd„ ZdS )ÚBaseKeepaliveServerTestCasec               @   s,   e Zd ZejjZdZg Zdd„ Z	dd„ Z
dS )z*BaseKeepaliveServerTestCase.RequestHandlerzHTTP/1.1c             C   s(   | j  g ¡ t| j ƒd | _| j | ¡S )Nr	   )Ú
myRequestsr?   r{   ÚreqidxÚparentClassÚhandle)r   r   r   r   rW  ü  s    z1BaseKeepaliveServerTestCase.RequestHandler.handlec             C   s$   | j  | ¡}| j| j  | j¡ |S )N)rV  Úhandle_one_requestrT  rU  r?   Zraw_requestline)r   r   r   r   r   rX     s    z=BaseKeepaliveServerTestCase.RequestHandler.handle_one_requestN)r*   r+   r,   rk   rˆ   rø   rV  rƒ   rT  rW  rX  r   r   r   r   r„   ø  s
   r„   c             C   s   g | j _t | ¡S )N)r„   rT  r  r#  )r   r   r   r   r#    s    z!BaseKeepaliveServerTestCase.setUpN)	r*   r+   r,   rk   rˆ   rø   r„   r  r#  r   r   r   r   rS  õ  s   rS  c               @   s   e Zd Zdd„ ZdS )ÚKeepaliveServerTestCase1c             C   s€   t  t¡}|  | dd¡d¡ |  | dd¡d¡ |  | dd¡d¡ |dƒƒ  |  t| jjƒd¡ |  t| jjd ƒd¡ d S )NrÌ   rÖ   i ¡ r  r	   r
   r   )	r   rq   rý   r   r  r{   r„   rT  ÚassertGreaterEqual)r   r”   r   r   r   Útest_two  s    

z!KeepaliveServerTestCase1.test_twoN)r*   r+   r,   r[  r   r   r   r   rY    s   rY  c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚKeepaliveServerTestCase2r   c             C   sÞ   t  t¡}|  | dd¡d¡ |  | dd¡d¡ |  | dd¡d¡ |dƒƒ  |  | dd¡d¡ |  | dd¡d¡ |  | dd¡d¡ |dƒƒ  |  t| jjƒd¡ |  t| jjd ƒd¡ |  t| jjd ƒd¡ d S )NrÌ   rÖ   i ¡ r  r   r
   éþÿÿÿ)	r   rq   rý   r   r  r{   r„   rT  rZ  )r   r”   r   r   r   Ú
test_close$  s    


z#KeepaliveServerTestCase2.test_closec             C   s`   t  t¡}|  | dd¡d¡ |dƒ ¡  |  | dd¡d¡ |dƒƒ  |  t| jjƒd¡ d S )NrÌ   rÖ   i ¡ rF  r  r   )	r   rq   rý   r   r  r  r{   r„   rT  )r   r”   r   r   r   Útest_transport7  s    

z'KeepaliveServerTestCase2.test_transportN)r*   r+   r,   r  r^  r_  r   r   r   r   r\     s   r\  zrequires gzipc               @   sV   e Zd ZG dd„ dejjƒZeZG dd„ dej	ƒZ	dd„ Z
dd„ Zd	d
„ Zdd„ ZdS )ÚGzipServerTestCasec               @   s    e Zd ZejjZdZdd„ ZdS )z!GzipServerTestCase.RequestHandlerzHTTP/1.1c             C   s   t | jd ƒ| j_| j | ¡S )Nzcontent-length)rI   rv   Ú	__class__Úcontent_lengthrV  r   )r   r   r   r   r   J  s    z)GzipServerTestCase.RequestHandler.do_POSTN)	r*   r+   r,   rk   rˆ   rø   rV  rƒ   r   r   r   r   r   r„   F  s   r„   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )zGzipServerTestCase.TransportFc             C   s    t | dd¡ƒ| _tj | |¡S )Nzcontent-lengthr   )rI   Z	getheaderÚresponse_lengthr   rm   Úparse_response)r   r~   r   r   r   rd  S  s    z+GzipServerTestCase.Transport.parse_responsec             C   s"   | j r| dd¡ tj | ||¡S )NzContent-EncodingÚgzip)Ú	fake_gzipZ	putheaderr   rm   Úsend_content)r   Z
connectionZbodyr   r   r   rg  W  s    z)GzipServerTestCase.Transport.send_contentN)r*   r+   r,   rf  rd  rg  r   r   r   r   rm   P  s   rm   c             C   s   t  | ¡ d S )N)r  r#  )r   r   r   r   r#  ]  s    zGzipServerTestCase.setUpc             C   sv   |   ¡ }d |_tjt|d}|  | dd¡d¡ | jj}d|_|  | dd¡d¡ | jj}|  	||k¡ |dƒƒ  d S )N)rF  rÌ   rÖ   i ¡ r   r  )
rm   Úencode_thresholdr   rq   rý   r   r  r„   rb  rt   )r   r3   r”   rd   re   r   r   r   Útest_gzip_request`  s    z$GzipServerTestCase.test_gzip_requestc          	   C   s`   |   ¡ }d |_d|_tjt|d}|  tjt 	d¡¡}| | 
dd¡ W d Q R X |dƒƒ  d S )NT)rF  z\b400\brÌ   rÖ   r  )rm   rh  rf  r   rq   rý   r¬   r  ÚreÚcompiler  )r   r3   r”   Úcmr   r   r   Útest_bad_gzip_requestl  s    z(GzipServerTestCase.test_bad_gzip_requestc             C   s†   |   ¡ }tjt|d}| jj}d | j_|  | dd¡d¡ |j}d| j_|  | dd¡d¡ |dƒƒ  |j}|| j_|  	||k¡ d S )N)rF  rÌ   rÖ   i ¡ r   r  )
rm   r   rq   rý   r  rh  r   r  rc  rt   )r   r3   r”   Úoldrd   re   r   r   r   Útest_gzip_responsew  s    
z%GzipServerTestCase.test_gzip_responseN)r*   r+   r,   rk   rˆ   rø   r„   r  r   rm   r#  ri  rm  ro  r   r   r   r   r`  B  s   r`  c               @   s   e Zd Zdd„ ZdS )ÚGzipUtilTestCasec          	   C   sz   d}d| }t  |¡}t  |¡}|  t|ƒ|¡ d|d  }t  |¡}|  td¡ t  |¡ W d Q R X t j|dd d S )Ni  @ó    r	   z#max gzipped payload length exceededr
   )Z
max_decode)r   Zgzip_encodeZgzip_decoder   r{   r¬   Ú
ValueError)r   Zmax_gzip_decoder_   ZencodedZdecodedr   r   r   Útest_gzip_decode_limit‰  s    


z'GzipUtilTestCase.test_gzip_decode_limitN)r*   r+   r,   rs  r   r   r   r   rp  †  s   rp  c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚServerProxyTestCasec             C   s   t j | ¡ d| _d S )Nzhttp://fake.localhost)r  ÚTestCaser#  r“   )r   r   r   r   r#  œ  s    zServerProxyTestCase.setUpc             C   s"   t  | j¡}|  |dƒƒ d ¡ d S )Nr  )r   rq   r“   r   )r   r”   r   r   r   r^  ¢  s    zServerProxyTestCase.test_closec             C   s,   t  ¡ }t j| j|d}|  |dƒ|¡ d S )N)rF  rF  )r   rm   rq   r“   r   )r   r3   r”   r   r   r   r_  ¦  s    z"ServerProxyTestCase.test_transportN)r*   r+   r,   r#  r^  r_  r   r   r   r   rt  ›  s   rt  c                   s   e Zd Zd‡ fdd„	Z‡  ZS )ÚFailingMessageClassNc                s"   |  ¡ }|dkrdS tƒ  ||¡S )Nzcontent-lengthzI am broken)r  Úsuperrw   )r   ÚkeyZfailobj)ra  r   r   rw   ¯  s    zFailingMessageClass.get)N)r*   r+   r,   rw   Ú__classcell__r   r   )ra  r   rv  ®  s   rv  c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚFailingServerTestCasec             C   sN   t  ¡ | _| jdf}t jt|d}| ¡  |  |j¡ | j ¡  | j 	¡  d S )Nr	   )rŠ   r   )
r   r  r  rŽ   r	  r   r‹   r   r   r!  )r   r"  r’   r   r   r   r#  ·  s    


zFailingServerTestCase.setUpc             C   s*   | j  ¡  dtjj_tjj}|tjj	_
d S )NF)r  r   rk   rˆ   r÷   r  rz   rl   ÚHTTPMessagerø   ÚMessageClass)r   Zdefault_classr   r   r   r$  Ã  s    

zFailingServerTestCase.tearDownc             C   s’   t jjj}|  |d¡ dt jj_y"t t¡}|  | dd¡d¡ W nJ tj	t
fk
rŒ } z&t|ƒs||  d|t|ddƒf ¡ W d d }~X Y nX d S )	NFTrÌ   rÖ   i ¡ z%s
%srv   rß   )rk   rˆ   r÷   r  r   r   rq   rý   r  r  rs   r  r&  r'  )r   Zflagvalr”   r  r   r   r   Ú
test_basicÌ  s    


z FailingServerTestCase.test_basicc          
   C   sš   t tjj_yt t¡}| dd¡ W nf tj	t
fk
rŠ } zBt|ƒszt|dƒrz|  |j d¡d k¡ |  |j d¡d k¡ W d d }~X Y nX |  d¡ d S )NrÌ   rÖ   rv   zX-exceptionzX-tracebackzProtocolError not raised)rv  rk   rˆ   rø   r|  r   rq   rý   r  r  rs   r  Úhasattrrt   rv   rw   r&  )r   r”   r  r   r   r   Útest_fail_no_infoÞ  s    

(z'FailingServerTestCase.test_fail_no_infoc          
   C   s¦   t tjj_dtjj_yt t	¡}| 
dd¡ W nh tjtfk
r– } zDt|ƒs†t|dƒr†d}|  |j d¡|¡ |  |j d¡d k	¡ W d d }~X Y nX |  d¡ d S )	NTrÌ   rÖ   rv   z5invalid literal for int() with base 10: 'I am broken'zX-exceptionzX-tracebackzProtocolError not raised)rv  rk   rˆ   rø   r|  r÷   r  r   rq   rý   r  r  rs   r  r~  r   rv   rw   rt   r&  )r   r”   r  Zexpected_errr   r   r   Útest_fail_with_infoî  s    


(z)FailingServerTestCase.test_fail_with_infoN)r*   r+   r,   r#  r$  r}  r  r€  r   r   r   r   rz  ¶  s
   	rz  úutf-8c             c   s4   t j}tjt ¡ | dt _zt jV  W d|t _X dS )zhA variation on support.captured_stdout() which gives a text stream
    having a `buffer` attribute.
    )rT   N)rG   ÚstdoutÚioÚTextIOWrapperÚBytesIO)rT   Zorig_stdoutr   r   r   Úcaptured_stdout  s
    r†  c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚCGIHandlerTestCasec             C   s   t j ¡ | _d S )N)rk   rˆ   ÚCGIXMLRPCRequestHandlerÚcgi)r   r   r   r   r#    s    zCGIHandlerTestCase.setUpc             C   s
   d | _ d S )N)r‰  )r   r   r   r   r$    s    zCGIHandlerTestCase.tearDownc          
   C   s   t  ¡ ~}d|d< t| jjd}| j ¡  W d Q R X | d¡ | ¡ }| ¡ d }d 	| ¡ dd… ¡}|  
|d	¡ |  
|d
¡ W d Q R X d S )NZGETZREQUEST_METHOD)rT   r   r	   ú r   r=   Z400zBad Request)r   ÚEnvironmentVarGuardr†  r‰  rT   r‡   Úseekrx   Úsplitr   r   )r   ÚenvÚdata_outrW  r1  Úmessager   r   r   Útest_cgi_get  s    

zCGIHandlerTestCase.test_cgi_getc             C   sØ   d}t  ¡ b}t| jjdH}t  ¡ 4}| |¡ | d¡ tt	|ƒƒ|d< | j 
¡  W d Q R X W d Q R X W d Q R X | d¡ | ¡ }|  tjtj|dd … ¡ || d¡d … }|  tt d|¡ d¡ƒt	|ƒ¡ d S )	Naw  <?xml version='1.0'?>
        <methodCall>
            <methodName>test_method</methodName>
            <params>
                <param>
                    <value><string>foo</string></value>
                </param>
                <param>
                    <value><string>bar</string></value>
                </param>
            </params>
        </methodCall>
        )rT   r   ZCONTENT_LENGTHé,   z<?xmlzContent-Length: (\d+)r	   )r   r‹  r†  r‰  rT   Zcaptured_stdinr|   rŒ  r&   r{   r‡   rx   r7   r   rµ   r   Úfindr   rI   rj  ÚsearchÚgroup)r   r_   rŽ  r  Zdata_inrW  Zcontentr   r   r   Útest_cgi_xmlrpc_response*  s    



(
z+CGIHandlerTestCase.test_cgi_xmlrpc_responseN)r*   r+   r,   r#  r$  r‘  r–  r   r   r   r   r‡    s   r‡  c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚUseBuiltinTypesTestCasec                s´   g ˆ _ d}t dddddd¡}t ||fd¡}‡ fd	d
„}tjjdd dd}| |¡ | |¡ ˆ  	t
ˆ j ƒd¡ ˆ j \}}ˆ  	ˆ j ||g¡ ˆ  t|ƒtj¡ ˆ  t|ƒt¡ d S )Ns   my dog has fleasiØ  r>   é   é   é   é   Úfoobarc                 s   ˆ j  | ¡ d S )N)ÚlogÚextend)r   )r   r   r   rœ  _  s    z>UseBuiltinTypesTestCase.test_use_builtin_types.<locals>.foobarT)rQ   rT   r   r   )r  r   r   r   rk   rˆ   r›   rœ   r  r   r{   r   r   rZ   )r   Zexpected_bytesZexpected_dateZ	marshaledrœ  ÚhandlerZmybytesZmydater   )r   r   Útest_use_builtin_typesW  s    


z.UseBuiltinTypesTestCase.test_use_builtin_typesc             C   s   t jjdd}|  |j¡ d S )NT)r   )rk   rˆ   rˆ  rt   r   )r   rŸ  r   r   r   Ú*test_cgihandler_has_use_builtin_types_flagk  s    zBUseBuiltinTypesTestCase.test_cgihandler_has_use_builtin_types_flagc             C   s(   t jjddd}| ¡  |  |j¡ d S )N)rï   r   T)r   )rk   rˆ   r÷   rŒ   rt   r   )r   rˆ   r   r   r   Ú,test_xmlrpcserver_has_use_builtin_types_flago  s    zDUseBuiltinTypesTestCase.test_xmlrpcserver_has_use_builtin_types_flagN)r*   r+   r,   r   r¡  r¢  r   r   r   r   r—  U  s   r—  c               C   s.   t  tttttttt	t
tttttttt¡ d S )N)r   Zrun_unittestr   r±   rÁ   rÞ   r´   r—  r%  rL  rY  r\  r`  rp  rN  rt  rz  r‡  r–   r   r   r   r   Ú	test_mainv  s    
r£  Ú__main__)NN)N)r  )?rá   r   ri   rG   rÇ   r  r   Zxmlrpc.clientrl   r   Zxmlrpc.serverrk   Zhttp.clientrz   Zhttp.serverr…   r   rj  rƒ  Ú
contextlibZtestr   re  rp   rY   r[   r   r   ru  r   r–   r±   r´   rÁ   rÞ   rû   rü   rý   r	  r  r  r  r  r%  rL  rN  rS  rY  r\  ZskipIfr`  rp  rt  r{  rv  rz  Úcontextmanagerr†  r‡  r—  Zreap_threadsr£  r*   r   r   r   r   Ú<module>   sŽ   
  3WW
@
C J"C
ND!
