Ñò
e¦ŠRc           @   sò  d  d k  Z  d  d k Z d  d k Z d  d k Z d  d k Z d  d k Z d  d k Z d  d k l Z d  d k	 l
 Z
 d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d  e f d! „  ƒ  YZ e e e e e e e e e e e e e e g Z d S("   iÿÿÿÿN(   t   Test(   t   Failuret
   ServerTestc           B   s#   e  Z d  Z d „  Z d d „ Z RS(   i   c         C   s“   yJ | i  ƒ  } | i ƒ  } | i ƒ  t | ƒ d j o |  i d ƒ n WnB t j
 o6 } |  i d t | ƒ ƒ t d t | ƒ ƒ ‚ n Xd  S(   Ni    s   missing body in responses   Client failed with error: (   t   getresponset   readt   closet   lent   failt	   Exceptiont   strR   (   t   selft   connt   responset   msgt   inst(    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyt
   client_run
   s    
c         C   s­  d } d } t  i i |  i d ƒ } xvt d ƒ D]h} t i | | ƒ }	 |  i d t |	 ƒ ƒ d t |	 ƒ t | ƒ t | ƒ | g }
 | d  j	 o |
 i
 t | ƒ ƒ n |  i |
 d | ƒ} t i d ƒ | i ƒ  | i d  j oš t i d	 |	 d
 d ƒ} | i d d ƒ y | i ƒ  } | i ƒ  Wn t j
 o n X| i ƒ  | i d  j o$ t i d ƒ |	 |  _ | |  _ | Sn y | i ƒ  Wq1 q1 Xq1 Wt d ƒ ‚ d  S(   Niˆ  i'  t   filesi   s   Starting server on port t   servert   cwdgš™™™™™É?t	   localhostt   timeouti   t   GETs
   /home.htmlgš™™™™™¹?s   Could not start server(   t   ost   patht   joint	   test_patht   ranget   randomt   randintt   logR	   t   Nonet   appendt   startexet   timet   sleept   pollt
   returncodet   httplibt   HTTPConnectiont   requestR   R   R   t   portt
   serverProct   killR   (   R
   t   threadst   bufferst   schedalgt   nt   minportt   maxportt   roott   iR(   t   argsR)   R   R   (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyt
   run_server   s@     '

			N(   t   __name__t
   __module__R   R   R   R4   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyR      s   	t   Basicc           B   s8   e  Z d  Z d Z d „  Z d Z d Z d Z d „  Z RS(   t   basics)   check if the webserver can serve requestsc         C   s¼   y‰ t  i d |  i d d ƒ} d GH| i d d ƒ d GH| i ƒ  } d GH| i ƒ  } d	 GHt | ƒ d
 j o |  i d ƒ n | i ƒ  Wn, t	 j
 o  } |  i d t
 | ƒ ƒ n Xd  S(   NR   R   i
   t	   ConnectedR   s
   /home.htmlt	   Requesteds   Got responses   Read responsei    s   missing body in responses   Client failed with error: (   R%   R&   R(   R'   R   R   R   R   R   R   R	   (   R
   R   R   R   R   (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyt   client1_run;   s    i   t   FIFOc         C   s@   |  i  |  i |  i |  i ƒ } |  i ƒ  | i ƒ  |  i ƒ  d  S(   N(   R4   R+   R,   R-   R;   R*   t   done(   R
   R)   (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyt   runR   s    

(	   R5   R6   t   namet   descriptionR;   R+   R,   R-   R>   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyR7   7   s   	t   Fifoc           B   s   e  Z d  Z d Z d „  Z RS(   t   fifos)   FIFO with dynamic requests and one threadc         C   s«  |  i  d d d d d d ƒ } d d d d	 g } t ƒ  } xS | D]K } t i d
 ƒ t i d |  i d d ƒ} | i d | ƒ | i | ƒ q@ Wg  } | D]% } | t	 i
 d |  i d | f ƒ qš ~ } x | D] }	 |	 i ƒ  qÏ Wx­ t d ƒ D]Ÿ }
 | |
 i ƒ  p" |  i d t |
 ƒ d ƒ qð n | |
 i ƒ  xU t |
 d d ƒ D]@ } | | i ƒ  p) |  i d t | ƒ d t |
 ƒ ƒ qKqKWqð W| i ƒ  |  i ƒ  d  S(   NR+   i   R,   R-   R<   s   /output.cgi?3s   /3.cgi?1s   /2.cgi?1s   /1.cgi?1gš™™™™™¹?R   R   i
   R   t   targetR3   i   s   reply s    received too soons    was received before reply (   R4   t   listR!   R"   R%   R&   R(   R'   R   t	   threadingt   ThreadR   t   startR   t   is_aliveR   R	   R   R*   R=   (   R
   R)   t   requestst   connsR'   t
   connectiont   _[1]R   t   clientst   clientR2   t   j(    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyR>   ]   s4    	 2   1
(   R5   R6   R?   R@   R>   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyRA   Y   s   t   Sffc           B   s   e  Z d  Z d Z d „  Z RS(   t   sffs8   Smallest file first with dynamic requests and one threadc   	   
   C   s:  |  i  d d d d d d ƒ } d  g d } t i d |  i d	 d ƒ| d
 <| d
 i d d ƒ t i d ƒ t i d |  i d	 d ƒ| d <| d i d d ƒ t i d ƒ t i d |  i d	 d ƒ| d <| d i d d ƒ t i d ƒ t i d |  i d	 d ƒ| d <| d i d d ƒ g  } | D]% } | t i	 d |  i
 d | f ƒ q)~ } x | D] } | i ƒ  q^Wx­ t d ƒ D]Ÿ } | | i ƒ  p" |  i d t | ƒ d ƒ qn | | i ƒ  xU t | d d ƒ D]@ } | | i ƒ  p) |  i d t | ƒ d t | ƒ ƒ qÚqÚWqW| i ƒ  |  i ƒ  d  S(   NR+   i   R,   i
   R-   t   SFFi   R   R   i    R   s   /output.cgi?3i   s   /2.cgi?1gš™™™™™¹?i   s   /3.cgi?1s   /1.cgi?1RC   R3   s   reply s    received too soons    was received before reply (   R4   R   R%   R&   R(   R'   R!   R"   RE   RF   R   RG   R   RH   R   R	   R   R*   R=   (	   R
   R)   RJ   RL   R   RM   RN   R2   RO   (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyR>   {   s:    9   1
(   R5   R6   R?   R@   R>   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyRP   w   s   t   Sff2c           B   s   e  Z d  Z d Z d „  Z RS(   t   sff2s)   Smallest file first with dynamic requestsc      	   C   sI  |  i  d d d d d d ƒ } d  g d } t i d |  i d	 d ƒ| d
 <| d
 i d d ƒ t i d |  i d	 d ƒ| d <| d i d d ƒ t i d ƒ t i d |  i d	 d ƒ| d <| d i d d ƒ t i d |  i d	 d ƒ| d <| d i d d ƒ t i d |  i d	 d ƒ| d <| d i d d ƒ t i d |  i d	 d ƒ| d <| d i d d ƒ g  } | D]% } | t i	 d |  i
 d | f ƒ qu~ } x | D] } | i ƒ  qªWxU d d g D]G } | | i ƒ  p" |  i d t | ƒ d ƒ qËn | | i ƒ  qËWx | D] } | i ƒ  qW| i ƒ  |  i ƒ  d  S(   NR+   i   R,   i
   R-   RR   i   R   R   i    R   s   /output.cgi?3i   i   s   /2.cgi?1i   i   s   /3.cgi?1s   /1.cgi?1RC   R3   s   reply s    received too soon(   R4   R   R%   R&   R(   R'   R!   R"   RE   RF   R   RG   RH   R   R	   R   R*   R=   (   R
   R)   RJ   RL   R   RM   RN   R2   (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyR>   ¥   s<    9   
(   R5   R6   R?   R@   R>   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyRS   ¢   s   t   Sfnfc           B   s   e  Z d  Z d Z d „  Z RS(   t   sfnfs.   Shortest file name first with dynamic requestsc      	   C   sI  |  i  d d d d d d ƒ } d  g d } t i d |  i d	 d ƒ| d
 <| d
 i d d ƒ t i d |  i d	 d ƒ| d <| d i d d ƒ t i d ƒ t i d |  i d	 d ƒ| d <| d i d d ƒ t i d |  i d	 d ƒ| d <| d i d d ƒ t i d |  i d	 d ƒ| d <| d i d d ƒ t i d |  i d	 d ƒ| d <| d i d d ƒ g  } | D]% } | t i	 d |  i
 d | f ƒ qu~ } x | D] } | i ƒ  qªWxU d d g D]G } | | i ƒ  p" |  i d t | ƒ d ƒ qËn | | i ƒ  qËWx | D] } | i ƒ  qW| i ƒ  |  i ƒ  d  S(   NR+   i   R,   i
   R-   t   SFNFi   R   R   i    R   s   /output.cgi?3i   i   s	   /1_.cgi?1i   i   s
   /1__.cgi?1s   /1.cgi?1RC   R3   s   reply s    received too soon(   R4   R   R%   R&   R(   R'   R!   R"   RE   RF   R   RG   RH   R   R	   R   R*   R=   (   R
   R)   RJ   RL   R   RM   RN   R2   (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyR>   Å   s<    9   
(   R5   R6   R?   R@   R>   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyRU   Â   s   t   Poolc           B   s   e  Z d  Z d Z d „  Z RS(   t   pools'   check if using a fixed size thread poolc         C   s>  |  i  d d d d d d ƒ } t ƒ  } xW t d ƒ D]I } | i t i d |  i d	 d
 ƒƒ | d i d d ƒ t i	 d ƒ q4 Wyv | d i
 ƒ  | d i
 ƒ  t i ƒ  } | d i
 ƒ  | d i
 ƒ  t i ƒ  } | | d j  o |  i d ƒ n Wn, t j
 o  } |  i d t | ƒ ƒ n X| i ƒ  |  i ƒ  d  S(   NR+   i   R,   i   R-   R<   i   R   R   i
   iÿÿÿÿR   s   /output.cgi?1gš™™™™™¹?i    i   i   s+   not using a fixed size thread pool (size 2)s   Client failed with error: (   R4   RD   R   R   R%   R&   R(   R'   R!   R"   R   R   R   R	   R*   R=   (   R
   R)   RJ   R2   t   t1t   t2R   (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyR>   å   s(    	 "
(   R5   R6   R?   R@   R>   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyRX   â   s   t   Pool2c           B   s   e  Z d  Z d Z d „  Z RS(   t   pool2s'   check if using a fixed size thread poolc         C   sZ  |  i  d d d d d d ƒ } t ƒ  } xW t d ƒ D]I } | i t i d |  i d	 d
 ƒƒ | d i d d ƒ t i	 d ƒ q4 Wy’ | d i
 ƒ  | d i
 ƒ  | d i
 ƒ  t i ƒ  } | d i
 ƒ  | d i
 ƒ  | d i
 ƒ  t i ƒ  } | | d j  o |  i d ƒ n Wn, t j
 o  } |  i d t | ƒ ƒ n X| i ƒ  |  i ƒ  d  S(   NR+   i   R,   i   R-   R<   i   R   R   i
   iÿÿÿÿR   s   /output.cgi?1gš™™™™™¹?i    i   i   i   i   s+   not using a fixed size thread pool (size 2)s   Client failed with error: (   R4   RD   R   R   R%   R&   R(   R'   R!   R"   R   R   R   R	   R*   R=   (   R
   R)   RJ   R2   RZ   R[   R   (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyR>     s,    	 "
(   R5   R6   R?   R@   R>   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyR\   ÿ   s   t   Locksc           B   sP   e  Z d  Z d Z d Z d Z d Z d Z d Z d d g Z	 d „  Z
 d	 „  Z RS(
   t   lockss(   many concurrent requests to test lockingi   i   R<   i   s
   /home.htmls   /output.cgi?0.3c         C   sj   xc t  |  i ƒ D]R } xI |  i D]> } t i d |  i d d ƒ} | i d | ƒ |  i | ƒ q  Wq Wd  S(   NR   R   i   R   (   R   t   loopsRI   R%   R&   R(   R'   R   (   R
   R2   R'   R   (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyt	   many_reqs'  s     
 c         C   s®   |  i  d |  i d |  i d |  i ƒ } g  } t |  i ƒ D] } | t i d |  i ƒ q; ~ } x | D] } | i	 ƒ  qg Wx | D] } | i
 ƒ  q‚ W| i ƒ  |  i ƒ  d  S(   NR+   R,   R-   RC   (   R4   R+   R,   R-   R   t   num_clientsRE   RF   Ra   RG   R   R*   R=   (   R
   R)   RL   R2   RM   RN   (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyR>   -  s    '9  
(   R5   R6   R?   R@   R+   R,   R-   Rb   R`   RI   Ra   R>   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyR^     s   	t   Locks2c           B   s8   e  Z d  Z d Z d Z d Z d Z d d d d g Z RS(	   t   locks2i    i@   i(   i
   s
   /home.htmls   /output.cgi?0.3s   /ins   /output.cgi?0.2(   R5   R6   R?   R+   R,   Rb   R`   RI   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyRc   7  s   t   Locks3c           B   sD   e  Z d  Z d Z d Z d Z d Z d Z d d d d	 g Z d
 Z	 RS(   t   locks3i@   i€   RR   i2   i   s
   /home.htmls   /output.cgi?0.3s   /ins   /output.cgi?0.2i<   (
   R5   R6   R?   R+   R,   R-   Rb   R`   RI   R   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyRe   ?  s   t   Locks4c           B   s;   e  Z d  Z d Z d Z d Z d Z d d d g Z d Z RS(   t   locks4i   i   i   s   /output.cgi?0.01s   /output.cgi?0.02s   /output.cgi?0.005id   (	   R5   R6   R?   R+   R,   Rb   R`   RI   R   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyRg   I  s   t   Fewerc           B   s,   e  Z d  Z d Z d Z d Z d Z d Z RS(   t   fewers   fewer buffers than threadsi   i   i   (   R5   R6   R?   R@   R+   R,   Rb   R`   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyRi   R  s   t   Fewer2c           B   s,   e  Z d  Z d Z d Z d Z d Z d Z RS(   t   fewer2s   fewer buffers than threadsi    i   i   (   R5   R6   R?   R@   R+   R,   Rb   R`   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyRk   Z  s   t   BusyWaitc           B   s   e  Z d  Z d Z d „  Z RS(   t
   nobusywaits*   test to make sure you are not busy-waitingc         C   sê   |  i  d d d d d d ƒ } t i d ƒ d d	 d
 d t | i ƒ g } t i | d t i ƒi ƒ  d } t	 t
 t | i d ƒ ƒ ƒ \ } } } | d | d | } d | f GH| d j o |  i d ƒ n | i ƒ  |  i ƒ  d  S(   NR+   i
   R,   i   R-   R<   i   t   pss   --no-headerss   -oR!   t   stdouti    t   :i<   s+   idle server spent %d seconds running on CPUs1   idle server should spend 0 seconds running on CPU(   R4   R!   R"   R	   t   pidt
   subprocesst   Popent   PIPEt   communicatet   tuplet   mapt   intt   splitR   R*   R=   (   R
   R)   t   cmdRo   t   hrt   mint   sect   total(    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyR>   e  s    "'
(   R5   R6   R?   R@   R>   (    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyRm   b  s   (   Rs   R!   R   R%   R   RE   t	   toolspatht   testingR    t   testing.testR   R   R7   RA   RP   RS   RU   RX   R\   R^   Rc   Re   Rg   Ri   Rk   Rm   t	   test_list(    (    (    s;   /afs/cs.wisc.edu/p/course/cs537-remzi/ta/tests/4a/server.pyt   <module>   s&   H0"+  
	