o
    }oi                     @   sV   d dl Z d dlmZmZmZ d dlZd dlZd dlmZ d dl	m
Z
 G dd dZdS )    N)	MagicMockPropertyMockpatch)TrainerPreemptionCallbackc                   @   s   e Zd Zejdd Zejdd Zdd Zdd Zej	
d	g d
dd Zej	
dg ddd Zdd Zdd Zej	
dddgdd ZdS )TestPreemptionCallbackc                 C   s   t  S Nr   self r   e/home/ubuntu/.local/lib/python3.10/site-packages/tests/lightning/pytorch/callbacks/test_preemption.pycallback   s   zTestPreemptionCallback.callbackc                 C   s   t td}d|_|S )N)specF)r   r   should_stop)r   trainerr   r   r   mock_trainer   s   
z#TestPreemptionCallback.mock_trainerc                 C   s,   |j tjksJ |jrJ |jd u sJ d S r	   )sigsignalSIGTERM_interrupted_handler_context)r   r   r   r   r   	test_init%   s   
z TestPreemptionCallback.test_initc                 C   s    t tjd}|jtjksJ d S )N)r   )r   r   SIGUSR1r   )r   custom_callbackr   r   r   test_custom_signal*   s   z)TestPreemptionCallback.test_custom_signalz%initially_supported,becomes_supported))FT)FF)TTc              	   C   s   t td]}t |d>}||g|_||d  ||d d d |r%dn|r)dnd}|j|ks2J |r9|  n|r@|  n|  W d    n1 sNw   Y  W d    d S W d    d S 1 sfw   Y  d S )N_check_preemption_support_preemption_handlerr      )	r   objectr   side_effecton_train_starton_train_batch_start
call_countassert_called_once_withassert_not_called)r   r   r   initially_supportedbecomes_supported
mock_checkmock_handlerexpected_call_countr   r   r   *test_on_train_batch_start_distributed_init.   s$   




PzATestPreemptionCallback.test_on_train_batch_start_distributed_initz!is_supported,interrupted,expected))TTT)TFF)FTF)FFFc                 C   s  t jtd|dt t dW t dt|d> t ddd( t ddd ||_|j|ks0J W d    n1 s:w   Y  W d    n1 sIw   Y  W d    n1 sXw   Y  W d    n1 sgw   Y  W d    d S W d    d S 1 sw   Y  d S )	Nr   )return_valueztorch.distributed.broadcastztorch.tensorztorch.cuda.is_availableTztorch.cuda.current_devicer   )r   r   r   torchtensorr   interrupted)r   r   is_supportedr/   expectedr   r   r   test_interrupted_propertyF   s&   

  P z0TestPreemptionCallback.test_interrupted_propertyc              	   C   s   t jtdtdE}t |d&}d|_||d  |  |  d|_||d  |  W d    n1 s8w   Y  W d    d S W d    d S 1 sPw   Y  d S )Npreemption_supportednew_callabler   TF)	r   r   r   r   r,   r!   assert_called_once
reset_mockr%   )r   r   r   mock_supportedr)   r   r   r   test_on_train_startZ   s   

Pz*TestPreemptionCallback.test_on_train_startc                 C   s,   t  }||_||d  |jd d d  d S r	   )r   r   on_train_end__exit__r$   )r   r   r   mock_contextr   r   r   test_on_train_endk   s   z(TestPreemptionCallback.test_on_train_endr/   TFc              	      s   t jtd fddd:  r.tt ||d d d d W d    n1 s(w   Y  n	||d d d d |j ks>J W d    d S 1 sIw   Y  d S )Nr/   c                      s   t  fddS )Nc                    s    S r	   r   r
   r/   r   r   <lambda>s   s    zRTestPreemptionCallback.test_on_train_batch_end.<locals>.<lambda>.<locals>.<lambda>)propertyr   r>   r   r   r?   s   s    z@TestPreemptionCallback.test_on_train_batch_end.<locals>.<lambda>r4   r   )r   r   r   pytestraises
SystemExiton_train_batch_endr   )r   r   r   r/   r   r>   r   test_on_train_batch_endq   s   "z.TestPreemptionCallback.test_on_train_batch_endN)__name__
__module____qualname__rA   fixturer   r   r   r   markparametrizer+   r2   r9   r=   rE   r   r   r   r   r      s$    



	r   )r   unittest.mockr   r   r   rA   r-   lightning.pytorchr   +nemo.lightning.pytorch.callbacks.preemptionr   r   r   r   r   r   <module>   s   