a
    äzeAæ  ã                   @   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 d dlmZ d dlmZmZmZ zd dlZW n eyÞ   dZY n0 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*dPd#d$„Z+dQd%d&„Z,d'd(„ Z-d)d*„ Z.G d+d,„ d,ej!ƒZ/G d-d.„ d.e/ƒZ0G d/d0„ d0e/ƒZ1G d1d2„ d2e/ƒZ2G d3d4„ d4e/ƒZ3G d5d6„ d6e3ƒZ4G d7d8„ d8e3ƒZ5e 6edu d9¡G d:d;„ d;e/ƒƒZ7e 6edu d9¡G d<d=„ d=ej!ƒƒZ8G d>d?„ d?e/ƒZ9G d@dA„ dAej!ƒZ:G dBdC„ dCejj;ƒZ<G dDdE„ dEej!ƒZ=ej>dRdGdH„ƒZ?G dIdJ„ dJej!ƒZ@G dKdL„ dLej!ƒZAdMdN„ ZBeCdOkre D¡  dS )Sé    N)Úmock)Úsupport)Úsocket_helper)Ú	ALWAYS_EQÚLARGESTÚSMALLESTzfoo@bar.baz.spamgHázns¼@i   é   z.zyx.41ó   my dog has fleasFu	   ä€€æ€€è€€zregular valueú20050210T11:41:23)	éÕ  r   é
   é   é)   é   r   é   éÿÿÿÿr   r   r   r   r   )ZastringZafloatZanintZ
ashortlongZanotherlistZabase64Zb64bytesZb64bytearrayZbooleanÚ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+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.9/test/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 )Nr   r   r   r   r   r   r
   T©Úuse_builtin_typesF)Zuse_datetime©	Údatetimer   r   ÚDateTimer   r   ÚassertIsÚtypeÚassertIsNone©r   ZdtÚsÚresultÚmZnewdtr   r   r   Útest_dump_bare_datetime3   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:23Tr   Fr!   r'   r   r   r   Útest_datetime_before_1900U   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_1164912g   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   ÚTr   s   r7   éd   ZHello)ÚobjectÚxÚyr   r   r   r   Ú__dict__)r   r7   ÚtÚt2r2   r   r   r   Útest_newstyle_classq   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_longz   s    z!XMLRPCTestCase.test_dump_big_longc                 C   s   |   ttjddif¡ d S )N©r   r   é   r   ©rA   Ú	TypeErrorr   r   rC   r   r   r   Útest_dump_bad_dict}   s    z!XMLRPCTestCase.test_dump_bad_dictc                 C   s4   g d¢}ddd|g}|  |¡ |  ttj|f¡ d S )NrE   rF   é   é   )ÚappendrA   rH   r   r   )r   Úlr=   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Ú2rF   )Ú3r1   r=   rG   ©r   r1   r=   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ÿÿÿì        r   c                 S   s   d S ©Nr   ©r(   r   r   r   Údummy_write—   s    z5XMLRPCTestCase.test_dump_big_int.<locals>.dummy_write)ÚsysÚmaxsizerA   rB   r   r   ÚintÚMAXINTÚMININTÚ
MarshallerZdump_int©r   rW   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 )NrT   é*   c                 S   s   d S rU   r   rV   r   r   r   rW   ©   s    z4XMLRPCTestCase.test_dump_double.<locals>.dummy_write)r   r   Úfloatr[   r\   r]   Zdump_doubler^   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   rA   rH   )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â‚¬Â¤úiso-8859-15©Úencodingz,<?xml version='1.0' encoding='iso-8859-15'?>r   ÚxmlcharrefreplaceT)rh   r.   u   methodâ‚¬Â¤)rh   Ú
methodnamer   )r   r   r   r   Úencode)r   r/   rd   rj   r   r   r   Útest_dump_encodingº   s(    ÿ
ÿ
ÿz!XMLRPCTestCase.test_dump_encodingc                 C   s¾   d}|   |t |¡¡ tttjfD ]–}||ƒ}t |f¡}tj|dd\}}|\}|   ||¡ |  t|ƒt¡ |  	|¡ tj|dd\}}|\}|   ||¡ |  t|ƒtj¡ |  	|¡ q"d S )Nr	   Tr   F)
r   r   ÚBinaryÚbytesÚ	bytearrayr   r   r$   r%   r&   )r   ÚsampleÚ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   ÚResponseErrorrA   r   )r   rt   Údatar   r   r   Útest_loads_unsupportedâ   s    z%XMLRPCTestCase.test_loads_unsupportedc                 K   sR   d| }t j|fi |¤Ž\}}|\}|  ||¡ |  t|ƒt|ƒ¡ |  |¡ d S )Nz1<params><param><value>%s</value></param></params>)r   r   r   r$   r%   r&   )r   r(   r/   Úkwargsr   r)   r*   rr   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ÿTr   z6<dateTime.iso8601>20050210T11:41:23</dateTime.iso8601>r
   r   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)rx   r   rm   r#   r"   ©r   Úcheckr   r   r   Útest_load_standard_typesø   s8    







ÿÿÿþþý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)rx   ÚdecimalZDecimalr|   r   r   r   Útest_load_extension_types  s    




ÿ
ÿz(XMLRPCTestCase.test_load_extension_typesc              	   C   s¼   | j }d}t |¡” d|d  }|  t¡" |d|› dd ƒ W d   ƒ n1 sT0    Y  |  t¡" |d|› dd ƒ W d   ƒ n1 s0    Y  W d   ƒ n1 s®0    Y  d S )Niˆ  rO   r   z<int>z</int>z<biginteger>z</biginteger>)rx   r   Zadjust_int_max_str_digitsrA   Ú
ValueError)r   r}   Z	maxdigitsr(   r   r   r   Útest_limit_int   s    0zXMLRPCTestCase.test_limit_intc                 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   sz   zdd l }W n ty"   d}Y n0 d}ztj d¡ ¡  W n8 tyZ   |  |d¡ Y n tyt   |  	|¡ Y n0 d S )Nr   FTzhttps://localhost:9999z&xmlrpc client's error with SSL support)
ÚsslÚImportErrorr„   r…   ÚServerProxyZbad_functionÚNotImplementedErrorÚassertFalseÚOSErrorÚ
assertTrue)r   rˆ   Zhas_sslr   r   r   Útest_ssl_presence1  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 |¡0}|  | ¡ d¡ |  | ¡ d¡ W d   ƒ n1 s¬0    Y  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>.RequestHandlerú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 )NúContent-LengthT)rK   r-   F)rZ   ÚheadersÚgetZrfileÚreadÚhandledZclose_connectionr   r   rk   Zsend_responseÚhttpZ
HTTPStatusZOKZsend_headerÚlenZend_headersZwfileÚwrite)r   ÚlengthÚresponser   r   r   Údo_POSTD  s    zHXMLRPCTestCase.test_keepalive_disconnect.<locals>.RequestHandler.do_POSTc                 W   s   d S rU   r   )r   ÚformatÚargsr   r   r   Úlog_messageS  s    zLXMLRPCTestCase.test_keepalive_disconnect.<locals>.RequestHandler.log_messageN)r4   r5   r6   Úprotocol_versionr•   r›   rž   r   r   r   r   ÚRequestHandler@  s   r    c                      s$   ˆ j  tdƒ¡ ˆ  ¡  ˆ  ¡  d S ©Nr   )ÚsocketÚ
settimeoutra   Úhandle_requestr   ©Úserverr   r   Ú
run_serverW  s    z<XMLRPCTestCase.test_keepalive_disconnect.<locals>.run_serverr   )Útargetzhttp://{}:{}/rK   )r–   r¦   ZBaseHTTPRequestHandlerZ
HTTPServerr   ZHOSTÚ
addCleanupÚserver_closeÚ	threadingÚThreadÚstartÚjoinrœ   Zserver_addressr   rŠ   r   Úmethod)r   r    r§   ÚthreadÚurlÚpr   r¥   r   Útest_keepalive_disconnect?  s    z(XMLRPCTestCase.test_keepalive_disconnectN)r4   r5   r6   r   r+   r,   r3   r?   rD   rI   rN   rS   r_   rb   re   rl   rs   rv   rx   r~   r   rƒ   r‡   r   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)r4   r5   r6   Ú__doc__r   r   r   r   ÚDispatchExch  s   r¶   c                    sŽ   d}‡ fdd„}t j ¡ }| |¡ ˆ  ˆ j¡}| d|¡ W d  ƒ n1 sR0    Y  ˆ  |jj	|f¡ ˆ  
|jj¡ ˆ  
|jj¡ dS )z$Calls explicitly registered functionrE   c                     s   ˆ   | ¡‚d S rU   )r¶   )ÚparamsrC   r   r   Údispatched_funcs  s    zQSimpleXMLRPCDispatcherTestCase.test_call_registered_func.<locals>.dispatched_funcr¸   N)r„   r¦   ÚSimpleXMLRPCDispatcherÚregister_functionrA   r¶   Ú	_dispatchr   Ú	exceptionr   r&   Ú	__cause__Ú__context__)r   Ú
exp_paramsr¸   Ú
dispatcherÚexc_ctxr   rC   r   Útest_call_registered_funcl  s    

*z8SimpleXMLRPCDispatcherTestCase.test_call_registered_funcc                 C   s’   d}G dd„ dƒ}t j ¡ }| |ƒ ¡ |  | j¡}| d|¡ W d  ƒ n1 sV0    Y  |  |jj	|f¡ |  
|jj¡ |  
|jj¡ dS )z3Calls a registered instance attribute as a functionrE   c                   @   s   e Zd Zdd„ ZdS )zOSimpleXMLRPCDispatcherTestCase.test_call_instance_func.<locals>.DispatchedClassc                 W   s   t  |¡‚d S rU   ©r´   r¶   )r   r·   r   r   r   r¸   †  s    z_SimpleXMLRPCDispatcherTestCase.test_call_instance_func.<locals>.DispatchedClass.dispatched_funcN)r4   r5   r6   r¸   r   r   r   r   ÚDispatchedClass…  s   rÄ   r¸   N©r„   r¦   r¹   Úregister_instancerA   r¶   r»   r   r¼   r   r&   r½   r¾   )r   r¿   rÄ   rÀ   rÁ   r   r   r   Útest_call_instance_func~  s    
*z6SimpleXMLRPCDispatcherTestCase.test_call_instance_funcc                 C   s˜   d}d}G dd„ dƒ}t j ¡ }| |ƒ ¡ |  | j¡}| ||¡ W d  ƒ n1 sZ0    Y  |  |jj	||f¡ |  
|jj¡ |  
|jj¡ dS )z4Calls the registered instance's `_dispatch` functionr¯   rE   c                   @   s   e Zd Zdd„ ZdS )zLSimpleXMLRPCDispatcherTestCase.test_call_dispatch_func.<locals>.TestInstancec                 S   s   t  ||¡‚d S rU   rÃ   )r   r¯   r·   r   r   r   r»   š  s    ÿzVSimpleXMLRPCDispatcherTestCase.test_call_dispatch_func.<locals>.TestInstance._dispatchN)r4   r5   r6   r»   r   r   r   r   ÚTestInstance™  s   rÈ   NrÅ   )r   Z
exp_methodr¿   rÈ   rÀ   rÁ   r   r   r   Útest_call_dispatch_func‘  s    
*z6SimpleXMLRPCDispatcherTestCase.test_call_dispatch_funcc                 C   sT   t j ¡ }|jddd |  td¡ | dd¡ W d  ƒ n1 sF0    Y  dS )z2Calls explicitly registered function which is NoneNr¯   ©Úname©Zparam)r„   r¦   r¹   rº   ÚassertRaisesRegexÚ	Exceptionr»   ©r   rÀ   r   r   r   Útest_registered_func_is_none¦  s    
z;SimpleXMLRPCDispatcherTestCase.test_registered_func_is_nonec                 C   sR   t j ¡ }| tƒ ¡ |  td¡ | dd¡ W d  ƒ n1 sD0    Y  dS )z>Attempts to call nonexistent function on a registered instancer¯   rÌ   N)r„   r¦   r¹   rÆ   r9   rÍ   rÎ   r»   rÏ   r   r   r   Útest_instance_has_no_func®  s    
z8SimpleXMLRPCDispatcherTestCase.test_instance_has_no_funcc                 C   sF   t j ¡ }|  td¡ | dd¡ W d  ƒ n1 s80    Y  dS )z2Calls a function that the dispatcher cannot locater¯   rÌ   N)r„   r¦   r¹   rÍ   rÎ   r»   rÏ   r   r   r   Útest_cannot_locate_func¶  s    
z6SimpleXMLRPCDispatcherTestCase.test_cannot_locate_funcN)r4   r5   r6   rÎ   r¶   rÂ   rÇ   rÉ   rÐ   rÑ   rÒ   r   r   r   r   r´   g  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   ÚescaperC   r   r   r   Útest_escape¿  s    zHelperTestCase.test_escapeN)r4   r5   r6   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 )Nr`   ú
Test Faultz<Fault 42: 'Test Fault'>)r   ÚFaultr   Úreprr0   )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 )Nr`   r×   )Ú	faultCodeÚfaultString)r   rØ   r   r   r   r]   rA   )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 ©NZ__addÚtitle)rA   ÚAttributeErrorr„   r¦   Úresolve_dotted_attributer0   rŽ   rC   r   r   r   Útest_dotted_attributeÔ  s    
ÿz#FaultTestCase.test_dotted_attributeN)r4   r5   r6   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   sj   t  d¡L}t g d¢¡}||_t ¡ }t ¡ }|  t	|ƒt 
d|¡¡ W d   ƒ n1 s\0    Y  d S )Nztime.localtime)	iÝ  é   é   r   é   é1   r   éÄ   r   ú%Y%m%dT%H:%M:%S)r   ZpatchÚtimeÚstruct_timeZreturn_valueÚ	localtimer   r#   r   r0   Ústrftime)r   Zlocaltime_mockZtime_structrí   r=   r   r   r   Útest_defaultÜ  s    ÿ

ÿzDateTimeTestCase.test_defaultc              	   C   s0   d}t  |¡}|  t|ƒt dt |¡¡¡ d S ©Ngl]‚Þ®šÑArê   )r   r#   r   r0   rë   rî   rí   rR   r   r   r   Ú	test_timeæ  s
    

ÿzDateTimeTestCase.test_timec                 C   s"   d}t  |¡}|  t|ƒd¡ d S )N)	é×  é   é	   r   é&   é2   rK   é    r   z20070609T10:38:50)r   r#   r   r0   rR   r   r   r   Útest_time_tupleì  s    
z DateTimeTestCase.test_time_tuplec                 C   s0   t  d¡}t |¡}|  t|ƒt  d|¡¡ d S rð   )rë   rí   r   r#   r   r0   rî   rR   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 )Nrò   r   r   rF   rJ   rK   z20070102T03:04:05)r"   r   r#   r   r0   rR   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 )Nrò   r   r   rF   rJ   rK   z%<DateTime '20070102T03:04:05' at %#x>)r"   r   r#   Úidr   rÙ   )r   r1   r=   Ú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  rò   rô   é   rå   r   é   )r   r#   Údecoder"   r   Z	_datetime)r   r1   Út1Ztrefr>   r   r   r   Útest_decode  s    

zDateTimeTestCase.test_decodec                 C   sf  t j  ¡ }t | ¡ ¡}|  ||k¡ |  ||k¡ |t jdd }|  ||k¡ |  ||k ¡ | d¡}|  ||k¡ |  ||k¡ t | ¡ ¡}|  ||k¡ |  ||k ¡ | d¡}| ¡ }|  	|dk¡ |  ||k¡ |  	|t
|ƒk¡ |  ||k¡ |  t¡ |tdƒk  W d   ƒ n1 s,0    Y  |  t¡ ||k W d   ƒ n1 s`0    Y  |  t¡ |t
|ƒk W d   ƒ n1 s˜0    Y  |  t¡ ||k W d   ƒ n1 sÌ0    Y  |  |tk¡ |  	|tk¡ |  |tk ¡ |  	|tk¡ |  |tk¡ |  	|tk¡ |  	|tk ¡ |  |tk¡ |  	|tk¡ |  |tk¡ d S )NrJ   )Zsecondsrê   Úasciii²  )r"   Únowr   r#   Z	timetuplerŽ   Z	timedeltarî   rk   rŒ   ro   rA   rH   ra   r   r   r   )r   r  ZdtimeZthenZdstrZ
dtime_thenZdbytesZdtupler   r   r   Útest_comparison  sJ    


,(,(z DateTimeTestCase.test_comparisonN)r4   r5   r6   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   rm   r   r0   )r   r=   r   r   r   rï   A  s    zBinaryTestCase.test_defaultc                 C   s(   d}t  |¡}|  t|ƒt|dƒ¡ d S ©Ns   abc123ÿþzlatin-1r  rR   r   r   r   Útest_stringE  s    
zBinaryTestCase.test_stringc                 C   sZ   d}t  |¡}t ¡ }| |¡ |  t|ƒt|dƒ¡ t |¡}|  t|ƒt|dƒ¡ d S r  )Úbase64Zencodebytesr   rm   rÿ   r   r0   Z_binary)r   r1   Úder   r>   r   r   r   r  J  s    


zBinaryTestCase.test_decodeN)r4   r5   r6   rï   r	  r  r   r   r   r   r  :  s   r  c           
      C   s@  G dd„ dƒ}G dd„ dt jjƒ}|s.t jj}|d||ddd}zâz°| ¡  |j ¡ \aadttf a	| 
¡  | ¡  | ¡  | t¡ | d	d
„ d¡ |jdd„ ƒ}|jdddd„ ƒ}|ƒ }	|j|	dd |  ¡  |dkrð| ¡  |d8 }qÖW n tjy   Y n0 W |j ¡  d a|  ¡  n|j ¡  d a|  ¡  0 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 rU   r   ©r   r:   r;   r   r   r   Údiv\  s    z*http_server.<locals>.TestInstanceClass.divc                 S   s   |dkrdS d S ©Nr  úThis is the div functionr   ©r   rË   r   r   r   Ú_methodHelp_  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   ÚgetDatad  s    z6http_server.<locals>.TestInstanceClass.Fixture.getDataN)r4   r5   r6   Ústaticmethodr  r   r   r   r   ÚFixturec  s   r  N)r4   r5   r6   r  r  r  r   r   r   r   ÚTestInstanceClass[  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_requesti  s    
z/http_server.<locals>.MyXMLRPCServer.get_requestN©r4   r5   r6   r  r   r   r   r   ÚMyXMLRPCServerh  s   r  ©Ú	localhostr   F)rh   ÚlogRequestsÚbind_and_activateúhttp://%s:%dc                 S   s   | S rU   r   )r:   r   r   r   Ú<lambda>‚  ó    zhttp_server.<locals>.<lambda>õ   tÃªÅ¡tc                   S   s   dS ©úThis is my functionTr   r   r   r   r   Úmy_functionƒ  s    z http_server.<locals>.my_functionÚaddrÊ   c                 S   s   | | S rU   r   ©r:   r;   r   r   r   Ú_‡  s    zhttp_server.<locals>._T)Zallow_dotted_namesr   r   )r„   r¦   ÚSimpleXMLRPCServerÚSimpleXMLRPCRequestHandlerÚserver_bindr¢   ÚgetsocknameÚADDRÚPORTÚURLÚserver_activateÚ register_introspection_functionsÚregister_multicall_functionsrº   ÚpowrÆ   Úsetr¤   ÚtimeoutÚclose)
ÚevtÚnumrequestsÚrequestHandlerrh   r  r  Úservr*  r-  ZtestInstancer   r   r   Úhttp_serverZ  sF    þ





þ
r@  c                 C   sš  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zÐ|j ¡ \aa	dtt	f a
| ¡  g d¢}	|	D ]:}
| |
t j ¡ ¡}| ¡  | ¡  | |
fdd„d¡ q¬| |	d ¡ t¡ | |	d ¡ dd„ d¡ | d|ƒ ¡ |  ¡  |dkrJ| ¡  |d8 }q,W n tjyb   Y n0 W |j ¡  d a	|  ¡  n|j ¡  d a	|  ¡  0 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 rU   r   r  r   r   r   r  œ  s    z0http_multi_server.<locals>.TestInstanceClass.divc                 S   s   |dkrdS d S r  r   r  r   r   r   r  Ÿ  s    z8http_multi_server.<locals>.TestInstanceClass._methodHelpN)r4   r5   r6   r  r  r   r   r   r   r  ›  s   r  c                   S   s   dS r(  r   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 r  r  r  r   r   r   r  ¨  s    
z5http_multi_server.<locals>.MyXMLRPCServer.get_requestNr  r   r   r   r   r  §  s   r  c                   @   s   e Zd Zg ZdS )z+http_multi_server.<locals>.MyRequestHandlerN)r4   r5   r6   Z	rpc_pathsr   r   r   r   ÚMyRequestHandler±  s   rA  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   ru   Zdispatch_methodÚpathr   r   r   Ú_marshaled_dispatchµ  s    z?http_multi_server.<locals>.BrokenDispatcher._marshaled_dispatch)NN)r4   r5   r6   rD  r   r   r   r   ÚBrokenDispatcher´  s   rE  r   F)r"  r#  rF   r$  )
ú/fooú/foo/barú/foo?k=vú	/foo#fragú/foo?k=v#fragr  ú/ú/RPC2ú?k=vú#fragc                 S   s   | S rU   r   )r²   r   r   r   r%  Î  r&  z#http_multi_server.<locals>.<lambda>Útestr   r   c                 S   s   | | S rU   r   r,  r   r   r   r%  Ð  r&  r+  ú
/is/broken)r„   r¦   ZMultiPathXMLRPCServerr/  r¢   r£   r0  r1  r2  r3  r4  r5  Zadd_dispatcherr¹   r6  r7  rº   Zget_dispatcherr8  r9  r¤   r:  r;  )r<  r=  r>  r  r*  r  rA  rE  r?  ÚpathsrC  r1   r   r   r   Úhttp_multi_serverš  sJ    ÿ


þ
rR  c                 C   s^   z*| j dks| jdu rW dS | j d¡}W n tyD   t| ƒ}Y n0 |rZd| ¡ v 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   NTúX-exceptionztemporarily unavailable)Zerrcoder’   r“   rá   r0   Úlower)ÚeZexc_messr   r   r   Úis_unavailable_exceptionâ  s    rV  c                    s   | sdd„ S ‡ fdd„}|S )Nc                 S   s   | S rU   r   )Úfuncr   r   r   r%  ÷  r&  z)make_request_and_skipIf.<locals>.<lambda>c                    s   ‡ fdd„}|S )Nc              
      sV   zt  t¡ ¡  W n4 t jtfyF } zt|ƒs2‚ W Y d }~n
d }~0 0 t ˆ ¡‚d S rU   )	r   rŠ   r4  r*  ÚProtocolErrorr   rV  ÚunittestZSkipTest)r   rU  ©Úreasonr   r   Úmake_request_and_skipù  s    zImake_request_and_skipIf.<locals>.decorator.<locals>.make_request_and_skipr   )rW  r\  rZ  r   r   Ú	decoratorø  s    z*make_request_and_skipIf.<locals>.decoratorr   )Z	conditionr[  r]  r   rZ  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   )r„   r¦   r.  Ú_send_traceback_headerr«   ÚEventr<  Úrequest_countr>  r¬   Ú
threadFuncr­   r©   r®   ÚwaitÚclear©r   Z	serv_argsr°   r   r   r   ÚsetUp  s    


zBaseServerTestCase.setUpc                 C   s   | j  ¡  dtjj_d S ©NF)r<  re  r„   r¦   r.  ra  rC   r   r   r   ÚtearDown  s    
zBaseServerTestCase.tearDown)
r4   r5   r6   r>  rc  r  r@  rd  rh  rj  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   st   z"t  t¡}|  | dd¡d¡ W nL t jtfyn } z.t|ƒsZ|  d|t	|ddƒf ¡ W Y d }~n
d }~0 0 d S )Nró   rý   é ¡ ú%s
%sr’   r  )
r   rŠ   r4  r   r8  rX  r   rV  ÚfailÚgetattr©r   r²   rU  r   r   r   Útest_simple1  s    
z!SimpleServerTestCase.test_simple1c                 C   s€   d}d}z&t  t¡}|  | ||¡|| ¡ W nL t jtfyz } z.t|ƒsf|  d|t	|ddƒf ¡ W Y d }~n
d }~0 0 d S )Nu   PÅ·tu   hÆ¡nrm  r’   r  )
r   rŠ   r4  r   r+  rX  r   rV  rn  ro  ©r   Zstart_stringZ
end_stringr²   rU  r   r   r   Útest_nonascii)  s    
ÿz"SimpleServerTestCase.test_nonasciic                 C   s†   d}d}z*t jtdd}|  | ||¡|| ¡ W nN t jtjfy€ } z.t|ƒsl|  	d|t
|ddƒf ¡ W Y d }~n
d }~0 0 d S )Nõ   â‚¬õ   Â¤rf   rg   rm  r’   r  ©r   rŠ   r4  r   r+  rX  r¢   ÚerrorrV  rn  ro  rr  r   r   r   Útest_client_encoding6  s    ÿz)SimpleServerTestCase.test_client_encodingc                 C   sx   z$t jtdd}|  | d¡d¡ W nN t jtjfyr } z.t|ƒs^|  	d|t
|ddƒf ¡ W Y d }~n
d }~0 0 d S )Nr  rg   r`   rm  r’   r  )r   rŠ   r4  r   t   tÃªÅ¡trX  r¢   rw  rV  rn  ro  rp  r   r   r   Útest_nonascii_methodnameD  s    z-SimpleServerTestCase.test_nonascii_methodnamec                 C   sh   t  tj tt¡¡$}| dd¡ | ¡ }W d   ƒ n1 s>0    Y  |  	|j
d¡ |  	|jd¡ d S )NZPOSTz/this-is-not-validi”  z	Not Found)Ú
contextlibÚclosingr–   r…   ZHTTPConnectionr2  r3  ZrequestZgetresponser   Ústatusr[  )r   Úconnrš   r   r   r   Útest_404N  s
    &zSimpleServerTestCase.test_404c                 C   s†   t g d¢ƒ}z(t t¡}|j ¡ }|  t |ƒ|¡ W nL tjtfy€ } z.t	|ƒsl|  
d|t|ddƒf ¡ W Y d }~n
d }~0 0 d S )N)
r8  r  r*  r+  r'  zsystem.listMethodszsystem.methodHelpzsystem.methodSignaturezsystem.multicallr  rm  r’   r  )r9  r   rŠ   r4  ÚsystemZlistMethodsr   rX  r   rV  rn  ro  )r   Zexpected_methodsr²   ÚmethrU  r   r   r   Útest_introspection1X  s    

z(SimpleServerTestCase.test_introspection1c                 C   sx   z&t  t¡}|j d¡}|  |d¡ W nL t jtfyr } z.t|ƒs^|  	d|t
|ddƒf ¡ W Y d }~n
d }~0 0 d S )Nr  r  rm  r’   r  ©r   rŠ   r4  r  Z
methodHelpr   rX  r   rV  rn  ro  )r   r²   ZdivhelprU  r   r   r   Útest_introspection2h  s    
z(SimpleServerTestCase.test_introspection2r   z)Docstrings are omitted with -O2 and abovec                 C   sx   z&t  t¡}|j d¡}|  |d¡ W nL t jtfyr } z.t|ƒs^|  	d|t
|ddƒf ¡ W Y d }~n
d }~0 0 d S )Nr*  r)  rm  r’   r  r‚  )r   r²   Z
myfunctionrU  r   r   r   Útest_introspection3t  s    
z(SimpleServerTestCase.test_introspection3c                 C   sx   z&t  t¡}|j d¡}|  |d¡ W nL t jtfyr } z.t|ƒs^|  	d|t
|ddƒf ¡ W Y d }~n
d }~0 0 d S )Nr  zsignatures not supportedrm  r’   r  )r   rŠ   r4  r  ZmethodSignaturer   rX  r   rV  rn  ro  )r   r²   ZdivsigrU  r   r   r   Útest_introspection4‚  s    
z(SimpleServerTestCase.test_introspection4c                 C   s¾   zlt  t¡}t  |¡}| dd¡ | dd¡ | dd¡ |ƒ \}}}|  |d¡ |  |d¡ |  |d¡ W nL t jt	fy¸ } z.t
|ƒs¤|  d	|t|d
dƒf ¡ W Y d }~n
d }~0 0 d S )Nr   rF   ró   rý   é   r`   rK   rl  rm  r’   r  )r   rŠ   r4  Ú	MultiCallr+  r8  r  r   rX  r   rV  rn  ro  )r   r²   Ú	multicallÚ
add_resultZ
pow_resultZ
div_resultrU  r   r   r   Útest_multicall  s    

z#SimpleServerTestCase.test_multicallc                 C   s¤   zRt  t¡}t  |¡}| ¡  |ƒ }|  |jd d d¡ |  |jd d d¡ W nL t jtfyž } z.t	|ƒsŠ|  
d|t|ddƒf ¡ W Y d }~n
d }~0 0 d S )	Nr   rÜ   r   rÝ   z@<class 'Exception'>:method "this_is_not_exists" is not supportedrm  r’   r  )r   rŠ   r4  r‡  Zthis_is_not_existsr   ÚresultsrX  r   rV  rn  ro  )r   r²   rˆ  r)   rU  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 rß   )rA   rá   r„   r¦   râ   r0   rŽ   rq  rC   r   r   r   rã   µ  s
    
ÿz*SimpleServerTestCase.test_dotted_attributec                 C   s,   t  dttf ¡}|j ¡ }|  |d¡ d S )Núhttp://%s:%d/RPC2r  )r   rŠ   r2  r3  r  r  r   )r   r¦   ru   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 )Nr  rz   õ   Ã©u   aÃ©)r   rŠ   r2  r3  r   r+  ©r   r¦   r   r   r   Útest_unicode_hostÅ  s    z&SimpleServerTestCase.test_unicode_hostc                 C   sV   t  t ttf¡¡.}| dt› dt› d d¡¡ W d   ƒ n1 sH0    Y  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  r{  r¢   Úcreate_connectionr2  r3  Úsendrk   )r   r}  r   r   r   Útest_partial_postÉ  s    ýýûz&SimpleServerTestCase.test_partial_postc                 C   s^   t  t¡.}| dd¡ |  |dƒjd¡ W d   ƒ n1 s>0    Y  |  |dƒjd¡ d S )Nr   rF   Ú	transport©NN)r   rŠ   r4  r+  ZassertNotEqualÚ_connectionr   r  r   r   r   Útest_context_managerÓ  s    ÿ"ÿz)SimpleServerTestCase.test_context_managerc                 C   sf   z:t  t¡}| dd¡ W d   ƒ n1 s.0    Y  W n t jyN   Y n0 |  |dƒjd¡ d S )Nr   rz   r–  r—  )r   rŠ   r4  r+  rØ   r   r˜  r  r   r   r   Ú!test_context_manager_method_errorÛ  s    .ÿz6SimpleServerTestCase.test_context_manager_method_errorN)r4   r5   r6   rq  rs  rx  ry  r~  r  rƒ  r^  rX   ÚflagsÚoptimizer„  r…  rŠ  rŒ  rã   rŽ  r‘  r•  r™  rš  r   r   r   r   rk    s(   


ÿ


rk  c                   @   s"   e Zd Zeddd„ƒZdd„ ZdS )ÚSimpleServerEncodingTestCaseNc                 C   s   t | ||dƒ d S )Nrf   )r@  )r<  r=  r>  rh   r   r   r   rd  æ  s    z'SimpleServerEncodingTestCase.threadFuncc                 C   s‚   d}d}z&t  t¡}|  | ||¡|| ¡ W nN t jtjfy| } z.t|ƒsh|  	d|t
|ddƒf ¡ W Y d }~n
d }~0 0 d S )Nrt  ru  rm  r’   r  rv  rr  r   r   r   Útest_server_encodingê  s    
ÿz1SimpleServerEncodingTestCase.test_server_encoding)NN)r4   r5   r6   r  rd  rž  r   r   r   r   r  å  s   r  c                   @   sp   e Zd Ze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S )ÚMultiPathServerTestCaser   c                 C   s:   t  td ¡}|  | dd¡d¡ |  t j|jdd¡ d S )NrF  ró   rý   rl  )r   rŠ   r4  r   r8  rA   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 )NrG  ró   rý   é   )r   rŠ   r4  r   r+  rA   rØ   r8  r   r   r   r   Ú
test_path2  s    z"MultiPathServerTestCase.test_path2c                 C   s&   t  td ¡}|  t j|jdd¡ d S )NrP  ró   rý   ©r   rŠ   r4  rA   rØ   r+  r   r   r   r   Ú
test_path3  s    z"MultiPathServerTestCase.test_path3c                 C   s&   t  td ¡}|  t j|jdd¡ d S )Nz/invalidró   rý   r¤  r   r   r   r   Útest_invalid_path
  s    z)MultiPathServerTestCase.test_invalid_pathc                 C   s"   t  td ¡}|  | ¡ d¡ d S )NrJ  ©r   rŠ   r4  r   rO  r   r   r   r   Útest_path_query_fragment  s    z0MultiPathServerTestCase.test_path_query_fragmentc                 C   s"   t  td ¡}|  | ¡ d¡ d S )NrI  r§  r   r   r   r   Útest_path_fragment  s    z*MultiPathServerTestCase.test_path_fragmentc                 C   s"   t  td ¡}|  | ¡ d¡ d S )NrH  r§  r   r   r   r   Útest_path_query  s    z'MultiPathServerTestCase.test_path_queryc                 C   s   t  t¡}|  | ¡ d¡ d S )NrL  r§  r   r   r   r   Útest_empty_path  s    
z'MultiPathServerTestCase.test_empty_pathc                 C   s"   t  td ¡}|  | ¡ d¡ d S )NrK  r§  r   r   r   r   Útest_root_path  s    z&MultiPathServerTestCase.test_root_pathc                 C   s"   t  td ¡}|  | ¡ d¡ d S )NrM  r§  r   r   r   r   Útest_empty_path_query"  s    z-MultiPathServerTestCase.test_empty_path_queryc                 C   s"   t  td ¡}|  | ¡ d¡ d S )NrN  r§  r   r   r   r   Útest_empty_path_fragment&  s    z0MultiPathServerTestCase.test_empty_path_fragmentN)r4   r5   r6   r  rR  rd  rc  r¡  r£  r¥  r¦  r¨  r©  rª  r«  r¬  r­  r®  r   r   r   r   rŸ  ù  s   rŸ  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.RequestHandlerr   c                 C   s(   | j  g ¡ t| j ƒd | _| j | ¡S r¡   )Ú
myRequestsrL   r—   ÚreqidxÚparentClassÚhandlerC   r   r   r   r³  4  s    z1BaseKeepaliveServerTestCase.RequestHandler.handlec                 C   s$   | j  | ¡}| j| j  | j¡ |S rU   )r²  Úhandle_one_requestr°  r±  rL   Zraw_requestline)r   r)   r   r   r   r´  8  s    z=BaseKeepaliveServerTestCase.RequestHandler.handle_one_requestN)r4   r5   r6   r„   r¦   r/  r²  rŸ   r°  r³  r´  r   r   r   r   r    0  s
   r    c                 C   s   g | j _t | ¡S rU   )r    r°  r_  rh  rC   r   r   r   rh  >  s    z!BaseKeepaliveServerTestCase.setUpN)	r4   r5   r6   r„   r¦   r/  r    r>  rh  r   r   r   r   r¯  -  s   r¯  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ý   rl  r;  r   r   r   ©	r   rŠ   r4  r   r8  r—   r    r°  ZassertGreaterEqualr   r   r   r   Útest_twoF  s    

z!KeepaliveServerTestCase1.test_twoN)r4   r5   r6   r·  r   r   r   r   rµ  E  s   rµ  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ý   rl  r;  r   r   éþÿÿÿ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ý   rl  r–  r;  r   )	r   rŠ   r4  r   r8  r;  r—   r    r°  r   r   r   r   Útest_transporto  s    

z'KeepaliveServerTestCase2.test_transportN)r4   r5   r6   rc  rº  r»  r   r   r   r   r¸  X  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.RequestHandlerr   c                 C   s   t | jd ƒ| j_| j | ¡S )Núcontent-length)rZ   r’   Ú	__class__Úcontent_lengthr²  r›   rC   r   r   r   r›   ‚  s    z)GzipServerTestCase.RequestHandler.do_POSTN)	r4   r5   r6   r„   r¦   r/  r²  rŸ   r›   r   r   r   r   r    ~  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 )Nr½  r   )rZ   Z	getheaderÚresponse_lengthr   r†   Úparse_response)r   rš   r   r   r   rÁ  ‹  s    z+GzipServerTestCase.Transport.parse_responsec                 C   s"   | j r| dd¡ tj | ||¡S )NzContent-EncodingÚgzip)Ú	fake_gzipZ	putheaderr   r†   Úsend_content)r   Ú
connectionÚbodyr   r   r   rÄ    s    z)GzipServerTestCase.Transport.send_contentN)r4   r5   r6   rÃ  rÁ  rÄ  r   r   r   r   r†   ˆ  s   r†   c                 C   s   t  | ¡ d S rU   )r_  rh  rC   r   r   r   rh  •  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©r–  ró   rý   rl  r   r;  )
r†   Úencode_thresholdr   rŠ   r4  r   r8  r    r¿  rŽ   )r   r=   r²   rz   r{   r   r   r   Útest_gzip_request˜  s    z$GzipServerTestCase.test_gzip_requestc                 C   st   |   ¡ }d |_d|_tjt|d}|  tjt 	d¡¡}| | 
dd¡ W d   ƒ n1 s\0    Y  |dƒƒ  d S )NTrÈ  z\b400\bró   rý   r;  )r†   rÉ  rÃ  r   rŠ   r4  rÍ   rX  ÚreÚcompiler8  )r   r=   r²   Úcmr   r   r   Útest_bad_gzip_request¤  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 rÇ  )
r†   r   rŠ   r4  r>  rÉ  r   r8  rÀ  rŽ   )r   r=   r²   Úoldrz   r{   r   r   r   Útest_gzip_response¯  s    
z%GzipServerTestCase.test_gzip_responseN)r4   r5   r6   r„   r¦   r/  r    r>  r   r†   rh  rÊ  rÎ  rÐ  r   r   r   r   r¼  z  s   r¼  c                   @   s   e Zd Zdd„ ZdS )ÚGzipUtilTestCasec                 C   sŽ   d}d| }t  |¡}t  |¡}|  t|ƒ|¡ d|d  }t  |¡}|  td¡ t  |¡ W d   ƒ n1 sr0    Y  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Í   r‚   )r   Zmax_gzip_decoderu   ÚencodedZdecodedr   r   r   Útest_gzip_decode_limitÁ  s    


ÿ(z'GzipUtilTestCase.test_gzip_decode_limitN)r4   r5   r6   rÔ  r   r   r   r   rÑ  ¾  s   rÑ  c                       sl   e Zd ZG dd„ dejjƒZeZg d¢Z‡ fdd„Z	dd„ Z
dd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚHeadersServerTestCasec                       s    e Zd ZdZ‡ fdd„Z‡  ZS )z$HeadersServerTestCase.RequestHandlerNc                    s   | j | j_tƒ  ¡ S rU   )r’   r¾  Útest_headersÚsuperr›   rC   ©r¾  r   r   r›   Ö  s    
z,HeadersServerTestCase.RequestHandler.do_POST)r4   r5   r6   rÖ  r›   Ú__classcell__r   r   rØ  r   r    Ó  s   r    )ZHostzAccept-EncodingzContent-Typez
User-Agentr‘   c                    s   d | j _tƒ  ¡ S rU   )r    rÖ  r×  rh  rC   rØ  r   r   rh  Þ  s    zHeadersServerTestCase.setUpc                 C   sR   t | jt| ¡ ƒ ƒ}|  t | ¡ ƒ|¡ | ¡ D ]\}}|  | |¡|¡ q2d S rU   )ÚsortedÚstandard_headersÚlistÚkeysZassertListEqualÚitemsr   r“   )r   r’   Ú
additionalZexpected_keysÚkeyr/   r   r   r   ÚassertContainsAdditionalHeadersâ  s    z5HeadersServerTestCase.assertContainsAdditionalHeadersc                 C   s@   t jtdgd}|  | dd¡d¡ | jj}|  |ddi¡ d S )N©úX-TestÚfoo©r’   ró   rý   rl  rã  rä  ©r   rŠ   r4  r   r8  r    rÖ  rá  ©r   r²   r’   r   r   r   Útest_headeré  s    z!HeadersServerTestCase.test_headerc                 C   sD   t jtddgd}|  | dd¡d¡ | jj}|  |ddd	œ¡ d S )
Nrâ  )úX-Test-SecondÚbarrå  ró   rý   rl  rä  rê  )rã  ré  ræ  rç  r   r   r   Útest_header_manyð  s    ÿ
ÿz&HeadersServerTestCase.test_header_manyc                 C   s:   t jtg d}|  | dd¡d¡ | jj}|  |i ¡ d S )Nrå  ró   rý   rl  ræ  rç  r   r   r   Útest_header_emptyù  s    z'HeadersServerTestCase.test_header_emptyc                 C   s>   t jtdd}|  | dd¡d¡ | jj}|  |ddi¡ d S )N)râ  rå  ró   rý   rl  rã  rä  ræ  rç  r   r   r   Útest_header_tuple   s    z'HeadersServerTestCase.test_header_tuplec                 C   sF   t jtddi ¡ d}|  | dd¡d¡ | jj}|  |ddi¡ d S )Nrã  rä  rå  ró   rý   rl  )	r   rŠ   r4  rÞ  r   r8  r    rÖ  rá  rç  r   r   r   Útest_header_items  s    z'HeadersServerTestCase.test_header_items)r4   r5   r6   r„   r¦   r/  r    r>  rÛ  rh  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 )ÚServerProxyTestCasec                 C   s   t j | ¡ d| _d S )Nzhttp://fake.localhost)rY  ÚTestCaserh  r±   rC   r   r   r   rh    s    zServerProxyTestCase.setUpc                 C   s"   t  | j¡}|  |dƒƒ d ¡ d S )Nr;  )r   rŠ   r±   r   r   r   r   r   rº    s    zServerProxyTestCase.test_closec                 C   s,   t  ¡ }t j| j|d}|  |dƒ|¡ d S )NrÈ  r–  )r   r†   rŠ   r±   r   )r   r=   r²   r   r   r   r»    s    z"ServerProxyTestCase.test_transportN)r4   r5   r6   rh  rº  r»  r   r   r   r   rï    s   rï  c                       s   e Zd Zd‡ fdd„	Z‡  ZS )ÚFailingMessageClassNc                    s"   |  ¡ }|dkrdS tƒ  ||¡S )Nr½  zI am broken)rT  r×  r“   )r   rà  ZfailobjrØ  r   r   r“   $  s    zFailingMessageClass.get)N)r4   r5   r6   r“   rÙ  r   r   rØ  r   rñ  #  s   rñ  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«   rb  r<  r¬   r@  r­   r©   r®   re  rf  rg  r   r   r   rh  ,  s    


zFailingServerTestCase.setUpc                 C   s*   | j  ¡  dtjj_tjj}|tjj	_
d S ri  )r<  re  r„   r¦   r.  ra  r–   r…   ÚHTTPMessager/  ÚMessageClass)r   Zdefault_classr   r   r   rj  8  s    

zFailingServerTestCase.tearDownc                 C   s”   t jjj}|  |d¡ dt jj_z"t t¡}|  | dd¡d¡ W nL tj	t
fyŽ } z.t|ƒsz|  d|t|ddƒf ¡ W Y d }~n
d }~0 0 d S )	NFTró   rý   rl  rm  r’   r  )r„   r¦   r.  ra  r   r   rŠ   r4  r8  rX  r   rV  rn  ro  )r   Zflagvalr²   rU  r   r   r   Ú
test_basicA  s    


z FailingServerTestCase.test_basicc              
   C   sœ   t tjj_zt t¡}| dd¡ W nh tj	t
fyŒ } zJt|ƒsxt|dƒrx|  |j d¡d u ¡ |  |j d¡d u ¡ W Y d }~nd }~0 0 |  d¡ d S )Nró   rý   r’   rS  úX-tracebackúProtocolError not raised)rñ  r„   r¦   r/  rô  r   rŠ   r4  r8  rX  r   rV  ÚhasattrrŽ   r’   r“   rn  rp  r   r   r   Útest_fail_no_infoS  s    

,z'FailingServerTestCase.test_fail_no_infoc              
   C   s¨   t tjj_dtjj_zt t	¡}| 
dd¡ W nj tjtfy˜ } zLt|ƒs„t|dƒr„d}|  |j d¡|¡ |  |j d¡d u¡ W Y d }~nd }~0 0 |  d¡ d S )	NTró   rý   r’   z5invalid literal for int() with base 10: 'I am broken'rS  rö  r÷  )rñ  r„   r¦   r/  rô  r.  ra  r   rŠ   r4  r8  rX  r   rV  rø  r   r’   r“   rŽ   rn  )r   r²   rU  Zexpected_errr   r   r   Útest_fail_with_infoc  s    


,z)FailingServerTestCase.test_fail_with_infoN)r4   r5   r6   rh  rj  rõ  rù  rú  r   r   r   r   rò  +  s
   	rò  úutf-8c                 c   s:   t j}tjt ¡ | dt _zt jV  W |t _n|t _0 dS )zhA variation on support.captured_stdout() which gives a text stream
    having a `buffer` attribute.
    rg   N)rX   ÚstdoutÚioÚTextIOWrapperÚBytesIO)rh   Zorig_stdoutr   r   r   Úcaptured_stdouty  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 rU   )r„   r¦   ÚCGIXMLRPCRequestHandlerÚcgirC   r   r   r   rh  ‡  s    zCGIHandlerTestCase.setUpc                 C   s
   d | _ d S rU   )r  rC   r   r   r   rj  Š  s    zCGIHandlerTestCase.tearDownc              	   C   s¸   t  ¡ œ}d|d< t| jjd}| j ¡  W d   ƒ n1 s@0    Y  | d¡ | ¡ }| ¡ d }d 	| ¡ dd… ¡}|  
|d	¡ |  
|d
¡ W d   ƒ n1 sª0    Y  d S )NÚGETZREQUEST_METHODrg   r   r   ú r   rJ   Z400zBad Request)r   ÚEnvironmentVarGuardr   r  rh   r¤   Úseekr”   Úsplitr®   r   )r   ÚenvÚdata_outr³  r|  Úmessager   r   r   Útest_cgi_get  s    
(
zCGIHandlerTestCase.test_cgi_getc              
   C   s  d}t  ¡ ”}t| jjdf}t  ¡ >}| |¡ | d¡ tt	|ƒƒ|d< | j 
¡  W d   ƒ n1 sj0    Y  W d   ƒ n1 sˆ0    Y  W d   ƒ n1 s¦0    Y  | 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>
        rg   r   ZCONTENT_LENGTHé,   z<?xmlzContent-Length: (\d+)r   )r   r  r   r  rh   Zcaptured_stdinr˜   r  r0   r—   r¤   r”   rA   r   rØ   r   Úfindr   rZ   rË  ÚsearchÚgroup)r   ru   r	  r
  Zdata_inr³  Zcontentr   r   r   Útest_cgi_xmlrpc_responseŸ  s(    
ÿþ

d
þz+CGIHandlerTestCase.test_cgi_xmlrpc_responseN)r4   r5   r6   rh  rj  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 )Nr	   iØ  rK   é   é   é   é   Úfoobarc                     s   ˆ j  | ¡ d S rU   )ÚlogÚextend)r   rC   r   r   r  Ô  s    z>UseBuiltinTypesTestCase.test_use_builtin_types.<locals>.foobarT)rc   rh   r    r   )r  r"   r   r   r„   r¦   r¹   rº   rD  r   r—   r$   r%   rn   )r   Zexpected_bytesZexpected_dateZ	marshaledr  ÚhandlerZmybytesZmydater   rC   r   Útest_use_builtin_typesÌ  s    ÿ


z.UseBuiltinTypesTestCase.test_use_builtin_typesc                 C   s   t jjdd}|  |j¡ d S )NTr   )r„   r¦   r  rŽ   r    )r   r  r   r   r   Ú*test_cgihandler_has_use_builtin_types_flagà  s    zBUseBuiltinTypesTestCase.test_cgihandler_has_use_builtin_types_flagc                 C   s(   t jjddd}| ¡  |  |j¡ d S )Nr   Tr   )r„   r¦   r.  rª   rŽ   r    r  r   r   r   Ú,test_xmlrpcserver_has_use_builtin_types_flagä  s
    ÿzDUseBuiltinTypesTestCase.test_xmlrpcserver_has_use_builtin_types_flagN)r4   r5   r6   r  r  r  r   r   r   r   r  Ê  s   r  c                  C   s    t  ¡ } tjt jg| ¢R Ž  d S rU   )r   Zthreading_setuprY  ZaddModuleCleanupZthreading_cleanup)Úthread_infor   r   r   ÚsetUpModuleë  s    r  Ú__main__)NN)N)rû  )Er
  r"   r€   rX   rë   rY  r   Úxmlrpc.clientr…   r   Zxmlrpc.serverr„   Zhttp.clientr–   Zhttp.serverr¢   r«   rË  rý  rz  rO  r   Ztest.supportr   r   r   r   rÂ  r‰   rm   ro   r#   r   rð  r   r´   rÓ   rÖ   rä   r  r2  r3  r4  r@  rR  rV  r^  r_  rk  r  rŸ  r¯  rµ  r¸  ZskipIfr¼  rÑ  rÕ  rï  ró  rñ  rò  Úcontextmanagerr   r  r  r  r4   Úmainr   r   r   r   Ú<module>   sš   
ÿÿò  =W_
@
H H4"C>ND!
