356 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			356 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
| 
 | |
| """ javascript source for py.test distributed
 | |
| """
 | |
| 
 | |
| import py
 | |
| from py.__.test.report.web import exported_methods
 | |
| try:
 | |
|     from pypy.translator.js.modules import dom
 | |
|     from pypy.translator.js.helper import __show_traceback
 | |
| except ImportError:
 | |
|     py.test.skip("PyPy not found")
 | |
| 
 | |
| def create_elem(s):
 | |
|     return dom.document.createElement(s)
 | |
| 
 | |
| def get_elem(el):
 | |
|     return dom.document.getElementById(el)
 | |
| 
 | |
| def create_text_elem(txt):
 | |
|     return dom.document.createTextNode(txt)
 | |
| 
 | |
| tracebacks = {}
 | |
| skips = {}
 | |
| counters = {}
 | |
| max_items = {}
 | |
| short_item_names = {}
 | |
| 
 | |
| MAX_COUNTER = 30 # Maximal size of one-line table
 | |
| 
 | |
| class Globals(object):
 | |
|     def __init__(self):
 | |
|         self.pending = []
 | |
|         self.host = ""
 | |
|         self.data_empty = True
 | |
| 
 | |
| glob = Globals()
 | |
| 
 | |
| class Options(object):
 | |
|     """ Store global options
 | |
|     """
 | |
|     def __init__(self):
 | |
|         self.scroll = True
 | |
| 
 | |
| opts = Options()
 | |
| 
 | |
| def comeback(msglist):
 | |
|     if len(msglist) == 0:
 | |
|         return
 | |
|     for item in glob.pending[:]:
 | |
|         if not process(item):
 | |
|             return
 | |
|     glob.pending = []
 | |
|     for msg in msglist:
 | |
|         if not process(msg):
 | |
|             return
 | |
|     exported_methods.show_all_statuses(glob.sessid, comeback)
 | |
| 
 | |
| def show_info(data="aa"):
 | |
|     info = dom.document.getElementById("info")
 | |
|     info.style.visibility = "visible"
 | |
|     while len(info.childNodes):
 | |
|         info.removeChild(info.childNodes[0])
 | |
|     txt = create_text_elem(data)
 | |
|     info.appendChild(txt)
 | |
|     info.style.backgroundColor = "beige"
 | |
|     # XXX: Need guido
 | |
| 
 | |
| def hide_info():
 | |
|     info = dom.document.getElementById("info")
 | |
|     info.style.visibility = "hidden"
 | |
| 
 | |
| def show_interrupt():
 | |
|     glob.finished = True
 | |
|     dom.document.title = "Py.test [interrupted]"
 | |
|     dom.document.getElementById("Tests").childNodes[0].nodeValue = "Tests [interrupted]"
 | |
| 
 | |
| def show_crash():
 | |
|     glob.finished = True
 | |
|     dom.document.title = "Py.test [crashed]"
 | |
|     dom.document.getElementById("Tests").childNodes[0].nodeValue = "Tests [crashed]"
 | |
| 
 | |
| SCROLL_LINES = 50
 | |
| 
 | |
| def opt_scroll():
 | |
|     if opts.scroll:
 | |
|         opts.scroll = False
 | |
|     else:
 | |
|         opts.scroll = True
 | |
| 
 | |
| def scroll_down_if_needed(mbox):
 | |
|     if not opts.scroll:
 | |
|         return
 | |
|     #if dom.window.scrollMaxY - dom.window.scrollY < SCROLL_LINES:
 | |
|     mbox.parentNode.scrollIntoView()
 | |
| 
 | |
| def hide_messagebox():
 | |
|     mbox = dom.document.getElementById("messagebox")
 | |
|     while mbox.childNodes:
 | |
|         mbox.removeChild(mbox.childNodes[0])
 | |
| 
 | |
| def make_module_box(msg):
 | |
|     tr = create_elem("tr")
 | |
|     td = create_elem("td")
 | |
|     tr.appendChild(td)
 | |
|     td.appendChild(create_text_elem("%s[0/%s]" % (msg['itemname'],
 | |
|                                                           msg['length'])))
 | |
|     max_items[msg['fullitemname']] = int(msg['length'])
 | |
|     short_item_names[msg['fullitemname']] = msg['itemname']
 | |
|     td.id = '_txt_' + msg['fullitemname']
 | |
|     #tr.setAttribute("id", msg['fullitemname'])
 | |
|     td.setAttribute("onmouseover",
 | |
|     "show_info('%s')" % (msg['fullitemname'],))
 | |
|     td.setAttribute("onmouseout", "hide_info()")
 | |
|     td2 = create_elem('td')
 | |
|     tr.appendChild(td2)
 | |
|     table = create_elem("table")
 | |
|     td2.appendChild(table)
 | |
|     tbody = create_elem('tbody')
 | |
|     tbody.id = msg['fullitemname']
 | |
|     table.appendChild(tbody)
 | |
|     counters[msg['fullitemname']] = 0
 | |
|     return tr
 | |
| 
 | |
| def add_received_item_outcome(msg, module_part):
 | |
|     if msg['hostkey']:
 | |
|         host_elem = dom.document.getElementById(msg['hostkey'])
 | |
|         glob.host_pending[msg['hostkey']].pop()
 | |
|         count = len(glob.host_pending[msg['hostkey']])
 | |
|         host_elem.childNodes[0].nodeValue = '%s[%s]' % (
 | |
|             glob.host_dict[msg['hostkey']], count)
 | |
|         
 | |
|     td = create_elem("td")
 | |
|     td.setAttribute("onmouseover", "show_info('%s')" % (
 | |
|         msg['fullitemname'],))
 | |
|     td.setAttribute("onmouseout", "hide_info()")
 | |
|     item_name = msg['fullitemname']
 | |
|     # TODO: dispatch output
 | |
|     if msg["passed"] == 'True':
 | |
|         txt = create_text_elem(".")
 | |
|         td.appendChild(txt)
 | |
|     elif msg["skipped"] != 'None' and msg["skipped"] != "False":
 | |
|         exported_methods.show_skip(item_name, skip_come_back)
 | |
|         link = create_elem("a")
 | |
|         link.setAttribute("href", "javascript:show_skip('%s')" % (
 | |
|                                                 msg['fullitemname'],))
 | |
|         txt = create_text_elem('s')
 | |
|         link.appendChild(txt)
 | |
|         td.appendChild(link)
 | |
|     else:
 | |
|         link = create_elem("a")
 | |
|         link.setAttribute("href", "javascript:show_traceback('%s')" % (
 | |
|                                                 msg['fullitemname'],))
 | |
|         txt = create_text_elem('F')
 | |
|         link.setAttribute('class', 'error') 
 | |
|         link.appendChild(txt)
 | |
|         td.appendChild(link)
 | |
|         exported_methods.show_fail(item_name, fail_come_back)
 | |
|         
 | |
|     if counters[msg['fullmodulename']] == 0:
 | |
|         tr = create_elem("tr")
 | |
|         module_part.appendChild(tr)
 | |
| 
 | |
|     name = msg['fullmodulename']
 | |
|     counters[name] += 1
 | |
|     counter_part = get_elem('_txt_' + name)
 | |
|     newcontent = "%s[%d/%d]" % (short_item_names[name], counters[name],
 | |
|         max_items[name])
 | |
|     counter_part.childNodes[0].nodeValue = newcontent
 | |
|     module_part.childNodes[-1].appendChild(td)
 | |
|     
 | |
| def process(msg):
 | |
|     if len(msg) == 0:
 | |
|         return False
 | |
|     elem = dom.document.getElementById("testmain")
 | |
|     #elem.innerHTML += '%s<br/>' % msg['event']
 | |
|     main_t = dom.document.getElementById("main_table")
 | |
|     if msg['type'] == 'ItemStart':
 | |
|         # we start a new directory or what
 | |
|         #if msg['itemtype'] == 'Module':
 | |
|         tr = make_module_box(msg)
 | |
|         main_t.appendChild(tr)
 | |
|     elif msg['type'] == 'SendItem':
 | |
|         host_elem = dom.document.getElementById(msg['hostkey'])
 | |
|         glob.host_pending[msg['hostkey']].insert(0, msg['fullitemname'])
 | |
|         count = len(glob.host_pending[msg['hostkey']])
 | |
|         host_elem.childNodes[0].nodeValue = '%s[%s]' % (
 | |
|                             glob.host_dict[msg['hostkey']], count)
 | |
|         
 | |
|     elif msg['type'] == 'HostRSyncRootReady':
 | |
|         host_elem = dom.document.getElementById(msg['hostkey'])
 | |
|         host_elem.style.background = \
 | |
|             "#00ff00"
 | |
|         host_elem.childNodes[0].nodeValue = '%s[0]' % (
 | |
|                                     glob.host_dict[msg['hostkey']],)
 | |
|     elif msg['type'] == 'ItemFinish':
 | |
|         module_part = get_elem(msg['fullmodulename'])
 | |
|         if not module_part:
 | |
|             glob.pending.append(msg)
 | |
|             return True
 | |
| 
 | |
|         add_received_item_outcome(msg, module_part)
 | |
|     elif msg['type'] == 'TestTestrunFinish':
 | |
|         text = "FINISHED %s run, %s failures, %s skipped" % (msg['run'], msg['fails'], msg['skips'])
 | |
|         glob.finished = True
 | |
|         dom.document.title = "Py.test %s" % text
 | |
|         dom.document.getElementById("Tests").childNodes[0].nodeValue = \
 | |
|                                                     "Tests [%s]" % text
 | |
|     elif msg['type'] == 'FailedTryiter':
 | |
|         module_part = get_elem(msg['fullitemname'])
 | |
|         if not module_part:
 | |
|             glob.pending.append(msg)
 | |
|             return True
 | |
|         tr = create_elem("tr")
 | |
|         td = create_elem("td")
 | |
|         a = create_elem("a")
 | |
|         a.setAttribute("href", "javascript:show_traceback('%s')" % (
 | |
|                         msg['fullitemname'],))
 | |
|         txt = create_text_elem("- FAILED TO LOAD MODULE")
 | |
|         a.appendChild(txt)
 | |
|         td.appendChild(a)
 | |
|         tr.appendChild(td)
 | |
|         module_part.appendChild(tr)
 | |
|         item_name = msg['fullitemname']
 | |
|         exported_methods.show_fail(item_name, fail_come_back)
 | |
|     elif msg['type'] == 'DeselectedItem':
 | |
|         module_part = get_elem(msg['fullitemname'])
 | |
|         if not module_part:
 | |
|             glob.pending.append(msg)
 | |
|             return True
 | |
|         tr = create_elem("tr")
 | |
|         td = create_elem("td")
 | |
|         txt = create_text_elem("- skipped (%s)" % (msg['reason'],))
 | |
|         td.appendChild(txt)
 | |
|         tr.appendChild(td)
 | |
|         module_part.appendChild(tr)
 | |
|     elif msg['type'] == 'RsyncFinished':
 | |
|         glob.rsync_done = True
 | |
|     elif msg['type'] == 'InterruptedExecution':
 | |
|         show_interrupt()
 | |
|     elif msg['type'] == 'CrashedExecution':
 | |
|         show_crash()
 | |
|     if glob.data_empty:
 | |
|         mbox = dom.document.getElementById('messagebox')
 | |
|         scroll_down_if_needed(mbox)
 | |
|     return True
 | |
| 
 | |
| def show_skip(item_name="aa"):
 | |
|     set_msgbox(item_name, skips[item_name])
 | |
| 
 | |
| def set_msgbox(item_name, data):
 | |
|     msgbox = get_elem("messagebox")
 | |
|     while len(msgbox.childNodes):
 | |
|         msgbox.removeChild(msgbox.childNodes[0])
 | |
|     pre = create_elem("pre")
 | |
|     txt = create_text_elem(item_name + "\n" + data)
 | |
|     pre.appendChild(txt)
 | |
|     msgbox.appendChild(pre)
 | |
|     dom.window.location.assign("#message")
 | |
|     glob.data_empty = False
 | |
| 
 | |
| def show_traceback(item_name="aa"):
 | |
|     data = ("====== Traceback: =========\n%s\n======== Stdout: ========\n%s\n"
 | |
|             "========== Stderr: ==========\n%s\n" % tracebacks[item_name])
 | |
|     set_msgbox(item_name, data)
 | |
|     
 | |
| def fail_come_back(msg):
 | |
|     tracebacks[msg['item_name']] = (msg['traceback'], msg['stdout'],
 | |
|                                     msg['stderr'])
 | |
|     
 | |
| def skip_come_back(msg):
 | |
|     skips[msg['item_name']] = msg['reason']
 | |
| 
 | |
| def reshow_host():
 | |
|     if glob.host == "":
 | |
|         return
 | |
|     show_host(glob.host)
 | |
|     
 | |
| def show_host(host_name="aa"):
 | |
|     elem = dom.document.getElementById("jobs")
 | |
|     if elem.childNodes:
 | |
|         elem.removeChild(elem.childNodes[0])
 | |
|     tbody = create_elem("tbody")
 | |
|     for item in glob.host_pending[host_name]:
 | |
|         tr = create_elem("tr")
 | |
|         td = create_elem("td")
 | |
|         td.appendChild(create_text_elem(item))
 | |
|         tr.appendChild(td)
 | |
|         tbody.appendChild(tr)
 | |
|     elem.appendChild(tbody)
 | |
|     elem.style.visibility = "visible"
 | |
|     glob.host = host_name
 | |
|     dom.setTimeout(reshow_host, 100)
 | |
|     
 | |
| def hide_host():
 | |
|     elem = dom.document.getElementById("jobs")
 | |
|     while len(elem.childNodes):
 | |
|         elem.removeChild(elem.childNodes[0])
 | |
|     elem.style.visibility = "hidden"
 | |
|     glob.host = ""
 | |
| 
 | |
| def update_rsync():
 | |
|     if glob.finished:
 | |
|         return
 | |
|     elem = dom.document.getElementById("Tests")
 | |
|     if glob.rsync_done is True:
 | |
|         elem.childNodes[0].nodeValue = "Tests"
 | |
|         return
 | |
|     text = "Rsyncing" + '.' * glob.rsync_dots
 | |
|     glob.rsync_dots += 1
 | |
|     if glob.rsync_dots > 5:
 | |
|         glob.rsync_dots = 0
 | |
|     elem.childNodes[0].nodeValue = "Tests [%s]" % text
 | |
|     dom.setTimeout(update_rsync, 1000)
 | |
| 
 | |
| def host_init(host_dict):
 | |
|     tbody = dom.document.getElementById("hostsbody")
 | |
|     for host in host_dict.keys():
 | |
|         tr = create_elem('tr')
 | |
|         tbody.appendChild(tr)
 | |
|         td = create_elem("td")
 | |
|         td.style.background = "#ff0000"
 | |
|         txt = create_text_elem(host_dict[host])
 | |
|         td.appendChild(txt)
 | |
|         td.id = host
 | |
|         tr.appendChild(td)
 | |
|         td.setAttribute("onmouseover", "show_host('%s')" % host)
 | |
|         td.setAttribute("onmouseout", "hide_host()")
 | |
|         glob.rsync_dots = 0
 | |
|         glob.rsync_done = False
 | |
|         dom.setTimeout(update_rsync, 1000)
 | |
|     glob.host_dict = host_dict
 | |
|     glob.host_pending = {}
 | |
|     for key in host_dict.keys():
 | |
|         glob.host_pending[key] = []
 | |
| 
 | |
| def key_pressed(key):
 | |
|     if key.charCode == ord('s'):
 | |
|         scroll_box = dom.document.getElementById("opt_scroll")
 | |
|         if opts.scroll:
 | |
|             scroll_box.removeAttribute("checked")
 | |
|             opts.scroll = False
 | |
|         else:
 | |
|             scroll_box.setAttribute("checked", "true")
 | |
|             opts.scroll = True
 | |
| 
 | |
| def sessid_comeback(id):
 | |
|     glob.sessid = id
 | |
|     exported_methods.show_all_statuses(id, comeback)
 | |
| 
 | |
| def main():
 | |
|     glob.finished = False
 | |
|     exported_methods.show_hosts(host_init)
 | |
|     exported_methods.show_sessid(sessid_comeback)
 | |
|     dom.document.onkeypress = key_pressed
 | |
|     dom.document.getElementById("opt_scroll").setAttribute("checked", "True")
 |