2012-02-15 21:58:43 -07:00
#! /usr/bin/python3
import unittest
from subprocess import *
import os
def fnord ( * args ) :
return Popen ( ( ' ../fnord ' , ) + args ,
stdin = PIPE , stdout = PIPE , stderr = PIPE ,
env = { ' PROTO ' : ' TCP ' ,
' TCPREMOTEPORT ' : ' 5858 ' ,
' TCPREMOTEIP ' : ' 10.1.2.3 ' } )
class ArgTests ( unittest . TestCase ) :
def check_index ( self , * args ) :
p = fnord ( * args )
so , se = p . communicate ( b ' GET / HTTP/1.0 \r \n \r \n ' )
2012-02-16 12:05:02 -07:00
self . assertRegex ( so , b ' HTTP/1.0 200 OK \r \n Server: fnord/2.0 \r \n Content-Type: text/html; charset=UTF-8 \r \n Content-Length: 6 \r \n Last-Modified: (Mon|Tue|Wed|Thu|Fri|Sat|Sun), .. (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) 2... ..:..:.. GMT \r \n \r \n james \n ' )
2012-02-15 21:58:43 -07:00
self . assertEqual ( se , b ' 10.1.2.3 200 6 127.0.0.1:80 (null) (null) /index.html \n ' )
def testArgs ( self ) :
" Make sure index.html is the same for all arguments "
self . check_index ( )
self . check_index ( ' -d ' )
self . check_index ( ' -r ' )
self . check_index ( ' -c ' )
def testBadArgs ( self ) :
" Make sure bad arguments actually fail "
self . assertRaises ( AssertionError , self . check_index , ' -Z ' )
class BasicTests ( unittest . TestCase ) :
args = [ ]
def setUp ( self ) :
self . p = fnord ( * self . args )
def tearDown ( self ) :
del self . p
def get ( self , path , host ) :
h = ' GET %s HTTP/1.0 \r \n Host: %s \r \n \r \n ' % ( path , host )
so , se = self . p . communicate ( h . encode ( ' utf-8 ' ) )
return ( so , se )
2012-02-16 12:05:02 -07:00
def post ( self , path , host , formdata ) :
h = ' POST %s HTTP/1.0 \r \n Host: %s \r \n Content-Type: application/x-www-form-urlencoded \r \n Content-Length: %d \r \n \r \n %s ' % ( path , host , len ( formdata ) , formdata )
so , se = self . p . communicate ( h . encode ( ' utf-8 ' ) )
return ( so , se )
2012-02-15 21:58:43 -07:00
class DirTests ( BasicTests ) :
args = [ ' -d ' ]
def testRootDir ( self ) :
2012-02-16 12:05:02 -07:00
so , se = self . get ( ' / ' , ' empty ' )
2012-02-15 21:58:43 -07:00
self . assertEqual ( so , b ' HTTP/1.0 200 OK \r \n Server: fnord/2.0 \r \n Connection: close \r \n Content-Type: text/html; charset=utf-8 \r \n \r \n <h3>Directory Listing: /</h3> \n <pre> \n </pre> \n ' )
2012-02-16 12:05:02 -07:00
self . assertEqual ( se , b ' 10.1.2.3 200 32 empty:80 (null) (null) / \n ' )
def testNoTrailingSlash ( self ) :
so , se = self . get ( ' /files ' , ' default ' )
self . assertEqual ( so , b ' HTTP/1.0 404 Not Found \r \n Connection: close \r \n Content-Length: 50 \r \n Content-Type: text/html \r \n \r \n <title>Not Found</title>No such file or directory. ' )
self . assertEqual ( se , b ' 10.1.2.3 404 0 default:80 (null) (null) /files \n ' )
def testFiles ( self ) :
so , se = self . get ( ' /files/ ' , ' default ' )
self . assertEqual ( so , b ' HTTP/1.0 200 OK \r \n Server: fnord/2.0 \r \n Connection: close \r \n Content-Type: text/html; charset=utf-8 \r \n \r \n <h3>Directory Listing: /files/</h3> \n <pre> \n <a href= " / " >Parent directory</a> \n </pre> \n ' )
self . assertEqual ( se , b ' 10.1.2.3 200 78 default:80 (null) (null) /files/ \n ' )
2012-02-15 21:58:43 -07:00
2012-02-16 12:05:02 -07:00
class CGITests ( BasicTests ) :
args = [ ' -c ' ]
def testSet ( self ) :
so , se = self . get ( ' /cgi/set.cgi ' , ' default ' )
self . assertEqual ( so , b ' HTTP/1.0 200 OK \r \n Server: fnord/2.0 \r \n Pragma: no-cache \r \n Connection: close \r \n Content-Type: text/plain \r \n \n GATEWAY_INTERFACE=CGI/1.1 \n REMOTE_ADDR=10.1.2.3 \n REMOTE_PORT=5858 \n REQUEST_METHOD=GET \n REQUEST_URI=/cgi/set.cgi \n SCRIPT_NAME=/cgi/set.cgi \n SERVER_NAME=default:80 \n SERVER_PORT=80 \n SERVER_PROTOCOL=HTTP/1.0 \n SERVER_SOFTWARE=fnord/2.0 \n ' )
self . assertEqual ( se , b ' 10.1.2.3 200 248 default:80 (null) (null) /cgi/set.cgi \n ' )
def testSetArgs ( self ) :
so , se = self . get ( ' /cgi/set.cgi?a=1&b=2&c=3 ' , ' default ' )
self . assertEqual ( so , b " HTTP/1.0 200 OK \r \n Server: fnord/2.0 \r \n Pragma: no-cache \r \n Connection: close \r \n Content-Type: text/plain \r \n \n GATEWAY_INTERFACE=CGI/1.1 \n QUERY_STRING= ' a=1&b=2&c=3 ' \n REMOTE_ADDR=10.1.2.3 \n REMOTE_PORT=5858 \n REQUEST_METHOD=GET \n REQUEST_URI=/cgi/set.cgi \n SCRIPT_NAME=/cgi/set.cgi \n SERVER_NAME=default:80 \n SERVER_PORT=80 \n SERVER_PROTOCOL=HTTP/1.0 \n SERVER_SOFTWARE=fnord/2.0 \n " )
self . assertEqual ( se , b ' 10.1.2.3 200 275 default:80 (null) (null) /cgi/set.cgi \n ' )
def testPost ( self ) :
so , se = self . post ( ' /cgi/set.cgi ' , ' default ' , ' a=1&b=2&c=3 ' )
self . assertEqual ( so , b ' HTTP/1.0 200 OK \r \n Server: fnord/2.0 \r \n Pragma: no-cache \r \n Connection: close \r \n Content-Type: text/plain \r \n \n CONTENT_LENGTH=11 \n CONTENT_TYPE=application/x-www-form-urlencoded \n GATEWAY_INTERFACE=CGI/1.1 \n REMOTE_ADDR=10.1.2.3 \n REMOTE_PORT=5858 \n REQUEST_METHOD=POST \n REQUEST_URI=/cgi/set.cgi \n SCRIPT_NAME=/cgi/set.cgi \n SERVER_NAME=default:80 \n SERVER_PORT=80 \n SERVER_PROTOCOL=HTTP/1.0 \n SERVER_SOFTWARE=fnord/2.0 \n Form data: a=1&b=2&c=3 ' )
2012-02-15 21:58:43 -07:00
unittest . main ( )
2012-02-16 12:05:02 -07:00