o
    þâf²7 ã                   @   sà  d 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 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlm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!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'd(„ Z(e)d)krîej*d(d* dS dS )+z!Test suite for supervisor.optionsé    N)ÚStringIO)Úas_bytes)ÚMockÚsentinelÚpatch)ÚLevelsByName)ÚDummySupervisor)ÚDummyLogger)ÚDummyOptions)ÚDummyPoller)ÚDummyPConfig)ÚDummyProcess)ÚDummySocketConfig)Úlstripc                   @   s¶   e Zd Zdd„ Z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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 ).ÚOptionTestsc                 C   ó   ddl m} |S )Nr   ©ÚOptions)Úsupervisor.optionsr   )Úselfr   © r   úP/var/www/html/venv/lib/python3.10/site-packages/supervisor/tests/test_options.pyÚ_getTargetClass   ó   zOptionTests._getTargetClassFc                    sf   |   ¡ ‰ ddlm} G ‡ ‡fdd„dˆ ƒ}|ƒ }tƒ |_|jdddddd	 |jd
d
ddd|d |S )Nr   )Úintegerc                       s,   e Zd ZddiZ”f‡ fdd„	Zdd„ ZdS )z+OptionTests._makeOptions.<locals>.MyOptionsÚotheré)   c                    s,   || _ ˆ  | ¡ G dd„ dtƒ}|ƒ | _d S )Nc                   @   ó   e Zd ZdS )zAOptionTests._makeOptions.<locals>.MyOptions.__init__.<locals>.FooN©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   ÚFoo-   s    r"   )Ú
read_errorÚ__init__ÚobjectÚ
configroot)r   r#   r"   r   r   r   r$   *   s   
z4OptionTests._makeOptions.<locals>.MyOptions.__init__c                 S   s4   | j rt| j ƒ‚| jj | j¡ | jj | j¡ d S ©N)r#   Ú
ValueErrorr&   Ú__dict__ÚupdateÚdefault_mapÚmaster)r   Úfpr   r   r   Úread_config0   s   
z7OptionTests._makeOptions.<locals>.MyOptions.read_configN)r   r    r!   r,   r$   r.   r   ©r   r#   r   r   Ú	MyOptions'   s
    ÿr0   ÚanoptionÚoÚoptionÚdefault)ÚnameÚconfnameÚshortÚlongr4   r   ÚOTHERzp:zother=)r5   r6   Úenvr7   r8   Úhandler)r   Úsupervisor.datatypesr   r   Ú
configfileÚadd)r   r#   r   r0   Úoptionsr   r/   r   Ú_makeOptions#   s   ÿ
ÿzOptionTests._makeOptionsc                 C   s&   |   ¡ }|ƒ }| jt|jddd d S )NT)Úflagr;   ©r   ÚassertRaisesr(   r>   ©r   ÚclsÚinstr   r   r   Ú'test_add_flag_not_None_handler_not_None?   s   z3OptionTests.test_add_flag_not_None_handler_not_Nonec                 C   s(   |   ¡ }|ƒ }| jt|jdddd d S )NTF©rA   r8   r7   rB   rD   r   r   r   Ú-test_add_flag_not_None_long_false_short_falseD   ó   
ûz9OptionTests.test_add_flag_not_None_long_false_short_falsec                 C   ó(   |   ¡ }|ƒ }| jt|jdddd d S )NTFú:rH   rB   rD   r   r   r   Ú+test_add_flag_not_None_short_endswith_colonO   rJ   z7OptionTests.test_add_flag_not_None_short_endswith_colonc                 C   rK   )NTú=FrH   rB   rD   r   r   r   Ú*test_add_flag_not_None_long_endswith_equalZ   rJ   z6OptionTests.test_add_flag_not_None_long_endswith_equalc                 C   ó&   |   ¡ }|ƒ }| jt|jddd d S )NrN   Úabc©r8   r7   rB   rD   r   r   r   Ú(test_add_inconsistent_short_long_optionse   ó   
üz4OptionTests.test_add_inconsistent_short_long_optionsc                 C   rP   )NFú-abcrR   rB   rD   r   r   r   Ú%test_add_short_option_startswith_dasho   rT   z1OptionTests.test_add_short_option_startswith_dashc                 C   rP   )NFrQ   rR   rB   rD   r   r   r   Útest_add_short_option_too_longy   rT   z*OptionTests.test_add_short_option_too_longc                 C   ó0   |   ¡ }|ƒ }ddi|_| jt|jddd d S )Nz-aTFÚarR   ©r   Úoptions_maprC   r(   r>   rD   r   r   r   Ú#test_add_duplicate_short_option_keyƒ   ó   

üz/OptionTests.test_add_duplicate_short_option_keyc                 C   rP   )NrU   FrR   rB   rD   r   r   r   Ú$test_add_long_option_startswith_dashŽ   rT   z0OptionTests.test_add_long_option_startswith_dashc                 C   rX   )Nz--abcTrQ   FrR   rZ   rD   r   r   r   Ú"test_add_duplicate_long_option_key˜   r]   z.OptionTests.test_add_duplicate_long_option_keyc                 C   s8   |   ¡ }|  t|jƒd¡ |  |jdd … g d¢¡ d S )Né   éüÿÿÿ)úsupervisord.confzetc/supervisord.confz/etc/supervisord.confz /etc/supervisor/supervisord.conf)r@   ÚassertEqualÚlenÚsearchpaths©r   r?   r   r   r   Útest_searchpaths£   s   zOptionTests.test_searchpathsc                 C   sˆ   |   ¡ }| g ¡ |  |jd¡ |  |jd¡ |   ¡ }dtjd< | g ¡ |  |jd¡ |   ¡ }| ddg¡ |  |jd¡ tjd= d S )	Nr4   r   Ú42r9   é*   ú-pÚ43é+   )r@   Úrealizerc   r1   r   ÚosÚenvironrf   r   r   r   Útest_options_and_args_order­   s   


z'OptionTests.test_options_and_args_orderc                 C   sD   |   ¡ }| g ¡ |  |jd¡ d|jd< | ¡  |  |jd¡ d S )Nr   ri   r   )r@   rm   rc   r   r,   Úprocess_configrf   r   r   r   Útest_config_reloadÀ   s   

zOptionTests.test_config_reloadc                 C   s    | j dd}|  t|jd¡ d S )NÚerror©r#   F)r@   rC   r(   rq   rf   r   r   r   Ú!test_config_reload_do_usage_falseÈ   s   
ÿz-OptionTests.test_config_reload_do_usage_falsec                    sZ   | j dd}g ‰ ‡ fdd„|_tƒ  |_|_d|j_d|j_|jdd |  	ˆ dg¡ d S )	Nrs   rt   c                    ó
   ˆ   | ¡S r'   ©Úappend©Úx©Ú	exitcodesr   r   Ú<lambda>Ð   ó   
 z>OptionTests.test_config_reload_do_usage_true.<locals>.<lambda>é   T©Údo_usageé   )
r@   Úexitr   ÚstderrÚstdoutr&   r1   r   rq   rc   rf   r   r{   r   Ú test_config_reload_do_usage_trueÍ   s   z,OptionTests.test_config_reload_do_usage_truec                 C   s¼   ddl m} |ƒ }| ddd¡ |  |jd¡ |  |jd d¡ | ddd¡ |  |jd¡ |  |jd d¡ | ddd¡ |  |jd¡ |  |jd d¡ | ddd¡ |  |jd¡ d S )Nr   r   ÚfooÚbarÚbazr   Úgazonk)r   r   Ú_setrc   r‡   Úattr_priorities)r   r   r?   r   r   r   Ú	test__set×   s   zOptionTests.test__setc                    s\   |   ¡ }g |_g ‰ ‡ fdd„|_tƒ |_| ¡  |  ˆ dg¡ d}|  |j ¡  	|¡¡ d S )Nc                    rv   r'   rw   ry   r{   r   r   r}   ê   r~   z9OptionTests.test_missing_default_config.<locals>.<lambda>r‚   z,Error: No config file found at default paths)
r@   re   rƒ   r   r„   Údefault_configfilerc   Ú
assertTrueÚgetvalueÚ
startswith©r   r?   Úmsgr   r{   r   Útest_missing_default_configæ   s   z'OptionTests.test_missing_default_configc                 C   sV   |   ¡ }t ¡ }|jg|_| ¡ }|  ||j¡ W d   ƒ d S 1 s$w   Y  d S r'   )r@   ÚtempfileÚNamedTemporaryFiler5   re   rŽ   rc   )r   r?   ÚfÚconfigr   r   r   Útest_default_configñ   s   

"ýzOptionTests.test_default_configc                    s`   |   ¡ }g ‰ ‡ fdd„|_tƒ |_d|_d|_| d¡ |  ˆ dg¡ d}|  |j ¡ |¡ d S )Nc                    rv   r'   rw   ry   r{   r   r   r}   û   r~   z'OptionTests.test_help.<locals>.<lambda>Ú	test_helpzA sample docstring for %sÚ r   z!A sample docstring for test_help
)	r@   rƒ   r   r…   ÚprognameÚdocÚhelprc   r   r’   r   r{   r   rš   ø   s   
zOptionTests.test_helpN)F)r   r    r!   r   r@   rG   rI   rM   rO   rS   rV   rW   r\   r^   r_   rg   rp   rr   ru   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	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚClientOptionsTestsc                 C   r   )Nr   )ÚClientOptions)r   r    )r   r    r   r   r   r     r   z"ClientOptionsTests._getTargetClassc                 C   ó
   |   ¡ ƒ S r'   ©r   ©r   r   r   r   Ú_makeOne	  ó   
zClientOptionsTests._makeOnec                    sx   |   ¡ }g |_g ‰ ‡ fdd„|_|jg d¢d |  ˆ g ¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ d	S )
z(Making sure config file is not required.c                    rv   r'   rw   ry   r{   r   r   r}     r~   z8ClientOptionsTests.test_no_config_file.<locals>.<lambda>)z-súhttp://localhost:9001z-uÚchrisrj   Ú123©Úargsr   r¦   r§   r¨   N)	r¤   re   rƒ   rm   rc   ÚinteractiveÚ	serverurlÚusernameÚpassword©r   Úinstancer   r{   r   Útest_no_config_file  s   z&ClientOptionsTests.test_no_config_filec                 C   s²   t  ¡ }td| ƒ}t|ƒ}|  ¡ }||_|jg d |  |jd¡ t	j
 |d¡}|  |j|¡ |jj}|  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |j|¡ d S )	Nz«[supervisorctl]
        serverurl=http://localhost:9001
        username=chris
        password=123
        prompt=mysupervisor
        history_file=%s/sc_history
        r©   TÚ
sc_historyÚmysupervisorr¦   r§   r¨   )r•   Ú
gettempdirr   r   r¤   r=   rm   rc   r«   rn   ÚpathÚjoinÚhistory_filer&   ÚsupervisorctlÚpromptr¬   r­   r®   )r   ÚtempdirÚsr-   r°   r·   r?   r   r   r   Útest_options  s"   úzClientOptionsTests.test_optionsc                 C   ó@   t dƒ}|  ¡ }t|ƒ|_|jg d |jj}|  |jd¡ d S )Nzx
        [supervisorctl]
        serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
        r©   úhttp://127.0.0.1:9001©	r   r¤   r   r=   rm   r&   r¸   rc   r¬   ©r   Útextr°   r?   r   r   r   Ú3test_options_ignores_space_prefixed_inline_comments4  ó   
zFClientOptionsTests.test_options_ignores_space_prefixed_inline_commentsc                 C   r½   )Nzw
        [supervisorctl]
        serverurl=http://127.0.0.1:9001	;use an http:// url to specify an inet socket
        r©   r¾   r¿   rÀ   r   r   r   Ú1test_options_ignores_tab_prefixed_inline_comments?  rÃ   zDClientOptionsTests.test_options_ignores_tab_prefixed_inline_commentsc                 C   ó*   t dƒ}|  ¡ }t|ƒ|_|jg d d S )Nz 
        [supervisorctl]
        serverurl=http://localhost:9001 ;duplicate

        [supervisorctl]
        serverurl=http://localhost:9001 ;duplicate
        r©   ©r   r¤   r   r=   rm   ©r   rÁ   r°   r   r   r   Ú3test_options_parses_as_nonstrict_for_py2_py3_compatJ  s   
zFClientOptionsTests.test_options_parses_as_nonstrict_for_py2_py3_compatc                 C   s¤   t dƒ}t|ƒ}|  ¡ }t ¡ dddddddœ|_||_|jg d	 |  |j	d
¡ |j
j}|  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ d S )Na  
        [supervisorctl]
        serverurl=http://localhost:%(ENV_SERVER_PORT)s
        username=%(ENV_CLIENT_USER)s
        password=%(ENV_CLIENT_PASS)s
        prompt=%(ENV_CLIENT_PROMPT)s
        history_file=/path/to/histdir/.supervisorctl%(ENV_CLIENT_HIST_EXT)s
        ÚjohndoeÚ9210ÚsomeuserÚpasswordhereÚxsupervisorz.hist)ÚENV_HOMEÚENV_USERÚENV_SERVER_PORTÚENV_CLIENT_USERÚENV_CLIENT_PASSÚENV_CLIENT_PROMPTÚENV_CLIENT_HIST_EXTr©   Tzhttp://localhost:9210z$/path/to/histdir/.supervisorctl.hist)r   r   r¤   r•   r´   Úenviron_expansionsr=   rm   rc   r«   r&   r¸   r¹   r¬   r­   r®   r·   )r   r»   r-   r°   r?   r   r   r   Ú(test_options_with_environment_expansionsW  s(   	úz;ClientOptionsTests.test_options_with_environment_expansionsc              
   C   sÐ   |   ¡ }tdƒ}t ¡ }tj |d¡}t|dƒ}| |¡ W d   ƒ n1 s(w   Y  z||_	|j
g d W tj|dd ntj|dd w |jj}|  |jtj |d¡¡ |  |jdtj |d	¡ ¡ d S )
Nz}
        [supervisorctl]
        history_file=%(here)s/sc_history
        serverurl=unix://%(here)s/supervisord.sock
        rb   Úwr©   T©Úignore_errorsr²   úunix://úsupervisord.sock)r¤   r   r•   Úmkdtemprn   rµ   r¶   ÚopenÚwriter=   rm   ÚshutilÚrmtreer&   r¸   rc   r·   r¬   )r   r°   rÁ   ÚhereÚsupervisord_confr—   r?   r   r   r   Ú/test_options_supervisorctl_section_expands_hereu  s$   ÿ ÿÿzBClientOptionsTests.test_options_supervisorctl_section_expands_herec              
   C   ót   t j t j t¡d¡}|  ¡ }z| |¡ |  d¡ W d S  ty9 } z|  	d|j
d v ¡ W Y d }~d S d }~ww ©NÚnonexistentúnothing raisedzcould not find config filer   ©rn   rµ   r¶   ÚdirnameÚ__file__r¤   r.   Úfailr(   r   rª   ©r   ræ   r°   Úexcr   r   r   Útest_read_config_not_found‹  ó   
"€ÿz-ClientOptionsTests.test_read_config_not_foundc              
   C   ól   |   ¡ }dd„ }||_z| t¡ |  d¡ W d S  ty5 } z|  d|jd v ¡ W Y d }~d S d }~ww )Nc                 S   ó   t tjd|  ƒ‚©NzPermission denied: %s©ÚIOErrorÚerrnoÚEACCES©ÚfnÚmoder   r   r   Ú
dummy_open–  ó   zBClientOptionsTests.test_read_config_unreadable.<locals>.dummy_openzexpected exceptionúcould not read config filer   ©r¤   rÝ   r.   rê   rë   r(   r   rª   ©r   r°   rú   rí   r   r   r   Útest_read_config_unreadable”  ó   
"€ÿz.ClientOptionsTests.test_read_config_unreadablec              
   C   ó^   |   ¡ }z| tƒ ¡ |  d¡ W d S  ty. } z|  |jd d¡ W Y d }~d S d }~ww )Nrç   r   z0.ini file does not include supervisorctl section©r¤   r.   r   rë   r(   rc   rª   ©r   r°   rí   r   r   r   Ú9test_read_config_no_supervisord_section_raises_valueerror   ó   ÿ€ÿzLClientOptionsTests.test_read_config_no_supervisord_section_raises_valueerrorc                 C   s8   t dƒ}|  ¡ }||_|jddgd |  |jd¡ d S )Nz[supervisorctl]z--serverurlúunix:///dev/nullr©   )r   r¤   r=   rm   rc   r¬   )r   r-   r°   r   r   r   Útest_options_unixsocket_cli©  s
   z.ClientOptionsTests.test_options_unixsocket_clic                 C   s<   t dƒ}t|ƒ}|  ¡ }||_|jg d |  |jd¡ d S )Nz;[supervisorctl]
        serverurl=unix:///dev/null
        r©   r  )r   r   r¤   r=   rm   rc   r¬   )r   r»   r-   r°   r   r   r   Ú"test_options_unixsocket_configfile°  s   z5ClientOptionsTests.test_options_unixsocket_configfileN)r   r    r!   r   r¤   r±   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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/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOdP„ Z*dQdR„ Z+dSdT„ Z,dUdV„ Z-dWdX„ Z.dYdZ„ Z/d[d\„ Z0d]d^„ Z1d_d`„ Z2dadb„ Z3e4dce5ƒ ƒddde„ ƒZ6dfdg„ Z7dhdi„ Z8djdk„ Z9dldm„ Z:dndo„ Z;dpdq„ Z<drds„ Z=dtdu„ Z>dvdw„ Z?dxdy„ Z@e4dze5eAd{ƒd|d}„ ƒZBd~d„ ZCd€d„ ZDd‚dƒ„ ZEd„d…„ ZFd†d‡„ ZGdˆd‰„ ZHdŠd‹„ ZIdŒd„ ZJdŽd„ ZKdd‘„ ZLd’d“„ ZMd”d•„ ZNd–d—„ ZOd˜d™„ ZPdšd›„ ZQdœd„ ZRdždŸ„ ZSd d¡„ ZTd¢d£„ ZUd¤d¥„ ZVd¦d§„ ZWd¨d©„ ZXdªd«„ ZYd¬d­„ ZZd®d¯„ Z[d°d±„ Z\d²d³„ Z]d´dµ„ Z^d¶d·„ Z_d¸d¹„ Z`dºd»„ Zad¼d½„ Zbd¾d¿„ ZcdÀdÁ„ ZddÂdÃ„ ZedÄdÅ„ ZfdÆdÇ„ ZgdÈdÉ„ ZhdÊdË„ ZidÌdÍ„ ZjdÎdÏ„ ZkdÐdÑ„ ZldÒdÓ„ ZmdÔdÕ„ ZndÖd×„ ZodØdÙ„ ZpdÚdÛ„ ZqdÜdÝ„ ZrdÞdß„ Zsdàdá„ Ztdâdã„ Zudädå„ Zvdædç„ Zwdèdé„ Zxdêdë„ Zydìdí„ Zzdîdï„ Z{dðdñ„ Z|dòdó„ Z}dôdõ„ Z~död÷„ Zdødù„ Z€dúdû„ Zdü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‹e4de5g d¢dƒe4de5ddƒdd„ ƒƒZŒe4de5g d¢dƒe4de5ddƒdd„ ƒƒZdd„ ZŽdS (  ÚServerOptionsTestsc                 C   r   )Nr   )ÚServerOptions)r   r
  )r   r
  r   r   r   r   »  r   z"ServerOptionsTests._getTargetClassc                 C   r¡   r'   r¢   r£   r   r   r   r¤   ¿  r¥   zServerOptionsTests._makeOnec                 C   sF   ddl m} |  ¡ }tƒ |_|  t|jd ¡ |  |j 	¡ |d ¡ d S )Nr   )ÚVERSIONÚ
)
r   r  r¤   r   r…   rC   Ú
SystemExitÚversionrc   r   )r   r  r?   r   r   r   Útest_versionÂ  s
   zServerOptionsTests.test_versionc                 C   sP	  t ddt ¡ i ƒ}ddlm} t|ƒ}|  ¡ }||_|jg d |j	j
}|  |jt ¡ ¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |jd	¡ |  |jd
¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |jt ¡ ¡ |  t|jƒd¡ |  |jd d tj¡ |  |jd d d¡ |  |jd d d¡ |  |jd d d¡ |  |jd d d¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ |  t|jƒd	¡ |  |jt dd¡ |jd }|  |j!d¡ |  |j"d¡ |  t|j#ƒd¡ |j#d }|  |j!d¡ |  |j$d¡ |  |j"d¡ |  |j%d¡ |  |j&|j'¡ |  |j(d	¡ |  |j)d¡ |  |j*d¡ |  |j+d¡ |  |j,t-j.¡ |  |j/d	¡ |  |j0d ¡ |  |j1d ¡ |  |j2| 3d!¡¡ |  |j4d¡ |  |j5dg¡ |  |jd"¡ |  |jd#¡ |  |jt dd¡ |jd }|  |j!d$¡ |  |j"d#¡ |  t|j#ƒd¡ |j#d }	|  |	j!d$¡ |  |	j$d¡ |  |	j"d#¡ |  |	j%d¡ |  |	j&d ¡ |  |	j*d ¡ |  |	j+d%¡ |  |	j,t-j6¡ |  |	j0d ¡ |  |	j1d ¡ |  |	j2d&¡ |  |	j4d#¡ |  |	j5dg¡ |  |	jd ¡ |jd# }
|  |
j!d'¡ |  |
j"d(¡ |  t|
j#ƒd¡ |
j#d }|  |j!d)¡ |  |j$d¡ |  |j"d(¡ |  |j%d¡ |  |j&|j7¡ |  |j*d ¡ |  |j+|j8¡ |  |j2| 3d!¡¡ |  |j4d¡ |  |j5g d*¢¡ |  |j,t-j6¡ |  |j0d¡ |  |j1d¡ |jd( }|  |j!d+¡ |  |j"d,¡ |  t|j#ƒd#¡ |j#d }|  |j!d-¡ |  |j$d¡ |  |j"d,¡ |  |j%d¡ |  |j&|j'¡ |  |j*d ¡ |  |j+|j8¡ |  |j2| 3d!¡¡ |  |j4d¡ |  |j5dg¡ |  |j,t-j6¡ |  |j0d ¡ |  |j1d ¡ |  |jd ¡ |j#d }|  |j!d.¡ |  |j$d¡ |  |j"d,¡ |  |j%d¡ |  |j&|j'¡ |  |j*d ¡ |  |j+|j8¡ |  |j2| 3d!¡¡ |  |j4d¡ |  |j5dg¡ |  |j,t-j6¡ |  |j0d ¡ |  |j1d ¡ |  |jd ¡ |jd, }|  |j!d/¡ |  |j"d	¡ |  t|j#ƒd#¡ |j#d }|  |j!d0¡ |  |jd1¡ |j#d }|  |j!d2¡ |  |jd3¡ t9j: ;t9 <¡ ¡}|  |j*d¡ |  |j=d¡ |  |jt ¡ ¡ |  |jd¡ |  |jt9j: >|d¡¡ |  |jd¡ |  |jd	¡ |  |jd
¡ |  |jt9j: >|d¡¡ |  |jd¡ |  |jd¡ |  |j?d ¡ |  |jd¡ |  |jt ¡ ¡ |  t|jƒd¡ |  |jd d tj¡ |  |jd d d¡ |  |jd d d¡ |  |jd d d¡ |  |jd d d¡ |  |jd¡ |  |jd¡ |  |jd¡ d S )4Na„  
        [supervisord]
        directory=%(tempdir)s
        backofflimit=10
        user=root
        umask=022
        logfile=supervisord.log
        logfile_maxbytes=1000MB
        logfile_backups=5
        loglevel=error
        pidfile=supervisord.pid
        nodaemon=true
        silent=true
        identifier=fleeb
        childlogdir=%(tempdir)s
        nocleanup=true
        minfds=2048
        minprocs=300
        environment=FAKE_ENV_VAR=/some/path

        [inet_http_server]
        port=127.0.0.1:8999
        username=chrism
        password=foo

        [program:cat1]
        command=/bin/cat
        priority=1
        autostart=true
        user=root
        stdout_logfile=/tmp/cat.log
        stopsignal=KILL
        stopwaitsecs=5
        startsecs=5
        startretries=10
        directory=/tmp
        umask=002

        [program:cat2]
        priority=2
        command=/bin/cat
        autostart=true
        autorestart=false
        stdout_logfile_maxbytes = 1024
        stdout_logfile_backups = 2
        stdout_logfile = /tmp/cat2.log

        [program:cat3]
        priority=3
        process_name = replaced
        command=/bin/cat
        autorestart=true
        exitcodes=0,1,127
        stopasgroup=true
        killasgroup=true

        [program:cat4]
        priority=4
        process_name = fleeb_%%(process_num)s
        numprocs = 2
        command = /bin/cat
        autorestart=unexpected

        [program:cat5]
        priority=5
        process_name = foo_%%(process_num)02d
        numprocs = 2
        numprocs_start = 1
        command = /bin/cat
        directory = /some/path/foo_%%(process_num)02d
        rº   r   ©Ú	datatypesr©   é   úsupervisord.logi  €>é   é(   úsupervisord.pidTÚfleebr   ÚfamilyÚhostz	127.0.0.1Úporti'#  r­   Úchrismr®   r‡   i   i,  ú
/some/path©ÚFAKE_ENV_VARÚcat1ú/bin/caté
   ú/tmp/cat.logFÚ50MBú/tmpr‚   Úcat2z/tmp/cat2.logé   Úcat3é   Úreplaced)r   r   é   Úcat4é   Úfleeb_0Úfleeb_1Úcat5Úfoo_01z/some/path/foo_01Úfoo_02z/some/path/foo_02)@r   r•   r´   Ú
supervisorr  r   r¤   r=   rm   r&   Úsupervisordrc   Ú	directoryÚumaskÚlogfileÚlogfile_maxbytesÚlogfile_backupsÚloglevelÚpidfileÚnodaemonÚsilentÚ
identifierÚchildlogdirrd   Úserver_configsÚsocketÚAF_INETÚ	nocleanupÚminfdsÚminprocsÚprocess_group_configsÚenvironmentÚdictr5   ÚpriorityÚprocess_configsÚcommandÚ	autostartÚautorestartÚRestartWhenExitUnexpectedÚ	startsecsÚstartretriesÚuidÚstdout_logfileÚ
stopsignalÚsignalÚSIGKILLÚstopwaitsecsÚstopasgroupÚkillasgroupÚstdout_logfile_maxbytesÚ	byte_sizeÚstdout_logfile_backupsr|   ÚSIGTERMÚRestartUnconditionallyÚ	Automaticrn   rµ   ÚabspathÚgetcwdÚgidr¶   Ú
passwdfile)r   r»   r  r-   r°   r?   r  Úproc1r%  Úproc2r'  Úproc3r+  Úproc4_aÚproc4_br/  Úproc5_aÚproc5_brá   r   r   r   r¼   É  sZ  
FºH

ÿ



ÿ

ÿÿ
ÿÿ


zServerOptionsTests.test_optionsc                 C   sN   t dƒ}|  ¡ }t|ƒ|_|jg d |jj}|  |jd¡ |  |j	d¡ d S )Nzº
        [supervisord]
        logfile=/tmp/supervisord.log ;(main log file;default $CWD/supervisord.log)
        minfds=123 ; (min. avail startup file descriptors;default 1024)
        r©   z/tmp/supervisord.logé{   )
r   r¤   r   r=   rm   r&   r3  rc   r6  rC  rÀ   r   r   r   rÂ   Ç  s   
zFServerOptionsTests.test_options_ignores_space_prefixed_inline_commentsc                 C   r½   )Nzº
        [supervisord]
        logfile=/tmp/supervisord.log	;(main log file;default $CWD/supervisord.log)
        minfds=123	; (min. avail startup file descriptors;default 1024)
        r©   ri  )	r   r¤   r   r=   rm   r&   r3  rc   rC  rÀ   r   r   r   rÄ   Ô  s   
zDServerOptionsTests.test_options_ignores_tab_prefixed_inline_commentsc                 C   rÅ   )Nz‹
        [supervisord]

        [program:duplicate]
        command=/bin/cat

        [program:duplicate]
        command=/bin/cat
        r©   rÆ   rÇ   r   r   r   rÈ   à  s   	
zFServerOptionsTests.test_options_parses_as_nonstrict_for_py2_py3_compatc                 C   s\  t dƒ}|  ¡ }t|ƒ|_|jg d |jj}|  t|j	ƒd¡ |j	d }|  t|j
ƒd¡ |j	d }|  t|j
ƒd¡ |  |j	|j	u ¡ t dƒ}t|ƒ|_|jdd |jj}|  t|j	ƒd¡ |j	d }|  t|j
ƒd¡ |j
d }|  |jd	¡ |  |jd
¡ |  |j	|j	u ¡ |j	d }|  t|j
ƒd¡ |j
d }|  |jd¡ |  |jd¡ d S )Nzþ        [supervisord]
        user=root

        [program:one]
        command = /bin/cat

        [program:two]
        command = /bin/dog

        [program:four]
        command = /bin/sheep

        [group:thegroup]
        programs = one,two
        r©   r‚   r   r   zÉ        [supervisord]
        user=root

        [program:one]
        command = /bin/cat

        [program:three]
        command = /bin/pig

        [group:thegroup]
        programs = three
        Fr€   Úoner   Úthreez/bin/pig)r   r¤   r   r=   rm   r&   r3  rc   rd   rE  rI  r   rq   r5   rJ  )r   rÁ   r°   ÚsectionÚcatÚprocr   r   r   Útest_reloadï  s>   


ÿ


ÿ

zServerOptionsTests.test_reloadc                 C   sv   |   ¡ }d}|g|_|g|_|g|_tdƒ}t|ƒ|_|jg d |  ||jv ¡ |  ||jv ¡ |  ||jv ¡ d S )Nz Message from a prior config readúb        [supervisord]
        user=root

        [program:cat]
        command = /bin/cat
        r©   )	r¤   Úparse_criticalsÚparse_warningsÚparse_infosr   r   r=   rm   ÚassertFalse)r   r°   Úold_msgrÁ   r   r   r   Ú!test_reload_clears_parse_messages3  s   
z4ServerOptionsTests.test_reload_clears_parse_messagesc                 C   sF   |   ¡ }d}|g|_tdƒ}t|ƒ|_|jg d |  ||jv ¡ d S )NzInfo from a prior config readrp  r©   )r¤   Úinfosr   r   r=   rm   rt  rs  )r   r°   Úold_inforÁ   r   r   r   Útest_reload_clears_parse_infosG  s   
z1ServerOptionsTests.test_reload_clears_parse_infosc              
   C   rä   rå   rè   rì   r   r   r   rî   W  rï   z-ServerOptionsTests.test_read_config_not_foundc              
   C   rð   )Nc                 S   rñ   rò   ró   r÷   r   r   r   rú   b  rû   zBServerOptionsTests.test_read_config_unreadable.<locals>.dummy_openrç   rü   r   rý   rþ   r   r   r   rÿ   `  r   z.ServerOptionsTests.test_read_config_unreadablec                 C   sÆ   |   ¡ }tjddO}z| d¡ | ¡  | |j¡ |  d¡ W n' tyH } z|  	d|j
d v ¡ |  	|j|j
d v ¡ W Y d }~nd }~ww W d   ƒ d S W d   ƒ d S 1 s\w   Y  d S )Núw+©rù   z[supervisord]
junkrç   úcontains parsing errors:r   )r¤   r•   r–   rÞ   Úflushr.   r5   rë   r(   r   rª   )r   r°   r—   rí   r   r   r   Ú8test_read_config_malformed_config_file_raises_valueerrorl  s    
"€þÿû"øzKServerOptionsTests.test_read_config_malformed_config_file_raises_valueerrorc              
   C   sˆ   |   ¡ }tj tj t¡dd¡}td| ƒ}z| t|ƒ¡ |  	d¡ W d S  t
yC } z|  |jd d| ¡ W Y d }~d S d }~ww )Nræ   r  z1        [supervisord]
        logfile=%s
        rç   r   z9The directory named as part of the path %s does not exist)r¤   rn   rµ   r¶   ré   rê   r   r.   r   rë   r(   rc   rª   )r   r°   Úlogfile_with_nonexistent_dirrÁ   rí   r   r   r   Ú1test_read_config_logfile_with_nonexistent_dirpathy  s&   þýÿÿ€ÿzDServerOptionsTests.test_read_config_logfile_with_nonexistent_dirpathc              
   C   r  )Nrç   r   z..ini file does not include supervisord sectionr  r  r   r   r   r  Œ  r  zLServerOptionsTests.test_read_config_no_supervisord_section_raises_valueerrorc              
   C   sh   |   ¡ }tdƒ}z| t|ƒ¡ |  d¡ W d S  ty3 } z|  |jd d¡ W Y d }~d S d }~ww )NzD        [supervisord]

        [include]
        ;no files=
        rç   r   z5.ini file has [include] section, but no files setting)r¤   r   r.   r   rë   r(   rc   rª   ©r   r°   rÁ   rí   r   r   r   Ú8test_read_config_include_with_no_files_raises_valueerror•  s   ÿ€ÿzKServerOptionsTests.test_read_config_include_with_no_files_raises_valueerrorc                 C   s2   |   ¡ }tdƒ}| t|ƒ¡ |  |jdg¡ d S )NzM        [supervisord]

        [include]
        files=nonexistent/*
        z-No file matches via include "./nonexistent/*")r¤   r   r.   r   rc   rr  )r   r°   rÁ   r   r   r   Ú<test_read_config_include_with_no_matching_files_logs_warning¤  s   ÿzOServerOptionsTests.test_read_config_include_with_no_matching_files_logs_warningc              
   C   sz  t  ¡ }tj |d¡}t |¡ tj |d¡}td||f ƒ}t|dƒ}| |¡ W d   ƒ n1 s4w   Y  tj |d¡}t|dƒ}| d¡ W d   ƒ n1 sUw   Y  tj |d¡}t|dƒ}| d¡ W d   ƒ n1 svw   Y  |  	¡ }z| 
|¡ W tj|d	d
 ntj|d	d
 w |jj}	|  t|	jƒd¡ d| }
|  |
|jv ¡ d| }
|  |
|jv ¡ d S )Núconf.drb   z`        [supervisord]

        [include]
        files=%s/conf.d/*.conf %s/conf.d/*.ini
        r×   úa.confú[inet_http_server]
port=8000
za.iniz"[unix_http_server]
file=/tmp/file
TrØ   r‚   ú'Included extra file "%s" during parsing)r•   rÜ   rn   rµ   r¶   Úmkdirr   rÝ   rÞ   r¤   r.   rß   rà   r&   r3  rc   rd   r?  r   rs  )r   ré   Úconf_drâ   rÁ   r—   Ú	conf_fileÚini_filer°   r?   r“   r   r   r   Ú*test_read_config_include_reads_extra_files°  s8   
ûÿÿÿ z=ServerOptionsTests.test_read_config_include_reads_extra_filesc              
   C   s\  t  ¡ }tj |d¡}t |¡ tj |d¡}td| ƒ}t|dƒ}| |¡ W d   ƒ n1 s2w   Y  ddl	m
} |d d… }t|ƒD ])}tj |d| ¡}	t|	dƒ}| d	||f ¡ W d   ƒ n1 skw   Y  qG|  ¡ }
z|
 |¡ W tj|d
d ntj|d
d w g }t|ƒD ]}tj |d| ¡}	| d|	 ¡ q’|  |
j|¡ d S )Nr„  rb   úP        [supervisord]

        [include]
        files=%s/conf.d/*.conf
        r×   r   )Úlettersé   ú%s.confz[program:%s]
command=/bin/%s
TrØ   r‡  )r•   rÜ   rn   rµ   r¶   rˆ  r   rÝ   rÞ   Úsupervisor.compatrŽ  Úreversedr¤   r.   rß   rà   Úsortedrx   rc   rs  )r   ré   r‰  râ   rÁ   r—   rŽ  Úa_zÚletterÚfilenamer°   Úexpected_msgsr   r   r   Ú4test_read_config_include_reads_files_in_sorted_orderÓ  s>   
ûÿÿÿ€ ÿzGServerOptionsTests.test_read_config_include_reads_files_in_sorted_orderc           
   
   C   sp  t  ¡ }tj |d¡}t |¡ tj |d¡}td| ƒ}t|dƒ}| |¡ W d   ƒ n1 s2w   Y  tj |d¡}t|dƒ}| d¡ W d   ƒ n1 sSw   Y  |  	¡ }zSz| 
|¡ |  d¡ W n2 ty› } z&|  d|jd	 v ¡ |  ||jd	 v ¡ d
| }	|  |	|jv ¡ W Y d }~nd }~ww W tj|dd d S W tj|dd d S tj|dd w )Nr„  rb   r  r×   r…  z[inet_http_server]
junk
rç   r|  r   r‡  TrØ   )r•   rÜ   rn   rµ   r¶   rˆ  r   rÝ   rÞ   r¤   r.   rë   r(   r   rª   rs  rß   rà   )
r   ré   r‰  râ   rÁ   r—   Úmalformed_filer°   rí   r“   r   r   r   Ú-test_read_config_include_extra_file_malformedö  s:   
ûÿÿ
€üÿþ"z@ServerOptionsTests.test_read_config_include_extra_file_malformedc           
   
   C   s(  t  ¡ }tj |d¡}t |¡ tj |d¡}td|df ƒ}t|dƒ}| |¡ W d   ƒ n1 s4w   Y  tj |dt	 
¡  ¡}t|dƒ}| d¡ W d   ƒ n1 sYw   Y  |  ¡ }z| |¡ W tj|dd	 ntj|dd	 w |jj}|  t|jƒd
¡ d| }	|  |	|jv ¡ d S )Nr„  rb   zQ        [supervisord]

        [include]
        files=%s/conf.d/%s.conf
        z%(host_node_name)sr×   r  r†  TrØ   r   r‡  )r•   rÜ   rn   rµ   r¶   rˆ  r   rÝ   rÞ   ÚplatformÚnoder¤   r.   rß   rà   r&   r3  rc   rd   r?  r   rs  )
r   ré   r‰  râ   rÁ   r—   rŠ  r°   r?   r“   r   r   r   Ú/test_read_config_include_expands_host_node_name  s,   
ûÿÿ zBServerOptionsTests.test_read_config_include_expands_host_node_namec                 C   sz   t j t j t j t¡¡dd¡}t j |¡}t j |d¡}|  ¡ }||_| d¡ |j	j
}|  |j|¡ |  |j|¡ d S )NÚfixtureszinclude.confÚexampleT)rn   rµ   r¶   r^  ré   rê   r¤   r=   Úprocess_config_filer&   r3  rc   r6  r>  )r   ÚconfÚ	root_hereÚinclude_hereÚparserrl  r   r   r   Ú%test_read_config_include_expands_here2  s   þ
z8ServerOptionsTests.test_read_config_include_expands_herec              
   C   s\   ddl m} z|dddƒ W tdƒ‚ ty- } z|  |jd d¡ W Y d }~d S d }~ww )Nr   )ÚreadFilez	/nottherer!  ÚFAILEDzDidn't raise)r   r¦  r(   rc   rª   ÚAssertionError)r   r¦  rF   r   r   r   Útest_readFile_failed?  s   ý €ÿz'ServerOptionsTests.test_readFile_failedc                 C   s    |   ¡ }|  t ¡ | ¡ ¡ d S r'   )r¤   rc   rn   ÚgetpidÚget_pidr¯   r   r   r   Útest_get_pidH  s   zServerOptionsTests.test_get_pidc                 C   s`   |   ¡ }|j tjd ¡ |j tjd ¡ |  | ¡ tj¡ |  | ¡ tj¡ |  | ¡ d ¡ d S r'   )r¤   Úsignal_receiverÚreceiverS  r[  ÚSIGCHLDrc   Ú
get_signalr¯   r   r   r   Ú,test_get_signal_delegates_to_signal_receiverL  s   z?ServerOptionsTests.test_get_signal_delegates_to_signal_receiverc                 C   s,   |   ¡ }ddlm} |  ||jdd d ¡ d S )Nr   )ÚNotFoundz
/not/there)r¤   r   r²  rC   Úcheck_execv_args)r   r°   r²  r   r   r   Ú'test_check_execv_args_cant_find_commandT  s
   
ÿz:ServerOptionsTests.test_check_execv_args_cant_find_commandc              	   C   s4   |   ¡ }ddlm} |  ||jddgt d¡¡ d S )Nr   ©ÚNotExecutablez/etc/passwdz
etc/passwd©r¤   r   r¶  rC   r³  rn   Ústat©r   r°   r¶  r   r   r   Ú#test_check_execv_args_notexecutableZ  ó   þz6ServerOptionsTests.test_check_execv_args_notexecutablec              	   C   s4   |   ¡ }ddlm} |  ||jddgt d¡¡ d S )Nr   rµ  ú/r·  r¹  r   r   r   Útest_check_execv_args_isdira  r»  z.ServerOptionsTests.test_check_execv_args_isdirc                    sd   |   ¡ }g ‰ ‡ fdd„}||_tdƒ|_ddg}|j|d |  tˆ ƒd¡ |  ˆ d d	| ¡ d S )
Nc                    ó   ˆ   | ¡ d S r'   rw   ©Úmessage©Úrecorderr   r   Úrecord_usagel  ó   zSServerOptionsTests.test_realize_positional_args_not_supported.<locals>.record_usageú[supervisord]r‡   rˆ   r©   r   r   z*positional arguments are not supported: %s©r¤   Úusager   r=   rm   rc   rd   )r   r°   rÃ  rª   r   rÁ  r   Ú*test_realize_positional_args_not_supportedh  s   

ÿz=ServerOptionsTests.test_realize_positional_args_not_supportedc                    sZ   |   ¡ }g ‰ ‡ fdd„}||_tdƒ|_|jdgd |  tˆ ƒd¡ |  ˆ d d¡ d S )	Nc                    r¾  r'   rw   r¿  rÁ  r   r   rÃ  {  rÄ  zBServerOptionsTests.test_realize_getopt_error.<locals>.record_usagerÅ  z--bad=1r©   r   r   zoption --bad not recognizedrÆ  )r   r°   rÃ  r   rÁ  r   Útest_realize_getopt_errorw  s   
z,ServerOptionsTests.test_realize_getopt_errorc                 C   s<   t dƒ}|  ¡ }t|ƒ|_|jddgd |  |jd¡ d S )NzC
        [supervisord]
        identifier=from_config_file
        z-iÚ	from_argsr©   )r   r¤   r   r=   rm   rc   r=  rÇ   r   r   r   Ú)test_realize_prefers_identifier_from_args„  s
   
z<ServerOptionsTests.test_realize_prefers_identifier_from_argsc                 C   s¶   |   ¡ }tdƒ}ddlm} |ƒ }| |¡ t|ƒ|_| t|ƒ¡ |jg d |j	j
}|  |jd d tj¡ |  |jd d d¡ |  |jd d d	¡ |  |jd d
 d¡ d S )NzŸ        [unix_http_server]
        file=/tmp/supvtest.sock
        username=johndoe
        password=passwordhere

        [supervisord]
        ; ...
        r   ©ÚUnhosedConfigParserr©   r  Úfileú/tmp/supvtest.sockÚchmodéÀ  Úchown)éÿÿÿÿrÓ  ©r¤   r   r   rÍ  Úread_stringr   r=   r.   rm   r&   r3  rc   r?  r@  ÚAF_UNIX©r   r°   rÁ   rÍ  r˜   r?   r   r   r   Útest_options_afunixŽ  s   	

z&ServerOptionsTests.test_options_afunixc                 C   s    |   ¡ }tdƒ}ddlm} |ƒ }| |¡ t|ƒ|_| t|ƒ¡ |jg d |j	j
}|  |jd d tj¡ |  |jd d d¡ |  |jd d d	¡ d S )
Nz²        [unix_http_server]
        file=/tmp/supvtest.sock
        username=johndoe
        password=passwordhere
        chmod=0755

        [supervisord]
        ; ...
        r   rÌ  r©   r  rÎ  rÏ  rÐ  ií  rÔ  r×  r   r   r   Ú&test_options_afunix_chxxx_values_valid¦  s   


z9ServerOptionsTests.test_options_afunix_chxxx_values_validc              
   C   ór   |   ¡ }tdƒ}t|ƒ|_z| t|ƒ¡ |  d¡ W d S  ty8 } z|  |jd d¡ W Y d }~d S d }~ww )Nzc        [supervisord]

        [unix_http_server]
        file=/tmp/file
        chmod=NaN
        rç   r   zInvalid chmod value NaN©	r¤   r   r   r=   r.   rë   r(   rc   rª   r  r   r   r   Útest_options_afunix_chmod_bad¾  ó   
ÿ€ÿz0ServerOptionsTests.test_options_afunix_chmod_badc              
   C   rÚ  )Nzs        [supervisord]

        [unix_http_server]
        file=/tmp/file
        chown=thisisnotavaliduser
        rç   r   z+Invalid sockchown value thisisnotavaliduserrÛ  r  r   r   r   Útest_options_afunix_chown_badÏ  rÝ  z0ServerOptionsTests.test_options_afunix_chown_badc              
   C   rÚ  )NzL        [supervisord]

        [unix_http_server]
        ;no file=
        rç   r   z,section [unix_http_server] has no file valuerÛ  r  r   r   r   Útest_options_afunix_no_fileà  ó   
ÿ€ÿz.ServerOptionsTests.test_options_afunix_no_filec              
   C   rÚ  )Nz¡        [supervisord]

        [unix_http_server]
        file=/tmp/supvtest.sock
        username=usernamehere
        ;no password=
        chmod=0755
        rç   r   ú™Section [unix_http_server] contains incomplete authentication: If a username or a password is specified, both the username and password must be specifiedrÛ  r  r   r   r   Ú-test_options_afunix_username_without_passwordð  ó   
	ÿ€ÿz@ServerOptionsTests.test_options_afunix_username_without_passwordc              
   C   rÚ  )Nz¡        [supervisord]

        [unix_http_server]
        file=/tmp/supvtest.sock
        ;no username=
        password=passwordhere
        chmod=0755
        rç   r   rá  rÛ  r  r   r   r   Ú-test_options_afunix_password_without_username  rã  z@ServerOptionsTests.test_options_afunix_password_without_usernamec              
   C   sÒ   |   ¡ }tdƒ}t ¡ }tj |d¡}t|dƒ}| |¡ W d   ƒ n1 s(w   Y  z||_	|j
g d W tj|dd ntj|dd w |jj}|jd }|  |d tj¡ |  |d	 tj |d
¡¡ d S )Nza        [supervisord]

        [unix_http_server]
        file=%(here)s/supervisord.sock
        rb   r×   r©   TrØ   r   r  rÎ  rÛ   )r¤   r   r•   rÜ   rn   rµ   r¶   rÝ   rÞ   r=   rm   rß   rà   r&   r3  r?  rc   r@  rÖ  )r   r°   rÁ   rá   râ   r—   r?   Ú
serverconfr   r   r   Ú%test_options_afunix_file_expands_here  s"   ÿ 

ÿz8ServerOptionsTests.test_options_afunix_file_expands_herec              
   C   rÚ  )Nz¡        [supervisord]

        [inet_http_server]
        file=/tmp/supvtest.sock
        username=usernamehere
        ;no password=
        chmod=0755
        rç   r   ú™Section [inet_http_server] contains incomplete authentication: If a username or a password is specified, both the username and password must be specifiedrÛ  r  r   r   r   Ú-test_options_afinet_username_without_password4  rã  z@ServerOptionsTests.test_options_afinet_username_without_passwordc              
   C   rÚ  )Nzn        [supervisord]

        [inet_http_server]
        password=passwordhere
        ;no username=
        rç   r   rç  rÛ  r  r   r   r   Ú-test_options_afinet_password_without_usernameJ  rÝ  z@ServerOptionsTests.test_options_afinet_password_without_usernamec              
   C   rÚ  )NzL        [supervisord]

        [inet_http_server]
        ;no port=
        rç   r   z,section [inet_http_server] has no port valuerÛ  r  r   r   r   Útest_options_afinet_no_port^  rà  z.ServerOptionsTests.test_options_afinet_no_portc                 C   s’   t jdd}|j}| d¡ W d   ƒ n1 sw   Y  |  ¡ }d|_G dd„ dƒ}tj|dœ|ƒ fg|_d|_	| 
¡  |  tj |¡¡ d S )	NF©Údeleteó   fooTc                   @   r   )z=ServerOptionsTests.test_cleanup_afunix_unlink.<locals>.ServerNr   r   r   r   r   ÚServert  ó    rî  ©r  rÎ  r›   )r•   r–   r5   rÞ   r¤   Úunlink_socketfilesr@  rÖ  Úhttpserversr:  Úcleanuprt  rn   rµ   Úexists©r   r—   rø   r°   rî  r   r   r   Útest_cleanup_afunix_unlinkn  s   þ
ÿz-ServerOptionsTests.test_cleanup_afunix_unlinkc                 C   sÚ   t jdd}|j}| d¡ W d   ƒ n1 sw   Y  z=|  ¡ }G dd„ dƒ}tj|dœ|ƒ fg|_d|_d|_	| 
¡  |  tj |¡¡ W zt |¡ W d S  ty[   Y d S w zt |¡ W w  tyl   Y w w )NFrë  rí  c                   @   r   )z?ServerOptionsTests.test_cleanup_afunix_nounlink.<locals>.ServerNr   r   r   r   r   rî  ‚  rï  rî  rð  r›   )r•   r–   r5   rÞ   r¤   r@  rÖ  rò  r:  rñ  ró  r   rn   rµ   rô  ÚunlinkÚOSErrorrõ  r   r   r   Útest_cleanup_afunix_nounlink|  s0   þ
ÿÿþÿz/ServerOptionsTests.test_cleanup_afunix_nounlinkc                 C   s   t j t j t¡d¡}tjdd}|j}| d¡ W d   ƒ n1 s$w   Y  zE|  	¡ }d|_
G dd„ dƒ}tj|dœ|ƒ ftj|dœ|ƒ fg|_d	|_| ¡  |  t j |¡¡ W zt  |¡ W d S  tyn   Y d S w zt  |¡ W w  ty   Y w w )
NÚnotfoundFrë  rí  Tc                   @   r   )zMServerOptionsTests.test_cleanup_afunix_ignores_oserror_enoent.<locals>.ServerNr   r   r   r   r   rî  ˜  rï  rî  rð  r›   )rn   rµ   r¶   ré   rê   r•   r–   r5   rÞ   r¤   rñ  r@  rÖ  rò  r:  ró  rt  rô  r÷  rø  )r   rú  r—   Ú
socketnamer°   rî  r   r   r   Ú*test_cleanup_afunix_ignores_oserror_enoent  s2   þþÿþÿz=ServerOptionsTests.test_cleanup_afunix_ignores_oserror_enoentc                 C   sÌ   t jdd}|j}| d¡ W d   ƒ n1 sw   Y  z6|  ¡ }||_tƒ |_| ¡  |  	|j
¡ | ¡  |  tj |¡¡ W zt |¡ W d S  tyT   Y d S w zt |¡ W w  tye   Y w w ©NFrë  ó   2)r•   r–   r5   rÞ   r¤   r:  r	   ÚloggerÚwrite_pidfiler   Úunlink_pidfileró  rt  rn   rµ   rô  r÷  rø  ©r   r—   r:  r°   r   r   r   Útest_cleanup_removes_pidfile§  s,   þÿþÿz/ServerOptionsTests.test_cleanup_removes_pidfilec                 C   s0   t j t j t¡d¡}|  ¡ }||_| ¡  d S )Nrú  )rn   rµ   r¶   ré   rê   r¤   r:  ró  )r   rú  r°   r   r   r   Ú+test_cleanup_pidfile_ignores_oserror_enoent¹  s   z>ServerOptionsTests.test_cleanup_pidfile_ignores_oserror_enoentc                 C   s¼   t jdd}|j}| d¡ W d   ƒ n1 sw   Y  z.|  ¡ }||_|  |j¡ | ¡  |  	t
j |¡¡ W zt
 |¡ W d S  tyL   Y d S w zt
 |¡ W w  ty]   Y w w )NFrë  s   1234)r•   r–   r5   rÞ   r¤   r:  rt  r  ró  r   rn   rµ   rô  r÷  rø  r  r   r   r   Ú=test_cleanup_does_not_remove_pidfile_from_another_supervisord¿  s(   þÿþÿzPServerOptionsTests.test_cleanup_does_not_remove_pidfile_from_another_supervisordc                 C   sÄ   t jdd}|j}| d¡ W d   ƒ n1 sw   Y  z2|  ¡ }||_ti ƒ}||_|  |j	¡ | 
¡  |  |j	¡ W zt |¡ W d S  tyP   Y d S w zt |¡ W w  tya   Y w w rý  )r•   r–   r5   rÞ   r¤   r:  r   Úpollerrt  Úclosedró  r   rn   r÷  rø  )r   r—   r:  r°   r  r   r   r   Útest_cleanup_closes_pollerÓ  s,   þÿþÿz-ServerOptionsTests.test_cleanup_closes_pollerzos.closerangec                    s2   |   ¡ ‰ dˆ _‡ fdd„}|ƒ  tj dd¡ d S )Nr!  c                      s   ˆ   ¡  d S r'   )Úcleanup_fdsr   ©r°   r   r   r—   ë  ó   zCServerOptionsTests.test_cleanup_fds_closes_5_upto_minfds.<locals>.fr  )r¤   rC  rn   Ú
closerangeÚassert_called_with)r   r—   r   r
  r   Ú%test_cleanup_fds_closes_5_upto_minfdsæ  s
   z8ServerOptionsTests.test_cleanup_fds_closes_5_upto_minfdsc                 C   sB   |   ¡ }G dd„ dƒ}|ƒ }i |fg|_| ¡  |  |jd¡ d S )Nc                   @   s   e Zd ZdZdd„ ZdS )z9ServerOptionsTests.test_close_httpservers.<locals>.ServerFc                 S   s
   d| _ d S ©NT©r  r£   r   r   r   Úcloseô  r¥   z?ServerOptionsTests.test_close_httpservers.<locals>.Server.closeN)r   r    r!   r  r  r   r   r   r   rî  ò  s    rî  T)r¤   rò  Úclose_httpserversrc   r  )r   r°   rî  Úserverr   r   r   Útest_close_httpserversð  s   z)ServerOptionsTests.test_close_httpserversc                 C   s.   |   ¡ }tƒ }||_| ¡  |  |jd¡ d S r  )r¤   r	   rÿ  Úclose_loggerrc   r  ©r   r°   rÿ  r   r   r   Útest_close_loggerû  s
   z$ServerOptionsTests.test_close_loggerc                    óR   |   ¡ }g ‰ ‡ fdd„}||_ddddddd	œ}| |¡ |  tˆ ƒg d
¢¡ d S )Nc                    r¾  r'   rw   ©Úfdr  r   r   Úclose_fd  rÄ  z<ServerOptionsTests.test_close_parent_pipes.<locals>.close_fdr   r   r‚   r(  r,  r  ©Ústdinr…   r„   Úchild_stdinÚchild_stdoutÚchild_stderr)r   r   r‚   ©r¤   r  Úclose_parent_pipesrc   r“  ©r   r°   r  Úpipesr   r  r   Útest_close_parent_pipes  ó   ÿ
z*ServerOptionsTests.test_close_parent_pipesc                    s@   |   ¡ }g ‰ ‡ fdd„}||_dd i}| |¡ |  ˆ g ¡ d S )Nc                    r¾  r'   rw   r  r  r   r   r    rÄ  zOServerOptionsTests.test_close_parent_pipes_ignores_fd_of_none.<locals>.close_fdr  )r¤   r  r"  rc   r#  r   r  r   Ú*test_close_parent_pipes_ignores_fd_of_none  s   
z=ServerOptionsTests.test_close_parent_pipes_ignores_fd_of_nonec                    r  )Nc                    r¾  r'   rw   r  r  r   r   r    rÄ  z;ServerOptionsTests.test_close_child_pipes.<locals>.close_fdr   r   r‚   r(  r,  r  r  )r(  r,  r  )r¤   r  Úclose_child_pipesrc   r“  r#  r   r  r   Útest_close_child_pipes  r&  z)ServerOptionsTests.test_close_child_pipesc                    sD   |   ¡ }g ‰ ‡ fdd„}||_dd i}| |¡ |  tˆ ƒg ¡ d S )Nc                    r¾  r'   rw   r  r  r   r   r  %  rÄ  zNServerOptionsTests.test_close_child_pipes_ignores_fd_of_none.<locals>.close_fdr  r!  r#  r   r  r   Ú)test_close_child_pipes_ignores_fd_of_none"  s   
z<ServerOptionsTests.test_close_child_pipes_ignores_fd_of_nonec                 C   sP   |   ¡ }tƒ }tƒ g|_||_| ¡  |  |jd jd¡ |  |jd d¡ d S )Nr   Tzsupervisord logreopen)r¤   r	   Úhandlersrÿ  Ú
reopenlogsrc   ÚreopenedÚdatar  r   r   r   Útest_reopenlogs,  s   
z"ServerOptionsTests.test_reopenlogsc                 C   s2  t jdd}|j}W d   ƒ n1 sw   Y  |  tj |¡¡ ze|  ¡ }tƒ |_	||_
| ¡  |  tj |¡¡ t|dƒ}t| ¡  ¡ ƒ}W d   ƒ n1 sSw   Y  |  |t ¡ ¡ |j	jd }|  | d¡¡ |  |j¡ W zt |¡ W d S  ty‡   Y d S w zt |¡ W w  ty˜   Y w w )NTrë  Úrr   zsupervisord started with pid)r•   r–   r5   rt  rn   rµ   rô  r¤   r	   rÿ  r:  r   r   rÝ   ÚintÚreadÚstriprc   rª  r.  r‘   r  r÷  rø  )r   r—   rø   r°   Úpidr“   r   r   r   Útest_write_pidfile_ok5  s6   ÿÿÿþÿz(ServerOptionsTests.test_write_pidfile_okc                 C   sN   d}|   ¡ }tƒ |_||_| ¡  |jjd }|  | d¡¡ |  |j	¡ d S )Nz/cannot/possibly/existr   zcould not write pidfile)
r¤   r	   rÿ  r:  r   r.  r   r‘   rt  r  )r   rø   r°   r“   r   r   r   Útest_write_pidfile_failL  s   z*ServerOptionsTests.test_write_pidfile_failc                 C   sp   |   ¡ }t ¡ \}}t |d¡ t |tdƒ¡ | |¡ |  ttj|d¡ | |¡ |  ttj|tdƒ¡ d S )Nr   r‡   )	r¤   rn   Úpiper2  rÞ   r   r  rC   rø  )r   r°   ÚinnieÚoutier   r   r   Útest_close_fdV  s   

z ServerOptionsTests.test_close_fdzos.close)Úside_effectc                 C   s   |   ¡ }| d¡ d S )Nr   )r¤   r  r¯   r   r   r   Útest_close_fd_ignores_oserror`  s   z0ServerOptionsTests.test_close_fd_ignores_oserrorc                 C   s`  |   ¡ }tdƒ}ddlm} |ƒ }| |¡ | |dd¡}|  t|ƒd¡ |d }|  |jd¡ |  |j	d¡ |  |j
d	¡ |  |jd	¡ |  |jd
¡ |  |jd
¡ |  |jd¡ |  |jd ¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |jtj¡ |  |jd	¡ |  |jd¡ |  |jd
¡ |  |jddg¡ |  |jd	¡ |  |jddddœ¡ d S )Na~          [program:foo]
        command = /bin/cat
        priority = 1
        autostart = false
        autorestart = false
        startsecs = 100
        startretries = 100
        user = root
        stdout_logfile = NONE
        stdout_logfile_backups = 1
        stdout_logfile_maxbytes = 100MB
        stdout_events_enabled = true
        stopsignal = KILL
        stopwaitsecs = 100
        killasgroup = true
        exitcodes = 1,4
        redirect_stderr = false
        environment = KEY1=val1,KEY2=val2,KEY3=%(process_num)s
        numprocs = 2
        process_name = %(group_name)s_%(program_name)s_%(process_num)02d
        r   rÌ  úprogram:foorˆ   r‚   Ú
bar_foo_00r   Féd   i  @Tr   r,  Úval1Úval2Ú0)ÚKEY1ÚKEY2ÚKEY3)r¤   r   r   rÍ  rÕ  Úprocesses_from_sectionrc   rd   r5   rJ  rK  rL  rN  rO  rP  rQ  Ústdout_capture_maxbytesrX  Ústdout_events_enabledrR  rS  rT  rV  rW  rU  r|   Úredirect_stderrrF  ©r   r°   rÁ   rÍ  r˜   ÚpconfigsÚpconfigr   r   r   Útest_processes_from_sectione  s8   

ÿz.ServerOptionsTests.test_processes_from_sectionc                 C   s\   |   ¡ }tdƒ}ddlm} |ƒ }| |¡ | |dd¡}dt ¡  }|  |d j	|¡ d S )NzS        [program:foo]
        command = /bin/foo --host=%(host_node_name)s
        r   rÌ  r=  rˆ   z/bin/foo --host=)
r¤   r   r   rÍ  rÕ  rF  r›  rœ  rc   rJ  ©r   r°   rÁ   rÍ  r˜   rK  Úexpectedr   r   r   Ú4test_processes_from_section_host_node_name_expansion—  s   
zGServerOptionsTests.test_processes_from_section_host_node_name_expansionc                 C   sà   |   ¡ }tdƒ}ddlm} |ƒ }| |¡ | |dd¡}|  t|ƒd¡ dD ]F}|  || jd| ¡ |  || j	d	| ¡ |  || j
d
| ¡ |  || jd| ¡ |  || jd| ¡ |  || jdd| i¡ q'd S )NaX          [program:foo]
        process_name = foo_%(process_num)d
        command = /bin/foo --num=%(process_num)d
        directory = /tmp/foo_%(process_num)d
        stderr_logfile = /tmp/foo_%(process_num)d_stderr
        stdout_logfile = /tmp/foo_%(process_num)d_stdout
        environment = NUM=%(process_num)d
        numprocs = 2
        r   rÌ  r=  rˆ   r‚   ©r   r   úfoo_%dz/bin/foo --num=%dz/tmp/foo_%dz/tmp/foo_%d_stderrz/tmp/foo_%d_stdoutÚNUMz%d)r¤   r   r   rÍ  rÕ  rF  rc   rd   r5   rJ  r4  Ústderr_logfilerQ  rF  ©r   r°   rÁ   rÍ  r˜   rK  Únumr   r   r   Ú1test_processes_from_section_process_num_expansion¤  s&   

ÿÿøzDServerOptionsTests.test_processes_from_section_process_num_expansionc                 C   s„   |   ¡ }tdƒ}ddlm} |ƒ }| |¡ | |dd¡}|  t|ƒd¡ dD ]}|  || jd| ¡ |  || j	d	d ¡ q'd S )
Nz‘        [program:foo]
        process_name = foo_%(process_num)d
        command = /bin/foo --numprocs=%(numprocs)d
        numprocs = 2
        r   rÌ  r=  rˆ   r‚   rQ  rR  z/bin/foo --numprocs=%d)
r¤   r   r   rÍ  rÕ  rF  rc   rd   r5   rJ  rU  r   r   r   Ú.test_processes_from_section_numprocs_expansion¿  s   
þzAServerOptionsTests.test_processes_from_section_numprocs_expansionc                 C   sZ   |   ¡ }tdƒ}ddlm} |ƒ }ddi|_| |¡ | |dd¡}|  |d jd¡ d S )Nz^        [program:foo]
        command = /bin/cat
        directory = /tmp/%(ENV_FOO)s
        r   rÌ  ÚENV_FOOrˆ   r=  z/tmp/bar)	r¤   r   r   rÍ  Ú
expansionsrÕ  rF  rc   r4  ©r   r°   rÁ   rÍ  r˜   rK  r   r   r   Ú-test_processes_from_section_expands_directoryÐ  s   

z@ServerOptionsTests.test_processes_from_section_expands_directoryc                 C   s^   |   ¡ }tdƒ}ddlm} |ƒ }| |¡ | |dd¡}dtjd  }|  |d j	|¡ d S )NzO        [program:foo]
        command = /bin/foo --path='%(ENV_PATH)s'
        r   rÌ  r=  rˆ   z/bin/foo --path='%s'ÚPATH)
r¤   r   r   rÍ  rÕ  rF  rn   ro   rc   rJ  rN  r   r   r   Ú;test_processes_from_section_environment_variables_expansionÞ  s   
zNServerOptionsTests.test_processes_from_section_environment_variables_expansionc                 C   sb   |   ¡ }tdƒ}ddlm} |ƒ }| |¡ | |dd¡}dtjd  }|  |d j	d |¡ d S )Nzl        [program:foo]
        command = /bin/foo
        environment = PATH='/foo/bar:%(ENV_PATH)s'
        r   rÌ  r=  rˆ   z/foo/bar:%sr]  )
r¤   r   r   rÍ  rÕ  rF  rn   ro   rc   rF  rN  r   r   r   Ú6test_processes_from_section_expands_env_in_environmentë  s   
zIServerOptionsTests.test_processes_from_section_expands_env_in_environmentc                 C   sb   |   ¡ }tdƒ}ddlm} |ƒ }| |¡ | |dd¡}|  |jd d¡ |  |d jd ¡ d S )Nz~        [program:foo]
        command = /bin/foo
        redirect_stderr = true
        stderr_logfile = /tmp/logfile
        r   rÌ  r=  rˆ   zyFor [program:foo], redirect_stderr=true but stderr_logfile has also been set to a filename, the filename has been ignored©	r¤   r   r   rÍ  rÕ  rF  rc   rr  rT  r[  r   r   r   Ú9test_processes_from_section_redirect_stderr_with_filenameù  s   
ÿzLServerOptionsTests.test_processes_from_section_redirect_stderr_with_filenamec                 C   ót   |   ¡ }tdƒ}ddlm} |ƒ }| |¡ | |dd¡}|  |jd d¡ |  |d jd ¡ |  |d j	d¡ d S )NzY        [program:foo]
        command = /bin/foo
        stdout_logfile = syslog
        r   rÌ  r=  rˆ   z†For [program:foo], stdout_logfile=syslog but this is deprecated and will be removed.  Use stdout_syslog=true to enable syslog instead.T)
r¤   r   r   rÍ  rÕ  rF  rc   rr  rQ  Ústdout_syslogr[  r   r   r   Ú=test_processes_from_section_rewrites_stdout_logfile_of_syslog
  ó   
ÿzPServerOptionsTests.test_processes_from_section_rewrites_stdout_logfile_of_syslogc                 C   rb  )NzY        [program:foo]
        command = /bin/foo
        stderr_logfile = syslog
        r   rÌ  r=  rˆ   z†For [program:foo], stderr_logfile=syslog but this is deprecated and will be removed.  Use stderr_syslog=true to enable syslog instead.T)
r¤   r   r   rÍ  rÕ  rF  rc   rr  rT  Ústderr_syslogr[  r   r   r   Ú=test_processes_from_section_rewrites_stderr_logfile_of_syslog  re  zPServerOptionsTests.test_processes_from_section_rewrites_stderr_logfile_of_syslogc                 C   s^   |   ¡ }tdƒ}ddlm} |ƒ }| |¡ | |dd¡}|  |jg ¡ |  |d jd ¡ d S )Nzv        [program:foo]
        command = /bin/foo
        redirect_stderr = true
        stderr_logfile = auto
        r   rÌ  r=  rˆ   r`  r[  r   r   r   Ú5test_processes_from_section_redirect_stderr_with_auto.  s   
zHServerOptionsTests.test_processes_from_section_redirect_stderr_with_autoc                 C   sf   |   ¡ }tdtj ƒ}ddlm} |ƒ }| |¡ | |dd¡}|  |j	g ¡ |  |d j
tj¡ d S )NzQ        [program:foo]
        command = /bin/foo
        stopsignal = %d
        r   rÌ  r=  rˆ   )r¤   r   rS  ÚSIGQUITr   rÍ  rÕ  rF  rc   rr  rR  r[  r   r   r   Ú9test_processes_from_section_accepts_number_for_stopsignal=  s   ü
zLServerOptionsTests.test_processes_from_section_accepts_number_for_stopsignalc           	      C   sˆ  t dƒ}ddlm} ddlm} |  ¡ }i dt ¡ “dd“dd	“d
d“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d!“d"d#“d$dd%d&d'd(d)d*d*dd+dd,œ¥|_|ƒ }|j|_	| 
|¡ t|ƒ|_| t|ƒ¡ |jg d- |  |jd.|j	 ¡ |  |jd/|j	 ¡ |  |jd0¡ |  |jd1¡ |  |jtj¡ |  |jd2¡ |  |jd2¡ |  |jd3¡ |  |jd4¡ |  |jd5¡ |  |j|j	d ¡ |  |jd2¡ |jj}|  |j d d6 t!j"¡ |  |j d d7 d8¡ |  |j d d9 d:¡ |  |j d d; d¡ |  |j d d< d¡ |j#d }|  |j$d=¡ |  |j%d>¡ |  t&|j'ƒd?¡ |j'd }|  |j$d=¡ |  |j(d@¡ |  |j%d>¡ |  |j)d5¡ |  |j*|j+¡ |  |j,dA¡ |  |j-d1¡ |  |j.d¡ |  |j/d&¡ |  |j0t1j2¡ |  |j3dA¡ |  |j4d2¡ |  |j5d2¡ |  |j6| 7d'¡¡ |  |j8dB¡ |  |j9dg¡ |  |j:d+¡ |  |j;dB¡ |  |j<t=dCdD¡ d S )ENa^          [supervisord]
        logfile = %(ENV_HOME)s/supervisord.log
        logfile_maxbytes = %(ENV_SUPD_LOGFILE_MAXBYTES)s
        logfile_backups = %(ENV_SUPD_LOGFILE_BACKUPS)s
        loglevel = %(ENV_SUPD_LOGLEVEL)s
        nodaemon = %(ENV_SUPD_NODAEMON)s
        minfds = %(ENV_SUPD_MINFDS)s
        minprocs = %(ENV_SUPD_MINPROCS)s
        umask = %(ENV_SUPD_UMASK)s
        identifier = supervisor_%(ENV_USER)s
        nocleanup = %(ENV_SUPD_NOCLEANUP)s
        childlogdir = %(ENV_HOME)s
        strip_ansi = %(ENV_SUPD_STRIP_ANSI)s
        environment = FAKE_ENV_VAR=/some/path

        [inet_http_server]
        port=*:%(ENV_HTSRV_PORT)s
        username=%(ENV_HTSRV_USER)s
        password=%(ENV_HTSRV_PASS)s

        [program:cat1]
        command=%(ENV_CAT1_COMMAND)s --logdir=%(ENV_CAT1_COMMAND_LOGDIR)s
        priority=%(ENV_CAT1_PRIORITY)s
        autostart=%(ENV_CAT1_AUTOSTART)s
        user=%(ENV_CAT1_USER)s
        stdout_logfile=%(ENV_CAT1_STDOUT_LOGFILE)s
        stdout_logfile_maxbytes = %(ENV_CAT1_STDOUT_LOGFILE_MAXBYTES)s
        stdout_logfile_backups = %(ENV_CAT1_STDOUT_LOGFILE_BACKUPS)s
        stopsignal=%(ENV_CAT1_STOPSIGNAL)s
        stopwaitsecs=%(ENV_CAT1_STOPWAIT)s
        startsecs=%(ENV_CAT1_STARTWAIT)s
        startretries=%(ENV_CAT1_STARTRETRIES)s
        directory=%(ENV_CAT1_DIR)s
        umask=%(ENV_CAT1_UMASK)s
        r   r  rÌ  rÎ   rÏ   rÉ   ÚENV_HTSRV_PORTrÊ   ÚENV_HTSRV_USERrË   ÚENV_HTSRV_PASSrÌ   ÚENV_SUPD_LOGFILE_MAXBYTESÚ51MBÚENV_SUPD_LOGFILE_BACKUPSÚ10ÚENV_SUPD_LOGLEVELÚinfoÚENV_SUPD_NODAEMONÚfalseÚENV_SUPD_SILENTÚENV_SUPD_MINFDSÚ1024ÚENV_SUPD_MINPROCSÚ200ÚENV_SUPD_UMASKÚ002ÚENV_SUPD_NOCLEANUPÚtrueÚENV_SUPD_STRIP_ANSIÚENV_CAT1_COMMANDz/bin/customcatÚENV_CAT1_COMMAND_LOGDIRz/path/to/logsÚ3Úrootr"  Ú78KBÚ2ÚKILLÚ5r$  )ÚENV_CAT1_PRIORITYÚENV_CAT1_AUTOSTARTÚENV_CAT1_USERÚENV_CAT1_STDOUT_LOGFILEÚ ENV_CAT1_STDOUT_LOGFILE_MAXBYTESÚENV_CAT1_STDOUT_LOGFILE_BACKUPSÚENV_CAT1_STOPSIGNALÚENV_CAT1_STOPWAITÚENV_CAT1_STARTWAITÚENV_CAT1_STARTRETRIESÚENV_CAT1_DIRÚENV_CAT1_UMASKr©   z%(ENV_HOME)s/supervisord.logzsupervisor_%(ENV_USER)si  0r!  Fr&  éÈ   Tr  r  r›   r  iú#  r­   r®   r  r(  r   z%/bin/customcat --logdir=/path/to/logsr  r‚   r  r  )>r   r2  r  r   rÍ  r¤   r•   r´   rÕ   rZ  rÕ  r   r=   r.   rm   rc   r6  r=  r7  r8  r9  r   ÚINFOr;  r<  rC  rD  rB  r>  Ú
strip_ansir&   r3  r?  r@  rA  rE  r5   rH  rd   rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r|   r4  r5  rF  rG  )	r   rÁ   r  rÍ  r°   r˜   r?   r  rb  r   r   r   rÖ   K  sØ   $ÿþýüûúùø	÷
öõôóòñðï
ã

ÿÿ

ÿÿz;ServerOptionsTests.test_options_with_environment_expansionsc              
   C   sð   |   ¡ }tdƒ}t ¡ }tj |d¡}t|dƒ}| |¡ W d   ƒ n1 s(w   Y  z||_	|j
g d W tj|dd ntj|dd w |  |jtj |¡¡ |  |jtj |¡¡ |  |jtj |d¡¡ |  |jtj |d¡¡ d S )	Nz¨        [supervisord]
        childlogdir=%(here)s
        directory=%(here)s
        logfile=%(here)s/supervisord.log
        pidfile=%(here)s/supervisord.pid
        rb   r×   r©   TrØ   r  r  )r¤   r   r•   rÜ   rn   rµ   r¶   rÝ   rÞ   r=   rm   rß   rà   rc   r>  r4  r6  r:  )r   r°   rÁ   rá   râ   r—   r   r   r   Ú-test_options_supervisord_section_expands_hereÊ  s.   ÿ 
ÿ
ÿÿÿz@ServerOptionsTests.test_options_supervisord_section_expands_herec           	   
   C   óÖ   |   ¡ }tdƒ}t ¡ }tj |d¡}t|dƒ}| |¡ W d   ƒ n1 s(w   Y  z||_	|j
g d W tj|dd ntj|dd w |jj}|jd }|  |jd¡ |jd }|  |jtj |d	¡¡ d S )
Nzˆ
        [supervisord]
        environment=CMD=/bin/from/supervisord/section

        [program:cmd]
        command=%(ENV_CMD)s
        rb   r×   r©   TrØ   r   Úcmdz/bin/from/supervisord/section©r¤   r   r•   rÜ   rn   rµ   r¶   rÝ   rÞ   r=   rm   rß   rà   r&   r3  rE  rc   r5   rI  rJ  ©	r   r°   rÁ   rá   râ   r—   r?   Úgrouprn  r   r   r   Ú>test_options_program_section_expands_env_from_supervisord_sectå  s$   ÿ 

ÿzQServerOptionsTests.test_options_program_section_expands_env_from_supervisord_sectc           	   
   C   r˜  )
Nzº
        [supervisord]
        environment=CMD=/bin/from/supervisord/section

        [program:cmd]
        command=%(ENV_CMD)s
        environment=CMD=/bin/from/program/section
        rb   r×   r©   TrØ   r   r™  z/bin/from/program/sectionrš  r›  r   r   r   Ú:test_options_program_section_expands_env_from_program_sectþ  s$   ÿ 

ÿzMServerOptionsTests.test_options_program_section_expands_env_from_program_sectc           	   
   C   óV  |   ¡ }tdƒ}t ¡ }tj |d¡}t|dƒ}| |¡ W d   ƒ n1 s(w   Y  z||_	|j
g d W tj|dd ntj|dd w |jj}|jd }|  |jd¡ |jd }|  |jtj |d	¡¡ |  |jtj |d
¡¡ |  |jdtj |d¡i¡ |  |jdtj |d¡ ¡ |  |jtj |d¡¡ |  |jtj |d¡¡ d S )Na-  
        [supervisord]

        [program:cat]
        command=%(here)s/bin/cat
        directory=%(here)s/thedirectory
        environment=FOO=%(here)s/foo
        serverurl=unix://%(here)s/supervisord.sock
        stdout_logfile=%(here)s/stdout.log
        stderr_logfile=%(here)s/stderr.log
        rb   r×   r©   TrØ   r   rm  Úthedirectoryúbin/catÚFOOr‡   rÚ   rÛ   ú
stdout.logú
stderr.log©r¤   r   r•   rÜ   rn   rµ   r¶   rÝ   rÞ   r=   rm   rß   rà   r&   r3  rE  rc   r5   rI  r4  rJ  rF  r¬   rQ  rT  r›  r   r   r   Ú)test_options_program_section_expands_here  sB   ÿ 

ÿÿÿÿÿÿz<ServerOptionsTests.test_options_program_section_expands_herec           	   
   C   rŸ  )NaP  
        [supervisord]

        [eventlistener:memmon]
        events=TICK_60
        command=%(here)s/bin/memmon
        directory=%(here)s/thedirectory
        environment=FOO=%(here)s/foo
        serverurl=unix://%(here)s/supervisord.sock
        stdout_logfile=%(here)s/stdout.log
        stderr_logfile=%(here)s/stderr.log
        rb   r×   r©   TrØ   r   Úmemmonr   z
bin/memmonr¢  r‡   rÚ   rÛ   r£  r¤  r¥  r›  r   r   r   Ú/test_options_eventlistener_section_expands_here?  sB   ÿ 

ÿÿÿÿÿÿzBServerOptionsTests.test_options_eventlistener_section_expands_herec           
   
   C   s  |   ¡ }tdƒ}|d7 }t ¡ }tj |d¡}t|dƒ}| |¡ W d   ƒ n1 s,w   Y  zdddœ|_	||_
|jg d W tj|d	d
 ntj|d	d
 w |jj}|  |jtj |d¡¡ |jd }|jd }dtj |d¡t ¡ f }	|  |j|	¡ d S )Nze
        [supervisord]
        logfile = %(here)s/%(ENV_LOGNAME)s.log

        [program:cat]
        z\command = %(here)s/bin/cat --foo=%(ENV_FOO)s --num=%(process_num)d --node=%(host_node_name)srb   r×   Úmainlogrˆ   )ÚENV_LOGNAMErY  r©   TrØ   zmainlog.logr   z%s --foo=bar --num=0 --node=%sr¡  )r¤   r   r•   rÜ   rn   rµ   r¶   rÝ   rÞ   rÕ   r=   rm   rß   rà   r&   r3  rc   r6  rE  rI  r›  rœ  rJ  )
r   r°   rÁ   rá   râ   r—   rl  Ú	cat_groupÚcat_0rO  r   r   r   Ú(test_options_expands_combined_expansionsg  s4   ÿþ ÿ

þz;ServerOptionsTests.test_options_expands_combined_expansionsc              
   C   sô   t  ¡ }tj |d¡}tdƒ}t|dƒ}| |¡ W d   ƒ n1 s$w   Y  |  ¡ }zD||_	z|j
dd |  d¡ W n ty] } z|  t|jd ƒd| ¡ W Y d }~nd }~ww W tj|d	d
 d S W tj|d	d
 d S tj|d	d
 w )Nrb   zq
        [supervisord]

        [program:cat]
        command = /bin/cat
        stopsignal = NOTASIGNAL
        r×   Fr€   rç   r   úQvalue 'NOTASIGNAL' is not a valid signal name in section 'program:cat' (file: %r)TrØ   )r•   rÜ   rn   rµ   r¶   r   rÝ   rÞ   r¤   r=   rq   rë   r(   rc   Ústrrª   rß   rà   )r   ré   râ   rÁ   r—   r°   Úer   r   r   Ú.test_options_error_handler_shows_main_filenameŒ  s0   ÿÿÿ€ÿÿü"zAServerOptionsTests.test_options_error_handler_shows_main_filenamec           	   
   C   sZ  t  ¡ }tj |d¡}td| ƒ}t|dƒ}| |¡ W d   ƒ n1 s&w   Y  tj |d¡}t |¡ tj |d¡}tdƒ}t|dƒ}| |¡ W d   ƒ n1 sWw   Y  |  	¡ }zD||_
z|jdd |  d	¡ W n ty } z|  t|jd
 ƒd| ¡ W Y d }~nd }~ww W tj|dd d S W tj|dd d S tj|dd w )Nrb   r  r×   r„  zincluded.confzY        [program:cat]
        command = /bin/cat
        stopsignal = NOTASIGNAL
        Fr€   rç   r   r®  TrØ   )r•   rÜ   rn   rµ   r¶   r   rÝ   rÞ   rˆ  r¤   r=   rq   rë   r(   rc   r¯  rª   rß   rà   )	r   ré   râ   rÁ   r—   r‰  Úincluded_confr°   r°  r   r   r   Ú2test_options_error_handler_shows_included_filename¦  sB   ûÿ
ÿÿÿ€ÿÿü"zEServerOptionsTests.test_options_error_handler_shows_included_filenamec                 C   óD   |   ¡ }tdƒ}ddlm} |ƒ }| |¡ |  t|j|dd ¡ d S )Nz)        [program:spaces are bad]
        r   rÌ  zprogram:spaces are bad©r¤   r   r   rÍ  rÕ  rC   r(   rF  ©r   r°   rÁ   rÍ  r˜   r   r   r   Ú3test_processes_from_section_bad_program_name_spacesÊ  ó   

ÿzFServerOptionsTests.test_processes_from_section_bad_program_name_spacesc                 C   r´  )Nz)        [program:colons:are:bad]
        r   rÌ  zprogram:colons:are:badrµ  r¶  r   r   r   Ú3test_processes_from_section_bad_program_name_colonsÕ  r¸  zFServerOptionsTests.test_processes_from_section_bad_program_name_colonsc                 C   r´  )NzN        [program:foo]
        command = /bin/cat
        numprocs = 2
        r   rÌ  r=  rµ  r¶  r   r   r   Ú5test_processes_from_section_no_procnum_in_processnameà  ó   

ÿzHServerOptionsTests.test_processes_from_section_no_procnum_in_processnamec              
   C   sˆ   |   ¡ }tdƒ}ddlm} |ƒ }| |¡ z| |dd ¡ |  d¡ W d S  tyC } z|  |j	d  
d¡¡ W Y d }~d S d }~ww )Nz        [program:foo]
        r   rÌ  r=  rç   z6program section program:foo does not specify a command)r¤   r   r   rÍ  rÕ  rF  rë   r(   r   rª   r‘   )r   r°   rÁ   rÍ  r˜   rí   r   r   r   Ú&test_processes_from_section_no_commandí  s   
ÿ€ÿz9ServerOptionsTests.test_processes_from_section_no_commandc                 C   r´  )Nz^        [program:foo]
        command = /bin/cat
        process_name = %(not_there)s
        r   rÌ  r=  rµ  r¶  r   r   r   Ú?test_processes_from_section_missing_replacement_in_process_nameü  r»  zRServerOptionsTests.test_processes_from_section_missing_replacement_in_process_namec                 C   r´  )Nz`        [program:foo]
        command = /bin/cat
        process_name = %(program_name)
        r   rÌ  r=  rµ  r¶  r   r   r   Ú:test_processes_from_section_bad_expression_in_process_name		  r»  zMServerOptionsTests.test_processes_from_section_bad_expression_in_process_namec                 C   r´  )Nz_        [program:foo]
        command = /bin/cat
        process_name = colons:are:bad
        r   rÌ  r=  rµ  r¶  r   r   r   Ú5test_processes_from_section_bad_chars_in_process_name	  r»  zHServerOptionsTests.test_processes_from_section_bad_chars_in_process_namec                 C   sr   |   ¡ }tdƒ}ddlm} |ƒ }| |¡ | |dd¡}|  t|ƒd¡ |d }|  |jd¡ |  |j	d¡ d S )Nz|        [program:foo]
        command = /bin/cat
        process_name = %(program_name)s
        stopasgroup = true
        r   rÌ  r=  rˆ   r   T)
r¤   r   r   rÍ  rÕ  rF  rc   rd   rV  rW  rJ  r   r   r   Ú;test_processes_from_section_stopasgroup_implies_killasgroup#	  s   
zNServerOptionsTests.test_processes_from_section_stopasgroup_implies_killasgroupc                 C   r´  )Nz˜        [program:foo]
        command = /bin/cat
        process_name = %(program_name)s
        stopasgroup = true
        killasgroup = false
        r   rÌ  r=  rµ  r¶  r   r   r   Ú>test_processes_from_section_killasgroup_mismatch_w_stopasgroup4	  s   

ÿzQServerOptionsTests.test_processes_from_section_killasgroup_mismatch_w_stopasgroupc              
   C   s†   |   ¡ }tdƒ}ddlm} |ƒ }| |¡ z	| |dd ¡ W n ty; } z|  dt|ƒv ¡ W Y d }~d S d }~ww |  	d¡ d S )Nzh        [program:foo]
        command = /bin/cat
        environment = KEY1=val1,KEY2=val2,KEY3
        r   rÌ  r=  z^Unexpected end of key/value pairs in value 'KEY1=val1,KEY2=val2,KEY3' in section 'program:foo'z9instance.processes_from_section should raise a ValueError)
r¤   r   r   rÍ  rÕ  rF  r(   r   r¯  rë   )r   r°   rÁ   rÍ  r˜   r°  r   r   r   Ú=test_processes_from_section_unexpected_end_of_key_value_pairsC	  s    
þÿ€ÿzPServerOptionsTests.test_processes_from_section_unexpected_end_of_key_value_pairsc                 C   sÜ   |   ¡ }tdƒ}tjddV}z!| |¡ | ¡  ddlm} |ƒ }| |j	¡ | 
|dd ¡ W n tyN } z|  |jd d|j	 ¡ W Y d }~nd }~ww |  d¡ W d   ƒ d S W d   ƒ d S 1 sgw   Y  d S )	Nz2        [program:foo]
        ;no command
        rz  r{  r   rÌ  r=  zZprogram section program:foo does not specify a command in section 'program:foo' (file: %r)rç   )r¤   r   r•   r–   rÞ   r}  r   rÍ  r2  r5   rF  r(   rc   rª   rë   )r   r°   rÁ   r—   rÍ  r˜   r°  r   r   r   Ú=test_processes_from_section_shows_conf_filename_on_valueerrorX	  s,   
ÿÿ€ÿó	"÷zPServerOptionsTests.test_processes_from_section_shows_conf_filename_on_valueerrorc                 C   sj   |   ¡ }tdƒ}ddlm} |ƒ }tƒ |_| |¡ | |dd ¡ |  |j	d d¡ |  |j	d d¡ d S )Nz½        [program:foo]
        command = /bin/foo
        stdout_logfile = AUTO
        stdout_logfile_maxbytes = 0
        stderr_logfile = AUTO
        stderr_logfile_maxbytes = 0
        r   rÌ  r=  z‰For [program:foo], AUTO logging used for stdout_logfile without rollover, set maxbytes > 0 to avoid filling up filesystem unintentionallyr   z‰For [program:foo], AUTO logging used for stderr_logfile without rollover, set maxbytes > 0 to avoid filling up filesystem unintentionally)
r¤   r   r   rÍ  r	   rÿ  rÕ  rF  rc   rr  r¶  r   r   r   Ú4test_processes_from_section_autolog_without_rolloverm	  s   
ÿÿzGServerOptionsTests.test_processes_from_section_autolog_without_rolloverc                 C   s€   t dƒ}ddlm} |ƒ }| |¡ |  ¡ }| |¡}|  t|ƒd¡ |d }|  |jd¡ |  |j	d¡ |  t|j
ƒd¡ d S )Nzœ        [program:many]
        process_name = %(program_name)s_%(process_num)s
        command = /bin/cat
        numprocs = 2
        priority = 1
        r   rÌ  r   Úmanyr‚   ©r   r   rÍ  rÕ  r¤   Úprocess_groups_from_parserrc   rd   r5   rH  rI  ©r   rÁ   rÍ  r˜   r°   ÚgconfigsÚgconfigr   r   r   Ú+test_homogeneous_process_groups_from_parser…	  s   

z>ServerOptionsTests.test_homogeneous_process_groups_from_parserc                 C   s  t dƒ}ddlm} ddlm} |ƒ }| |¡ |  ¡ }| |¡}|  t	|ƒd¡ |d }|  |j
d¡ |  |j|¡ |  t	|jƒd¡ |d }|  |j
d	¡ |  |jd
¡ |  |j|¡ |  t	|jƒd¡ |d }|  |j
d¡ |  |jd¡ |  |j|¡ |  t	|jƒd¡ d S )Na          [eventlistener:dog]
        events=PROCESS_COMMUNICATION
        process_name = %(program_name)s_%(process_num)s
        command = /bin/dog
        numprocs = 2
        priority = 1

        [eventlistener:cat]
        events=PROCESS_COMMUNICATION
        process_name = %(program_name)s_%(process_num)s
        command = /bin/cat
        numprocs = 3

        [eventlistener:biz]
        events=PROCESS_COMMUNICATION
        process_name = %(program_name)s_%(process_num)s
        command = /bin/biz
        numprocs = 2
        r   rÌ  ©Údefault_handlerr(  Úbizr‚   r   rm  rÓ  Údog)r   r   rÍ  Úsupervisor.dispatchersrÍ  rÕ  r¤   rÇ  rc   rd   r5   Úresult_handlerrI  rH  )r   rÁ   rÍ  rÍ  r˜   r°   rÉ  Úgconfig1r   r   r   Ú%test_event_listener_pools_from_parser˜	  s,   

z8ServerOptionsTests.test_event_listener_pools_from_parserc                 C   sf  t dƒ}ddlm} ddlm} |  ¡ }t ¡ ddddd	d
œ|_|ƒ }|j|_	| 
|¡ | |¡}|  t|ƒd¡ |d }|  |jd¡ |  |jd¡ |  |j|¡ |  t|jƒd¡ |d }|  |jd¡ |  |jd¡ |  |j|¡ |  t|jƒd¡ |jd }	|  |	jd¡ |  |	jd¡ |  |	jd¡ |jd }
|  |
jd¡ |  |
jd¡ |  |
jd¡ d S )Na·          [eventlistener:dog]
        events=PROCESS_COMMUNICATION
        process_name = %(ENV_EL1_PROCNAME)s_%(program_name)s_%(process_num)s
        command = %(ENV_EL1_COMMAND)s
        numprocs = %(ENV_EL1_NUMPROCS)s
        priority = %(ENV_EL1_PRIORITY)s

        [eventlistener:cat]
        events=PROCESS_COMMUNICATION
        process_name = %(program_name)s_%(process_num)s
        command = /bin/cat
        numprocs = 3

        r   rÌ  rÌ  rÉ   Úmyeventlistenerz/bin/dogr…  Ú1)rÎ   rÏ   ÚENV_EL1_PROCNAMEÚENV_EL1_COMMANDÚENV_EL1_NUMPROCSÚENV_EL1_PRIORITYr‚   rm  rÓ  r(  r   rÏ  Úmyeventlistener_dog_0Úmyeventlistener_dog_1)r   r   rÍ  rÐ  rÍ  r¤   r•   r´   rÕ   rZ  rÕ  rÇ  rc   rd   r5   rH  rÑ  rI  rJ  )r   rÁ   rÍ  rÍ  r°   r˜   rÉ  Úgconfig0rÒ  Údog0Údog1r   r   r   ÚAtest_event_listener_pools_from_parser_with_environment_expansionsÆ	  sD   û



zTServerOptionsTests.test_event_listener_pools_from_parser_with_environment_expansionsc              
   C   ó€   t dƒ}ddlm} |ƒ }| |¡ |  ¡ }z| |¡ |  d¡ W d S  ty? } z|  |j	d d¡ W Y d }~d S d }~ww )Nzl        [eventlistener:dog]
        events=EVENT
        command = /bin/dog
        buffer_size = 0
        r   rÌ  rç   z8[eventlistener:dog] section sets invalid buffer_size (0)©
r   r   rÍ  rÕ  r¤   rÇ  rë   r(   rc   rª   ©r   rÁ   rÍ  r˜   r°   rí   r   r   r   Ú3test_event_listener_pool_disallows_buffer_size_zeroú	  ó   

 €ÿzFServerOptionsTests.test_event_listener_pool_disallows_buffer_size_zeroc              
   C   rà  )Nzƒ        [eventlistener:dog]
        events=PROCESS_COMMUNICATION
        command = /bin/dog
        redirect_stderr = True
        r   rÌ  rç   z‡[eventlistener:dog] section sets redirect_stderr=true but this is not allowed because it will interfere with the eventlistener protocolrá  râ  r   r   r   Ú2test_event_listener_pool_disallows_redirect_stderr
  rä  zEServerOptionsTests.test_event_listener_pool_disallows_redirect_stderrc                 C   sl   t dƒ}ddlm} ddlm} |ƒ }| |¡ |  ¡ }| |¡}|  t	|ƒd¡ |d }|  |j
|¡ d S )Nz¡        [eventlistener:dog]
        events=PROCESS_COMMUNICATION
        command = /bin/dog
        result_handler = supervisor.tests.base:dummy_handler
        r   rÌ  )Údummy_handlerr   )r   r   rÍ  Úsupervisor.tests.baseræ  rÕ  r¤   rÇ  rc   rd   rÑ  )r   rÁ   rÍ  ræ  r˜   r°   rÉ  rÒ  r   r   r   Ú2test_event_listener_pool_with_event_result_handler
  s   

zEServerOptionsTests.test_event_listener_pool_with_event_result_handlerc              
   C   rà  )NzŸ        [eventlistener:cat]
        events=PROCESS_COMMUNICATION
        command = /bin/cat
        result_handler = supervisor.tests.base:nonexistent
        r   rÌ  rç   zOsupervisor.tests.base:nonexistent cannot be resolved within [eventlistener:cat]rá  râ  r   r   r   Ú4test_event_listener_pool_result_handler_unimportable1
  s   

ÿ€ÿzGServerOptionsTests.test_event_listener_pool_result_handler_unimportablec                 C   ó@   t dƒ}ddlm} |ƒ }| |¡ |  ¡ }|  t|j|¡ d S )Nz¡        [eventlistener:dog]
        process_name = %(program_name)s_%(process_num)s
        command = /bin/dog
        numprocs = 2
        priority = 1
        r   rÌ  ©r   r   rÍ  rÕ  r¤   rC   r(   rÇ  ©r   rÁ   rÍ  r˜   r°   r   r   r   Ú%test_event_listener_pool_noeventslineD
  ó   
z8ServerOptionsTests.test_event_listener_pool_noeventslinec                 C   rê  )Nzã        [eventlistener:dog]
        events=PROCESS_COMMUNICATION,THIS_EVENT_TYPE_DOESNT_EXIST
        process_name = %(program_name)s_%(process_num)s
        command = /bin/dog
        numprocs = 2
        priority = 1
        r   rÌ  rë  rì  r   r   r   Ú*test_event_listener_pool_unknown_eventtypeR
  ó   
z=ServerOptionsTests.test_event_listener_pool_unknown_eventtypec                 C   s`  ddl m} ddl m} tdƒ}ddl m} |ƒ }| |¡ |  ¡ }tƒ }d d tj	tj
f|_tƒ }d d tj
f|_td|ƒtd|ƒtd|ƒd	d
„ ƒƒƒ}	|	||ƒ}
tj	tj
f}|  t|
ƒd¡ |
d }|  |j|¡ |  |jd¡ |  |jd¡ |  |jjd¡ |  ||j ¡ ¡ |  d|j ¡ ¡ |  d|j ¡ ¡ |  t|jƒd¡ |jd }|  |j|¡ |
d }|  |jd¡ |  |jd¡ |  |jjd¡ |  ||j ¡ ¡ |  d|j ¡ ¡ |  t|jƒd¡ |
d }|  |jd¡ |  |jjd¡ |  t|jƒd¡ |
d }|  |jd¡ |  |jjd¡ |  d |j ¡ ¡ |  d|j ¡ ¡ |  t|jƒd¡ d S )Nr   ©ÚFastCGIGroupConfig©ÚFastCGIProcessConfigaÏ          [fcgi-program:foo]
        socket = unix:///tmp/%(program_name)s.sock
        socket_owner = testuser:testgroup
        socket_mode = 0666
        socket_backlog = 32676
        process_name = %(program_name)s_%(process_num)s
        command = /bin/foo
        numprocs = 2
        priority = 1

        [fcgi-program:bar]
        socket = unix:///tmp/%(program_name)s.sock
        process_name = %(program_name)s_%(process_num)s
        command = /bin/bar
        user = testuser
        numprocs = 3

        [fcgi-program:flub]
        socket = unix:///tmp/%(program_name)s.sock
        command = /bin/flub

        [fcgi-program:cub]
        socket = tcp://localhost:6000
        command = /bin/cub
        rÌ  úpwd.getpwuidúpwd.getpwnamúgrp.getgrnamc                 S   ó
   |   |¡S r'   ©rÇ  ©r°   r˜   r   r   r   Úget_process_groupsŠ
  ó   
zMServerOptionsTests.test_fcgi_programs_from_parser.<locals>.get_process_groupsr,  r‡   r   zunix:///tmp/foo.socké¶  é¤  r‚   rˆ   éç  zunix:///tmp/bar.sockrÑ  r(  Úcubztcp://localhost:6000Úflubzunix:///tmp/flub.sock)r   rò  rô  r   rÍ  rÕ  r¤   r   r   rP  r`  Úreturn_valuer   rc   rd   Ú	__class__r5   rH  Úsocket_configÚurlÚ	get_ownerÚget_modeÚget_backlogrI  )r   rò  rô  rÁ   rÍ  r˜   r°   Úpwd_mockÚgrp_mockrû  rÉ  Ú	exp_ownerÚ	gconf_fooÚpconfig_fooÚ	gconf_barÚ	gconf_cubÚ
gconf_flubr   r   r   Útest_fcgi_programs_from_parsera
  sl   


ÿ

ÿ
ÿ
ÿz1ServerOptionsTests.test_fcgi_programs_from_parserc                 C   s”  ddl m} ddl m} tdƒ}ddl m} |  ¡ }dddd	d
ddddddœ
|_|ƒ }|j|_| |¡ t	ƒ }d d t
jt
jf|_t	ƒ }d d t
jf|_td|ƒtd|ƒtd|ƒdd„ ƒƒƒ}	|	||ƒ}
t
jt
jf}|  t|
ƒd¡ |
d }|  |j|¡ |  |jd¡ |  |jd¡ |  |jjd¡ |  ||j ¡ ¡ |  d|j ¡ ¡ |  d|j ¡ ¡ |  t|jƒd¡ |jd }|  |j|¡ |  |jd¡ d S )Nr   rñ  ró  aà          [fcgi-program:foo]
        socket = unix:///tmp/%(program_name)s%(ENV_FOO_SOCKET_EXT)s
        socket_owner = %(ENV_FOO_SOCKET_USER)s:testgroup
        socket_mode = %(ENV_FOO_SOCKET_MODE)s
        socket_backlog = %(ENV_FOO_SOCKET_BACKLOG)s
        process_name = %(ENV_FOO_PROCESS_PREFIX)s_%(program_name)s_%(process_num)s
        command = /bin/foo --arg1=%(ENV_FOO_COMMAND_ARG1)s
        numprocs = %(ENV_FOO_NUMPROCS)s
        priority = %(ENV_FOO_PRIORITY)s
        rÌ  r$  rÊ   z.usockÚtestuserÚ0666Ú32676zfcgi-rˆ   r…  rÕ  )
rÎ   rÐ   ÚENV_FOO_SOCKET_EXTÚENV_FOO_SOCKET_USERÚENV_FOO_SOCKET_MODEÚENV_FOO_SOCKET_BACKLOGÚENV_FOO_PROCESS_PREFIXÚENV_FOO_COMMAND_ARG1ÚENV_FOO_NUMPROCSÚENV_FOO_PRIORITYrõ  rö  r÷  c                 S   rø  r'   rù  rú  r   r   r   rû  à
  rü  ziServerOptionsTests.test_fcgi_programs_from_parser_with_environment_expansions.<locals>.get_process_groupsr   r‡   zunix:///tmp/foo.usockrý  rþ  r‚   z/bin/foo --arg1=bar)r   rò  rô  r   rÍ  r¤   rÕ   rZ  rÕ  r   r   rP  r`  r  r   rc   rd   r  r5   rH  r  r  r  r  r  rI  rJ  )r   rò  rô  rÁ   rÍ  r°   r˜   r	  r
  rû  rÉ  r  r  r  r   r   r   Ú:test_fcgi_programs_from_parser_with_environment_expansionsº
  sX   ÷


ÿ
zMServerOptionsTests.test_fcgi_programs_from_parser_with_environment_expansionsc                 C   rê  )Nz         [fcgi-program:foo]
        process_name = %(program_name)s_%(process_num)s
        command = /bin/foo
        numprocs = 2
        priority = 1
        r   rÌ  rë  rì  r   r   r   Útest_fcgi_program_no_socketú
  rî  z.ServerOptionsTests.test_fcgi_program_no_socketc                 C   rê  )Nz»        [fcgi-program:foo]
        socket=junk://blah
        process_name = %(program_name)s_%(process_num)s
        command = /bin/foo
        numprocs = 2
        priority = 1
        r   rÌ  rë  rì  r   r   r   Ú)test_fcgi_program_unknown_socket_protocol  rð  z<ServerOptionsTests.test_fcgi_program_unknown_socket_protocolc                 C   rê  )NzÄ        [fcgi-program:foo]
        socket=unix://relative/path
        process_name = %(program_name)s_%(process_num)s
        command = /bin/foo
        numprocs = 2
        priority = 1
        r   rÌ  rë  rì  r   r   r   Ú$test_fcgi_program_rel_unix_sock_path  rð  z7ServerOptionsTests.test_fcgi_program_rel_unix_sock_pathc                 C   rê  )NzÁ        [fcgi-program:foo]
        socket=tcp://missingport
        process_name = %(program_name)s_%(process_num)s
        command = /bin/foo
        numprocs = 2
        priority = 1
        r   rÌ  rë  rì  r   r   r   Ú%test_fcgi_program_bad_tcp_sock_format&  rð  z8ServerOptionsTests.test_fcgi_program_bad_tcp_sock_formatc                 C   rê  )NzÐ        [fcgi-program:foo]
        socket=unix:///tmp/%(process_num)s.sock
        process_name = %(program_name)s_%(process_num)s
        command = /bin/foo
        numprocs = 2
        priority = 1
        r   rÌ  rë  rì  r   r   r   Ú(test_fcgi_program_bad_expansion_proc_num5  rð  z;ServerOptionsTests.test_fcgi_program_bad_expansion_proc_numc                 C   rê  )Nz…        [fcgi-program:foo]
        socket=tcp://localhost:8000
        socket_owner=nobody:nobody
        command = /bin/foo
        r   rÌ  rë  rì  r   r   r   Ú*test_fcgi_program_socket_owner_set_for_tcpD  ó   
z=ServerOptionsTests.test_fcgi_program_socket_owner_set_for_tcpc                 C   rê  )Nz        [fcgi-program:foo]
        socket = tcp://localhost:8000
        socket_mode = 0777
        command = /bin/foo
        r   rÌ  rë  rì  r   r   r   Ú)test_fcgi_program_socket_mode_set_for_tcpQ  r$  z<ServerOptionsTests.test_fcgi_program_socket_mode_set_for_tcpc                 C   rê  )Nz         [fcgi-program:foo]
        socket = unix:///tmp/foo.sock
        socket_owner = sometotaljunkuserthatshouldnobethere
        command = /bin/foo
        r   rÌ  rë  rì  r   r   r   Ú"test_fcgi_program_bad_socket_owner^  r$  z5ServerOptionsTests.test_fcgi_program_bad_socket_ownerc                 C   rê  )Nz        [fcgi-program:foo]
        socket = unix:///tmp/foo.sock
        socket_mode = junk
        command = /bin/foo
        r   rÌ  rë  rì  r   r   r   Ú!test_fcgi_program_bad_socket_modek  r$  z4ServerOptionsTests.test_fcgi_program_bad_socket_modec                 C   rê  )Nz€        [fcgi-program:foo]
        socket = unix:///tmp/foo.sock
        socket_backlog = -1
        command = /bin/foo
        r   rÌ  rë  rì  r   r   r   Ú$test_fcgi_program_bad_socket_backlogx  r$  z7ServerOptionsTests.test_fcgi_program_bad_socket_backlogc                 C   ó€   t dƒ}ddlm} |ƒ }| |¡ |  ¡ }| |¡}|  t|ƒd¡ |d }|  |jd¡ |  |j	d¡ |  t|j
ƒd¡ d S )Nzµ        [program:one]
        command = /bin/cat

        [program:two]
        command = /bin/cat

        [group:thegroup]
        programs = one,two
        priority = 5
        r   rÌ  r   Úthegroupr  r‚   rÆ  rÈ  r   r   r   Ú-test_heterogeneous_process_groups_from_parser…  s   

z@ServerOptionsTests.test_heterogeneous_process_groups_from_parserc                 C   s¶   t dƒ}ddlm} |ƒ }| |¡ |  ¡ }| |¡}|  t|ƒd¡ |d }|  |jd¡ |  |j	d¡ |  t|j
ƒd¡ |d }|  |jd¡ |  |j	d¡ |  t|j
ƒd¡ d S )	NaJ          [program:one]
        command = /bin/cat

        [program:two]
        command = /bin/cat

        [program:many]
        process_name = %(program_name)s_%(process_num)s
        command = /bin/cat
        numprocs = 2
        priority = 1

        [group:thegroup]
        programs = one,two
        priority = 5
        r   rÌ  r‚   rÅ  r   r*  r  rÆ  )r   rÁ   rÍ  r˜   r°   rÉ  Ú
manyconfigrÊ  r   r   r   Ú&test_mixed_process_groups_from_parser1œ  s   

z9ServerOptionsTests.test_mixed_process_groups_from_parser1c                 C   r)  )NaP          [program:one]
        command = /bin/cat

        [program:two]
        command = /bin/cat

        [program:many]
        process_name = %(program_name)s_%(process_num)s
        command = /bin/cat
        numprocs = 2
        priority = 1

        [group:thegroup]
        programs = one,two, many
        priority = 5
        r   rÌ  r   r*  r  r,  rÆ  rÈ  r   r   r   Ú&test_mixed_process_groups_from_parser2¿  s   

z9ServerOptionsTests.test_mixed_process_groups_from_parser2c                 C   r)  )Naó          [program:one]
        command = /bin/cat

        [fcgi-program:two]
        command = /bin/cat

        [program:many]
        process_name = %(program_name)s_%(process_num)s
        command = /bin/cat
        numprocs = 2
        priority = 1

        [fcgi-program:more]
        process_name = %(program_name)s_%(process_num)s
        command = /bin/cat
        numprocs = 2
        priority = 1

        [group:thegroup]
        programs = one,two,many,more
        priority = 5
        r   rÌ  r   r*  r  r`   rÆ  rÈ  r   r   r   Ú&test_mixed_process_groups_from_parser3Ý  s   

z9ServerOptionsTests.test_mixed_process_groups_from_parser3c                 C   rê  )Nz˜        [program:one]
        command = /bin/cat

        [fcgi-program:one]
        command = /bin/cat

        [group:thegroup]
        programs = oner   rÌ  rë  rì  r   r   r   Ú-test_ambiguous_process_in_heterogeneous_group  s   	

ÿz@ServerOptionsTests.test_ambiguous_process_in_heterogeneous_groupc                 C   rê  )Nzj        [program:one]
        command = /bin/cat

        [group:foo]
        programs = notthere
        r   rÌ  rë  rì  r   r   r   Ú+test_unknown_program_in_heterogeneous_group  s   

ÿz>ServerOptionsTests.test_unknown_program_in_heterogeneous_groupc                 C   s–   t dt ƒ}ddlm} |ƒ }| |¡ |  ¡ }| |dd¡}|  t|ƒd¡ |d }|  |d d¡ |  |d t	j
t ¡ |  |d d	d
dœ¡ d S )Nzv        [rpcinterface:dummy]
        supervisor.rpcinterface_factory = %s
        foo = bar
        baz = qux
        r   rÌ  úsupervisor.rpcinterface_factoryúrpcinterface:r   Údummyr‚   rˆ   Úqux)r‡   r‰   )r   r   r   rÍ  rÕ  r¤   Úget_pluginsrc   rd   ÚsysÚmodules)r   rÁ   rÍ  r˜   r°   Ú	factoriesÚfactoryr   r   r   Útest_rpcinterfaces_from_parser!  s    û
þz1ServerOptionsTests.test_rpcinterfaces_from_parserc                 C   sœ   t dƒ}ddlm} |  ¡ }|ƒ }tddœ|_| |¡ | |dd¡}|  t	|ƒd¡ |d }|  |d d	¡ |  |d t
jt ¡ |  |d
 ddi¡ d S )Nzq        [rpcinterface:dummy]
        supervisor.rpcinterface_factory = %(factory)s
        foo = %(pet)s
        r   rÌ  rm  )r:  Úpetr2  r3  r   r4  r‚   r‡   )r   r   rÍ  r¤   r   rZ  rÕ  r6  rc   rd   r7  r8  )r   rÁ   rÍ  r°   r˜   r9  r:  r   r   r   Ú1test_rpcinterfaces_from_parser_factory_expansions5  s   
þzDServerOptionsTests.test_rpcinterfaces_from_parser_factory_expansionsc              
   C   ó„   t dƒ}ddlm} |ƒ }| |¡ |  ¡ }z| |dd¡ |  d¡ W d S  tyA } z|  |j	d d¡ W Y d }~d S d }~ww )Nz]        [rpcinterface:dummy]
        # note: no supervisor.rpcinterface_factory here
        r   rÌ  r2  r3  rç   zOsection [rpcinterface:dummy] does not specify a supervisor.rpcinterface_factory©
r   r   rÍ  rÕ  r¤   r6  rë   r(   rc   rª   râ  r   r   r   Ú.test_rpcinterfaces_from_parser_factory_missingI  ó   
þ €ÿzAServerOptionsTests.test_rpcinterfaces_from_parser_factory_missingc              
   C   r>  )Nz[        [rpcinterface:dummy]
        supervisor.rpcinterface_factory = nonexistent
        r   rÌ  r2  r3  rç   z:nonexistent cannot be resolved within [rpcinterface:dummy]r?  râ  r   r   r   Ú5test_rpcinterfaces_from_parser_factory_not_importable[  rA  zHServerOptionsTests.test_rpcinterfaces_from_parser_factory_not_importablec           	   
   C   sÆ   t  ¡ }zV|  ¡ }||_d}||_| d|d¡}|d }|d }t|dƒ}t|dƒ}| ¡  |  t	j
 |¡¡ |  t	j
 |¡¡ |  t	j
 |¡¡ | ¡  | ¡  W tj|dd d S tj|dd w )	Nr2  r‡   r…   z.1z.2r×   TrØ   )r•   rÜ   r¤   r>  r=  Úget_autochildlog_namerÝ   Úclear_autochildlogdirrt  rn   rµ   rô  r  rß   rà   )	r   Údnr°   ÚsidÚlogfnÚfirstÚsecondÚf1Úf2r   r   r   Útest_clear_autochildlogdirm  s$   


"z-ServerOptionsTests.test_clear_autochildlogdirc                 C   s4   |   ¡ }d|_tƒ |_| ¡  |  |jjdg¡ d S )Nz!/tmp/this/cant/possibly/existjjjjzCould not clear childlog dir)r¤   r>  r	   rÿ  rD  rc   r.  r¯   r   r   r   Ú*test_clear_autochildlogdir_listdir_oserror‚  s
   z=ServerOptionsTests.test_clear_autochildlogdir_listdir_oserrorc                 C   sš   t  ¡ }|  ¡ }||_|j}tj |d| ¡}t|dƒ}| 	d¡ W d   ƒ n1 s,w   Y  dd„ }||_
tƒ |_| ¡  |  |jjd| g¡ d S )Nzcat-stdout---%s-ayWAp9.logr×   Úlogc                  W   s
   t tjƒ‚r'   )rø  rõ   ÚENOENTr©   r   r   r   Úraise_oserror‘  r¥   zSServerOptionsTests.test_clear_autochildlogdir_unlink_oserror.<locals>.raise_oserrorzFailed to clean up '%s')r•   rÜ   r¤   r>  r=  rn   rµ   r¶   rÝ   rÞ   Úremover	   rÿ  rD  rc   r.  )r   ré   r°   Úidentr–  r—   rP  r   r   r   Ú)test_clear_autochildlogdir_unlink_oserror‰  s   ÿ
ÿz<ServerOptionsTests.test_clear_autochildlogdir_unlink_oserrorc                    sh   t ƒ }|  ¡ }dd„ }||_g ‰ ‡ fdd„}||_| |¡ |  tˆ ƒd¡ d}|  ˆ d  |¡¡ d S )Nc                 S   ó   t  tj¡‚r'   )r@  rs   rõ   Ú
EADDRINUSE©r3  r   r   r   Úraise_eaddrinuse  r  zhServerOptionsTests.test_openhttpservers_reports_friendly_usage_when_eaddrinuse.<locals>.raise_eaddrinusec                    r¾  r'   rw   r¿  rÁ  r   r   rÃ  ¢  rÄ  zdServerOptionsTests.test_openhttpservers_reports_friendly_usage_when_eaddrinuse.<locals>.record_usager   z$Another program is already listeningr   )	r   r¤   Úmake_http_serversrÇ  Úopenhttpserversrc   rd   r   r‘   )r   r3  r°   rW  rÃ  rO  r   rÁ  r   Ú;test_openhttpservers_reports_friendly_usage_when_eaddrinuse™  s   
zNServerOptionsTests.test_openhttpservers_reports_friendly_usage_when_eaddrinusec                    sj   t ƒ }|  ¡ }dd„ }||_g ‰ ‡ fdd„}||_| |¡ |  tˆ ƒd¡ dtj }|  ˆ d |¡ d S )Nc                 S   rT  r'   )r@  rs   rõ   ÚEPERMrV  r   r   r   rX  ¯  r  zbServerOptionsTests.test_openhttpservers_reports_socket_error_with_errno.<locals>.make_http_serversc                    r¾  r'   rw   r¿  rÁ  r   r   rÃ  ´  rÄ  z]ServerOptionsTests.test_openhttpservers_reports_socket_error_with_errno.<locals>.record_usager   zBCannot open an HTTP server: socket.error reported errno.EPERM (%d)r   )	r   r¤   rX  rÇ  rY  rc   rd   rõ   r[  ©r   r3  r°   rX  rÃ  rO  r   rÁ  r   Ú4test_openhttpservers_reports_socket_error_with_errno«  s   
ÿzGServerOptionsTests.test_openhttpservers_reports_socket_error_with_errnoc                    ód   t ƒ }|  ¡ }dd„ }||_g ‰ ‡ fdd„}||_| |¡ |  tˆ ƒd¡ d}|  ˆ d |¡ d S )Nc                 S   s
   t  d¡‚)Nzuh oh)r@  rs   rV  r   r   r   rX  Â  r¥   z^ServerOptionsTests.test_openhttpservers_reports_other_socket_errors.<locals>.make_http_serversc                    r¾  r'   rw   r¿  rÁ  r   r   rÃ  Ç  rÄ  zYServerOptionsTests.test_openhttpservers_reports_other_socket_errors.<locals>.record_usager   z7Cannot open an HTTP server: socket.error reported uh ohr   ©r   r¤   rX  rÇ  rY  rc   rd   r\  r   rÁ  r   Ú0test_openhttpservers_reports_other_socket_errors¾  s   
zCServerOptionsTests.test_openhttpservers_reports_other_socket_errorsc                    r^  )Nc                 S   s   t dƒ‚)Núnot prefixed with help)r(   rV  r   r   r   rX  Õ  s   zWServerOptionsTests.test_openhttpservers_reports_value_errors.<locals>.make_http_serversc                    r¾  r'   rw   r¿  rÁ  r   r   rÃ  Ú  rÄ  zRServerOptionsTests.test_openhttpservers_reports_value_errors.<locals>.record_usager   ra  r   r_  r\  r   rÁ  r   Ú)test_openhttpservers_reports_value_errorsÑ  s   
z<ServerOptionsTests.test_openhttpservers_reports_value_errorsc                 C   s0   t ƒ }|  ¡ }dd„ }||_|  t|j|¡ d S )Nc                 S   s   t ‚r'   )ÚOverflowErrorrV  r   r   r   rX  ç  s   zgServerOptionsTests.test_openhttpservers_does_not_catch_other_exception_types.<locals>.make_http_servers)r   r¤   rX  rC   rc  rY  )r   r3  r°   rX  r   r   r   Ú9test_openhttpservers_does_not_catch_other_exception_typesã  s   ÿzLServerOptionsTests.test_openhttpservers_does_not_catch_other_exception_typesc                 C   s"   |   ¡ }| d ¡}|  |d¡ d S )NzNo user specified to setuid to!©r¤   Údrop_privilegesrc   ©r   r°   r“   r   r   r   Útest_drop_privileges_user_noneð  s   
z1ServerOptionsTests.test_drop_privileges_user_nonerõ  )r‡   Né   é"   )r  z	os.getuidri  c                 C   s&   |   ¡ }| t ¡ ¡}|  |d ¡ d S r'   )r¤   rf  rn   Úgetuidrc   rg  r   r   r   Ú&test_drop_privileges_nonroot_same_userõ  s   z9ServerOptionsTests.test_drop_privileges_nonroot_same_user)r‡   Né7   rj  c                 C   s"   |   ¡ }| d¡}|  |d¡ d S )Nri   z$Can't drop privilege as nonroot userre  rg  r   r   r   Ú+test_drop_privileges_nonroot_different_userü  s   
z>ServerOptionsTests.test_drop_privileges_nonroot_different_userc                 C   s>   |   ¡ }dd„ |_tƒ |_| ¡  |jj ¡  |jj ¡  d S )Nc                   S   s   d S r'   r   r   r   r   r   r}     s    zYServerOptionsTests.test_daemonize_notifies_poller_before_and_after_fork.<locals>.<lambda>)r¤   Ú
_daemonizer   r  Ú	daemonizeÚbefore_daemonizeÚassert_called_once_withÚafter_daemonizer¯   r   r   r   Ú4test_daemonize_notifies_poller_before_and_after_fork  s   
zGServerOptionsTests.test_daemonize_notifies_poller_before_and_after_forkN)r   r    r!   r   r¤   r  r¼   rÂ   rÄ   rÈ   ro  rv  ry  rî   rÿ   r~  r€  r  r‚  rƒ  rŒ  r˜  rš  r  r¥  r©  r¬  r±  r´  rº  r½  rÈ  rÉ  rË  rØ  rÙ  rÜ  rÞ  rß  râ  rä  ræ  rè  ré  rê  rö  rù  rü  r  r  r  r  r   r   r  r  r  r%  r'  r)  r*  r/  r5  r6  r:  rø  r<  rM  rP  rW  rX  r\  r^  r_  ra  rd  rg  rh  rj  rÖ   r—  r  rž  r¦  r¨  r­  r±  r³  r·  r¹  rº  r¼  r½  r¾  r¿  rÀ  rÁ  rÂ  rÃ  rÄ  rË  rÓ  rß  rã  rå  rè  ré  rí  rï  r  r  r  r  r   r!  r"  r#  r%  r&  r'  r(  r+  r-  r.  r/  r0  r1  r;  r=  r@  rB  rL  rM  rS  rZ  r]  r`  rb  rd  rh  rl  rn  rt  r   r   r   r   r	  º  s"    D		##	


	

	


2'(%$.4Y@#$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	dd„ Z
dd„ Zdd„ ZdS )ÚProcessConfigTestsc                 C   r   )Nr   )ÚProcessConfig)r   rv  )r   rv  r   r   r   r     r   z"ProcessConfigTests._getTargetClassc                 O   óD   i }dD ]}|||< qdD ]}d||< q|  |¡ |  ¡ |i |¤ŽS ©N)r5   rJ  r4  r5  rH  rK  rL  rN  rO  rP  rQ  rG  rH  rc  rT  Ústderr_capture_maxbytesÚstderr_events_enabledrf  rR  rU  rV  rW  r|   rI  rF  )rZ  rX  Ústderr_logfile_backupsÚstderr_logfile_maxbytesr!  ©r*   r   ©r   ÚargÚkwÚdefaultsr5   r   r   r   r¤     ó   



zProcessConfigTests._makeOnec                 C   s,   t ƒ }| j|d d}|  | ¡ | ¡ ¡ d S )N©rF  ©r
   r¤   rc   Úget_path©r   r?   r°   r   r   r   Ú.test_get_path_env_is_None_delegates_to_options#  s   zAProcessConfigTests.test_get_path_env_is_None_delegates_to_optionsc                 C   s0   t ƒ }| j|ddid}|  | ¡ | ¡ ¡ d S )Nr¢  rÕ  rƒ  r„  r†  r   r   r   Ú8test_get_path_env_dict_with_no_PATH_delegates_to_options(  s   zKProcessConfigTests.test_get_path_env_dict_with_no_PATH_delegates_to_optionsc                 C   sD   t ƒ }| j|ddid}|  | ¡ | ¡ ¡ |  | ¡ g d¢¡ d S )Nr]  z/a:/b:/crƒ  )z/az/bz/c)r
   r¤   ÚassertNotEqualr…  rc   r†  r   r   r   Ú(test_get_path_env_dict_with_PATH_uses_it-  s   z;ProcessConfigTests.test_get_path_env_dict_with_PATH_uses_itc                 C   sT   t ƒ }|  |¡}ddlm} ||_||_| ¡  |  |j|j¡ |  |j|j¡ d S )Nr   )r]  )	r
   r¤   r<   r]  rQ  rT  Úcreate_autochildlogsrc   Útempfile_name)r   r?   r°   r]  r   r   r   Útest_create_autochildlogs3  s   
z,ProcessConfigTests.test_create_autochildlogsc                 C   sD   t ƒ }|  |¡}| ¡ }ddlm} |  |j|¡ |  |jd ¡ d S )Nr   ©Ú
Subprocess©r
   r¤   Úmake_processÚsupervisor.processr  rc   r  rœ  ©r   r?   r°   Úprocessr  r   r   r   Útest_make_process=  s   
z$ProcessConfigTests.test_make_processc                 C   óF   t ƒ }|  |¡}| d¡}ddlm} |  |j|¡ |  |jd¡ d S )NrQ   r   rŽ  r  r“  r   r   r   Útest_make_process_with_groupE  ó   

z/ProcessConfigTests.test_make_process_with_groupc           
   	   C   s"  t ƒ }|  |¡}t ¡ {}t ¡ ^}|j|_|j|_d|_t|ƒ}| 	|¡\}}|  
|d jd¡ ddlm} |  
|d j|¡ |  
|d d¡ |  
|d jd¡ ddlm}	 |  
|d j|	¡ |  
|d d¡ W d   ƒ n1 srw   Y  W d   ƒ d S W d   ƒ d S 1 sŠw   Y  d S )	NFr  r…   r   ©ÚProcessCommunicationStdoutEventé   r„   ©ÚProcessCommunicationStderrEvent)r
   r¤   r•   r–   r5   rQ  rT  rI  r   Úmake_dispatchersrc   ÚchannelÚsupervisor.eventsrš  Ú
event_typer  ©
r   r?   r°   rQ  rT  Úprocess1Údispatchersr$  rš  r  r   r   r   Ú+test_make_dispatchers_stderr_not_redirectedM  s2   


ÿÿñÿ"ÿz>ProcessConfigTests.test_make_dispatchers_stderr_not_redirectedc                 C   sŽ   t ƒ }|  |¡}t ¡ 1}|j|_t|ƒ}| |¡\}}|  |d j	d¡ |  |d d¡ |  |d d ¡ W d   ƒ d S 1 s@w   Y  d S )Nr  r…   r„   )
r
   r¤   r•   r–   r5   rQ  r   rž  rc   rŸ  )r   r?   r°   rQ  r£  r¤  r$  r   r   r   Ú'test_make_dispatchers_stderr_redirectedb  s   

"úz:ProcessConfigTests.test_make_dispatchers_stderr_redirectedN)r   r    r!   r   r¤   r‡  rˆ  rŠ  r  r•  r—  r¥  r¦  r   r   r   r   ru    s    
ru  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚEventListenerConfigTestsc                 C   r   )Nr   )ÚEventListenerConfig)r   r¨  )r   r¨  r   r   r   r   n  r   z(EventListenerConfigTests._getTargetClassc                 O   rw  rx  r}  r~  r   r   r   r¤   r  r‚  z!EventListenerConfigTests._makeOnec           
   	   C   sJ  t ƒ }|  |¡}t ¡ }t ¡ r}|j|_|j|_d|_t|ƒ}| 	|¡\}}|  
|d jd¡ |  
|d jd¡ |  
|d jd¡ ddlm} |  
|d jj|j¡ |  
|d d¡ |  
|d jd	¡ dd
lm}	 |  
|d j|	¡ |  
|d	 d¡ W d   ƒ n1 s†w   Y  W d   ƒ d S W d   ƒ d S 1 sžw   Y  d S )NFr,  r  r  r…   r   )ÚEventListenerStatesr›  r„   rœ  )r
   r¤   r•   r–   r5   rQ  rT  rI  r   rž  rc   rŸ  r  Úsupervisor.statesr©  r”  Úlistener_stateÚACKNOWLEDGEDr   r  r¡  )
r   r?   r°   rQ  rT  r£  r¤  r$  r©  r  r   r   r   Útest_make_dispatchers…  s6   


ÿÿïÿ"ÿz.EventListenerConfigTests.test_make_dispatchersN)r   r    r!   r   r¤   r­  r   r   r   r   r§  m  s    r§  c                   @   ó4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚFastCGIProcessConfigTestsc                 C   r   )Nr   ró  )r   rô  )r   rô  r   r   r   r   ž  r   z)FastCGIProcessConfigTests._getTargetClassc                 O   rw  rx  r}  r~  r   r   r   r¤   ¢  r‚  z"FastCGIProcessConfigTests._makeOnec                 C   s"   t ƒ }|  |¡}|  t|j¡ d S r'   )r
   r¤   rC   ÚNotImplementedErrorr‘  r†  r   r   r   r•  µ  s   
z+FastCGIProcessConfigTests.test_make_processc                 C   r–  )NrQ   r   )ÚFastCGISubprocess)r
   r¤   r‘  r’  r±  rc   r  rœ  )r   r?   r°   r”  r±  r   r   r   r—  º  r˜  z6FastCGIProcessConfigTests.test_make_process_with_groupc           
   	   C   sF  t ƒ }|  |¡}t ¡ }t ¡ p}|j|_|j|_d|_t|ƒ}| 	|¡\}}|  
|d jd¡ |  
|d jd¡ |  
|d jd¡ ddlm} |  
|d j|¡ |  
|d d¡ |  
|d	 jd
¡ ddlm}	 |  
|d	 j|	¡ |  
|d
 d	¡ W d   ƒ n1 s„w   Y  W d   ƒ d S W d   ƒ d S 1 sœw   Y  d S )NFr,  r  Tr  r…   r   r™  r›  r„   rœ  )r
   r¤   r•   r–   r5   rQ  rT  rI  r   rž  rc   rŸ  r  r   rš  r¡  r  r¢  r   r   r   r­  Â  s6   


ÿÿïÿ"ÿz/FastCGIProcessConfigTests.test_make_dispatchersN)r   r    r!   r   r¤   r•  r—  r­  r   r   r   r   r¯    s    r¯  c                   @   r®  )ÚProcessGroupConfigTestsc                 C   r   )Nr   )ÚProcessGroupConfig)r   r³  )r   r³  r   r   r   r   Ú  r   z'ProcessGroupConfigTests._getTargetClassc                 C   s   |   ¡ ||||ƒS r'   r¢   )r   r?   r5   rH  rK  r   r   r   r¤   Þ  ó   z ProcessGroupConfigTests._makeOnec                 C   sR   t ƒ }|  |ddg ¡}|  |j|¡ |  |jd¡ |  |jd¡ |  |jg ¡ d S )NÚwhateverrÿ  )r
   r¤   rc   r?   r5   rH  rI  r†  r   r   r   Ú	test_ctorá  s   z!ProcessGroupConfigTests.test_ctorc                 C   sB   t ƒ }t|ddƒg}|  |dd|¡}| ¡  |  |d jd¡ d S )Nr£  ú/bin/process1rµ  rÿ  r   T©r
   r   r¤   Úafter_setuidrc   Úautochildlogs_created©r   r?   rK  r°   r   r   r   Útest_after_setuidé  s
   z)ProcessGroupConfigTests.test_after_setuidc                 C   sJ   t ƒ }t|ddƒg}|  |dd|¡}| ¡ }ddlm} |  |j|¡ d S )Nr£  r·  rµ  rÿ  r   )ÚProcessGroup)r
   r   r¤   Ú
make_groupr’  r½  rc   r  )r   r?   rK  r°   rœ  r½  r   r   r   Útest_make_groupð  s   z'ProcessGroupConfigTests.test_make_groupN)r   r    r!   r   r¤   r¶  r¼  r¿  r   r   r   r   r²  Ù  s    r²  c                   @   ó,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚEventListenerPoolConfigTestsc                 C   r   )Nr   )ÚEventListenerPoolConfig)r   rÂ  )r   rÂ  r   r   r   r   ù  r   z,EventListenerPoolConfigTests._getTargetClassc                 C   s   |   ¡ |||||||ƒS r'   r¢   )r   r?   r5   rH  rI  Úbuffer_sizeÚpool_eventsrÑ  r   r   r   r¤   ý  s   þz%EventListenerPoolConfigTests._makeOnec              	   C   sH   t ƒ }t|ddƒg}|  |dd|dg d ¡}| ¡  |  |d jd¡ d S )Nr£  r·  r5   rÿ  r   r   Tr¸  r»  r   r   r   r¼    s
   z.EventListenerPoolConfigTests.test_after_setuidc              	   C   sP   t ƒ }t|ddƒg}|  |dd|dg d ¡}| ¡ }ddlm} |  |j|¡ d S )Nr£  r·  r5   rÿ  r   r   )ÚEventListenerPool)r
   r   r¤   r¾  r’  rÅ  rc   r  )r   r?   rK  r°   rœ  rÅ  r   r   r   r¿  
  s   z,EventListenerPoolConfigTests.test_make_groupN)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S )ÚFastCGIGroupConfigTestsc                 C   r   )Nr   rñ  )r   rò  )r   rò  r   r   r   r     r   z'FastCGIGroupConfigTests._getTargetClassc                 O   ó   |   ¡ |i |¤ŽS r'   r¢   ©r   rª   r€  r   r   r   r¤     r´  z FastCGIGroupConfigTests._makeOnec                 C   sj   t ƒ }tdƒ}|  |ddg |¡}|  |j|¡ |  |jd¡ |  |jd¡ |  |jg ¡ |  |j|¡ d S ©Nr`   rµ  rÿ  )	r
   r   r¤   rc   r?   r5   rH  rI  r  )r   r?   Úsock_configr°   r   r   r   r¶    s   z!FastCGIGroupConfigTests.test_ctorc                 C   sZ   t ƒ }tdƒ}|  |ddg |¡}tdƒ}|  |ddg |¡}|  ||k¡ |  ||k¡ d S rÉ  ©r
   r   r¤   r   rt  ©r   r?   Úsock_config1Ú	instance1Úsock_config2Ú	instance2r   r   r   Útest_same_sockets_are_equal$  ó   z3FastCGIGroupConfigTests.test_same_sockets_are_equalc                 C   sZ   t ƒ }tdƒ}|  |ddg |¡}tdƒ}|  |ddg |¡}|  ||k¡ |  ||k¡ d S )Nr`   rµ  rÿ  r›  rË  rÌ  r   r   r   Útest_diff_sockets_are_not_equal/  rÒ  z7FastCGIGroupConfigTests.test_diff_sockets_are_not_equalc                 C   sF   t ƒ }tdƒ}|  |ddg |¡}| ¡ }ddlm} |  |j|¡ d S )Nr`   r5   rÿ  r   )ÚFastCGIProcessGroup)r
   r   r¤   r¾  r’  rÔ  rc   r  )r   r?   rÊ  r°   rœ  rÔ  r   r   r   r¿  :  s   z'FastCGIGroupConfigTests.test_make_groupN)	r   r    r!   r   r¤   r¶  rÑ  rÓ  r¿  r   r   r   r   rÆ    s    
rÆ  c                   @   rÀ  )
ÚSignalReceiverTestsc                 C   s&   ddl m} |ƒ }|  | ¡ d ¡ d S )Nr   ©ÚSignalReceiver)r   r×  rc   r°  ©r   r×  Úsrr   r   r   Útest_returns_None_initiallyC  s   z/SignalReceiverTests.test_returns_None_initiallyc                 C   sf   ddl m} |ƒ }| tjd¡ | tjd¡ |  | ¡ tj¡ |  | ¡ tj¡ |  | ¡ d ¡ d S ©Nr   rÖ  Úframe)r   r×  r®  rS  r[  r¯  rc   r°  rØ  r   r   r   Ú&test_returns_signals_in_order_receivedH  s   z:SignalReceiverTests.test_returns_signals_in_order_receivedc                 C   sT   ddl m} |ƒ }| tjd¡ | tjd¡ |  | ¡ tj¡ |  | ¡ d ¡ d S rÛ  )r   r×  r®  rS  r[  rc   r°  rØ  r   r   r   Ú%test_does_not_queue_duplicate_signalsQ  s   z9SignalReceiverTests.test_does_not_queue_duplicate_signalsc                 C   sv   ddl m} |ƒ }| tjd¡ |  | ¡ tj¡ |  | ¡ d ¡ | tjd¡ |  | ¡ tj¡ |  | ¡ d ¡ d S rÛ  )r   r×  r®  rS  r[  rc   r°  r¯  rØ  r   r   r   Ú%test_queues_again_after_being_emptiedY  s   z9SignalReceiverTests.test_queues_again_after_being_emptiedN)r   r    r!   rÚ  rÝ  rÞ  rß  r   r   r   r   rÕ  B  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	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 )"ÚUnhosedConfigParserTestsc                 C   r   )Nr   rÌ  )r   rÍ  )r   rÍ  r   r   r   r   d  r   z(UnhosedConfigParserTests._getTargetClassc                 O   rÇ  r'   r¢   rÈ  r   r   r   r¤   h  r´  z!UnhosedConfigParserTests._makeOnec                 C   s6   |   ¡ }| d¡ ddlm} |  |j|jdd¡ d S )Nú[supervisord]
r   )ÚConfigParserr3  Úmissing)r¤   rÕ  r‘  râ  rC   ÚNoOptionErrorÚsaneget)r   r¤  râ  r   r   r   Útest_saneget_no_defaultk  s   
ÿz0UnhosedConfigParserTests.test_saneget_no_defaultc                 C   s2   |   ¡ }| d¡ |jdddd}|  |d¡ d S )Nrá  r3  rã  rQ   ©r4   ©r¤   rÕ  rå  rc   ©r   r¤  Úresultr   r   r   Útest_saneget_with_defaultr  ó   
z2UnhosedConfigParserTests.test_saneget_with_defaultc                 C   s<   |   ¡ }ddi|_| d¡ |jdddd}|  |d¡ d S )Nr<  rÏ  rá  r3  r‡   ú%(pet)srç  ©r¤   rZ  rÕ  rå  rc   ré  r   r   r   Ú$test_saneget_with_default_and_expandx  s
   

z=UnhosedConfigParserTests.test_saneget_with_default_and_expandc                 C   s>   |   ¡ }ddi|_| d¡ |jddddd}|  |d¡ d S )	Nr<  rÏ  rá  r3  r‡   rí  F)r4   Ú	do_expandrî  ré  r   r   r   Ú#test_saneget_with_default_no_expand  s   

ÿz<UnhosedConfigParserTests.test_saneget_with_default_no_expandc                 C   s2   |   ¡ }| d¡ |jdddd}|  |d¡ d S )Nú[supervisord]
foo=%(pet)s
r3  r‡   F)rð  rí  rè  ré  r   r   r   Ú!test_saneget_no_default_no_expand‡  rì  z:UnhosedConfigParserTests.test_saneget_no_default_no_expandc                 C   s8   |   ¡ }ddi|_| d¡ | dd¡}|  |d¡ d S )Nr<  rÏ  rò  r3  r‡   rî  ré  r   r   r   Ú(test_saneget_expands_instance_expansions  s
   

zAUnhosedConfigParserTests.test_saneget_expands_instance_expansionsc                 C   s@   |   ¡ }ddi|_| d¡ |jddddid}|  |d¡ d S )Nr<  rÏ  rò  r3  r‡   rm  )rZ  rî  ré  r   r   r   Ú#test_saneget_expands_arg_expansions”  s   

ÿz<UnhosedConfigParserTests.test_saneget_expands_arg_expansionsc                 C   s.   |   ¡ }| d|j ¡ |  | d¡d¡ d S )Nz[%s]
foo=bar
r‡   rˆ   )r¤   rÕ  Ú	mysectionrc   Ú
getdefault©r   r¤  r   r   r   Ú+test_getdefault_does_saneget_with_mysectionœ  s   zDUnhosedConfigParserTests.test_getdefault_does_saneget_with_mysectionc                 C   sf   |   ¡ }tjdd}| d¡ | ¡  | |j¡}W d   ƒ n1 s$w   Y  |  ||jg¡ d S ©Nrz  r{  ú[foo]
©r¤   r•   r–   rÞ   r}  r2  r5   rc   ©r   r¤  r—   Úok_filenamesr   r   r   Útest_read_filenames_as_string¡  s   
ýz6UnhosedConfigParserTests.test_read_filenames_as_stringc                 C   sh   |   ¡ }tjdd}| d¡ | ¡  | |jg¡}W d   ƒ n1 s%w   Y  |  ||jg¡ d S rú  rü  rý  r   r   r   Útest_read_filenames_as_list©  s   
ýz4UnhosedConfigParserTests.test_read_filenames_as_listc                 C   s€   t j t j t¡d¡}|  ¡ }tjdd}| d¡ | 	¡  | 
||jg¡}W d   ƒ n1 s1w   Y  |  ||jg¡ d S )Nræ   rz  r{  rû  )rn   rµ   r¶   ré   rê   r¤   r•   r–   rÞ   r}  r2  r5   rc   )r   ræ   r¤  r—   rþ  r   r   r   Ú3test_read_returns_ok_filenames_like_rawconfigparser±  s   
ýzLUnhosedConfigParserTests.test_read_returns_ok_filenames_like_rawconfigparserc                 C   s   |   ¡ }|  |ji ¡ d S r'   )r¤   rc   Úsection_to_filerø  r   r   r   Ú)test_read_section_to_file_initially_emptyº  s   zBUnhosedConfigParserTests.test_read_section_to_file_initially_emptyc                 C   sl   |   ¡ }tjdd}| d¡ | ¡  | |jg¡ W d   ƒ n1 s%w   Y  |  |jd |j¡ d S )Nrz  r{  rû  r‡   ©	r¤   r•   r–   rÞ   r}  r2  r5   rc   r  )r   r¤  r—   r   r   r   Ú'test_read_section_to_file_read_one_file¾  s   
ýz@UnhosedConfigParserTests.test_read_section_to_file_read_one_filec              	   C   sÂ   |   ¡ }tjdd9}tjdd#}| d¡ | ¡  | d¡ | ¡  | |j|jg¡ W d   ƒ n1 s7w   Y  W d   ƒ n1 sFw   Y  |  |jd |j¡ |  |jd |j¡ d S )Nrz  r{  rû  z[bar]
r‡   rˆ   r  )r   r¤  rJ  rK  r   r   r   Ú-test_read_section_to_file_read_multiple_filesÆ  s   

û€ÿzFUnhosedConfigParserTests.test_read_section_to_file_read_multiple_filesN)r   r    r!   r   r¤   ræ  rë  rï  rñ  ró  rô  rõ  rù  rÿ  r   r  r  r  r  r   r   r   r   rà  c  s"    	rà  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚUtilFunctionsTestsc                 C   s4   ddl m} |  |ddƒd¡ |  |ddƒd¡ d S )Nr   )Úmake_namespecrœ  r”  zgroup:process)r   r  rc   )r   r  r   r   r   Útest_make_namespecÓ  s   z%UtilFunctionsTests.test_make_namespecc                 C   sT   ddl m} |}|  |dƒd¡ |  |dƒd¡ |  |dƒd¡ |  |d	ƒd¡ d S )
Nr   )Úsplit_namespeczprocess:group)r”  rœ  r”  )r”  r”  zgroup:)rœ  Nzgroup:*)r   r
  rc   )r   r
  r»   r   r   r   Útest_split_namespecØ  s   z&UtilFunctionsTests.test_split_namespecN)r   r    r!   r	  r  r   r   r   r   r  Ò  s    r  c                   C   s   t  tjt ¡S r'   )ÚunittestÚfindTestCasesr7  r8  r   r   r   r   r   Ú
test_suiteà  rû   r  Ú__main__)ÚdefaultTest)+Ú__doc__rn   r7  r•   r@  r  rS  rß   rõ   r›  r‘  r   r   rç  r   r   r   Úsupervisor.loggersr   r   r	   r
   r   r   r   r   r   ÚTestCaser   rŸ   r	  ru  r§  r¯  r²  rÁ  rÆ  rÕ  rà  r  r  r   Úmainr   r   r   r   Ú<module>   s|     h 7                      gb0<0!oÿ