o
    iE                     @   s  d dl Z d dlZd dlZd dlmZ 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$ 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0e1Z2G dd dZ3de4e5e5f d ej6e5 fd!d"Z7dS )#    N)Path)	APIClient)CITag)DEFAULT_SERVICE_NAME)ITRSkippingLevel)get_env_tags)Git)GitTag)BackendConnectorSetup)get_platform_tags)AttemptToFixHandler)AutoTestRetriesHandler)EarlyFlakeDetectionHandler)RetryHandler)TestProperties)TelemetryAPI)SuiteRef)Test)
TestModule)TestRef)TestSession)	TestSuite)TestTag)
Codeowners)asbool)TestCoverageWriter)TestOptWriterc                   @   s4  e Zd ZdeddfddZd*ddZd*dd	Zd*d
dZ	d+dede	de
jee	e	f  defddZd*ddZdede
jegdf de
jegdf de
jegdf deeeef f
ddZdede
je fddZdeddfddZde	fddZd*d d!Zdedefd"d#Zdefd$d%Zd*d&d'Zd*d(d)ZdS ),SessionManagersessionreturnNc                 C   s  t  | _t| jd| _t | _| jtj	 }rt
|| _nt
 | _t | _t | _t | _d | _tj| _|  tjd}|rHd| _|| _nd| _t| jpQt| _ttdd| _tdtdd | _| jd u rr| j  | _t!| j| j| j| j| j| j| jd	| _"| j"# | _$| %  | &  | j$j'r| j"( nt | _)| j$j*j+r| j", ni | _-| .  | j$j/r| j"0 \| _| _nt | _d | _| j$j1r| j"# | _$| j"2  g | _3t4| jd| _5t6| jd| _7|| _8| j89| j | j8j:| j$j/| j$j;| jd
 | j5<d| j | j5<d| j | j5<dt=j>| j8j?t=j@| j8jAt=jB| j8jCt=jD| E t=jF| j8jAt=jG| ji | jrK| jtjkr?dnd}| j5<|d| ji d | _HztItJ| jd| _HW d S  tKyj   tLMd Y d S  tNy{   tLjMddd Y d S w )N)connector_setup
DD_SERVICETF-DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER 
_CI_DD_ENVDD_ENV)serviceenvenv_tagsitr_skipping_levelconfigurationsr    telemetry_api)itr_enabledskipping_enabledskipping_level*testtest_suite_enditr_correlation_id)cwdz CODEOWNERS file is not availablezFailed to load CODEOWNERS)exc_info)Or
   detect_setupr    r   r+   r   r(   getr   WORKSPACE_PATHr   workspace_pathr3   r   platform_tagssetcollected_testsskippable_itemsr2   r   TESTr)   osenvironis_user_provided_servicer&   _get_service_name_from_git_repor   boolgetenvis_auto_injectedr'   default_envr   
api_clientget_settingssettingsoverride_settings_with_env_varsshow_settingsknown_tests_enabledget_known_testsknown_teststest_managementenabledget_test_management_propertiestest_propertiesupload_git_datar,   get_skippable_testsrequire_gitcloseretry_handlersr   writerr   coverage_writerr   set_serviceset_itr_attributesr-   add_metadatar   TEST_COMMANDtest_commandTEST_FRAMEWORKtest_frameworkTEST_FRAMEWORK_VERSIONtest_framework_versionTEST_SESSION_NAME_get_test_session_name	COMPONENTENV
codeownersr   str
ValueErrorlogwarning	Exception)selfr   r8   
dd_service	itr_event ro   \/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/testing/internal/session_manager.py__init__(   s   


	





zSessionManager.__init__c                 C   s   |    | j  d S N)setup_retry_handlersr;   clearrl   ro   ro   rp   finish_collection   s   z SessionManager.finish_collectionc                 C   s   | j jjr| jt|  | j jjrX| jrS| j| j }t	|t	| j }t	|| d }t	|| j jj
ko;|| j jj
k}|rJtd | jd n| jt|  ntd | j jjrg| jt|  d S d S )Nd   z6Not enabling Early Flake Detection: too many new testsfaultyz2Not enabling Early Flake Detection: no known tests)rH   rN   rO   rV   appendr   early_flake_detectionrM   r;   lenfaulty_session_thresholdri   debugr   &set_early_flake_detection_abort_reasonr   auto_test_retriesr   )rl   	new_teststotal_testsnew_tests_percentageis_faulty_sessionro   ro   rp   rs      s$   




z#SessionManager.setup_retry_handlersc                 C   s$   | j   | j  t| j d S rr   )rW   startrX   atexitregisterfinishru   ro   ro   rp   r      s   

zSessionManager.startcoverage_report_bytescoverage_formattagsc              
   C   sJ   z| j |||}|W S  ty$ } ztd| W Y d}~dS d}~ww )a  
        Upload a coverage report to Datadog CI Intake.

        This creates a temporary API client connection to upload the coverage report.

        Args:
            coverage_report_bytes: The coverage report content (will be gzipped by the API client)
            coverage_format: The format of the report (lcov, cobertura, jacoco, clover, opencover, simplecov)
            tags: Optional additional tags to include in the event

        Returns:
            True if upload succeeded, False otherwise
        z#Error uploading coverage report: %sNF)rF   upload_coverage_reportrk   ri   rj   )rl   r   r   r   resultero   ro   rp   r      s   z%SessionManager.upload_coverage_reportc                 C   sB   t | j | j  | j  | j  | j  | j  d S rr   )r   
unregisterr   rW   signal_finishrX   r+   wait_finishru   ro   ro   rp   r      s   



zSessionManager.finishtest_refon_new_moduleon_new_suiteon_new_testc                 C   s(  | j |jjj\}}|r#z|| W n ty"   td| Y nw ||jj\}}|rDz|| W n tyC   td| Y nw ||j\}}|rz1|  o_t	| j
dko_|| j
v}	| j|pht }
|j|	|
j|
j|
jd || | | W n ty   td| Y nw |||fS )ar  
        Return the module, suite and test objects for a given test reference, creating them if necessary.

        When a new module, suite or test is discovered, the corresponding `on_new_*` callback is invoked. This can be
        used to perform test framework specific initialization (such as setting pathnames from data colleced by the
        framework).
        z#Error during discovery of module %sz"Error during discovery of suite %sr   )is_newis_quarantinedis_disabledis_attempt_to_fixz!Error during discovery of test %s)r   get_or_create_childsuitemodulenamerk   ri   rj   has_parametersr{   rM   rQ   r6   r   set_attributesquarantineddisabledattempt_to_fix_set_codeowners)rl   r   r   r   r   test_modulecreated
test_suiter0   r   rQ   ro   ro   rp   discover_test   s>   "
zSessionManager.discover_testc                 C   sN   | j j|jjj}|sd S |j|jj}|sd S |j|j}|s%d S |S rr   )r   childrenr6   r   r   r   )rl   r   r   r   r0   ro   ro   rp   get_test  s   zSessionManager.get_testr0   c                 C   s|   | j sd S | }|std| d S ztt|| j}W n ty0   td| |}Y nw | j 	|}|
| d S )Nz%Could not get source file for test %sz'Could not get repo relative path for %r)rf   get_source_fileri   r}   rg   r   relative_tor8   rh   ofset_codeowners)rl   r0   source_filerepo_relative_pathrf   ro   ro   rp   r     s   zSessionManager._set_codeownersc                 C   s@   t jd }r
|S | jtj }r| d| jj S | jjS )NDD_TEST_SESSION_NAME-)r>   r?   r6   r(   r   JOB_NAMEr   r]   )rl   session_namejob_namero   ro   rp   rc   (  s
   z%SessionManager._get_test_session_namec                 C   s  t  }| }| j|}tt|t| }t|dkr$td d S |	 rX|
 dkrXtd | }|rStd | }| j|}tt|t| }ntd |j||d}d}d}||D ]}	| j|	}
|
d ur|||
7 }|d7 }qht || d S )	Nr   z=All latest commits found in backend, skipping metadata upload)      r   z@Shallow repository detected on git > 2.27 detected, unshallowingzVUnshallow successful, getting latest commits from backend based on unshallowed commitsz<Failed to unshallow repository, continuing to send pack data)excluded_commitsincluded_commits   )r   get_latest_commitsrF   get_known_commitslistr:   r{   ri   r}   is_shallow_repositoryget_git_version$try_all_unshallow_repository_methodsrj   get_filtered_revisionspack_objectssend_git_pack_filer   r6   record_git_pack_data)rl   gitlatest_commitsbackend_commitscommits_not_in_backendunshallow_successfulrevisions_to_senduploaded_filesuploaded_bytespackfilenbytesro   ro   rp   rR   1  s8   



zSessionManager.upload_git_datac                 C   s"   | j jsdS || jv p|j| jv S )NF)rH   r-   r<   r   )rl   r   ro   ro   rp   is_skippable_testW  s   z SessionManager.is_skippable_testc                 C   s
   | j d uS rr   )rf   ru   ro   ro   rp   has_codeowners]  s   
zSessionManager.has_codeownersc                 C   s   t tjddstd d| j_t tjdds%td d| jj_	t tjdds8td d| jj
_	t tjd	d
rJtd d| j_t tjdd
r\td d| j_t tjdd
rptd d| j_d S d S )NDD_CIVISIBILITY_ITR_ENABLEDtruez8Test Impact Analysis is disabled by environment variableF-DD_CIVISIBILITY_EARLY_FLAKE_DETECTION_ENABLEDz9Early Flake Detection is disabled by environment variable#DD_CIVISIBILITY_FLAKY_RETRY_ENABLEDz5Auto Test Retries is disabled by environment variable*_DD_CIVISIBILITY_ITR_PREVENT_TEST_SKIPPINGfalsez5TIA test skipping is disabled by environment variable*_DD_CIVISIBILITY_ITR_FORCE_ENABLE_COVERAGEz?TIA code coverage collection is enabled by environment variableT3DD_CIVISIBILITY_CODE_COVERAGE_REPORT_UPLOAD_ENABLEDz>Code coverage report upload is enabled by environment variable)r   r>   r?   r6   ri   r}   rH   r,   rz   rO   r   r-   coverage_enabledcoverage_report_upload_enabledru   ro   ro   rp   rI   `  s&   







z.SessionManager.override_settings_with_env_varsc                 C   sv   t d| j| j t d| jj| jj| jj t d| jjj	 t d| jj
 t d| jjj	 t d| jj d S )NzService: %s (env: %s)z`Test Optimization settings: Test Impact Analysis: %s, test skipping: %s, coverage collection: %sz=Test Optimization settings: Early Flake Detection enabled: %sz3Test Optimization settings: Known Tests enabled: %sz9Test Optimization settings: Auto Test Retries enabled: %sz>Test Optimization settings: Coverage Report Upload enabled: %s)ri   infor&   r'   rH   r,   r-   r   rz   rO   rK   r   r   ru   ro   ro   rp   rJ     s    
zSessionManager.show_settings)r   Nrr   )__name__
__module____qualname__r   rq   rv   rs   r   bytesrg   tOptionaldictrB   r   r   r   Callabler   r   r   tupler   r   r   rc   rR   r   r   rI   rJ   ro   ro   ro   rp   r   '   sF    
f




/
	&
r   r(   r   c                 C   s2   |  tj}|rtd| }r|d S d S )Nz.*/([^/]+)(?:.git)/?r   )r6   r	   REPOSITORY_URLrematchgrouplower)r(   	repo_namemro   ro   rp   rA     s   rA   )8r   loggingr>   pathlibr   r   typingr   #ddtrace.testing.internal.api_clientr   ddtrace.testing.internal.cir   "ddtrace.testing.internal.constantsr   r   !ddtrace.testing.internal.env_tagsr   ddtrace.testing.internal.gitr   r	   ddtrace.testing.internal.httpr
   !ddtrace.testing.internal.platformr   'ddtrace.testing.internal.retry_handlersr   r   r   r   &ddtrace.testing.internal.settings_datar   "ddtrace.testing.internal.telemetryr   "ddtrace.testing.internal.test_datar   r   r   r   r   r   r   #ddtrace.testing.internal.tracer_apir   ddtrace.testing.internal.utilsr   ddtrace.testing.internal.writerr   r   	getLoggerr   ri   r   r   rg   r   rA   ro   ro   ro   rp   <module>   sJ    
  $m