#!/usr/bin/env python """ TestFuncs.py Webware for Python This tests the performace of utility functions in WebUtils vs. their standard Python alternatives. """ import os, string, sys, time sys.path.insert(1, os.path.abspath(os.pardir)) from Funcs import * import urllib allChars = string.join(map(chr, range(256)), '') URLEncodeTests = [ 'NothingIsChangedTest', 'This test has spaces', 'This test has tabs', 'This:test:has:colons', ' boundary ', allChars ] URLDecodeTests = [ '%3E and %A7', '%3e and %a7', '& and + and -', 'illegal %3g?', 'illegal %x1?', '1 % 2 %% 3 %%%4 %%20' ] def TestURLEncode(): print 'Test URLEncode' for test in URLEncodeTests: if urlEncode(test) == urllib.quote_plus(test, '/'): print ' Passed test' else: print ' Failed test!' print ' string = (%s)' % test print ' urlEncode = (%s)' % urlEncode(test) print ' quote_plus = (%s)' % urllib.quote_plus(test, '/') print def TestURLDecode(): print 'Test URLDecode' for test in URLDecodeTests: if urlDecode(test) == urllib.unquote_plus(test): print ' Passed test' else: print ' Failed test!' print ' string = (%s)' % test print ' urlDecode = (%s)' % urlDecode(test) print ' unquote_plus = (%s)' % urllib.unquote_plus(test) print def TestEncodeAndDecode(encodeFunc, decodeFunc, tests): print 'Test %s and %s' % (encodeFunc.__name__, decodeFunc.__name__) for test in tests: if decodeFunc(encodeFunc(test)) == test: print ' Passed test' else: print ' Failed test!' print ' string = (%s)' % test print ' encoded = (%s)' % encodeFunc(test) print ' decoded = (%s)' % decodeFunc(encodeFunc(test)) print def TestURLEncodeAndDecode(): TestEncodeAndDecode(urlEncode, urlDecode, URLEncodeTests) def Benchmark(func, tests, metacount=500, count=20): start = time.time() for majorLoop in xrange(metacount): for test in tests: for minorLoop in xrange(count): func(test) stop = time.time() return stop - start def BenchmarkURLEncode(): print 'Benchmark urlEncode() vs. quote_plus()' tests = URLEncodeTests + map(urlEncode, URLEncodeTests) t1 = Benchmark(urllib.quote_plus, tests) t2 = Benchmark(urlEncode, tests) print ' quote_plus() = %6.2f secs' % t1 print ' urlEncode() = %6.2f secs' % t2 print ' diff = %6.2f secs' % (t2 - t1) print ' diff %% = %6.2f %%' % ((t2 - t1) / t1 * 100.0) print ' factor = %6.2f X' % (t1/t2) print def BenchmarkURLDecode(): print 'Benchmark urlDecode() vs. unquote_plus()' tests = map(urlEncode, URLEncodeTests) + URLDecodeTests t1 = Benchmark(urllib.unquote_plus, tests) t2 = Benchmark(urlDecode, tests) print ' unquote_plus() = %6.2f secs' % t1 print ' urlDecode() = %6.2f secs' % t2 print ' diff = %6.2f secs' % (t2 - t1) print ' diff %% = %6.2f %%' % ((t2 - t1) / t1 * 100.0) print ' factor = %6.2f X' % (t1/t2) print HTMLEncodeTests = [ 'Nothing special.', 'Put your HTML tags in .', 'a & b & c', 'A \n newline', 'A newline \n x < y < z \n &' ] def TestHTMLEncodeAndDecode(): TestEncodeAndDecode(htmlEncode, htmlDecode, HTMLEncodeTests) if __name__ == '__main__': # To remove allChars, change to 'if 1:' # (With allChars, we look really good - URLEncode() is 6 X faster. # However, it's not a realistic case; reality is 2 X faster, # and with newer Python versions, we don't look so good any more). if 0: del URLEncodeTests[-1] # run tests TestURLEncode() TestURLDecode() TestURLEncodeAndDecode() BenchmarkURLEncode() BenchmarkURLDecode() TestHTMLEncodeAndDecode()