o
    \h\                     @   sz   d dl Z d dlZd dlZd dlmZmZ d dlmZmZ ddl	m
Z
 d dlmZ G dd de jZed	kr;e   dS dS )
    N)Mockcall)clientconfig   )Watch)ApiExceptionc                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zed#d$ Zd%d& Zd'S )(
WatchTestsc                 C   s
   d| _ d S )Nr   	callcount)self r   ^/home/air/segue/gemini/backup/venv/lib/python3.10/site-packages/kubernetes/watch/watch_test.pysetUp   s   
zWatchTests.setUpc                 C   s
  t  }t  |_t  |_t g dd|_t  }t |d|_d|j_t }d}||jD ]7}| d|d  | d| |d jj	 | d	| |d jj
 | d	| |j
 |d7 }|d
krb|  q+| d
| |jjddd |jjd dd |j  |j  d S )N)n{"type": "ADDED", "object": {"metadata": {"name": "test1","resourceVersion": "1"}, "spec": {}, "status": {}}}
c{"type": "ADDED", "object": {"metadata": {"name": "test2","resourceVersion": "2"}, "spec": {}, "staytus": {}}}
{"type": "ADDED", "object": {"metadata": {"name": "test3","resourceVersion": "3"}, "spec": {}, "status": {}}}
zshould_not_happened
return_value:return: V1NamespaceListr   ADDEDtypetest%dobject%d   FT_preload_contentwatchamtdecode_content)r   closerelease_connstreamget_namespaces__doc__r   assertEqualmetadatanameresource_versionstopassert_called_once_withassert_called_oncer   	fake_respfake_apiwcounter   r   r   test_watch_with_decode#   s>   
z!WatchTests.test_watch_with_decodec                 C   s   t  }t  |_t  |_t g dd|_t  }t |d|_d|j_t }d}|j|jddD ]}|d u r4q-|d7 }| d| |d jj	 q-| d	| d S )
N)	
z({"type": "ADDED", "object": {"metadata":z={"name": "test1","resourceVersion": "1"}}}
{"type": "ADDED", zC"object": {"metadata": {"name": "test2", "resourceVersion": "2"}}}
r5    zU{"type": "ADDED", "object": {"metadata": {"name": "test3", "resourceVersion": "3"}}}
z


r5   r   r   r   r   timeout_secondsr   r      )
r   r"   r#   r$   r%   r&   r   r'   r(   r)   r.   r   r   r   %test_watch_with_interspersed_newlinesP   s"   z0WatchTests.test_watch_with_interspersed_newlinesc                 C   s   t  }t  |_t  |_t g dd|_t  }t |d|_d|j_t }d}|j|jddD ]<}|d7 }| d|d  | d	| |d
 jj	 | d| |d
 j
d  | d| |d
 jj | d| |j q-| d| d S )N)ui   {"type":"MODIFIED","object":{"data":{"utf-8":"© 1"},"metadata":{"name":"test1","resourceVersion":"1"}}}
s   {"type":"MODIFIED","object":{"data":{"utf-8":"© 2"},"metadata":{"name":"test2","resourceVersion":"2"}}}
{"type":"MODIFIED","object":{"data":{"utf-8":"s    3"},"metadata":{"nz"ame":"test3","resourceVersion":"3"}}}   
r   :return: V1ConfigMapListr   r   r7   MODIFIEDr   r   r   u   © %dutf-8r   r9   )r   r"   r#   r$   get_configmapsr&   r   r'   r(   r)   datar*   r   r/   r0   r1   r2   eventr   r   r   test_watch_with_multibyte_utf8s   s*   z)WatchTests.test_watch_with_multibyte_utf8c                 C   s   t  }t  |_t  |_t g dd|_t  }t |d|_d|j_t }d}|j|jddD ]:}|d7 }| d|d  | d	| |d
 jj	 | d| |d
 j
d  | ddd| | |d
 j
d  q-| d| d S )N)se   {"type":"MODIFIED","object":{"data":{"utf-8":"😄 1","invalid":" 1"},"metadata":{"name":"test1"}}}
sf   {"type":"MODIFIED","object":{"data":{"utf-8":"😄 2","invalid":" 2"},"metadata":{"name":"test2"}}}
s1   {"type":"MODIFIED","object":{"data":{"utf-8":"s        s   3","invalid":"s    z3"},"metadata":{"nzame":"test3"r;   r<   r   r=   r   r   r7   r>   r   r   r   u   😄 %dr?   u   � %du   �invalidr9   )r   r"   r#   r$   r@   r&   r   r'   r(   r)   rA   replacerB   r   r   r   test_watch_with_invalid_utf8   s,   z'WatchTests.test_watch_with_invalid_utf8c                 C   s   t  }t  |_t  |_t ddgd|_t  }t |d|_d|j_t }d}||jD ]}| d| |d7 }|dkr?|  q+|jj	dd	d
 |jj	d dd |j
  |j
  d S )Nzlog_line_1
zlog_line_2
r   z :param bool follow:
:return: strr   
log_line_1   FT)r   followr   )r   r"   r#   r$   read_namespaced_pod_logr&   r   r'   r+   r,   r-   r.   r   r   r   test_watch_for_follow   s6   
z WatchTests.test_watch_for_followc           
         s   t  }t  |_t  |_g d fdd}t |d|_t  }t |d|_d|j_t }g }d}|tdd	d
d |tdd	d
d t	|D ]}|tdd	dd qHt
|j|jd
dD ]\}}	|t| kro|  q_|j|  |jj| d S )N)r   r   r   c                     s      j d7  _  j dkrg S S )Nr   r
   )argskwargsr   valuesr   r   
get_values   s   
z>WatchTests.test_watch_resource_version_set.<locals>.get_valuesside_effectr   r   rJ   FT5)r   r   r*   3r*   )r   r"   r#   r$   r%   r&   r   appendr   range	enumeratelenr+   assert_has_callsr'   
mock_calls)
r   r/   rR   r0   r1   calls
iterationsicr3   r   rP   r   test_watch_resource_version_set   s@   




z*WatchTests.test_watch_resource_version_setc                 C   s   t t}dD ]Z}t }t |_t |_tdgd d|_t }t|d|_d|j_d}||jD ]}|d7 }|dkr?|  q1| 	|d |jj
dd	d
 |jj
d dd |j  |j  qd S )N)firstsecond{"type": "ADDED", "object": 1}
r   r   r   r   r9   FTr   r   )r   floatr   r"   r#   r$   r%   r&   r+   r'   r,   r-   )r   r1   stepr/   r0   r2   r3   r   r   r   test_watch_stream_twice+  s6   
z"WatchTests.test_watch_stream_twicec                 C   s   t t}t }t |_t |_tdgd|_t }t|d|_d|j_d}|j|jddD ]}|d }q-| |d ||jD ]}|d }|dkrN|	  q@| |d | |jj
d | |jj
d | |jj
d | |jj
d d S )Nre   r   r   r   r   r7   rJ   )r   rf   r   r"   r#   r$   r%   r&   r'   r+   
call_count)r   r1   r/   r0   r2   r3   r   r   r   test_watch_stream_loopF  s0   
z!WatchTests.test_watch_stream_loopc                 C   sZ   t  }|dd}| d|d  | d|d  | t|d t | d|d  d S )	Nz{"type": "ADDED", "object": 1}rf   r   r   g      ?r   r   
raw_object)r   unmarshal_eventr'   
assertTrue
isinstancerf   r   r1   rC   r   r   r    test_unmarshal_with_float_objectf  s   z+WatchTests.test_unmarshal_with_float_objectc                 C   sJ   t  }|dd }| d|d  | dg|d  | dg|d  d S )Nz&{"type": "ADDED", "object": ["test1"]}r   r   test1r   rk   )r   rl   r'   ro   r   r   r   "test_unmarshal_with_no_return_typen  s   z-WatchTests.test_unmarshal_with_no_return_typec                 C   s`   t  }|dd}| d|d  | t|d t | d|d d d  | d|j d S )Nz~{"type": "ADDED", "object": {"apiVersion":"test.com/v1beta1","kind":"foo","metadata":{"name": "bar", "resourceVersion": "1"}}}r   r   r   1r(   resourceVersion)r   rl   r'   rm   rn   dictr*   ro   r   r   r   !test_unmarshal_with_custom_objectv  s   z,WatchTests.test_unmarshal_with_custom_objectc                 C   s4   t  }|dd}| d|d  | d |j d S )Nz{"type":"BOOKMARK","object":{"kind":"Job","apiVersion":"batch/v1","metadata":{"resourceVersion":"1"},"spec":{"template":{"metadata":{},"spec":{"containers":null}}},"status":{}}}V1JobBOOKMARKr   )r   rl   r'   r*   ro   r   r   r   test_unmarshal_with_bookmark  s   z'WatchTests.test_unmarshal_with_bookmarkc                 C   s   t  }t  |_t  |_t tdd|_t  }t |d|_t }z||jD ]}| | d q&W n	 ty9   Y nw |jjddd |jjd dd |j	  |j	  d S )	NexpectedrS   r   zShould fail on exception.FTr   r   )
r   r"   r#   KeyErrorr$   	get_thingr   failr,   r-   r   r/   r0   r1   _r   r   r   test_watch_with_exception  s,   
z$WatchTests.test_watch_with_exceptionc                 C   s   t  }t  |_t  |_t dgd|_t  }t |d|_t }t||jr(J |jjddd |jjd dd |j  |j  d S )NY{"type": "ERROR", "object": {"code": 410, "reason": "Gone", "message": "error message"}}
r   FTr   r   )	r   r"   r#   r$   r|   r   listr,   r-   )r   r/   r0   r1   r   r   r   test_watch_with_error_event  s&   
z&WatchTests.test_watch_with_error_eventc                 C   s   t  }t  |_t  |_t dgd|_t  }t |d|_t }z|j|jddD ]}| | d q'W n tjj	y<   Y nw |j
tddddgd	  |j
td dd
gd	  |jjd	ks`J |jjd	kshJ d S )Nr   r   r   rW   Should fail with ApiException.FT)r*   r   r   rJ   r   )r   r"   r#   r$   r|   r   r}   r   restr   r\   r   ri   r~   r   r   r   !test_watch_retries_on_error_event  s2   z,WatchTests.test_watch_retries_on_error_eventc                 C   s   t  }t  |_t  |_t dgd|_t  }t |d|_t }z|j|jddD ]}| | d q'W n tjj	y<   Y nw |jj
dddd |jj
d dd	 |j  |j  d S )
Nr   r   
   r7   r   FT)r   r   r8   r   )r   r"   r#   r$   r|   r   r}   r   r   r   r,   r-   r~   r   r   r   -test_watch_with_error_event_and_timeout_param  s2   
z8WatchTests.test_watch_with_error_event_and_timeout_paramc                 C   s   t  | _d| _d S )Ndefault)r   api	namespace)clsr   r   r   
setUpClass  s   
zWatchTests.setUpClassc              
   C   s  d}zzt  | j_t  | j_t  | j_t  | j_d | jj_t  }d|j_|| jj_t	dg| jj_d}t

 }t

 | |k r\| jj|| jd}|jjdkrOnt
d t

 | |k s?| d t }g }t g dd	|_|j| jj|| jd
dD ]}|| t| qztd|  g d}	| ||	d W n ty }
 z| d|
  W Y d }
~
nd }
~
ww W | jj|| jd | jjj|| jd d S W | jj|| jd | jjj|| jd d S | jj|| jd | jjj|| jd w )Nzdemo-bugRunningzHello from Docker
<   )r)   r   rJ   z0Pod did not reach 'Running' state within timeout)zHello from Dockerr6   r6   z

zAnother log liner6   r5   z	Final logr   T)r)   r   rK   zCaptured logs: z(Captured logs do not match expected logszKubernetes API exception: )r   r   create_namespaced_podread_namespaced_poddelete_namespaced_podrL   r   statusphaseitertimer   sleepr}   r   r$   rX   printr'   r   r,   )r   pod_namemock_podtimeout
start_timepodr1   
log_outputrC   expected_logr3   r   r   r   test_pod_log_empty_lines  sR   










z#WatchTests.test_pod_log_empty_linesN)__name__
__module____qualname__r   r4   r:   rD   rH   rM   rb   rh   rj   rp   rr   rv   ry   r   r   r   r   classmethodr   r   r   r   r   r   r	      s*    -#'.E 
r	   __main__)unittestosr   unittest.mockr   r   
kubernetesr   r   r   r   kubernetes.clientr   TestCaser	   r   mainr   r   r   r   <module>   s       )