U
    iâËd&   ã                   @   s¸   d dl Z d dlmZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
 d dlmZ d dlmZ e	jdk r€d dlZnd dlmZ ed ZG d	d
„ d
eƒZG dd„ deƒZdS )é    N)Úmock)ÚconfigÚnjit)ÚTestCase)Ú_TIMEOUT)é   é	   )Úmetadatag      N@c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_DummyClassc                 C   s
   || _ d S ©N©Úvalue)Úselfr   © r   úU/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_entrypoints.pyÚ__init__   s    z_DummyClass.__init__c                 C   s
   d| j  S )Nz_DummyClass(%f, %f)r   ©r   r   r   r   Ú__repr__   s    z_DummyClass.__repr__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r
      s   r
   c                   @   sV   e Zd ZdZdd„ Zdd„ ZdZe e	j
 dd¡ekd	¡d
d„ ƒZdd„ Zdd„ ZdS )ÚTestEntrypointszE
    Test registration of init() functions from Numba extensions
    c              	   C   s¢   t jdd�}zx|tj|j< t ddd¡}t jjtdd|fid��< dd	l	m
} d
|_| ¡  |j ¡  | ¡  |j ¡  W 5 Q R X W 5 |jtjkrœtj|j= X d S )NZ_test_numba_extension©r   Úinitz_test_numba_extension:init_funcÚnumba_extensionsÚentry_points©Zreturn_valuer   ©ÚentrypointsF)r   ÚMockr   ÚsysÚmodulesÚimportlib_metadataÚ
EntryPointÚpatchÚobjectÚ
numba.corer   Ú_already_initializedÚinit_allÚ	init_funcÚassert_called_once)r   ÚmodÚmy_entrypointr   r   r   r   Útest_init_entrypoint$   s*      ÿý
z$TestEntrypoints.test_init_entrypointc              
   C   sâ   t jdd�}|jf dtdƒiŽ z¤|tj|j< t ddd¡}t j	j
tdd|fid	��h d
dlm} d|_tjdd��}| ¡  W 5 Q R X d}|D ]}|t|ƒkr� q®q�tdƒ‚|j ¡  W 5 Q R X W 5 |jtjkrÜtj|j= X d S )NZ_test_numba_bad_extensionr   zinit_func.side_effectÚbrokenr   z#_test_numba_bad_extension:init_funcr   r   r   r   r   FT)Úrecordz2Numba extension module '_test_numba_bad_extension'z"Expected warning message not found)r   r   Zconfigure_mockÚ
ValueErrorr   r    r!   r"   r#   r$   r%   r&   r   r'   ÚwarningsÚcatch_warningsr(   Ústrr)   r*   )r   r+   r,   r   ÚwZbad_strÚxr   r   r   Útest_entrypoint_toleranceJ   s4    ýýz)TestEntrypoints.test_entrypoint_toleranceZ	RUN_ENTRYÚ_EP_MAGIC_TOKENNzneeds tokenc              	      s    dd l ‰ ‡ fdd„}t d¡}||_z^|tj|j< t ddd¡}t	j
jtdd|fid	��" td
d„ ƒ}tdƒ}||ƒ W 5 Q R X W 5 |jtjkrštj|j= X d S )Nr   c                     sŽ   G ‡fdd„dˆj jƒ‰ˆjj t¡‡fdd„ƒ} ˆj ˆ¡G ‡ ‡fdd„dˆjjjƒƒ‰ ˆj 	ˆ¡‡fdd„ƒ}ˆj 
ˆ¡‡fd	d
„ƒ}d S )Nc                       s   e Zd Z‡‡ fdd„Z‡  ZS )zaTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.DummyTypec                    s   t ˆ | ƒjdd� d S )NÚ	DummyType)Úname)Úsuperr   r   )r8   Ú	__class__r   r   r   …   s    zjTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.DummyType.__init__©r   r   r   r   Ú__classcell__r   ©r8   ©r;   r   r8   „   s   r8   c                    s   ˆ ƒ S r   r   )ÚvalÚcr>   r   r   Útyper_DummyClassˆ   s    zhTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.typer_DummyClassc                       s    e Zd Z‡‡ ‡fdd„Z‡  ZS )zbTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.DummyModelc                    s&   dˆj jfg}tˆ | ƒ |||¡ d S )Nr   )ÚtypesZfloat64r:   r   )r   ZdmmZfe_typeÚmembers)Ú
DummyModelr;   Únumbar   r   r   Ž   s    
ÿzkTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.DummyModel.__init__r<   r   )rE   rF   r?   r   rE   Œ   s   rE   c                    st   |j  |d¡}ˆ jj | ¡}||j|jƒ}|j  |¡|_|j  	|¡ |j  
¡ }ˆ jj |j|¡}ˆ jj| ¡ |d�S )Nr   )Úis_error)ÚpyapiZobject_getattr_stringÚcoreÚcgutilsÚcreate_struct_proxyÚcontextÚbuilderZfloat_as_doubler   ÚdecrefZerr_occurredZis_not_nullÚ	extendingZNativeValueZ	_getvalue)ÚtypÚobjrA   Ú	value_objÚdummy_struct_proxyÚdummy_structZerr_flagrG   ©rF   r   r   Úunbox_dummy“   s    
ÿzcTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.unbox_dummyc           	         sn   ˆ j j | ¡}||j|jƒ}|j |j¡}|j t	¡}|j 
|¡}|j ||f¡}|j |¡ |j |¡ |S r   )rI   rJ   rK   rL   rM   rH   Zfloat_from_doubler   Zserialize_objectr
   ZunserializeZcall_function_objargsrN   )	rP   r@   rA   rS   rT   rR   Zserialized_clazzZ	class_objÚresrU   r   r   Ú	box_dummyŸ   s    zaTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.box_dummy)rC   ÚTyperO   Ztypeof_implÚregisterr
   Zregister_modelÚmodelsZStructModelZunboxÚbox)rB   rV   rX   rU   )rE   r8   r   Úinit_function€   s    


zNTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_functionZ_test_numba_init_sequencer   z#_test_numba_init_sequence:init_funcr   r   r   c                 S   s   | S r   r   )r5   r   r   r   Úfoo½   s    zDTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.fooé
   )rF   rC   Ú
ModuleTyper)   r   r    r!   r"   r#   r   r$   r%   r   r
   )r   r]   r+   r,   r^   Zivalr   rU   r   Ú'test_entrypoint_handles_type_extensionsy   s,    +
ýý
z7TestEntrypoints.test_entrypoint_handles_type_extensionsc                 C   s|   t j|t jt j|d�}t t|j¡}zH| ¡  | 	¡ \}}|j
dkrZtd|j
| ¡ f ƒ‚| ¡ | ¡ fW ¢S | ¡  X dS )N)ÚstdoutÚstderrÚenvr   z/process failed with code %s: stderr follows
%s
)NN)Ú
subprocessÚPopenÚPIPEÚ	threadingÚTimerÚ_TEST_TIMEOUTÚkillÚcancelÚstartÚcommunicateÚ
returncodeÚAssertionErrorÚdecode)r   Úcmdlinerd   ÚpopenÚtimeoutÚoutÚerrr   r   r   Úrun_cmdÈ   s$    ý
ÿÿ
zTestEntrypoints.run_cmdc           
      C   sn   t j ¡ }t| jƒ|d< | j}t| ƒj}d}d|||f }tj	dd|g}|  
||¡\}}d}	|	rjt||ƒ d S )Nr7   ra   z%s.%s.%sz-mznumba.runtestsF)ÚosÚenvironÚcopyr3   r7   r   Útyper   r    Ú
executablerw   Úprint)
r   Zenv_copyZthemodZtheclsZmethnameZinjected_methodrr   ru   rv   Ú_DEBUGr   r   r   Ú"test_entrypoint_extension_sequenceÛ   s    

z2TestEntrypoints.test_entrypoint_extension_sequence)r   r   r   Ú__doc__r-   r6   r7   ÚunittestZskipIfrx   ry   Úgetra   rw   r   r   r   r   r   r      s   &-ÿ
Mr   )r    r�   r   rC   r1   rx   re   rh   rF   r   r   Znumba.tests.supportr   Znumba.testing.mainr   Z_RUNNER_TIMEOUTZ	PYVERSIONr"   Ú	importlibr	   rj   r%   r
   r   r   r   r   r   Ú<module>   s    

