a
    WaI                     @   sp  d dl m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	Z	d dl
mZ d dlmZ d dlZdZdZdZdZed	ejd  ZeeZeeZee ejd
dddd e \ZZe edk re!  e"d e# Z$e%e$Z&dZ'd a(G dd deZ)e*dkr^d dl+m,Z, ed  Z'de'vrRej-.e'rJde' Z'nde' Z'e,e*d nde/d Z'dS )    )print_functionN)system_session)TestCaseD         A   z
{0} <host>z-v
store_trueverbosez#print successful expression outputs)actiondesthelpc                       s   e Zd Ze fddZedd Zdd Zdd Zd	d
 Zd8ddZ	dd Z
dd Zdd Zdd Zd9ddZdd Zdd Zdd Zd:ddZd d! Zd"d# Zd$d% Zd;d&d'Zd(d) Zd*d+ Zd<d,d-Zd.d/ Zd0d1 Zd=d2d3Zd4d5 Zd6d7 Z  ZS )>ComplexExpressionTestsc              
      s   t t|   tjjttt t	d| _d}d
|| j | _z| j| jdg W n   Y n0 z| j| j W nH tjy } z.|jd tkrtdj
|d |W Y d }~n
d }~0 0 d| _d	| _d
| _d| _d| _d| _d| _d| _d S )N)lpZsession_infoZcredentialsZComplexExprTestz
OU={0},{1}tree_delete:1r   zatest ou {ou} already exists. Delete with "samba-tool group delete OU={ou} --force-subtree-delete")Zouztestuser{0}
   ZaccountExpiresZaccountNameHistoryflagsZpreferredDeliveryMethodZmsTSExpireDateZcountryCode)superr   
setUpClasssambasamdbZSamDBhostr   r   credsformatZ	domain_dnbase_dndelete	create_ouldbLdbErrorargsERRCODE_ENTRY_EXISTSprintname_template	default_n
largeint_fstr_fint_fenum_ftime_franged_int_f)clsZou_namee	__class__ A/usr/lib/python3/dist-packages/samba/tests/complex_expressions.pyr   >   s6    
z!ComplexExpressionTests.setUpClassc                 C   s   | j | jdg d S )Nr   )r   r   r   )r*   r.   r.   r/   tearDownClassb   s    z$ComplexExpressionTests.tearDownClassc                    s   t d7 a dt jj  fdd|D }|D ]^}dd | D }zj| W q< tjy } zt	d|  |W Y d }~q<d }~0 0 q<|fS )Nr   zOU=testou{0},{1}c              
      s0   g | ](}d d |dj |dd |iqS )dnzCN=testuser{0},{1}nameZobjectClassuser)r   r"   .0nfieldou_dnselfr.   r/   
<listcomp>m   s   z<ComplexExpressionTests.make_test_objects.<locals>.<listcomp>c                 S   s   i | ]\}}|t |qS r.   str)r5   kvr.   r.   r/   
<dictcomp>v   s   z<ComplexExpressionTests.make_test_objects.<locals>.<dictcomp>zfailed to add %s)
ou_countr   r   r   r   itemsaddr   r   r!   )r:   r8   valsldap_objectsldap_objectZstringed_ldap_objectr+   r.   r7   r/   make_test_objectsg   s     z(ComplexExpressionTests.make_test_objectsc              
   C   s~   d}z,t   }| jj|tj|d}t   | }W n4 tyd } ztd|  |W Y d }~n
d }~0 0 td|| ||fS )Nr   baseZscopeZ
expressionzfailed expr z{0} took {1}s)timer   searchr   SCOPE_SUBTREE	Exceptionr!   r   )r:   exprr1   
time_takenZ
start_timeresr+   r.   r.   r/   time_ldap_search   s    z'ComplexExpressionTests.time_ldap_searchc              	   C   s   |  ||\}}dd |D }t }|D ]J}	z|jf i |	}
W n tyV   Y q(Y n0 t|
r(|t|	d  q(| || tj	rdd |D }|| }d
|pd}d
|pd}td|||| d S )Nc                 S   s   h | ]}t |d d qS r2   r   r=   get)r5   rowr.   r.   r/   	<setcomp>       z9ComplexExpressionTests.assertLDAPQuery.<locals>.<setcomp>r2   c                 S   s   h | ]}|d  qS )r2   r.   r5   lr.   r.   r/   rV      rW   z
  z	[NOTHING]zCPASS: Expression {0} took {1}s and returned:
  {2}
Excluded:
  {3}
)rQ   setr   KeyErrorevalrC   r=   assertEqualoptsr
   joinr!   )r:   Z	ldap_exprr9   py_exprrE   rP   rO   ZresultsZexpected_resultsrF   Z
final_exprZldap_object_namesZexcludedZreturnedr.   r.   r/   assertLDAPQuery   s,    
z&ComplexExpressionTests.assertLDAPQueryNc                 C   s   | j }|p| j}| |t|\}}d||d ||d f }d|d ||d f }| |||| t|d }d||f }d||f }| |||| d||f }d||f }| |||| d S )	N(&(%s>=%s)(%s<=%s))r   %d <= {%s} <= %d   (%s<=%s)
{%s} <= %dz(%s>=%s)
{%s} >= %d)r#   r&   rG   rangera   int)r:   r8   r6   r9   rE   rN   r`   half_nr.   r.   r/   test_int_range   s    
z%ComplexExpressionTests.test_int_rangec                 C   s   |  | j d S N)rk   r$   r:   r.   r.   r/   test_largeint_range   s    z*ComplexExpressionTests.test_largeint_rangec                 C   s   |  | j d S rl   )rk   r'   rm   r.   r.   r/   test_enum_range   s    z&ComplexExpressionTests.test_enum_rangec           	      C   sd   | j }d}d}tt|| |}| ||\}}d||d f }d||d f }| |||| d S )Ni      (%s<=%d)   rf   )r)   listrh   rG   ra   )	r:   r8   ZuboundwidthrD   r9   rE   rN   r`   r.   r.   r/   test_ranged_int_range   s    z,ComplexExpressionTests.test_ranged_int_rangec           	         s   | j }| j}| j }t|d }d  fddt| |D }dd |D }| ||\}}d|t d f }d| f }| |||| d	|t d
 d |t d
 d f }d d
 | d
 f }| |||| d S )Nrd   l   fHc                    s   g | ]} | qS r.   r.   r5   tZ	base_timer.   r/   r;      rW   z:ComplexExpressionTests.test_time_range.<locals>.<listcomp>c                 S   s   g | ]}t |d  qS ).0Zr<   rv   r.   r.   r/   r;      rW   re   ry   zint("{%s}"[:-3]) <= %drb   r   z%d <= int("{%s}"[:-3]) <= %d)r#   r(   ri   rh   rG   r=   ra   )	r:   r6   r8   rt   Z
time_ranger9   rE   rN   r`   r.   rx   r/   test_time_range   s&    z&ComplexExpressionTests.test_time_rangec           
         s   | j  p| j |  t\}}g d}g d} fdd|D } fdd|D }t||D ]\}}	| |||	| qfd S )N)=<=>=)z==r|   r}   c                    s   g | ]}d  |f qS )z(%s%s%d)r.   r5   cr8   r6   r.   r/   r;      rW   zHComplexExpressionTests.test_int_single_cmp_op_speeds.<locals>.<listcomp>c                    s   g | ]}d  |f qS )z{%s}%s%dr.   r~   r   r.   r/   r;     rW   )r#   r&   rG   rh   zipra   )
r:   r8   r9   rE   Zcomp_opsZpy_comp_opsZexprsZpy_exprsrN   r`   r.   r   r/   test_int_single_cmp_op_speeds   s    
z4ComplexExpressionTests.test_int_single_cmp_op_speedsc                 C   s   |  | j d S rl   )r   r$   rm   r.   r.   r/   "test_largeint_single_cmp_op_speeds  s    z9ComplexExpressionTests.test_largeint_single_cmp_op_speedsc                 C   s   |  | j d S rl   )r   r'   rm   r.   r.   r/   test_enum_single_cmp_op_speeds	  s    z5ComplexExpressionTests.test_enum_single_cmp_op_speedsc           
      C   s  | j }td}d}dd t||| D }| ||\}}t||d  }d|t|f }d|t|f }	| |||	| d|t|f }d	|t|f }	| |||	| d
|t|d |t|d f }dt|d |t|d f }	| |||	| d| }d| }	| |||	| d S )NAr   c                 S   s   g | ]}d  t|qS )zabc{0}d)r   chrr~   r.   r.   r/   r;     rW   z<ComplexExpressionTests.test_str_ordering.<locals>.<listcomp>rd   z(%s>=abc%s)z'{%s}' >= 'abc%s'z(%s<=abc%s)z'{%s}' <= 'abc%s'z(&(%s>=abc%s)(%s<=abc%s))z'abc%s' <= '{%s}' <= 'abc%s'z(%s>=1)z'{%s}' >= '1')r%   ordrh   rG   ri   r   ra   )
r:   r8   Za_ordr6   	str_ranger9   rE   rj   rN   r`   r.   r.   r/   test_str_ordering  s.    
z(ComplexExpressionTests.test_str_orderingc                 C   sV   |p| j }| j}| |tt|\}}g d}|D ]}|| }| ||d| q4d S )N)z	(%s>=abc)z	(%s<=abc)z(%s=abc)False)r&   r#   rG   rs   rh   ra   )r:   r8   r6   r9   rE   Zint_expressionsrN   r.   r.   r/   test_invalid_expressions,  s    
z/ComplexExpressionTests.test_invalid_expressionsc                 C   s   |  | j d S rl   )r   r$   rm   r.   r.   r/   !test_largeint_invalid_expressions8  s    z8ComplexExpressionTests.test_largeint_invalid_expressionsc                 C   s   |  | j d S rl   )r   r'   rm   r.   r.   r/   test_enum_invalid_expressions;  s    z4ComplexExpressionTests.test_enum_invalid_expressionsc                 C   sf   dd t dD }| | j|\}}d| j }d| j }| |||| d| j }| |||| d S )Nc                 S   s   g | ]}d t | qS )u   äbcr<   r4   r.   r.   r/   r;   ?  rW   z@ComplexExpressionTests.test_case_insensitive.<locals>.<listcomp>r   u
   (%s=äbc1)u   "{%s}"=="äbc1"u
   (%s=ÄbC1))rh   rG   r%   ra   )r:   r   r9   rE   rN   Zpyexprr.   r.   r/   test_case_insensitive>  s    


z,ComplexExpressionTests.test_case_insensitivec                 C   sR   |p| j }d}tt| |}| ||\}}d| }d| }| |||| d S )N   z(%s>=-3)z
{%s} >= -3)r&   rs   rh   rG   ra   )r:   r8   rt   Zaround_zeror9   rE   rN   r`   r.   r.   r/   test_negative_cmpJ  s    
z(ComplexExpressionTests.test_negative_cmpc                 C   s   |  | j d S rl   )r   r$   rm   r.   r.   r/   test_negative_cmp_largeintT  s    z1ComplexExpressionTests.test_negative_cmp_largeintc                 C   s   |  | j d S rl   )r   r'   rm   r.   r.   r/   test_negative_cmp_enumW  s    z-ComplexExpressionTests.test_negative_cmp_enumc              
      sr   p| j  | j}|  tt|\}}d |d f }d |d f }| |||| | j|dg dd t|D }z|  |\}}W n: tj	y } z |j
d tkr|W Y d }~d S d }~0 0 td   | jj|tjd	d
}	 fdd|	D }
dd t|D }| t|
t| d |d f }d |d f }|D ]}t|  | < qF| |||| d S )Nz
(%s>=00%d)rd   rg   r   c                 S   s   g | ]}d t | qS )Z00r<   )r5   Znumr.   r.   r/   r;   k  rW   z;ComplexExpressionTests.test_zero_prefix.<locals>.<listcomp>r   z4LDAP allowed insertion of 0-prefixed nums for field (objectClass=user)rH   c                    s   g | ]}t | d  qS r   rS   r5   rr8   r.   r/   r;   {  rW   c                 S   s   g | ]}t |qS r.   r<   r4   r.   r.   r/   r;   |  rW   (%s>=%d))r&   r#   rG   rs   rh   ra   r   r   r   r   r   ERRCODE_INVALID_VALUEr!   rK   rL   r]   rZ   ri   )r:   r8   r6   r9   rE   rN   r`   Zzero_pref_numsr+   rP   returned_numsexpectrF   r.   r   r/   test_zero_prefix\  s6    
z'ComplexExpressionTests.test_zero_prefixc                 C   s   |  | j d S rl   )r   r$   rm   r.   r.   r/   test_zero_prefix_largeint  s    z0ComplexExpressionTests.test_zero_prefix_largeintc                 C   s   |  | j d S rl   )r   r'   rm   r.   r.   r/   test_zero_prefix_enum  s    z,ComplexExpressionTests.test_zero_prefix_enumc                    sd   p| j  |pd}d}tt|| || }|  |\}}d |d f }d|d  |f }| |||| d |f }d}| |||| d | f }d	 |f }| |||| d
  }d |d f }| |||| | jj|tjdd}	 fdd|	D }
tt|| |d }tt| d | | d }dd || D }| 	t
|
t
| d S )Nrp   r      rc   rq   Truez(&(%s<=%d)(%s>=0))rf   z(%s<=0)rg   r   r   rH   c                    s   g | ]}t | d  qS r   rS   r   r   r.   r/   r;     rW   z<ComplexExpressionTests.test_int_overflow.<locals>.<listcomp>rd   c                 S   s   g | ]}t |qS r.   r<   r4   r.   r.   r/   r;     rW   )r&   rs   rh   rG   ra   r   rK   r   rL   r]   rZ   )r:   r8   Zofrt   rD   r9   rE   rN   r`   rP   r   Zup_to_overflowZ	negativesr   r.   r   r/   test_int_overflow  s4    
z(ComplexExpressionTests.test_int_overflowc                 C   s   |  | jd d S )Nr   )r   r'   rm   r.   r.   r/   test_enum_overflow  s    z)ComplexExpressionTests.test_enum_overflowc           
         s   d d}|   tt|\}}| jj|tjdd} fdd|D } fdd|D }tt|}|tt	|d  }d	 |f }d
 |f }	| 
|||	| d |f }d |f }	| 
|||	| d S )NZ
uSNChangedr   r   rH   c                    s0   g | ](}d t |d  d  t|  d iqS rR   )r=   ri   r   r   r.   r/   r;     s   z:ComplexExpressionTests.test_usnchanged.<locals>.<listcomp>c                    s   g | ]}|  qS r.   r.   rX   r   r.   r/   r;     rW   rd   z(&(%s<=%d)(objectClass=user))rf   z(&(%s>=%d)(objectClass=user))rg   )rG   rs   rh   r   rK   r   rL   sortedri   lenra   )
r:   r6   r9   _rP   rE   ZnumsZ
search_numrN   r`   r.   r   r/   test_usnchanged  s&    
z&ComplexExpressionTests.test_usnchanged)N)N)N)N)N)NN) __name__
__module____qualname__classmethodr   r0   rG   rQ   ra   rk   rn   ro   ru   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r.   r.   r,   r/   r   ;   s:   #
$





*
'r   __main__)TestProgramz://ztdb://%sz	ldap://%s)modulezldap://ZSERVER)0Z
__future__r   Zoptparser   Zsamba.getoptZgetoptZoptionssysosrJ   Z
samba.authr   Zsamba.testsr   r   r    ZERRCODE_OPERATIONS_ERRORr   ZERRCODE_CLASS_VIOLATIONZOptionParserr   argvparserZSambaOptionsZ	sambaoptsZCredentialsOptionsZcredoptsZadd_option_groupZ
add_option
parse_argsr^   r   r   Zprint_usageexitZget_loadparmr   Zget_credentialsr   r   rA   r   r   Zsamba.tests.subunitrunr   pathisfilegetenvr.   r.   r.   r/   <module>   sR   





   %


