a
    )&ii                     @   s  d Z ddlmZ ddlZddl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m
Z
 ddlmZ 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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Zzddl m!Z! W n e"y    dd Z!Y n0 ddl#Zddl$Zddl%Zzddlm&Z& W n$ e"yn   G dd de'Z&Y n0 ej()ej(*ej(+e,dZ-e.dd e/dD Z0dd e1e2 D Z3dd Z4dd Z5G dd dej6Z6G d d! d!e6Z7G d"d# d#e6Z8d$d% Z9dCd'd(Z:dZ;G d)d* d*e6Z<G d+d, d,e6Z=G d-d. d.e'Z>G d/d0 d0e8Z?dDd2d3Z@dEd4d5ZAdFd6d7ZBd8d9 ZCd:d; ZDeG d<d= d=eZEdGd?d@ZFdHdAdBZGdS )IzSamba Python tests.    )print_functionN)param)credentials)Credentials)gensec)IntEnumunique)	text_type)string_types)randint)SystemRandom)contextmanager)SamDBc                  O   s   d S N )argskwargsr   r   6/usr/lib/python3/dist-packages/samba/tests/__init__.pyr   1   s    r   SkipTestc                   @   s   e Zd ZdZdS )r   zTest skipped.N__name__
__module____qualname____doc__r   r   r   r   r   ;   s   r   z../../../../binc                 C   s4   g | ],}t tt|d kr(|dk r(|ntdqS )      .)lenreprchrord.0xr   r   r   
<listcomp>A       r%      c                 C   s    i | ]\}}| d r||qS ZERR_)
startswithr#   kvr   r   r   
<dictcomp>C   r&   r-   c              
   C   sv   t | tjr| jd } | tv r&t|  S zdddd | D  dW S  typ } zt| W Y d }~n
d }~0 0 | S )Nr   [, c                 s   s   | ]}t ||V  qd S r   )LDB_ERR_LUTgetr"   r   r   r   	<genexpr>M   r&   zldb_err.<locals>.<genexpr>])
isinstanceldbLdbErrorr   r0   join	TypeErrorprint)r,   er   r   r   ldb_errE   s    
r;   c                 C   s   |    | S r   )setUpDynamicTestCases)clsr   r   r   DynamicTestCaseS   s    r>   c                       s  e Zd ZdZeddddZedd Z fdd	Zd
d Zdd Z	dd Z
dd Zd9ddZejdk rddlZdd Zd:ddZd;ddZd<ddZd=ddZd>d d!Zd?d"d#Zd@d$d%ZdAd&d'ZdBd(d)ZdCd*d+Zd,d- ZdDd.d/Zd0d1 ZdEd2d3ZdFd5d6Zd7d8 Z   Z!S )GTestCasezA Samba test case.N)docc                   sJ    fdd}||_ d|f }t| |r:td| dt| || dS )a   
        fnname is something like "test_dynamic_sum"
        suffix is something like "1plus2"
        argstr could be (1, 2)

        This would generate a test case called
        "test_dynamic_sum_1plus2(self)" that
        calls
        self._test_dynamic_sum_with_args(1, 2)
        c                    s   t | d    d S )Nz_%s_with_args)getattrselfr   fnnamer   r   fnf   s    z*TestCase.generate_dynamic_test.<locals>.fnz%s_%szDynamic test z already exists!N)r   hasattrRuntimeErrorsetattr)r=   rE   suffixr@   r   rF   attrr   rD   r   generate_dynamic_testZ   s    
zTestCase.generate_dynamic_testc                 C   s   d|  }t |dS )zThis can be implemented in order to call cls.generate_dynamic_test()
        In order to implement autogenerated testcase permutations.
        z=%s needs setUpDynamicTestCases() if @DynamicTestCase is used!N)	Exception)r=   msgr   r   r   r<   n   s    zTestCase.setUpDynamicTestCasesc                    sN   t t|   td}|d urJt|}t | _t	| | 
tj	| d S )NZTEST_DEBUG_LEVEL)superr?   setUposgetenvintsambaZget_debug_levelZ_old_debug_levelZset_debug_level
addCleanup)rC   Ztest_debug_level	__class__r   r   rP   v   s    


zTestCase.setUpc                 C   s   t  S r   )env_loadparmrB   r   r   r   get_loadparm   s    zTestCase.get_loadparmc                 C   s   t S r   )cmdline_credentialsrB   r   r   r   get_credentials   s    zTestCase.get_credentialsc                 C   s"   |   }||  }| }|S r   )r[   Zget_named_ccacherY   Zget_name)rC   credsZccacheZccache_namer   r   r   get_creds_ccache_name   s    zTestCase.get_creds_ccache_namec           	   	   C   s   d}d}t |t}|r|d d }|dd }|dd  }|r|ddd |D }ddd |D }|t}|t}nHdd	d |D }dd
d |D }|td}|td}|d|d|d|||f 7 }|d7 }q|S )Nr           c                 S   s   g | ]}d t | qS z%02Xr!   r"   r   r   r   r%      r&   z$TestCase.hexdump.<locals>.<listcomp>c                 S   s   g | ]}d t | qS rb   rc   r"   r   r   r   r%      r&   c                 S   s   g | ]}d | qS rb   r   r"   r   r   r   r%      r&   c                 S   s   g | ]}d | qS rb   r   r"   r   r   r   r%      r&   utf8z[%04X] %-*s  %-*s  %s %s
   )r4   r
   r7   	translateHEXDUMP_FILTERdecode)	rC   srcNresultZ	is_stringZllZlrZhlZhrr   r   r   hexdump   s&    


zTestCase.hexdumpc                 C   s   |d u rt d|d ur(|d u r(t d|d u rL|d u s<J | }| }|d u r\| }t }|| || ||  |	|
  ||  || tjB  || |S )Nz)you need to supply a Credentials templatez8you cannot set creds username without setting a password)
ValueErrorZget_usernameZget_passwordZget_kerberos_stater   set_usernameset_passwordZ
set_domainZ
get_domainZ	set_realmZ	get_realmZset_workstationZget_workstationZset_gensec_featuresZget_gensec_featuresr   ZFEATURE_SEALZset_kerberos_state)rC   templateZusernameZuserpassZkerberos_statecr   r   r   insta_creds   s.    



zTestCase.insta_creds)      r   c                 C   s   t |d S r   r   )rC   reasonr   r   r   skipTest   s    zTestCase.skipTestc                 C   s   |  ||v | d S r   
assertTrue)rC   memberZ	containerrN   r   r   r   assertIn   s    zTestCase.assertInc                 C   s   |  ||u | d S r   rw   rC   abrN   r   r   r   assertIs   s    zTestCase.assertIsc                 C   s   |  ||u| d S r   rw   r{   r   r   r   assertIsNot   s    zTestCase.assertIsNotc                 C   s   |  |d u d S r   rw   rC   r|   rN   r   r   r   assertIsNotNone   s    zTestCase.assertIsNotNonec                 C   s   |  t||| d S r   )rx   r4   r{   r   r   r   assertIsInstance   s    zTestCase.assertIsInstancec                 C   s   |  |d u | d S r   rw   r   r   r   r   assertIsNone   s    zTestCase.assertIsNonec                 C   s   |  ||k| d S r   rw   r{   r   r   r   assertGreater   s    zTestCase.assertGreaterc                 C   s   |  ||k| d S r   rw   r{   r   r   r   assertGreaterEqual   s    zTestCase.assertGreaterEqualc                 C   s   |  ||k | d S r   rw   r{   r   r   r   
assertLess   s    zTestCase.assertLessc                 C   s   |  ||k| d S r   rw   r{   r   r   r   assertLessEqual   s    zTestCase.assertLessEqualc                 O   s   t | dg |||fg | _d S )N	_cleanups)rA   r   )rC   rF   r   r   r   r   r   rU      s    
zTestCase.addCleanupc                 C   s0   t |ttfrt|}||s,| | d S r   )r4   strr	   recompilesearchfail)rC   textZregexrN   r   r   r   assertRegexpMatches   s    

zTestCase.assertRegexpMatchesc                 C   s<   t |dd }|d ur || | ntdtd ||  d S )NaddSkipz4TestResult has no addSkip method, skips not reportedrs   )rA   warningswarnRuntimeWarning
addSuccess)rC   rk   ru   r   r   r   r   _addSkip   s    zTestCase._addSkipc              
   C   s.  |d u r|   }||  t| | j}zz|   W n| tyx } z*| |t| W Y d }~W ||  d S d }~0  t	y    Y n*   |
| |   Y W ||  d S 0 d}z|  d}W n ty
 } z*| |t| W Y d }~W ||  d S d }~0  | jy.   || |   Y n0 t	yB    Y n   |
| |   Y n0 z|   W nh ty } z| |t| W Y d }~n<d }~0  t	y    Y n    |
| |   d}Y n0 tt| dg D ]\}}}||i | q|r||  W ||  n||  0 d S )NFTr   )ZdefaultTestResultZ	startTestrA   Z_testMethodNamerP   r   r   r   ZstopTestKeyboardInterruptZaddErrorZ	_exc_infoZfailureExceptionZ
addFailureZtearDownreversedr   )rC   rk   Z
testMethodr:   okrF   r   r   r   r   r   run   s`    
$


$
zTestCase.runFc                 C   s   |r|  }|  }||krtjd|r,dndt|t|f  ddlm} ||d|ddd}|D ]}tj| ql| | d	S )
zAssert equality between two strings and highlight any differences.
        If strip is true, leading and trailing whitespace is ignored.z8The strings differ %s(lengths %d vs %d); a diff follows
zwhen stripped r^   r   )unified_diffTr|   r}   N)	stripsysstderrwriter   Zdifflibr   
splitlinesr   )rC   r|   r}   rN   r   r   Zdiffliner   r   r   assertStringsEqual*  s"    

zTestCase.assertStringsEqualc                    sf  |du r |j  d| d| d}z||i | W n tjy } z|j\}}t|tjjrh||v }	n||k}	|	sdd tt	 D  t|tjjrd
 fdd	|D }
n
 |}
| | d
|
 d| d | d| d|  W Y d}~nhd}~0 0 dd tt	 D  t|tjjrDd
 fdd	|D }
n
 |}
| d||
|f  dS )z/Assert a function raises a particular LdbError.Nz(*z, **)c                 S   s*   i | ]"\}}| d rt|tr||qS r(   r)   r4   rS   r*   r   r   r   r-   N  s   z1TestCase.assertRaisesLdbError.<locals>.<dictcomp>ra   c                 3   s   | ]}  |V  qd S r   r1   r"   Zlutr   r   r2   Q  r&   z0TestCase.assertRaisesLdbError.<locals>.<genexpr>z, expected LdbError r/   z got z (z) c                 S   s*   i | ]"\}}| d rt|tr||qS r(   r   r*   r   r   r   r-   Y  s   c                 3   s   | ]}  |V  qd S r   r   r"   r   r   r   r2   \  r&   z1%s, expected LdbError %s, (%s) but we got success)r   r5   r6   r   r4   collectionsabc	Containervarsitemsr7   r1   r   )rC   Zerrcodemessagefr   r   r:   numrN   foundZerrcode_namer   r   r   assertRaisesLdbErrorA  sF    




zTestCase.assertRaisesLdbError)NNNN)N)N)N)N)N)N)N)N)N)N)N)N)NF)"r   r   r   r   classmethodrL   r<   rP   rY   r[   r]   rl   rr   r   version_infor   rv   rz   r~   r   r   r   r   r   r   r   r   rU   r   r   r   r   r   __classcell__r   r   rV   r   r?   W   s<   
	











	
0
r?   c                       s,   e Zd ZdZ fddZg fddZ  ZS )LdbTestCasez2Trivial test case for running tests against a LDB.c                    s8   t t|   tjdd| _| jj| _t| j| _	d S )NF)delete)
rO   r   rP   tempfileZNamedTemporaryFilenamefilenamerT   Ldbr5   rB   rV   r   r   rP   i  s    
zLdbTestCase.setUpc                 C   sD   t  }t | j d|_d||d< | j | t| j| _ dS )z Change the modules for this Ldb.z@MODULES,z@LISTN)	r5   ZMessageDndnr7   addrT   r   r   )rC   modulesmr   r   r   set_moduleso  s
    zLdbTestCase.set_modules)r   r   r   r   rP   r   r   r   r   rV   r   r   f  s   r   c                       s0   e Zd Z fddZdd Zedd Z  ZS )TestCaseInTempDirc                    s(   t t|   t | _| | j d S r   )rO   r   rP   r   ZmkdtemptempdirrU   _remove_tempdirrB   rV   r   r   rP   z  s    
zTestCaseInTempDir.setUpc                 C   s*   |  g t| j t| j d | _d S r   )ZassertEqualrQ   listdirr   rmdirrB   r   r   r   r     s    z!TestCaseInTempDir._remove_tempdirc                 c   s   zpt j| jd\}}|V  W zt| t| W q ttfyn } ztd| t	j
d W Y d}~qd}~0 0 nVzt| t| W n: ttfy } ztd| t	j
d W Y d}~n
d}~0 0 0 dS )z*Yield a temporary filename in the tempdir.)dirz#could not remove temporary file: %s)fileN)r   Zmkstempr   rQ   closeunlinkOSErrorIOErrorr9   r   r   )rC   fdrF   r:   r   r   r   mktemp  s"    

zTestCaseInTempDir.mktemp)r   r   r   rP   r   r   r   r   r   r   rV   r   r   x  s   r   c                  C   s<   t  } z| tjd  W n ty6   tdY n0 | S )NZSMB_CONF_PATHzSMB_CONF_PATH not set)r   LoadParmloadrQ   environKeyError)lpr   r   r   rX     s    rX   Fc                 C   s:   |r| t j vrdS | t j v s0J d|  t j|  S )zReturns value for variable in os.environ

    Function throws AssertionError if variable is defined.
    Unit-test based python tests require certain input params
    to be set in environment, otherwise they can't be run
    NzPlease supply %s in environment)rQ   r   keys)Zvar_nameZallow_missingr   r   r   env_get_var_value  s
    r   c                   @   s   e Zd ZdZdS )RpcInterfaceTestCasezDCE/RPC Test case.Nr   r   r   r   r   r     s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )ValidNetbiosNameTestsc                 C   s   |  td d S )NZFOO)rx   rT   valid_netbios_namerB   r   r   r   
test_valid  s    z ValidNetbiosNameTests.test_validc                 C   s   |  td d S )NZFOOFOOFOOFOOFOOFOOFOOFOOFOOFOOZassertFalserT   r   rB   r   r   r   test_too_long  s    z#ValidNetbiosNameTests.test_too_longc                 C   s   |  td d S )Nz*BLAr   rB   r   r   r   test_invalid_characters  s    z-ValidNetbiosNameTests.test_invalid_charactersN)r   r   r   r   r   r   r   r   r   r   r     s   r   c                   @   s"   e Zd ZdZdddZdd ZdS )BlackboxProcessErrorzThis is raised when check_output() process returns a non-zero exit status

    Exception instance should contain the exact exit code (S.returncode),
    command line (S.cmd), process output (S.stdout) and process error stream
    (S.stderr)
    Nc                 C   sF   || _ t|tr$d|| _d| _n|| _d| _|| _|| _|| _d S )Nra   FT)	
returncoder4   listr7   cmdshellstdoutr   rN   )rC   r   r   r   r   rN   r   r   r   __init__  s    
zBlackboxProcessError.__init__c                 C   s8   d| j | j| j| j| jf }| jd ur4d|| jf }|S )NzBCommand '%s'; shell %s; exit status %d; stdout: '%s'; stderr: '%s'z%s; message: %s)r   r   r   r   r   rN   )rC   sr   r   r   __str__  s    
zBlackboxProcessError.__str__)N)r   r   r   r   r   r   r   r   r   r   r     s   
r   c                   @   sF   e Zd ZdZdd ZdddZdddZd	d
 Zdd ZdddZ	dS )BlackboxTestCasez"Base test case for blackbox tests.c                 C   s   t |tr|}n|dd}|d }tjt|}g d}tj|rN||d< ||v rttddrt|	dtj
d  t |tsd|}|S )zQExpand the called script into a fully resolved path in the bin
        directory.ra      r   )z
samba-toolZsamba_dnsupdateZsamba_upgradednszscript/traffic_replayzscript/traffic_learnerZPYTHONN)r4   r   splitrQ   pathr7   BINDIRexistsrR   insertr   )rC   r   partsr   ZexeZpython_cmdsr   r   r   _make_cmdline  s    


zBlackboxTestCase._make_cmdlineNc                 C   s   | j |d|d d S )Nr   )rN   )check_exit_code)rC   r   rN   r   r   r   	check_run  s    zBlackboxTestCase.check_runc           	      C   sn   |  |}t|t }tj|tjtj|d}| \}}|j}||krj|d u rZd||f }t||||||S )Nr   r   r   zexpected return code %s; got %s)	r   r4   r   
subprocessPopenPIPEcommunicater   r   )	rC   r   ZexpectedrN   	use_shellp
stdoutdata
stderrdataretcoder   r   r   r     s&    
z BlackboxTestCase.check_exit_codec                 C   sV   t |t }| |}tj|tjtj|dd}| \}}|j}|rRt|||||S )NT)r   r   r   Z	close_fds)	r4   r   r   r   r   r   r   r   r   rC   r   r   r   r   r   r   r   r   r   check_output  s    
zBlackboxTestCase.check_outputc                 C   sT   |  |}t|t }tj|tjtj|d}| \}}|j}||d|dfS )Nr   ZUTF8)	r   r4   r   r   r   r   r   r   rh   r   r   r   r   run_command   s    
zBlackboxTestCase.run_command    c                 C   sV   t  tj}|t  tj7 }|t  tj7 }|ddd t|d D 7 }|S )Nr^   c                 s   s(   | ] }t  tjtj tj V  qd S r   )r   choicestringascii_uppercaseascii_lowercasedigitsr"   r   r   r   r2   1  s   
z3BlackboxTestCase.random_password.<locals>.<genexpr>r   )r   r   r   r   r  r   r7   range)rC   countZpasswordr   r   r   random_password-  s    

z BlackboxTestCase.random_password)N)N)r   )
r   r   r   r   r   r   r   r   r   r  r   r   r   r   r     s   

r   Tc              	   C   s   d| vr*|s"t j| r"d|  } nd|  } | dr<dg}n|rLtd|  |du rZt }|du rntj|}|du rzt	}t
| ||||||dS )	au  Create SamDB instance and connects to samdb_url database.

    :param samdb_url: Url for database to connect to.
    :param lp: Optional loadparm object
    :param session_info: Optional session information
    :param credentials: Optional credentials, defaults to anonymous.
    :param flags: Optional LDB flags
    :param ldap_only: If set, only remote LDAP connection will be created.
    :param global_schema: Whether to use global schema.

    Added value for tests is that we have a shorthand function
    to make proper URL for ldb.connect() while using default
    parameters for connection based on test environment
    z://ztdb://%sz	ldap://%szldap://zmodules:paged_searchesz;Trying to connect to %s while remote connection is requiredN)Zurlr   session_infor   flagsZoptionsglobal_schema)rQ   r   isfiler)   AssertionErrorrX   rT   ZauthZsystem_sessionrZ   r   )	samdb_urlr   r  r   r  ldb_options	ldap_onlyr  r   r   r   connect_samdb7  s0    

r  c           	      C   s6   t | ||||||}|jddtjdgd}||d fS )a  Connects to samdb_url database

    :param samdb_url: Url for database to connect to.
    :param lp: Optional loadparm object
    :param session_info: Optional session information
    :param credentials: Optional credentials, defaults to anonymous.
    :param flags: Optional LDB flags
    :param ldap_only: If set, only remote LDAP connection will be created.
    :return: (sam_db_connection, rootDse_record) tuple
    r^   *)baseZ
expressionZscopeattrsr   )r  r   r5   Z
SCOPE_BASE)	r
  r   r  r   r  r  r  Zsam_dbresr   r   r   connect_samdb_exd  s    
r  c                 C   sT   t | }t }|du r*t }|| |t | |t | t|||dS )a  Connect to SamDB by getting URL and Credentials from environment

    :param env_url: Environment variable name to get lsb url from
    :param env_username: Username environment variable
    :param env_password: Password environment variable
    :return: sam_db_connection
    N)r   r   )	r   r   r   r   r   Zguessrn   ro   r  )Zenv_urlZenv_usernameZenv_passwordr   r
  r\   r   r   r   connect_samdb_envx  s    
r  c              
   K   sb   z| j |fi | W nF tjy\ } z,|j\}}|tjksHJ d| W Y d }~n
d }~0 0 d S )Nzldb.delete() failed: %s)r   r5   r6   r   ZERR_NO_SUCH_OBJECT)samdbr   r   errorr   Zerrstrr   r   r   delete_force  s
    
r  c                 C   s8   t dd}t| d|||  f }| |dd |S )z Creates a unique OU for the testr   i z
OU=%s%d,%sZorganizationalUnit)r   Zobjectclass)r   r5   r   Zget_default_basednr   )r  r   Zrandr   r   r   r   create_test_ou  s    
r  c                   @   s   e Zd ZdZdZdZdZdS )OptStater   r   rs   r   N)r   r   r   NOOPTHYPHEN1HYPHEN2NAMEr   r   r   r   r    s   r  
   c                 C   s  |d u rg }nd }|  dD ]f}| }|dkr2q|d u rJ||krg }nqt|t|| k r`q|d dkrv|| ||kr qq|d u rd S tdj}|D ] }tj}	d }
d}|D ]}|	tjkr|dkr|	 rtj
}	|}q|	tj
kr| rd| }
tj}	q|dkrtj}	q|	tjkrJ| r>d| }
tj}	qtj}	|}q|	tjkr||rh|
|7 }
q||
g | tj}	|}q|	tjkr||
g | qd S )N
r^   r   -z^[\w-]$ra   z--)r   lstripr   appendr   r   matchr  r  isspacer  isalnumr  r  
setdefault)outoptions_startoptions_endoptmapZmax_leading_spacesZ	opt_linesZraw_liner   Zis_longname_charstater   prevrq   r   r   r   parse_help_consistency  sh    








r,  c                 C   sf   i }t | ||| g }t| D ]0\}}t|dkr"|D ]}|d||f  q:q"|rbd|S dS )a  Ensure that options are not repeated and redefined in --help
    output.

    Returns None if everything is OK, otherwise a string indicating
    the problems.

    If options_start and/or options_end are provided, only the bit in
    the output between these two lines is considered. For example,
    with samba-tool,

    options_start='Options:', options_end='Available subcommands:'

    will prevent the test looking at the preamble which may contain
    examples using options.
    r   z%s: %sr  N)r,  sortedr   r   r!  r7   )r&  r'  r(  r)  errorsr+   valuesr,   r   r   r   check_help_consistency  s    r0  )F)NNNr   NFT)NNNr   NF)N)NNNr  )NN)Hr   Z
__future__r   rQ   r   r   r   r5   rT   r   r   Zsamba.credentialsr   r   r   r   Zunittestr   enumr   r   Z
samba.authZsamba.dcerpc.baseZsamba.compatr	   r
   Zrandomr   r   
contextlibr   r   Zsamba.samdbr   ImportErrorZ	samba.ndrZsamba.dcerpc.dcerpcZsamba.dcerpc.epmapperr   rM   r   abspathr7   dirname__file__r   	bytearrayr  rg   r   r   r0   r;   r>   r?   r   r   rX   r   rZ   r   r   r   r   r  r  r  r  r  r  r,  r0  r   r   r   r   <module>   s     	
[  
-  

    
K  