o
    پi                     @   s   d dl Z d dlZed dd ZdefddZejdd	d
d ZdefddZ	ddedefddZ
dedefddZdd ZdS )    Nz-[CONFTEST] Loading conftest.py at import timec                 C   s0   t | dstjt  | _td| j  dS dS )z
    Create the perf results StashKey once and store it in config.
    This hook runs once per test session, before module double-import issues.
    _diffusion_perf_keyz%[CONFTEST] Created perf_results_key: N)hasattrpytestStashKeylistr   printconfig r
   ^/home/ubuntu/.local/lib/python3.10/site-packages/sglang/multimodal_gen/test/server/conftest.pypytest_configure   s   
r   resultsc                 C   sH   | j }| j|g }|| || j|< tdt| dt|  dS )z,Add performance results to the shared stash.z[CONFTEST] Added z results, total now: N)r   stashgetextendr   len)r	   r   keyexistingr
   r
   r   add_perf_results   s
   

 r   session)scopec                 C   s   | j S )z9Provide access to pytest config for storing perf results.r   )requestr
   r
   r   perf_config   s   r   contentc                 C   sN   t jd}|r%t|d}||  W d   dS 1 sw   Y  dS dS )z2Write content to GitHub Step Summary if available.GITHUB_STEP_SUMMARYaN)osenvironr   openwrite)r   summary_filefr
   r
   r   _write_github_step_summary"   s   "r"   diffusion-results.jsonoutput_pathc              
   C   s   ddl }z't|d}|j| |dd W d   n1 sw   Y  td|  W dS  tyE } ztd|  W Y d}~dS d}~ww )zBWrite performance results to JSON file for CI artifact collection.r   Nw   )indentz[CONFTEST] Wrote results to z)[CONFTEST] Failed to write results JSON: )jsonr   dumpr   	Exception)r   r$   r(   r!   er
   r
   r   _write_results_json*   s   r,   returnc           
      C   sZ  | sdS t jdd}d}|r|d| d7 }|d7 }|}|d7 }|d7 }t| d	d
 dD ],}|dd}|d|d  d|d  d| d|d dd|d dd|d dd7 }q-dd | D }|r|d7 }|d7 }|d7 }|D ]9}|dd}|dd}|dd}	t|tr|d}t|	tr|	d}	|d|d  d| d| d|	 d	7 }qq|S ) z=Generate a markdown report for diffusion performance results. 
GPU_CONFIGz ## Diffusion Performance Summaryz []z

zZ| Test Suite | Test Name | Modality | E2E (ms) | Avg Denoise (ms) | Median Denoise (ms) |
zZ| ---------- | --------- | -------- | -------- | ---------------- | ------------------- |
c                 S   s   | d | d fS )N
class_name	test_namer
   xr
   r
   r   <lambda>F   s    z5_generate_diffusion_markdown_report.<locals>.<lambda>r   modalityimagez| r1    | r2   e2e_ms.2favg_denoise_msmedian_denoise_msz |
c                 S   s   g | ]}| d dkr|qS )r7   video)r   ).0rr
   r
   r   
<listcomp>O   s    z7_generate_diffusion_markdown_report.<locals>.<listcomp>z
### Video Generation Metrics

z9| Test Name | FPS | Total Frames | Avg Frame Time (ms) |
z9| --------- | --- | ------------ | ------------------- |
frames_per_secondzN/Atotal_framesavg_frame_time_ms)r   r   r   sorted
isinstancefloat)
r   
gpu_configheadermarkdownentryr7   video_resultsfpsframes	avg_framer
   r
   r   #_generate_diffusion_markdown_report6   sH   

(rP   c                 C   s  | j j}| j j|g }tdt| d |std dS td tdddd	d
ddddddddd	 td t|dd dD ]#}t|d dd|d d
d|d dd|d dd|d d	 qEtd td t|dd dD ]H}td |d  d!|d  d" d#d$d% |d&i  D }|rtd'|  |d(pi }|rd#d)d% t| D }td*|  qytd t	|}|rt
| t| dS )+z
    This hook is called by pytest at the end of the entire test session.
    It prints a consolidated summary of all performance results.
    z*
[DEBUG] pytest_sessionfinish called, has z entriesz5[DEBUG] No results collected, skipping summary outputNz]

=================================== Performance Summary ===================================z
Test Suitez<30r9   z	Test Namez<20zE2E (ms)z>12zAvg Denoise (ms)z>18zMedian Denoise (ms)z>20zp-------------------------------+----------------------+--------------+--------------------+---------------------c                 S      | d S Nr1   r
   r3   r
   r
   r   r5          z&pytest_sessionfinish.<locals>.<lambda>r6   r1   r2   r:   z>12.2fr<   z>18.2fr=   z>20.2fz[===========================================================================================z]

==================================== Detailed Reports =====================================c                 S   rQ   rR   r
   r3   r
   r
   r   r5      rS   z
--- Details for z / z ---z, c                 s   &    | ]\}}| d |ddV  qdS :r;   msNr
   )r?   namedurationr
   r
   r   	<genexpr>   
    
z'pytest_sessionfinish.<locals>.<genexpr>stage_metricsz    Stages: sampled_stepsc                 s   rT   rU   r
   )r?   idxrY   r
   r
   r   rZ      r[   z    Sampled Steps: )r	   r   r   r   r   r   rE   joinitemsrP   r"   r,   )r   r   r   rK   stage_reportr]   step_reportmarkdown_reportr
   r
   r   pytest_sessionfinisha   sT   ($


rd   )r#   )r   r   r   r   r   r   fixturer   strr"   r,   rP   rd   r
   r
   r
   r   <module>   s    



+