U
    Mh                     @   s   d dl Zd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZ d dlZd dlZejdd Zdd Zdd	 Zd
d Zdd Zdd ZG dd dejjjZdd ZdS )    N)
LazyString)configc               	   c   sN   t jj } t jjt jj  z
d V  W 5 t jj|  t jj  X d S N)torch_logging	_internalZ_get_log_stateZ_set_log_stateZLogState
_init_logs)Z
prev_state r	   W/var/www/html/venv/lib/python3.8/site-packages/torch/testing/_internal/logging_utils.pypreserve_log_state   s    
r   c                 C   sD   t  }tjjtjd| i}|t	  || t
jj  |S )NZ
TORCH_LOGS)
contextlib	ExitStackunittestmockpatchdictosenvironenter_contextr   r   r   r   r   )settings
exit_stackZsettings_patchr	   r	   r
   log_settings   s    
r   c                  K   s&   t  }|t  tjjf |  |S r   )r   r   r   r   r   r   Zset_logs)kwargsr   r	   r	   r
   log_api    s    r   c                     s   dddd g  fdd}|   D ]l\}}t|trD| q&t|trZ||| q&t|tr|dkr|  D ]\}}||| qtq&tdq&d	S )
N+ -)
      (   c                    s>   t | tr2t |tr2| kr2 | |   d S tdd S )NInvalid value for setting)
isinstancestrintappend
ValueError)namelevelZINT_TO_VERBOSITYr   r	   r
   append_setting,   s    z*kwargs_to_settings.<locals>.append_settingmodulesr    ,)itemsr!   boolr$   r#   r   r%   join)r   r)   r&   valZmodule_qnamer'   r	   r(   r
   kwargs_to_settings'   s    


r0   c                     s    fdd}|S )Nc                    s    t ddi fdd}|S )NZfx_graph_cacheFc              
      s   t j  g }tdkr<| |  | | W 5 Q R X n:ttf & | |  | | W 5 Q R X W 5 Q R X t j  |  tf & | |  | | W 5 Q R X W 5 Q R X d S )Nr   )	r   _dynamoresetlen_handler_watcherr   r0   clearr   selfrecords)fnr   r	   r
   test_fnN   s    

z3make_logging_test.<locals>.wrapper.<locals>.test_fn)inductor_configr   r9   r:   r   r9   r
   wrapperM   s    z"make_logging_test.<locals>.wrapperr	   )r   r?   r	   r=   r
   make_logging_testL   s    r@   c                    s    fdd}|S )Nc                    s    fdd}|S )Nc              
      sF   t j  g }t& | |  | | W 5 Q R X W 5 Q R X d S r   )r   r1   r2   r   r4   r6   )r9   r   r	   r
   r:   h   s    
z4make_settings_test.<locals>.wrapper.<locals>.test_fnr	   r<   r   r>   r
   r?   g   s    z#make_settings_test.<locals>.wrapperr	   )r   r?   r	   rA   r
   make_settings_testf   s    
rB   c                       sD   e Zd Ze fddZedd Zdd Zdd Zd	d
 Z  Z	S )LoggingTestCasec                    sX   t    | jtjjtj	ddi | jtjdd | jtjdd d S )NZ___LOG_TESTINGr   z$torch._dynamo.config.suppress_errorsTztorch._dynamo.config.verboseF)
super
setUpClass_exit_stackr   r   r   r   r   r   r   cls	__class__r	   r
   rE   t   s    
zLoggingTestCase.setUpClassc                 C   s&   | j   tjjj  tj  d S r   )rF   closer   r   r   Z	log_stater5   r   rG   r	   r	   r
   tearDownClass   s    
zLoggingTestCase.tearDownClassc                    s   t  fdd|D S )Nc                 3   s   | ]} |  kV  qd S r   )
getMessage).0rmr	   r
   	<genexpr>   s     z,LoggingTestCase.hasRecord.<locals>.<genexpr>)anyr7   r8   rQ   r	   rP   r
   	hasRecord   s    zLoggingTestCase.hasRecordc                    s^   d D ]2 |   kr| jt fddd  qd krZ| d| d  S )Nc                      s   d d  d S )Nzmultiple matching records: z and  among r	   r	   rO   recordr8   r	   r
   <lambda>       z+LoggingTestCase.getRecord.<locals>.<lambda>)msgzdid not find record with rV   )rM   ZassertIsNoner   ZfailrT   r	   rW   r
   	getRecord   s    zLoggingTestCase.getRecordc              	      s   t  }fdd tjjj D ]l}t|}t	|j
}| |dd | |dd |j
D ]0}|j fdd}|tjj|d	| q\q"|S )
Nc                    s     |  d S r   )r$   rX   )record_listr	   r
   emit_post_hook   s    z8LoggingTestCase._handler_watcher.<locals>.emit_post_hook   zgAll pt2 loggers should only have at most two handlers (debug artifacts and messages above debug level).r   z3All pt2 loggers should have more than zero handlersc                    s   |   |  d S r   r	   r]   )r_   old_emitr	   r
   new_emit   s    z2LoggingTestCase._handler_watcher.<locals>.new_emitemit)r   r   r   r   r   Zlog_registryZget_log_qnameslogging	getLoggerr3   handlersZassertLessEqualZassertGreaterrc   r   r   r   r   object)r7   r^   r   Z	log_qnameloggerZnum_handlershandlerrb   r	   )r_   ra   r^   r
   r4      s$    


z LoggingTestCase._handler_watcher)
__name__
__module____qualname__classmethodrE   rL   rU   r\   r4   __classcell__r	   r	   rI   r
   rC   s   s   
rC   c                    s@   t  }tj|d tj fddfdd}||fS )zExample:
    logs_to_string("torch._inductor.compile_fx", "post_grad_graphs")
    returns the output of TORCH_LOGS="post_grad_graphs" from the
    torch._inductor.compile_fx module.
    )streamc               	   3   s4   z"tj} |   d V  W 5 |    X d S r   )removeHandlerr   r   ZgetArtifactLogger
addHandler)rh   )ri   
log_optionmoduler	   r
   tmp_redirect_logs   s
    

z)logs_to_string.<locals>.tmp_redirect_logsc                     s   t  } |   | S r   )r   r   )r   )rr   rt   r	   r
   ctx_manager   s    z#logs_to_string.<locals>.ctx_manager)ioStringIOrd   StreamHandlerr   contextmanager)rs   rr   Z
log_streamru   r	   )ri   rr   rs   rt   r
   logs_to_string   s    rz   )Ztorch._dynamo.test_caser   Zunittest.mockr   r   r   Ztorch._loggingZtorch._logging._internalZtorch._dynamo.utilsr   Ztorch._inductorr   r;   rd   rv   ry   r   r   r   r0   r@   rB   r1   Z	test_caseZTestCaserC   rz   r	   r	   r	   r
   <module>   s$   
	%K