o
    iqR                     @  s  d dl mZ d dlZ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 eeZ dZ!dddZ"G dd dZ#dS )    )annotationsN)Path)
EMPTY_NAME)ITRSkippingLevel)GitTag)BackendConnectorSetup)FileAttachment)	Subdomain)Settings)TestProperties)	ErrorType)TelemetryAPI)	ModuleRef)SuiteRef)TestRefi'  returnintc                  C  s\   zt tjdtt} W n ty   tdt t Y S w | dkr,td| t tS | S )z^Max pages for known tests pagination; configurable via _DD_CIVISIBILITY_KNOWN_TESTS_MAX_PAGES.&_DD_CIVISIBILITY_KNOWN_TESTS_MAX_PAGESzIFailed to parse _DD_CIVISIBILITY_KNOWN_TESTS_MAX_PAGES, using default: %sr   zO_DD_CIVISIBILITY_KNOWN_TESTS_MAX_PAGES must be positive (%s), using default: %s)	r   osenvirongetstr_DEFAULT_KNOWN_TESTS_MAX_PAGES
ValueErrorlogwarning)value r   W/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/testing/internal/api_client.py_get_known_tests_max_pages   s"   r   c                   @  sj   e Zd Zd1ddZd2ddZd3ddZd4ddZd5ddZd6ddZd7d#d$Z	d8d&d'Z
	(d9d:d/d0Zd(S );	APIClientservicer   envenv_tagsdict[str, str]itr_skipping_levelr   configurationsconnector_setupr   telemetry_apir   r   Nonec                 C  sD   || _ || _|| _|| _|| _|tj| _|tj	| _
|| _d S N)r!   r"   r#   r%   r&   get_connector_for_subdomainr	   API	connector
CICOVREPRTcoverage_connectorr(   )selfr!   r"   r#   r%   r&   r'   r(   r   r   r   __init__4   s   

zAPIClient.__init__c                 C  s   | j   | j  d S r*   )r-   closer/   )r0   r   r   r   r2   G   s   
zAPIClient.closer
   c                 C  sl  | j jddd dd}z'dtt d| jj| j| j| j	t
j | j	t
j | j	t
j | jddi}W n! tyR } ztd	| |tj t W  Y d }~S d }~ww z| jjd
||d}|  W n ty} } ztd| t W  Y d }~S d }~ww z|jd d }t|}W n! ty } ztd| |tj t W  Y d }~S d }~ww | j | |S )Nzgit_requests.settingszgit_requests.settings_mszgit_requests.settings_errorscountdurationresponse_byteserrordata&ci_app_test_service_libraries_settings)
test_levelr!   r"   repository_urlshabranchr&   idtype
attributesz?Git info not available, cannot fetch settings (missing key: %s)z(/api/v2/libraries/tests/services/setting	telemetryz#Error getting settings from API: %srA   )r(   with_request_metric_namesr   uuiduuid4r%   r   r!   r"   r#   r   REPOSITORY_URL
COMMIT_SHABRANCHr&   KeyErrorr   r   record_errorr   UNKNOWNr
   r-   	post_jsonon_error_raise_exception	Exceptionparsed_responsefrom_attributesBAD_JSONrecord_settings)r0   rC   request_dataeresultrA   settingsr   r   r   get_settingsK   s^   



zAPIClient.get_settingsset[TestRef]c                 C  s|  | j jddddd}d }t }t }t|D ]}|d u ri nd|i}zdtt d| j| j	| j
tj | j|d	d
i}W n# tya } ztd| |tj t W  Y d }~  S d }~ww z| jjd||d}	|	  W n ty } ztd| t W  Y d }~  S d }~ww z{|	jd d }
|
d }| D ]#\}}t|}| D ]\}}t||}|D ]
}|t|| qqq|
d}|sW  ngt|t std |tj! t W   S |d}|sW  nG|d}|s	td|d  |tj! t W   S W q ty$   td |tj! t  Y   S w td| |tj! t S | j "t#| |S )Nzknown_tests.requestzknown_tests.request_mszknown_tests.response_byteszknown_tests.request_errorsr3   
page_stater8   ci_app_libraries_tests_request)r!   r"   r;   r&   	page_infor>   zBGit info not available, cannot fetch known tests (missing key: %s)z/api/v2/ci/libraries/testsrB   z&Error getting known tests from API: %srA   testsr\   z,Known tests response page_info is not a dicthas_nextcursorz9Known tests response missing pagination cursor on page %d   z"Error getting known tests from APIz-Known tests pagination exceeded max pages: %d)$r(   rD   setr   ranger   rE   rF   r!   r"   r#   r   rG   r&   rJ   r   r   rK   r   rL   r-   rM   rN   rO   rP   itemsr   r   addr   r   
isinstancedictrR   record_known_tests_countlen)r0   rC   rZ   known_test_ids	max_pagespage_numberr\   rT   rU   rV   rA   
tests_datamodulesuites
module_refsuiter]   	suite_reftestr^   r   r   r   get_known_tests   s   








zAPIClient.get_known_testsdict[TestRef, TestProperties]c              
   C  s  | j jddddd}z0| jtjp| jtj }| jtjp$| jtj }dt	t
 d| jtj ||dd	i}W n  tyZ } ztd
| |tj i W  Y d }~S d }~ww z| jjd||d}|  W n ty } ztd| i W  Y d }~S d }~ww zYi }|jd d d }| D ]G\}	}
t|	}|
d }| D ]6\}}t||}|d }| D ]$\}}t||}|di }t|dd|dd|ddd||< qqqW n  ty } ztd| |tj i W  Y d }~S d }~ww | j t| |S )Nztest_management_tests.requestz test_management_tests.request_msz$test_management_tests.response_bytesz$test_management_tests.request_errorsr3   r8   r[   )r;   commit_messager<   r>   zQGit info not available, cannot fetch Test Management properties (missing key: %s)z,/api/v2/test/libraries/test-management/testsrB   z5Error getting Test Management properties from API: %srA   modulesrn   r]   
propertiesquarantinedFdisabledattempt_to_fix)rx   ry   rz   z7Failed to parse Test Management tests data from API: %s) r(   rD   r#   r   r   COMMIT_HEAD_MESSAGECOMMIT_MESSAGECOMMIT_HEAD_SHArH   r   rE   rF   rG   rJ   r   r   rK   r   rL   r-   rM   rN   rO   rP   rc   r   r   r   r   rR   "record_test_management_tests_countrh   )r0   rC   ru   
commit_sharT   rU   rV   test_propertiesrv   module_namemodule_dataro   rn   
suite_name
suite_datarq   r]   	test_name	test_datatest_refrw   r   r   r   get_test_management_properties   s|   






z(APIClient.get_test_management_propertieslatest_commits	list[str]c              
   C  s*  | j jddd dd}zd| jtj idd |D d}W n  ty< } ztd	| |t	j
 g W  Y d }~S d }~ww z| jjd
||d}|  W n tyf } ztd| g W  Y d }~S d }~ww zdd |jd D }W |S  ty } ztd| |t	j g W  Y d }~S d }~ww )Nzgit_requests.search_commitszgit_requests.search_commits_msz"git_requests.search_commits_errorsr3   r;   c                 S  s   g | ]}|d dqS )commitr?   r@   r   ).0r<   r   r   r   
<listcomp>$  s    z/APIClient.get_known_commits.<locals>.<listcomp>)metar8   zDGit info not available, cannot fetch known commits (missing key: %s)z%/api/v2/git/repository/search_commitsrB   z(Error getting known commits from API: %sc                 S  s    g | ]}|d  dkr|d qS )r@   r   r?   r   )r   itemr   r   r   r   7  s     r8   z'Failed to parse search_commits data: %s)r(   rD   r#   r   rG   rJ   r   r   rK   r   rL   r-   rM   rN   rO   rP   rR   )r0   r   rC   rT   rU   rV   known_commitsr   r   r   get_known_commits  sH   
zAPIClient.get_known_commitspackfiler   t.Optional[int]c              
   C  sP  | j jddd dd}z| jtj ddd| jtj id}W n ty= } ztd	| |	t
j W Y d }~d S d }~ww z| }td
d dt|ddtd|jd|dg}W n tyz } ztd| |	t
j W Y d }~d S d }~ww z| jjd|d|d}|  W t|S  ty } ztd| W Y d }~d S d }~ww )Nzgit_requests.objects_packzgit_requests.objects_pack_msz git_requests.objects_pack_errorsr3   r   r   r;   )r8   r   zBGit info not available, cannot send git packfile (missing key: %s)	pushedShaapplication/jsonutf-8namefilenamecontent_typer8   r   zapplication/octet-streamzError sending Git pack data: %sz/api/v2/git/repository/packfileFfiles	send_gziprC   z"Failed to upload Git pack data: %s)r(   rD   r#   r   rH   rG   rJ   r   r   rK   r   rL   
read_bytesr   jsondumpsencoder   rO   r-   
post_filesrN   rh   )r0   r   rC   metadatarU   contentr   rV   r   r   r   send_git_pack_file@  sZ   


zAPIClient.send_git_pack_file7tuple[set[t.Union[SuiteRef, TestRef]], t.Optional[str]]c              
   C  s$  | j jddddd}z"dtt d| j| j| jtj	 | jtj
 | j| jjdd	i}W n# tyO } ztd
| |tj t d fW  Y d }~S d }~ww z| jjd||d}|  W n ty| } ztd| t d fW  Y d }~S d }~ww zat }|jd D ]O}|d dv rt|d di dt}t||d dt}|d dkr| jtjkr| | q|d dkr| jtj!krt"||d dt}	| |	 q|jd d }
W n$ ty } ztd| |tj# t d fW  Y d }~S d }~ww | j j$t%|| jd ||
fS )Nzitr_skippable_tests.requestzitr_skippable_tests.request_msz"itr_skippable_tests.response_bytesz"itr_skippable_tests.request_errorsr3   r8   test_params)r!   r"   r;   r<   r&   r:   r>   zDGit info not available, cannot get skippable items (missing key: %s)z/api/v2/ci/tests/skippablerB   z*Error getting skippable tests from API: %sr@   )rr   rp   rA   r&   ztest.bundlerp   rr   r   r   correlation_idz1Failed to parse skippable tests data from API: %s)r4   level)&r(   rD   r   rE   rF   r!   r"   r#   r   rG   rH   r&   r%   r   rJ   r   r   rK   r   rL   ra   r-   rM   rN   rO   rP   r   r   r   r   r   SUITErd   TESTr   rR   record_skippable_countrh   )r0   rC   rT   rU   rV   skippable_itemsr   ro   rq   r   r   r   r   r   get_skippable_testss  sl   



zAPIClient.get_skippable_testsNcoverage_report_bytesbytescoverage_formattagst.Optional[dict[str, str]]boolc              
   C  s  |s	t d dS | jjddddd}zct|}t dt|t| tj	| j
vr/t d	 d
dlm} t| j
}|rA|| |||d}t dtj|dd tdd| dd|dtdddt|ddg}	t d|t| W n ty }
 zt d|
 |tj W Y d}
~
dS d}
~
ww z-| jjd|	d|d}|jrt d|j|j|jr|jdd nd |  t d  W d!S  ty }
 zt d"|
 W Y d}
~
dS d}
~
ww )#a  
        Upload a coverage report to Datadog CI Intake.

        Args:
            coverage_report_bytes: The coverage report content (will be gzipped)
            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)Coverage report is empty, skipping uploadFzcoverage_upload.requestzcoverage_upload.request_mszcoverage_upload.request_byteszcoverage_upload.request_errorsr3   z0Compressed coverage report: %d bytes -> %d bytesz;Git repository URL not available for coverage report uploadr   )create_coverage_report_event)r   r   z!Coverage report event payload: %s   )indentcoveragez	coverage.z.gzzapplication/gzipr   eventz
event.jsonr   r   z3Uploading coverage report: format=%s, size=%d bytesz*Error preparing coverage report upload: %sNz/api/v2/cicovreprtr   zICoverage report upload failed: error=%s, description=%s, response_body=%si  z%Successfully uploaded coverage reportTz$Failed to upload coverage report: %s)r   r   r(   rD   gzipcompressdebugrh   r   rG   r#   6ddtrace.internal.test_visibility.coverage_report_utilsr   rf   updater   r   r   r   rO   rK   r   rL   r/   r   
error_typeerror_descriptionresponse_bodyrN   )r0   r   r   r   rC   compressed_reportr   all_tags
event_datar   rU   rV   r   r   r   upload_coverage_report  s   






z APIClient.upload_coverage_report)r!   r   r"   r   r#   r$   r%   r   r&   r$   r'   r   r(   r   r   r)   )r   r)   )r   r
   )r   rY   )r   rt   )r   r   r   r   )r   r   r   r   )r   r   r*   )r   r   r   r   r   r   r   r   )__name__
__module____qualname__r1   r2   rX   rs   r   r   r   r   r   r   r   r   r   r    3   s    



4
V
B
)
3>r    )r   r   )$
__future__r   r   r   loggingr   pathlibr   typingtrE   "ddtrace.testing.internal.constantsr   r   ddtrace.testing.internal.gitr   ddtrace.testing.internal.httpr   r   r	   &ddtrace.testing.internal.settings_datar
   r   "ddtrace.testing.internal.telemetryr   r   "ddtrace.testing.internal.test_datar   r   r   	getLoggerr   r   r   r   r    r   r   r   r   <module>   s2    

