o
    S۷i/                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dl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 zd dlZW n eyc   dZY nw G dd de jZG dd de jZdS )    N)ProcessStates)SupervisorStates)DummyOptions)DummyPConfig)DummyPGroupConfig)DummyProcess)DummyProcessGroup)DummyDispatcher)StringIOc                   @   s0   e Zd Zdd Zerdd Zdd Zdd Zd	S )
EntryPointTestsc           	   	   C   s   ddl m} tjtjtjtdd}t }dd |_	t
j}z,t }tj|d}tj|d}|t
_|d	|d
|d|dgdd W |t
_t| n	|t
_t| w | }| d|v | d S )Nr   mainfixturesdonothing.confc                   S      dS N    r   r   r   W/home/ubuntu/vllm_env/lib/python3.10/site-packages/supervisor/tests/test_supervisord.py<lambda>#       z5EntryPointTests.test_main_noprofile.<locals>.<lambda>logpid-c-l-j-nTargstestzsupervisord startedsupervisor.supervisordr   ospathjoinabspathdirname__file__r
   filenosysstdouttempfilemkdtempshutilrmtreegetvalue
assertTrue	selfr   conf
new_stdout
old_stdouttempdirr   r   outputr   r   r   test_main_noprofile   s,   
z#EntryPointTests.test_main_noprofilec           	   	   C   s   ddl m} tjtjtjtdd}t }dd |_	t
j}z-t }tj|d}tj|d}|t
_|d	|d
|d|ddgdd W |t
_t| n	|t
_t| w | }| d|v | d S )Nr   r   r   r   c                   S   r   r   r   r   r   r   r   r   9   r   z3EntryPointTests.test_main_profile.<locals>.<lambda>r   r   r   r   r   r   z"--profile_options=cumulative,callsTr   zcumulative time, call countr    r1   r   r   r   test_main_profile3   s0   
z!EntryPointTests.test_main_profilec           	   	   C   s   ddl m} tjtjtjtdd}t }dd |_	t
j}z,t }tj|d}tj|d}|t
_|d	|d
|d|dgdd W |t
_t| n	|t
_t| w | }| t|d d S )Nr   r   r   r   c                   S   r   r   r   r   r   r   r   r   N   r   z1EntryPointTests.test_silent_off.<locals>.<lambda>r   r   r   r   r   r   Tr   )r!   r   r"   r#   r$   r%   r&   r'   r
   r(   r)   r*   r+   r,   r-   r.   r/   assertGreaterlenr1   r   r   r   test_silent_offH   s(   
zEntryPointTests.test_silent_offc           	   	   C   s   ddl m} tjtjtjtdd}t }dd |_	t
j}z-t }tj|d}tj|d}|t
_|d	|d
|d|ddgdd W |t
_t| n	|t
_t| w | }| t|d d S )Nr   r   r   r   c                   S   r   r   r   r   r   r   r   r   c   r   z0EntryPointTests.test_silent_on.<locals>.<lambda>r   r   r   r   r   r   z-sTr   )r!   r   r"   r#   r$   r%   r&   r'   r
   r(   r)   r*   r+   r,   r-   r.   r/   assertEqualr;   r1   r   r   r   test_silent_on]   s(   
zEntryPointTests.test_silent_onN)__name__
__module____qualname__r8   pstatsr9   r<   r>   r   r   r   r   r      s    r   c                   @   sD  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	d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)dOS )PSupervisordTestsc                 C   s   ddl m} |  d S )Nr   )clear)supervisor.eventsrD   )r2   rD   r   r   r   tearDowns   s   
zSupervisordTests.tearDownc                 C   s   ddl m} |S )Nr   )
Supervisor)r!   rG   )r2   rG   r   r   r   _getTargetClassw   s   z SupervisordTests._getTargetClassc                 C   s   |   |S N)rH   )r2   optionsr   r   r   _makeOne{   s   zSupervisordTests._makeOnec                 C   s  t  }t|ddd}t|d|gdg}||_d|_d|_| |}|  | |j	d | |j
d | |jdg | |jg  | |jdg | |jd | t|jd	 | |jd jj| | |jd | |jd | |jd | |jd | |jd d S )
Nfoo/bin/foo/tmppconfigsTFsetuid_calledrlimits_setr   )r   r   r   process_group_configsr   firstrK   r   r=   fds_cleaned_uprR   parse_criticalsparse_warningsparse_infosautochildlogdir_clearedr;   process_groupsconfigrJ   httpservers_openedsignals_set
daemonizedpidfile_written
cleaned_upr2   rJ   pconfiggconfigssupervisordr   r   r   test_main_first~   s.   
z SupervisordTests.test_main_firstc                 C   s  t  }t|ddd}t|d|gdg}||_d|_d|_| |}|  | |j	d | 
t|d | |jdg | |jg  | |jg  | |jd | t|jd	 | |jd jj| | |jd | |jd | |jd | |jd | |jd d S )
NrL   rM   rN   rO   TFrR   rQ   r   )r   r   r   rS   r   rT   rK   r   r=   rU   assertFalsehasattrrV   rW   rX   rY   r;   rZ   r[   rJ   r\   r]   r^   r_   r`   ra   r   r   r   test_main_notfirst   s.   
z#SupervisordTests.test_main_notfirstc                 C   sl   t  }d|_t|ddd}t|}d|_d|_d |_d|_d|i|_| 	|}|j
dd	 | |jd d S )
Nr   r   processrM   rN   FTNNr   oncer   waitpid_returnr   r   drainedkillinglaststop
waitstatus
pidhistoryrK   reapr=   finishedr2   rJ   rb   rj   rd   r   r   r   	test_reap      

zSupervisordTests.test_reapc                 C   s.   t  }| |}|jddd}| |d  d S )NTd   )rm   recursionguard)r   rK   ru   r=   )r2   rJ   rd   resultr   r   r   test_reap_recursionguard   s   
z)SupervisordTests.test_reap_recursionguardc                 C   sl   t  }d|_t|ddd}t|}d|_d|_d |_d|_d|i|_| 	|}|j
d	d
 | |jd d S )Nri   rj   rM   rN   FTrk   r   c   )r{   rn   rw   r   r   r   test_reap_more_than_once   ry   z)SupervisordTests.test_reap_more_than_oncec                 C   s   t  }d|_t|ddd}t|}d|_d|_d |_d|_d|i|_| 	|}|j
dd	 | |jd  | |jjd
 d d S )N)   r   rj   rM   rN   FTrk   r   rl   r   z$reaped unknown pid 2 (exit status 0))r   ro   r   r   rp   rq   rr   rs   rt   rK   ru   r=   rv   loggerdatarw   r   r   r   test_reap_unknown_pid   s   

z&SupervisordTests.test_reap_unknown_pidc                 C   J   t  }tj|_| |}|  | |jjt	j
 | |jjd d d S )Nr   z(received SIGTERM indicating exit request)r   signalSIGTERM_signalrK   handle_signalr=   rJ   moodr   SHUTDOWNr   r   r2   rJ   rd   r   r   r   test_handle_sigterm      

z$SupervisordTests.test_handle_sigtermc                 C   r   )Nr   z'received SIGINT indicating exit request)r   r   SIGINTr   rK   r   r=   rJ   r   r   r   r   r   r   r   r   r   test_handle_sigint   r   z#SupervisordTests.test_handle_sigintc                 C   r   )Nr   z(received SIGQUIT indicating exit request)r   r   SIGQUITr   rK   r   r=   rJ   r   r   r   r   r   r   r   r   r   test_handle_sigquit   r   z$SupervisordTests.test_handle_sigquitc                 C   s\   t  }tj|_| |}| |jjtj	 |
  | |jjtj | |jjd d d S )Nr   z*received SIGHUP indicating restart request)r   r   SIGHUPr   rK   r=   rJ   r   r   RUNNINGr   
RESTARTINGr   r   r   r   r   r   #test_handle_sighup_in_running_state  s   


z4SupervisordTests.test_handle_sighup_in_running_statec                 C   sf   t  }tj|_| |}tj|j_| 	|jjtj |
  | 	|jjtj | 	|jjd d d S )Nr   z@ignored SIGHUP indicating restart request (shutdown in progress))r   r   r   r   rK   r   r   rJ   r   r=   r   r   r   r   r   r   r   $test_handle_sighup_in_shutdown_state  s   



z5SupervisordTests.test_handle_sighup_in_shutdown_statec                 C   sP   t  }tj|_| |}|  | |jjt	j
 d}| |jjd |v  d S )N)z(received SIGCHLD indicating a child quitz'received SIGCLD indicating a child quitr   )r   r   SIGCHLDr   rK   r   r=   rJ   r   r   r   r0   r   r   )r2   rJ   rd   msgsr   r   r   test_handle_sigchld  s   

z$SupervisordTests.test_handle_sigchldc                 C   s   t  }tj|_t|ddd}t|tjd}t d |_	| 
|}t|dddg}t|d|d|_t|}d |i|_|  | |jjtj | |jd | |jjd	 d
 | |jd d S )Nprocess1rM   rN   )stater   rL   rO   Tr   z.received SIGUSR2 indicating log reopen request)r   r   SIGUSR2r   r   r   r   STOPPINGtimedelayrK   r   rS   r   rZ   r   r=   rJ   r   r   r   logs_reopenedr   r   )r2   rJ   pconfig1r   rd   rP   dummypgroupr   r   r   test_handle_sigusr2(  s,   


z$SupervisordTests.test_handle_sigusr2c                 C   r   )Nr   z#received SIGUSR1 indicating nothing)r   r   SIGUSR1r   rK   r   r=   rJ   r   r   r   r   r   r   r   r   r   test_handle_unknown_signal=  r   z+SupervisordTests.test_handle_unknown_signalc                 C   s&   t  }| |}| | tj d S rI   )r   rK   r=   	get_stater   r   r   r   r   r   test_get_stateG  s   
zSupervisordTests.test_get_statec                 C   sp   t  }| |}t|ddd}t|d|gd}|g|j_| \}}}| ||g | |g  | |g  d S )Nr   rM   rN   group1rO   )r   rK   r   r   rJ   rS   diff_to_activer=   )r2   rJ   rd   rb   r   addedchangedremovedr   r   r   &test_diff_to_active_finds_groups_addedL  s   

z7SupervisordTests.test_diff_to_active_finds_groups_addedc           	      C   s   t  }| |}t|ddd}t|d|gd}t|ddd}t|d|gd}||g|j_|| || |g|j_| \}}}| |g  | |g  | ||g d S )	Nr   z/bin/process1rN   r   rO   process2z/bin/process2group2)	r   rK   r   r   rJ   rS   add_process_groupr   r=   )	r2   rJ   rd   rb   r   r   r   r   r   r   r   r   (test_diff_to_active_finds_groups_removed[  s   



z9SupervisordTests.test_diff_to_active_finds_groups_removedc                    s~  ddl m m t | } fdd}fdd}|dddd	}|d
|g}|dd}|d|g}||g}|dddd	}|d
|g}|dd}|d|g}	|| ||	 ||j_| \}
}}| 	|
g  | 	|g  | 	||g t | }|dd}|dd}|d
||g}|g}||d
|g ||j_| \}
}}| 	|
g  | 	|g  | 	||g d S )Nr   )ProcessConfigProcessGroupConfigc                       i 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 d}| |  fi |S Nnamecommand	directoryumaskpriorityi  	autostartTautorestart	startsecs
   startretriesuidstdout_logfilestdout_capture_maxbytesr   stdout_events_enabledFstdout_logfile_backupsstdout_logfile_maxbytesstdout_syslogstderr_logfile)r   )stderr_capture_maxbytesstderr_events_enabledstderr_logfile_backupsstderr_logfile_maxbytesstderr_syslogredirect_stderr
stopsignalstopwaitsecsstopasgroupkillasgroup	exitcodesenvironment	serverurlupdater   r   paramsr|   )r   rJ   r   r   make_pconfigw  ^   
zBSupervisordTests.test_diff_to_active_changed.<locals>.make_pconfigc                    s    | d|S )N   r   )r   rP   )r   rJ   r   r   make_gconfig     zBSupervisordTests.test_diff_to_active_changed.<locals>.make_gconfigr   new)r   r   r   r   old)
supervisor.optionsr   r   r   rK   r   rJ   rS   r   r=   )r2   rd   r   r   rb   r   r   r   group3group4r   r   r   r   pconfig2r   )r   r   rJ   r   test_diff_to_active_changedq  sB   







z,SupervisordTests.test_diff_to_active_changedc                    s  ddl m ddlm m t | } fdd}fdd}dfd	d
	}|dd}|d}|d|g|}|dd}|d}|d|g|}||g}	|dd}|d}|d|g|}
|dd}|d}|d|g|}||
 || |	|j_	|
 \}}}| |g  | |g  | ||g t | }|dd}|d}|d|g|}|dd}|d}|d|g|}||g}	|dd}|d}|d|g|}
|dd}|d}|d|g|}||
 || |	|j_	|
 \}}}| |g  | |g  | ||g t | }|dd}|d}|d|g|d}|dd}|d}|d|g|}||g}	|dd}|d}|d|g|d}
|dd}|d}|d|g|}||
 || |	|j_	|
 \}}}| |g  | |g  | ||g d S )Nr   
EventTypes)EventListenerConfigEventListenerPoolConfigc                    r   r   r   r   )r   rJ   r   r   r     r   zPSupervisordTests.test_diff_to_active_changed_eventlistener.<locals>.make_pconfigc                     s$   g }| D ]}| t |d  q|S rI   )appendgetattr)pool_event_namesr|   pool_event_namer   r   r   make_econfig  s   zPSupervisordTests.test_diff_to_active_changed_eventlistener.<locals>.make_econfig&supervisor.dispatchers:default_handlerc                    s    | d|d||S )Nr   r   r   )r   rP   pool_eventsresult_handler)r   rJ   r   r   r     s   zPSupervisordTests.test_diff_to_active_changed_eventlistener.<locals>.make_gconfigr   zprocess1-newTICK_60r   r   	TICK_3600r   zprocess1-oldTICK_5znew-result-handlerzold-result-handler)r   )rE   r   r   r   r   r   rK   r   rJ   rS   r   r=   )r2   rd   r   r   r   rb   econfigr   r   r   r   r   r   r   r   r   )r   r   r   rJ   r   )test_diff_to_active_changed_eventlistener  s   




















z:SupervisordTests.test_diff_to_active_changed_eventlistenerc                 C   s   t  }t|ddd}t|d|gd}|g|_| |}| |ji  ||}| t|j	 dg | 
| |jd }||}| ||jd  | 
|  d S )NrL   rM   rN   rO   )r   r   r   rS   rK   r=   rZ   r   listkeysr0   )r2   rJ   rb   gconfigrd   r|   groupr   r   r   test_add_process_group/  s   




z'SupervisordTests.test_add_process_groupc                    s   ddl m} g   fdd}||j| t }t|ddd}t|d|gd}|g|_| |}|	| d	|_
|  |  d
g d S )Nr   eventsc                         d d S r   r   eventLr   r   callbackD  r   zESupervisordTests.test_add_process_group_emits_event.<locals>.callbackrL   rM   rN   rO   Tr   )
supervisorr   	subscribeProcessGroupAddedEventr   r   r   rS   rK   r   r   
runforeverr=   r2   r   r  rJ   rb   r   rd   r   r  r   "test_add_process_group_emits_eventA  s   

z3SupervisordTests.test_add_process_group_emits_eventc                 C   s   t  }t|ddd}t|d|gd}| |}| t|jd || |jd }|d}| 	|j
 | |ji  | 	| || td g|jd _|d}| t|j dg | 	|  d S )NrL   rM   rN   rO   asdf)r   r   r   rK   assertRaisesKeyErrorremove_process_groupr   rZ   r0   before_remove_calledr=   r   unstopped_processesr   r   )r2   rJ   rb   r   rd   r   r|   r   r   r   test_remove_process_groupS  s    






z*SupervisordTests.test_remove_process_groupc                    s   ddl m} g   fdd}||j| t }t|ddd}t|d|gd}|g|_| |}|	| t
d g|jd _|d d	|_|  |  d
g d S )Nr   r   c                    r   r   r   r   r  r   r   r  k  r   zBSupervisordTests.test_remove_process_group_event.<locals>.callbackrL   rM   rN   rO   Tr   )r  r   r  ProcessGroupRemovedEventr   r   r   rS   rK   r   r   rZ   stopped_processesr  r   r  r=   r  r   r  r   test_remove_process_group_eventh  s   


z0SupervisordTests.test_remove_process_group_eventc                    sZ   ddl m} g   fdd}||j| t }| |}d|_|  |  dg d S )Nr   r   c                    r   r   r   r   r  r   r   r    r   zNSupervisordTests.test_runforever_emits_generic_startup_event.<locals>.callbackTr   )	r  r   r  SupervisorStateChangeEventr   rK   r   r  r=   r2   r   r  rJ   rd   r   r  r   +test_runforever_emits_generic_startup_event|  s   
z<SupervisordTests.test_runforever_emits_generic_startup_eventc                    sZ   ddl m} g   fdd}||j| t }d|_| |}|  |  dg d S )Nr   r   c                    r   )Nr   r   r   r  r   r   r    r   zOSupervisordTests.test_runforever_emits_generic_specific_event.<locals>.callbackTr   )	r  r   r  SupervisorRunningEventr   r   rK   r  r=   r  r   r  r   ,test_runforever_emits_generic_specific_event  s   
z=SupervisordTests.test_runforever_emits_generic_specific_eventc                 C   sF   t  }d|_| |}| t|jd |  | t|jd d S )NTr      )r   r   rK   r=   r;   ticksr  r   r   r   r   test_runforever_calls_tick  s   
z+SupervisordTests.test_runforever_calls_tickc           	      C   s   t  }dgddgf|j_| |}t|dd}t||gd}t|}tdd}tdd	}tdtd
}|||d|_	d|i|_
d|_|  | |jd | |jd | |jd | |jd d S )N         rL   rM   rO   T)readable)writable)r   error)r  r  r  )r   pollerr|   rK   r   r   r   r	   OSErrordispatchersrZ   r   r  r=   transitionedread_event_handledwrite_event_handlederror_handled)	r2   rJ   rd   rb   r   pgroupr  r   r!  r   r   r    test_runforever_poll_dispatchers  s"   



z1SupervisordTests.test_runforever_poll_dispatchersc                 C   s   t  }dgg f|j_| |}t|dd}t||gd}t|}ddlm} t	d|j
d}d|i|_d|i|_d|_| |j
|j d S 	Nr  rL   rM   rO   r   asyncore_25Tr  r!  r   r"  r|   rK   r   r   r   supervisor.medusar-  r	   ExitNowr$  rZ   r   r  r  r2   rJ   rd   rb   r   r)  asyncoreexitnowr   r   r   2test_runforever_select_dispatcher_exitnow_via_read     


zCSupervisordTests.test_runforever_select_dispatcher_exitnow_via_readc                 C   s   t  }g dgf|j_| |}t|dd}t||gd}t|}ddlm} t	d|j
d}d|i|_d|i|_d|_| |j
|j d S r+  r/  r2  r   r   r   3test_runforever_select_dispatcher_exitnow_via_write  r6  zDSupervisordTests.test_runforever_select_dispatcher_exitnow_via_writec                 C   s   t  }dgg f|j_| |}t|dd}t||gd}t|}tdtd}d|i|_	d|i|_
d|_|  | |jd d S Nr  rL   rM   rO   Tr.  r   r"  r|   rK   r   r   r   r	   NotImplementedErrorr$  rZ   r   r  r=   r(  r2   rJ   rd   rb   r   r)  notimplr   r   r   7test_runforever_select_dispatcher_handle_error_via_read     


zHSupervisordTests.test_runforever_select_dispatcher_handle_error_via_readc                 C   s   t  }g dgf|j_| |}t|dd}t||gd}t|}tdtd}d|i|_	d|i|_
d|_|  | |jd d S r8  r9  r;  r   r   r   8test_runforever_select_dispatcher_handle_error_via_write  r>  zISupervisordTests.test_runforever_select_dispatcher_handle_error_via_writec                    s   t  }| |}t|}t|}d|i|_tj|j_g   fdd}ddl	m
} ||j| ddlm} d|_| |j|j | |j | t d |j | t d |j | t d |j | t d |j d S )	NrL   c                         |  d S rI   r   r   r  r   r   r    r   zHSupervisordTests.test_runforever_stopping_emits_events.<locals>.callbackr   r   r,  Tr   )r   rK   r   r   rZ   r   r   rJ   r   r  r   r  r  r0  r-  r   r  r1  r  r0   all_stopped
isinstancer  SupervisorStoppingEvent)r2   rJ   rd   r   r)  r  r   r3  r   r  r   %test_runforever_stopping_emits_events  s$   


z6SupervisordTests.test_runforever_stopping_emits_eventsc                    s   t  }| |}t|dd}t||gd}t|}g   fdd}d|i|_tj|j_	d|j_
ddlm} | |j|j | |jd d S )	NrL   rM   rO   c                      r   r   r   r   r  r   r   r    r   z,SupervisordTests.test_exit.<locals>.callbackTr   r,  )r   rK   r   r   r   rZ   r   r   rJ   r   r   r0  r-  r  r1  r  r=   rA  )r2   rJ   rd   rb   r   r)  r  r3  r   r  r   	test_exit  s   


zSupervisordTests.test_exitc                    s   t  }| |}t|dd}t|}t||gd}t|}|g|_g   fdd}d|i|_tj	|j
_d|j
_|  | |jd d S )NrL   rM   rO   c                      r   r   r   r   r  r   r   r    r   z4SupervisordTests.test_exit_delayed.<locals>.callbackTr   )r   rK   r   r   r   r   r  rZ   r   r   rJ   r   r   r  assertNotEquallastshutdownreport)r2   rJ   rd   rb   rj   r   r)  r  r   r  r   test_exit_delayed  s   


z"SupervisordTests.test_exit_delayedc                 C   s&   ddl m} |tj}| |d d S )Nr   )getSupervisorStateDescriptionr   )supervisor.statesrI  r   r   r=   )r2   rI  r|   r   r   r   "test_getSupervisorStateDescription  s   
z3SupervisordTests.test_getSupervisorStateDescriptionc                    s  ddl m} g   fdd}||j| t }| |}|jdd | |jd d | |jd d | |jd d | t	 d |jd	d | |jd d | |jd d | |jd d | t	 d
 |  d j
|j |jdd | |jd d | |jd d | |jd d | t	 d |  d j
|j |jdd | |jd d | |jd d | |jd d | t	 d	 |  d j
|j d S )Nr   r   c                    r@  rI   r   r   r  r   r   r  %  r   z,SupervisordTests.test_tick.<locals>.callback)now   <   i  r  r   =   r  i  )r  r   r  	TickEventr   rK   tickr=   r  r;   	__class__
Tick5EventTick60EventTick3600Eventr  r   r  r   	test_tick"  s:   
zSupervisordTests.test_tickN)*r?   r@   rA   rF   rH   rK   re   rh   rx   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  r7  r=  r?  rD  rE  rH  rK  rW  r   r   r   r   rC   r   sP    



DzrC   )unittestr   r   r)   r"   r+   r-   rJ  r   r   supervisor.tests.baser   r   r   r   r   r	   supervisor.compatr
   rB   ImportErrorTestCaser   rC   r   r   r   r   <module>   s.    V