U
    ]                     @   s   d 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Zddl	Z
ddlmZ ddlmZ ddlmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ G dd dejZdd ZG dd dejZedkre  dS )z%Tests for certbot.plugins.standalone.    Nerrno)
challenges)
standalone)DictTupleSet)achallenges)errors)	acme_util)utilc                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )ServerManagerTestz3Tests for certbot.plugins.standalone.ServerManager.c                 C   s,   ddl m} i | _i | _|| j| j| _d S )Nr   )ServerManager)certbot.plugins.standaloner   certshttp_01_resourcesmgr)selfr    r   A/usr/lib/python3/dist-packages/certbot/plugins/standalone_test.pysetUp   s    zServerManagerTest.setUpc                 C   s,   |  | jj| jk |  | jj| jk d S N)
assertTruer   r   r   r   r   r   r   	test_init"   s    zServerManagerTest.test_initc                 C   sZ   | j jd|d}| d d }| | j  ||i | j j|d | | j  i  d S )Nr   portchallenge_type   )r   )r   rungetsocknamesassertEqualrunningstop)r   r   serverr   r   r   r   _test_run_stop'   s
    z ServerManagerTest._test_run_stopc                 C   s   |  tj d S r   )r%   r   HTTP01r   r   r   r   test_run_stop_http_01.   s    z'ServerManagerTest.test_run_stop_http_01c                 C   sz   | j jdtjd}| d d }| j j|tjd}| | j  ||i | ||k | j | | | j  i  d S )Nr   r   r   )	r   r   r   r&   r    r!   r"   r   r#   )r   r$   r   server2r   r   r   test_run_idempotent1   s    z%ServerManagerTest.test_run_idempotentc                 C   s   t  t j}|d | d }t   }z|d|f W n t jk
rR   Y nX | jtj| jj	|t
jd | | j i  |  |  d S )N r   r   r+   )r   )socketZAF_INET6bindgetsocknameerrorassertRaisesr
   StandaloneBindErrorr   r   r   r&   r!   r"   close)r   Zsome_serverr   Zmaybe_another_serverr   r   r   test_run_bind_error:   s"    
  z%ServerManagerTest.test_run_bind_errorN)
__name__
__module____qualname____doc__r   r   r%   r'   r)   r3   r   r   r   r   r      s   	r   c                  C   s4   t  t jt jd} | d |  d }|   |S )z%Gets an open port number from the OS.r   r*   r   )r,   ZAF_INETZSOCK_STREAMr-   r.   r2   )Zopen_socketr   r   r   r   get_open_portK   s
    
r8   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Ze	 d
d Z
e	 dd Zdd Zdd Zdd Zdd Zedd Zdd ZdS )AuthenticatorTestz3Tests for certbot.plugins.standalone.Authenticator.c                 C   s<   ddl m} tjt d| _|| jdd| _t | j_d S )Nr   )Authenticator)Zhttp01_portr   )name)r   r:   mock	MagicMockr8   Zconfigauthservers)r   r:   r   r   r   r   W   s    zAuthenticatorTest.setUpc                 C   s   |  t| j tj d S r   )r   
isinstancer>   Z	more_infosixZstring_typesr   r   r   r   test_more_info^   s    z AuthenticatorTest.test_more_infoc                 C   s   |  | jjd dtjg d S )N)domain)r!   r>   Zget_chall_prefr   r&   r   r   r   r   test_get_chall_prefa   s    z%AuthenticatorTest.test_get_chall_prefc                 C   s2   |   }| j|}dd |D }| || d S )Nc                 S   s   g | ]}| |jqS r   )responseaccount_key).0Zachallr   r   r   
<listcomp>i   s     z2AuthenticatorTest.test_perform.<locals>.<listcomp>)_get_achallsr>   performr!   )r   ZachallsrE   Zexpectedr   r   r   test_performe   s    zAuthenticatorTest.test_performc                 C   s^   | }t j}ttj|dd}|gdt g  | jjj_	|j
}d|_|   | | d S )Nr      T)socket_errors
EADDRINUSEr
   r1   r<   r=   r>   r?   r   side_effectyesnoreturn_valuerK   _assert_correct_yesno_call)r   mock_get_utilitymock_utilityr   r/   
mock_yesnor   r   r   test_perform_eaddrinuse_retryl   s    z/AuthenticatorTest.test_perform_eaddrinuse_retryc                 C   s8   | }|j }d|_tj}| tj| j| | | d S )NF)	rQ   rR   rN   rO   r0   r
   PluginError_fail_performrS   )r   rT   rU   rV   r   r   r   r    test_perform_eaddrinuse_no_retryx   s    z2AuthenticatorTest.test_perform_eaddrinuse_no_retryc                 C   s2   |j \}}| d|d k | |dd d S )Nzin user   defaultT)Z	call_argsr   ZassertFalseget)r   rV   Z
yesno_argsZyesno_kwargsr   r   r   rS      s    
z,AuthenticatorTest._assert_correct_yesno_callc                 C   s   t j}| tj| j| d S r   )rN   ZEACCESr0   r
   rX   rY   r   r   r   r   r   test_perform_eacces   s    z%AuthenticatorTest.test_perform_eaccesc                 C   s   t j}| tj| j| d S r   )rN   ZENOTCONNr0   r
   r1   rY   r]   r   r   r   $test_perform_unexpected_socket_error   s      z6AuthenticatorTest.test_perform_unexpected_socket_errorc                 C   s4   t tj|dd}|| jjj_| j| 	  d S )Nr   rL   )
r
   r1   r<   r=   r>   r?   r   rP   rJ   rI   )r   r   r/   r   r   r   rY      s    zAuthenticatorTest._fail_performc                 C   s.   d}t jtd}tjtj||d}|gS )Ns	   localhostzrsa512_key.pem)ZchallbrC   rF   )	joseZJWKload	test_utilZload_vectorr	   Z"KeyAuthorizationAnnotatedChallenger   ZHTTP01_P)clsrC   keyZhttp_01r   r   r   rI      s      zAuthenticatorTest._get_achallsc                 C   s  ddd| j jj_| j jd d | j jd ddg | j dg | | j jt	 t	ddgd | j jj
d d	di| j jj_| j dg | | j jt	 t	dgd | d| j jj
j | j dg | | j jt	 t	g d | j jj
d	 d S )
Nserver1r(   )r   rM   Zchall1Zchall2Zchall3)re   r(   r   rM   )r>   r?   r"   rR   ZservedaddupdateZcleanupr!   setr#   Zassert_called_once_withZ
call_countZassert_called_withr   r   r   r   test_cleanup   s4    
 
 
 
 zAuthenticatorTest.test_cleanupN)r4   r5   r6   r7   r   rB   rD   rK   rb   Zpatch_get_utilityrW   rZ   rS   r^   r_   rY   classmethodrI   ri   r   r   r   r   r9   T   s    

	
r9   __main__) r7   r,   r   rN   ZunittestZjosepyr`   r<   rA   ZOpenSSL.cryptoZOpenSSLZacmer   r   Zacme_standaloneZacme.magic_typingr   r   r   Zcertbotr	   r
   Zcertbot.testsr   r   rb   ZTestCaser   r8   r9   r4   mainr   r   r   r   <module>   s&   3	e