import urllib.request import urllib.parse import xml.dom.minidom def test_latest(name, **query): revision = get_revision(name) output = get_output(name, revision, query) return output def get_output(name, revision, query): string = run_utility('xml', name, revision, query) middle = string.split('<', 1)[1].rsplit('>', 1)[0] dom = xml.dom.minidom.parseString('<' + middle + '>') value = extract_output(dom) dom.unlink() return value def run_utility(api, name, revision, query): url = 'http://utilitymill.com/api/{0}/utility/{1}/{2}/run?{3}' params = urllib.parse.urlencode(query) file = urllib.request.urlopen(url.format(api, name, revision, params)) # dom = xml.dom.minidom.parse(file) return file.read().decode() def extract_output(dom): elements = dom.getElementsByTagName('output') assert len(elements) == 1, 'XML Error' output = elements[0] assert len(output.childNodes) == 1, 'XML Error' child = output.childNodes[0] assert child.nodeType == child.CDATA_SECTION_NODE, 'XML Error' return child.nodeValue def get_revision(name): string = info_utility('xml', name) middle = string.split('<', 1)[1].rsplit('>', 1)[0] dom = xml.dom.minidom.parseString('<' + middle + '>') value = extract_number(dom) dom.unlink() return value def info_utility(api, name): url = 'http://utilitymill.com/api/{0}/utility/{1}/info' file = urllib.request.urlopen(url.format(api, name)) return file.read().decode() def extract_number(dom): elements = dom.getElementsByTagName('number') assert len(elements) == 1, 'XML Error' number = elements[0] assert len(number.childNodes) == 1, 'XML Error' child = number.childNodes[0] assert child.nodeType == child.TEXT_NODE, 'XML Error' return child.nodeValue ################################################################################ import random import spice import time # Python 2.5 Hack __builtins__.xrange = __builtins__.range def hack1(*args): return list(xrange(*args)) __builtins__.range = hack1 __builtins__.xmap = __builtins__.map def hack2(*args): return list(xmap(*args)) __builtins__.map = hack2 def _decode(string, map_1, map_2): 'Private module function.' cache = '' iterator = iter(string) for byte in iterator: bits_12 = map_1[ord(byte)] << 6 bits_34 = map_1[ord(next(iterator))] << 4 bits_56 = map_1[ord(next(iterator))] << 2 bits_78 = map_1[ord(next(iterator))] cache += map_2[bits_12 + bits_34 + bits_56 + bits_78] return cache spice._decode = _decode # END def main(): try: while True: print('Testing', end=' ') choice = random.randrange(3) if choice == 1: # Test "Create Keys" Action print('Create', end=' ') choice = random.randrange(4) if choice == 1: # Test No Names print('No Names', end=' ... ') test_create() elif choice == 2: # Test Major Name print('Major Name', end=' ... ') n1 = verse() major, minor = test_create(MAJOR_NAME=n1) assert major == spice.named_major(n1) elif choice == 3: # Test Minor Name print('Minor Name', end=' ... ') n2 = verse() major, minor = test_create(MINOR_NAME=n2) assert minor == spice.named_minor(n2) else: # Test Both Names print('Both Names', end=' ... ') n1, n2 = verse(), verse() major, minor = test_create(MAJOR_NAME=n1, MINOR_NAME=n2) assert major == spice.named_major(n1) assert minor == spice.named_minor(n2) elif choice == 2: # Test "Encode Input" Action print('Encode', end=' ... ') major = spice.crypt_major() minor = spice.crypt_minor() data = verse() encoded = test_encode(major, minor, data) decoded = spice.decode_string(encoded, major, minor) assert decoded == data else: # Test "Decode Input" Action print('Decode', end=' ... ') major = spice.crypt_major() minor = spice.crypt_minor() data = verse() encoded = spice.encode_string(data, major, minor) decoded = test_decode(major, minor, encoded) assert decoded == data print('PASS') time.sleep(60) except: print('FAIL') def test_create(**query): output = test_latest('SPICE_Text', ACTION='Create Keys', **query) x, x, major, x, x, x, minor = output.split('\n') major = hex2bin(major) minor = hex2bin(minor) spice._check_major(major) spice._check_minor(minor) return major, minor def test_encode(major, minor, data): hma = bin2hex(major) hmi = bin2hex(minor) output = test_latest('SPICE_Text', ACTION='Encode Input', MAJOR_KEY=hma, MINOR_KEY=hmi, INPUT=data) encoded = hex2bin(output.replace('\r', '').replace('\n', '')) return encoded def test_decode(major, minor, data): hma = bin2hex(major) hmi = bin2hex(minor) hda = bin2hex(data) decoded = test_latest('SPICE_Text', ACTION='Decode Input', MAJOR_KEY=hma, MINOR_KEY=hmi, INPUT=hda) return decoded def bin2hex(x): return ''.join('%02X' % ord(y) for y in x) def hex2bin(x): return ''.join(chr(int(x[y:y+2], 16)) for y in range(0, len(x), 2)) ################################################################################ def verse(): return random.choice(random.choice(random.choice(BIBLE))) def load_bible(): global BIBLE try: bible = open('bible13.txt', 'r').read() except: bible = get_bible() open('bible13.txt', 'w').write(bible) win_fix = bible.replace('\r\n', '\n') mac_fix = win_fix.replace('\r', '\n') BIBLE = parse_bible(mac_fix) def get_bible(): url = 'http://www.gutenberg.org/dirs/etext92/bible13.txt' file = urllib.request.urlopen(url) return file.read().decode() def parse_bible(string): 'Parse Bible and return 3D array.' book = chap = vers = 1 form = '%02u:%03u:%03u' book_s, chap_s, vers_s = [], [], [] start = 0 while True: try: start = string.index(form % (book, chap, vers), start) + 11 end = string.index('\n\n', start) vers_s.append(' '.join(string[start:end].replace('\n', '').split())) start = end vers += 1 except: if vers != 1: chap_s.append(vers_s) vers_s = [] chap += 1 vers = 1 elif chap != 1: book_s.append(chap_s) chap_s = [] book += 1 chap = 1 elif book != 1: return book_s else: raise EOFError ################################################################################ if __name__ == '__main__': load_bible() main()