o
    8ήc&                      @   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   C/tmp/pip-target-vg8gfxp4/lib/python/numba/tests/test_entrypoints.py__init__      
z_DummyClass.__init__c                 C   s
   d| j  S )Nz_DummyClass(%f, %f)r   r   r   r   r   __repr__   r   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}zT|tj|j< tddd}t jjtdd|fid# dd	l	m
} d
|_|  |j  |  |j  W d    n1 sFw   Y  W |jtjv rYtj|j= d S d S |jtjv rftj|j= w )N_test_numba_extensionr   initz_test_numba_extension:init_funcnumba_extensionsentry_pointsreturn_valuer   entrypointsF)r   Mocksysmodulesr   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di dtdi zt|tj|j< tddd}t j	j
tdd|fid	C d
dlm} d|_tjdd}|  W d    n1 sKw   Y  d}|D ]
}|t|v r^ nqTtd|j  W d    n1 srw   Y  W |jtjv rtj|j= d S d S |jtjv rtj|j= w )N_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 foundr   )r   r"   configure_mock
ValueErrorr#   r$   r   r%   r&   r'   r(   r)   r!   r*   warningscatch_warningsr+   strr,   r-   )r   r.   r/   r!   wbad_strxr   r   r   test_entrypoint_toleranceJ   s@   
z)TestEntrypoints.test_entrypoint_tolerance	RUN_ENTRY_EP_MAGIC_TOKENNzneeds tokenc                    s   dd l   fdd}td}||_zG|tj|j< tddd}t	j
jtdd|fid	 td
d }td}|| W d    n1 sEw   Y  W |jtjv rXtj|j= d S d S |jtjv retj|j= w )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   )r?   	__class__r   r   r      s   zjTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.DummyType.__init__r   r   r   r   __classcell__r   r?   rB   r   r?      s    r?   c                    s     S r   r   )valcrE   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   )typesfloat64rA   r   )r   dmmfe_typemembers)
DummyModelrB   numbar   r   r      s   
zkTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.DummyModel.__init__rC   r   )rO   rP   rF   r   rO      s    rO   c                    st   |j |d} jj| }||j|j}|j ||_|j 	| |j 
 } jj|j|} jj| |dS )Nr   )is_error)pyapiobject_getattr_stringcorecgutilscreate_struct_proxycontextbuilderfloat_as_doubler   decreferr_occurredis_not_null	extendingNativeValue	_getvalue)typobjrH   	value_objdummy_struct_proxydummy_structerr_flagrQ   rP   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   )rT   rU   rV   rW   rX   rR   float_from_doubler   serialize_objectr
   unserializecall_function_objargsrZ   )	r`   rG   rH   rc   rd   rb   serialized_clazz	class_objresrf   r   r   	box_dummy   s   zaTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.box_dummy)rJ   Typer]   typeof_implregisterr
   register_modelmodelsStructModelunboxbox)rI   rg   ro   rf   )rO   r?   r   init_function   s   


zNTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function_test_numba_init_sequencer   z#_test_numba_init_sequence:init_funcr   r   r   c                 S   s   | S r   r   )r;   r   r   r   foo   s   zDTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.foo
   )rP   rJ   
ModuleTyper,   r#   r$   r   r%   r&   r   r'   r(   r   r
   )r   rx   r.   r/   rz   ivalr   rf   r   'test_entrypoint_handles_type_extensionsy   s4   
+

z7TestEntrypoints.test_entrypoint_handles_type_extensionsc                 C   s~   t j|t jt j|d}tt|j}z'|  | \}}|j	dkr-t
d|j	| f | | fW |  S |  w )N)stdoutstderrenvr   z/process failed with code %s: stderr follows
%s
)
subprocessPopenPIPE	threadingTimer_TEST_TIMEOUTkillstartcommunicate
returncodeAssertionErrordecodecancel)r   cmdliner   popentimeoutouterrr   r   r   run_cmd   s"   
zTestEntrypoints.run_cmdc           
      C   sr   t j }t| j|d< | j}t| j}d}d|||f }tj	dd|g}| 
||\}}d}	|	r7t|| d S d S )Nr>   r~   z%s.%s.%sz-mznumba.runtestsF)osenvironcopyr8   r>   r   typer   r#   
executabler   print)
r   env_copythemodtheclsmethnameinjected_methodr   r   r   _DEBUGr   r   r   "test_entrypoint_extension_sequence   s   

z2TestEntrypoints.test_entrypoint_extension_sequence)r   r   r   __doc__r0   r<   r>   unittestskipIfr   r   getr~   r   r   r   r   r   r   r      s    &-
Mr   )r#   r   r   rJ   r6   r   r   r   rP   r   r   numba.tests.supportr   numba.testing.mainr   _RUNNER_TIMEOUT	PYVERSIONr%   	importlibr	   r   r(   r
   r   r   r   r   r   <module>   s"    

