o
    iF6                     @   s*  U 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 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 eeZG dd dZdZej ej!ej"ej#ej$ej%ej&ej!iZ'e(ee)f e*d< 	d:dedej+de(e)e
f dede,f
ddZ-d e j.j/d!e0e
 fd"d#Z1dej+d!efd$d%Z2	&d;d e j.j/d'e)d(e)d)e)d*e0e) d+e0e) d,e)d-e,fd.d/Z3	d:d e j.j/d0e)d1e)d*e0e) d+e0e) d,e)d2e,fd3d4Z4d e j.j/fd5d6Z5d7e
d!e	fd8d9Z6dS )<    N)RetryOutcomes)RetryReason)UserProperty)_get_outcome_from_retry)_get_retry_attempt_string)%_pytest_report_teststatus_return_type)pytest_TestReport)PYTEST_STATUS)	TestPhase)_get_test_id_from_item)_TestOutcome)get_user_property)TestId)
TestStatus)
get_logger)EFDTestStatus)InternalTest)InternalTestSessionc                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	_EFD_RETRY_OUTCOMESdd_efd_attempt_passeddd_efd_attempt_faileddd_efd_attempt_skippeddd_efd_final_passeddd_efd_final_faileddd_efd_final_skippeddd_efd_final_flakyN)
__name__
__module____qualname__EFD_ATTEMPT_PASSEDEFD_ATTEMPT_FAILEDEFD_ATTEMPT_SKIPPEDEFD_FINAL_PASSEDEFD_FINAL_FAILEDEFD_FINAL_SKIPPEDEFD_FINAL_FLAKY r&   r&   ^/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/pytest/_efd_utils.pyr      s    r   flaky_FINAL_OUTCOMESFtest_iditemtest_reportstest_outcomeis_quarantinedc                 C   sX  | tj}| tj}| tj}|r4|jtjkrtj	|_
n|jtjkr*tj|_
n
|jtjkr4tj|_
t| drAtd d S t| drNtd d S |jtjkr_|r[tj|_
ntj|_
|jj|d |ro|jj|d t|}t| d}	t|j|jdd |jD tj|	t| |jtjtj ftj!|j"fg d	}
|jj|
d |jj|d d S )
Nz_dd.ci.efd_setup_failedzOTest item %s failed during setup, will not be retried for Early Flake Detectionz_dd.ci.efd_teardown_failedzRTest item %s failed during teardown, will not be retried for Early Flake Detection)reportfailure_longreprc                 S   s   i | ]}|d qS )   r&   ).0kr&   r&   r'   
<dictcomp>`       z&efd_handle_retries.<locals>.<dictcomp>)nodeidlocationkeywordswhenlongreproutcomeuser_properties)#getr
   SETUPCALLTEARDOWNstatusr   FAILr   r    r;   PASSr   SKIPr!   r   get_taglogdebugihookpytest_runtest_logreport_efd_do_retries	stash_getr   r6   r7   r8   r)   r<   r   RETRY_REASONr   EARLY_FLAKE_DETECTIONRETRY_FINAL_OUTCOMEvalue)r*   r+   r,   r-   r.   setup_reportcall_reportteardown_reportefd_outcomer:   final_reportr&   r&   r'   efd_handle_retries/   sP   






rU   terminalreporterreturnc                 C   s   |  tjS )N)
getreportsr   r    )rV   r&   r&   r'   efd_get_failed_reportso   s   rY   c                 C   s   t | }ttjtjtjtjtjd}t| t|r:tj	|dd}t
| ||}t|||j|j|j t|st|}|S )N)PASSEDFAILEDSKIPPEDXFAILXPASST)start_immediately)r   r   r   r   r    r!   r   finishefd_should_retryefd_add_retryr   efd_finish_retryrA   skip_reasonexc_infoefd_get_final_status)r+   r*   outcomes	retry_numretry_outcomeefd_final_statusr&   r&   r'   rJ   s   s$   
	


	rJ   T
status_keystatus_textreport_outcomeraw_stringsmarkedup_stringscolordelete_reportsc                 C   s  |  |}|di}	|r}t| d| }
||
 || jj|
fi |	ddi | jd| fi |	ddi |D ]8}| jj| fi |	 d|j }| | ||_	| j
|g D ]
}|j|jkri nq_| j
|g | q<|r| j
|= d S d S d S )NT bold_)rX   lenappend_twmarkup	write_sepupperr6   
write_liner;   statsr=   
setdefault)rV   rk   rl   rm   rn   ro   rp   rq   reportsmarkup_kwargstextr/   lineexisting_reportsr&   r&   r'   _efd_write_report_for_status   s*   


" $
r   reports_keyreports_textrs   c           
      C   sh   |  |}|di}|rd|d< |r2t| d| }	||	 || jj|	fi | | j|= d S d S )NTrs   rr   )rX   ru   rv   rw   rx   r|   )
rV   r   r   rn   ro   rp   rs   r~   r   failed_attempts_textr&   r&   r'   _efd_prepare_attempts_strings   s   
	
r   c              
      s  | j ddddd g }g }t| tjdtj||dd t| tjdtj||d	d t| tjd
tj	||dd t| t
t
t
||ddd dd | jt
g D  | jdg }|ra fdd|D | jd< g }g }t| tjd||ddd t| tjd||d	 t| tjd
||d d|}d|}|r|| jjdddd| | jjddd 7 }|dd| d7 }|| jjdddd7 }|dr|d d }| j ddddd |r| j d|| jjt|t|  ddd nt r| j ddddd  n	| j dd!ddd | j dddd d S )"N=zDatadog Early Flake DetectionT)purplers   failedred)rp   passedgreenskippedyellowF)rp   rq   c                 S   s   h | ]}|j qS r&   r6   r2   r/   r&   r&   r'   	<setcomp>   r5   z9efd_pytest_terminal_summary_post_yield.<locals>.<setcomp>c                    s   g | ]	}|j  vr|qS r&   r   r   flaky_node_idsr&   r'   
<listcomp>   s    z:efd_pytest_terminal_summary_post_yield.<locals>.<listcomp>)rs   z. z, z (total attempts: )r   ) z[0mrt   z%Datadog Early Flake Detection summaryrr   )	fullwidthr   rs   z;No tests were retried because too many were considered new.)r   rs   z!No Early Flake Detection results.)ry   r   r   r#   r	   r[   r"   rZ   r$   r\   _EFD_FLAKY_OUTCOMEr|   r=   r   r    r   r!   joinrw   rx   endswithr   ru   r   efd_is_faulty_session)rV   raw_summary_stringsmarkedup_summary_stringspassed_reportsraw_attempt_stringsmarkedup_attempts_stringsraw_summary_stringmarkedup_summary_stringr&   r   r'   &efd_pytest_terminal_summary_post_yield   s   


	
	

r   r/   c                 C   s$  | j tjkrtjddt|  dddiffS | j tjkr,tjddt|  dddiffS | j tjkrBtjd	dt|  d
ddiffS t| tjt	j
krt| tj}|tjjkratjddddiffS |tjjkrqtjddddiffS |tjjkrtjddddiffS |tjjkrtddddiffS d S )Nrz
EFD RETRY rZ   r   TRr[   r   sr\   .zEFD FINAL STATUS: PASSEDFzEFD FINAL STATUS: FAILEDr   SzEFD FINAL STATUS: SKIPPEDKzEFD FINAL STATUS: FLAKY)r;   r   r   r   r    r!   r   r   rL   r   rM   rN   r   ALL_PASSrO   r"   ALL_FAILr#   ALL_SKIPr$   FLAKYr   )r/   rS   r&   r&   r'   efd_get_teststatusB  s4   r   )F)T)7_pytestpytest,ddtrace.contrib.internal.pytest._retry_utilsr   r   r   r   r   &ddtrace.contrib.internal.pytest._typesr   r   &ddtrace.contrib.internal.pytest._utilsr	   r
   r   r   r   1ddtrace.ext.test_visibility._test_visibility_baser   ddtrace.ext.test_visibility.apir   ddtrace.internal.loggerr   ,ddtrace.internal.test_visibility._efd_mixinsr   $ddtrace.internal.test_visibility.apir   r   r   rF   r   r   r   rZ   r   r[   r   r\   r   r)   dictstr__annotations__ItemboolrU   terminalTerminalReporterlistrY   rJ   r   r   r   r   r&   r&   r&   r'   <module>   s   
 


@$
&
 