#!/usr/bin/env python import SocketServer import sys import threading import subprocess import BaseHTTPServer import random import tempfile import shutil import urllib2 import os import logging class MyHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): pass class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): def do_GET(self): if self.path.startswith('/MISSING'): self.send_error(404) else: self.send_response(200) self.end_headers() self.wfile.write('CONTENT' + self.path) def log_message(self, fmt, *args): pass def start_server(): serv = MyHTTPServer(('127.0.0.1', 0), RequestHandler) thread = threading.Thread(target=serv.serve_forever) thread.setDaemon(True) thread.start() return 'http://%s:%d/' % serv.server_address def check_urls(base): files = [ 'MISSING-%d' % n if (n % 4) < 2 else 'FOUND-%d' % n for n in range(300) ] work = tempfile.mkdtemp(prefix="server_test_") good, bad = 0, 0 try: logging.warn('Checking URLs, workdir %r' % work) # Create fileslist url_list = work + '/filelist.txt' with open(url_list, 'w') as f: for fn in files: print >>f, base + fn # Fetch with wget subprocess.call( ['wget', '-o', 'wget.log', '--input-file', url_list], cwd=work) # Verify for fn in files: try: real = open(work + '/' + fn, 'r').read(1024) except IOError: real = '' if fn.startswith('MISSING'): expected = '' else: expected = 'CONTENT/' + fn if expected != real: logging.error('url %r expected %r got (%d)%r', fn, expected, len(real), real[:23]) bad += 1 else: good += 1 print >>sys.stderr, 'Thread done, %d good, %d bad' % (good, bad) finally: shutil.rmtree(work) if __name__ == '__main__': base = start_server() print 'Server ready at %r' % base tlist = list() for _ in xrange(2): t = threading.Thread(target=check_urls, args=(base, )) t.start() tlist.append(t) for t in tlist: t.join()