ó
pAçRc           @   sï   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 Z d  d l	 j
 Z
 d  d l j Z d  d l j Z e j j e j j e ƒ d d ƒ Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ d S(   iÿÿÿÿN(   t   SystemRandoms   ..t   datat   TestCasec           B   s5   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s1   | |  _  |  j | ƒ \ |  _ |  _ d  |  _ d  S(   N(   t   harnesst   normalize_id_and_urlt   idt   urlt   Nonet   json(   t   selfR   t	   id_or_url(    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt   __init__   s    	c         C   sg   t  j d | ƒ r; | } | j d ƒ d j d ƒ d } n" | } |  j j } d | | f } | | f S(   Ns	   \Ahttps?:t   /iÿÿÿÿt   .i    s5   https://stripe-ctf-3.s3.amazonaws.com/level%s/%s.json(   t   ret   matcht   splitR   t   LEVEL(   R	   R
   R   R   t   level(    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyR      s    #c         C   s#   t  j j |  j j ƒ  |  j d ƒ S(   Ns   .json(   t   ost   patht   joinR   t   test_cases_pathR   (   R	   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt	   dump_path!   s    c         C   sÞ   |  j  r |  j  Sy? t |  j ƒ  d ƒ } t j  j | ƒ |  _  | j ƒ  |  j  SWn t k
 rb n Xt j j d |  j	 ƒ |  j
 j |  j	 ƒ } y t j  j | ƒ |  _  Wn- t k
 rÖ d | f } t j | ƒ ‚ n X|  j  S(   Nt   rs   Fetching. URL: %ssL   There was a problem parsing the test case. We expected JSON. We received: %s(   R   t   openR   t   utilt   loadt   closet   IOErrort   loggert   infoR   R   t   fetch_s3_resourcet   loadst
   ValueErrort   errort   StripeError(   R	   t   ft   contentt   msg(    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyR   $   s$    	 

c         C   sR   t  t j j |  j j ƒ  |  j d ƒ d ƒ } t j j	 |  j | ƒ | j
 ƒ  d  S(   Ns   .jsont   w(   R   R   R   R   R   R   R   R   R   t   dumpR   (   R	   R%   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt   flush8   s    .(   t   __name__t
   __module__R   R   R   R   R*   (    (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyR      s
   				t   AbstractHarnessc           B   s_   e  Z g  i  d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 RS(	   c            sÞ   t  j ˆ  j ƒ  ƒ t j j t j ƒ  ƒ sM d t j ƒ  } t j	 | ƒ ‚ n  | g  k r„ t  j
 j d ƒ t ƒ  j ˆ  j ƒ g } n  t ‡  f d †  | ƒ ˆ  _ | ˆ  _ i d ˆ  j f d 6} t j d | d t ƒ ˆ  _ d  S(   Nsd   You seem to have deleted the file of certificates that shipped with this repo. It should exist at %ss8   No test case supplied. Randomly choosing among defaults.c            s   t  ˆ  |  ƒ S(   N(   R   (   t   token(   R	   (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt   <lambda>H   s    s   Stripe TestHarness/%ss
   User-Agentt   headerst   verify_ssl_certs(   R   t   mkdir_pR   R   R   t   isfilet   http_clientt
   certs_pathR#   R$   R   R   R    t   choicet   DEFAULT_TEST_CASESt   mapt
   test_casest   optionst   VERSIONt   new_default_http_clientt   True(   R	   t   ids_or_urlsR:   R'   R0   (    (   R	   s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyR   >   s    	c         C   sÆ   y |  j  j d | ƒ \ } } WnF t j k
 rg t j ƒ  } d | f } t j | t | ƒ ƒ ‚ n X| d k rx | S| d k r£ d | f } t j | ƒ ‚ n d | | f } t j | ƒ ‚ d  S(   Nt   gets¹   There was an error while connecting to fetch the url %s. Please check your connectivity. If there continues to be an issue, please let us know at ctf@stripe.com. The specific error is:
iÈ   i“  s‚   We received a 403 while fetching the url %s. This probably means that you are trying to get something that doesn't actually exist.sF   We received the unexpected response code %i while fetching the url %s.(   R4   t   requestR#   t   HTTPConnectionErrorR   t   exception_asR$   t   str(   R	   R   R&   t   status_codet   errR'   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyR    O   s     

c         C   sI   |  j  d } | d k r5 |  j ƒ  } |  j | ƒ n t d | ƒ ‚ d  S(   Nt   taskt   executes   Unrecognized task (   R:   t   load_test_casesRG   t   StandardError(   R	   RF   t   test_cases_to_execute(    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt   rune   s
    c         C   s   t  j j t d d |  j ƒ S(   Nt   downloaded_test_casess	   version%i(   R   R   R   t   data_directoryR;   (   R	   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyR   n   s    	c         C   sD   t  j j d |  j ƒ  ƒ x$ |  j D] } | j |  j ƒ  ƒ q# Wd  S(   Ns   Flushing. Path: %s(   R   R   R   R   R9   R*   (   R	   t	   test_case(    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt   flush_test_casest   s    c         C   s   |  j  j | ƒ d  S(   N(   R9   t   append(   R	   RN   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt   add_test_casey   s    c         C   sM   g  } x@ |  j  D]5 } | j ƒ  } | s. q n  | j ƒ  | j | ƒ q W| S(   N(   R9   R   R*   RP   (   R	   t   loaded_test_casesRN   t   result(    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyRH   |   s     
c         C   s   d  S(   N(    (   R	   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt   hook_preexecute…   s    c         C   sg   |  j  ƒ  |  j ƒ  } xJ | D]B } |  j d rO t j j | j | j ƒ ƒ q | j | j ƒ q Wd  S(   Nt   raw(	   RT   t   hook_create_runnerR:   R   R   R   t   run_test_case_rawR   t   run_test_case(   R	   RJ   t   runnerRN   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyRG   ‰   s    
(   R+   R,   R   R    RK   R   RO   RQ   RH   RT   RG   (    (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyR-   =   s   									t   AbstractRunnerc           B   sk   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z RS(   c         C   s   d  S(   N(    (   R	   R:   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyR   ”   s    c         C   s   t  j j t  j j t ƒ d ƒ S(   Ns   ..(   R   R   R   t   dirnamet   __file__(   R	   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt   code_directory˜   s    c         C   s­   t  j j d ƒ t  j j | d d !ƒ t t j ƒ  j | j t ƒ | j t ƒ ƒ ƒ } t	 d „  | d d !ƒ } t  j j d ƒ t  j j d ƒ t  j j d j
 | ƒ ƒ d  S(	   Ns    Here is the head of your output:i    iè  c         S   s   |  d d k S(   Ni    t   ?(    (   t   line(    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyR/       s    i   s   
***********
sC   Here is the head of the diff between your output and the benchmark:t    (   R   R   R   t   listt   difflibt   Differt   comparet
   splitlinesR=   t   filterR   (   R	   t   benchmark_outputt   user_outputt   difft   lines(    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt   log_diff›   s    c         C   s§   t  j j d ƒ t j t j j |  j ƒ  d ƒ g d t j	 d t j	 ƒ} | j
 ƒ  \ } } | j d k r} t  j j d ƒ n& t  j j d | j ƒ t  j j | ƒ d  S(   Ns"   Building your code via `build.sh`.s   build.sht   stdoutt   stderri    s   Done building your code.s"   Build failed with code %i. Stderr:(   R   R   R   t
   subprocesst   PopenR   R   R   R]   t   PIPEt   communicatet
   returncode(   R	   t   build_runnerRl   Rm   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt   run_build_sh¥   s    c         C   s   d  S(   N(    (   R	   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt   hook_prerun³   s    c         C   sQ   |  j  ƒ  | d } t j j d | ƒ | d } |  j | ƒ } |  j | | ƒ S(   NR   s   About to run test case: %st   input(   Ru   R   R   R   t	   run_inputt   report_result(   R	   RN   R   Rv   RS   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyRX   ¶   s    


c         C   s+   |  j  ƒ  | d } |  j | ƒ } | d S(   NRv   t   output(   Ru   Rw   (   R	   RN   Rv   RS   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyRW   ¾   s    

c         C   s<   t  j j d ƒ |  j |  j ƒ  | ƒ } t  j j d ƒ | S(   Ns   Beginning run.s   Finished run(   R   R   R   t   run_subprocess_commandt   subprocess_command(   R	   Rv   Ry   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyRw   Ä   s    c         C   s.   | s
 d  St  j j d ƒ t  j j | ƒ d  S(   Ns   Standard error from trial run:(   R   R   R   (   R	   Rm   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt   report_stderrÊ   s     c         C   sp   t  j d k r! | j d ƒ } n  | j | ƒ \ } } t  j d k rf | j d ƒ } | j d ƒ } n  | | f S(   Ni   i    s   utf-8(   i   i    (   i   i    (   t   syst   version_infot   encodeRq   t   decode(   R	   RY   Rv   Rl   Rm   (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt   subprocess_communicateÏ   s    c         C   s‹   t  j  ƒ  } t j | d t j d t j d t j ƒ} |  j | | ƒ \ } } t  j  ƒ  } i | | d 6| d 6| d 6|  j d 6| j d 6S(	   Nt   stdinRl   Rm   t   wall_clock_timeRy   Rv   R   t
   exitstatus(   t   timeRn   Ro   Rp   R   R   Rr   (   R	   t   commandRv   t
   start_timeRY   Rl   Rm   t   end_time(    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyRz   Ø   s    *
(   R+   R,   R   R]   Rk   Rt   Ru   RX   RW   Rw   R|   R   Rz   (    (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyRZ   “   s   			
								(   Rb   t   os.pathR   t   randomR    R   Rn   R}   R…   t	   lib.errorR#   t   lib.http_clientR4   t   lib.utilR   R   R   R[   R\   RM   t   objectR   R-   RZ   (    (    (    s7   /Users/bryon/r-bryfry/level2/test/lib/test_framework.pyt   <module>   s   $-V