testkit-lite 2.2.7-4 testkit-lite-NovemberRelease-2.2.7-4
authortestkit <testkit@elva-desktop.(none)>
Fri, 30 Nov 2012 08:25:56 +0000 (16:25 +0800)
committerLei Yang <lei.a.yang@intel.com>
Fri, 30 Nov 2012 08:25:56 +0000 (16:25 +0800)
    - rebase to 2.2.6-1 for hang issue
    - update logic to process tests.xml with latest schema

ChangeLog
testkit-lite
testkit-lite.spec
testkitlite/engines/default/pyhttpd.py
testkitlite/engines/default/runner.py
testkitlite/engines/default/testkithttpd.py [deleted file]
web/Makefile.am
web/application.js [deleted file]
web/index.html
web/manual_harness.html [deleted file]

index e445cfd..72bb6f7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,14 +1,5 @@
- Tue Nov 16 2012 Zhang Huihui <huihuix.zhang@intel.com> 2.2.7-3
-  - terminate existing client when timeout
- Tue Nov 13 2012 Zhang Huihui <huihuix.zhang@intel.com> 2.2.7-2
-  - change result to BLOCK when timeout, set initial case result to BLOCK
- Tue Nov 8 2012 Zhang Huihui <huihuix.zhang@intel.com> 2.2.7-1
-  - add patch from tangshaofeng, and introduces a new mechanism to run webapi case
-  - alien to the new schema which move launcher attribute from tag test_definition to suite
-  - add support to run xml without tag test_definition
-  - add installation section into pdf doc
-  - remove overall timeout control for webapi package
-change permission to 755 for folder /opt/testkit/lite, so non-root user can user testkit-lite
+ Tue Nov 29 2012 Zhang Huihui <huihuix.zhang@intel.com> 2.2.7-4
+  - rollback to 2.2.6, since a critical issue is found after applying the improvement patch
  Tue Oct 23 2012 Zhang Huihui <huihuix.zhang@intel.com> 2.2.6-1
   - add category filter back
   - add block button to the manualharness
index 17e72da..63ef253 100755 (executable)
@@ -101,7 +101,7 @@ except Exception, e:
 
 # detect version option
 if "--version" in sys.argv:
-    print "[ testkit-lite v2.2.7-3 ]"
+    print "[ testkit-lite v2.2.7-4 ]"
     sys.exit(1)
 
 #get test engine, now we only got default engine
@@ -301,7 +301,7 @@ Note: \n\
                         wfilters['execution_type'] = ["manual"]
                         runner.add_filter_rules(**wfilters)
                         runner.run(t, resultdir=log_dir)
-                        time.sleep(10)
+                        time.sleep(50)
                     except Exception, e:
                         print e
             else:
@@ -318,7 +318,7 @@ Note: \n\
                         wfilters['execution_type'] = ["manual"]
                         runner.add_filter_rules(**wfilters)
                         runner.run(t, resultdir=log_dir)
-                        time.sleep(10)
+                        time.sleep(50)
                     except Exception, e:
                         print e
         else:
@@ -408,7 +408,7 @@ Note: \n\
         print e
 
 except KeyboardInterrupt, e:
-    print >> sys.stderr, "\n[ exiting testkit-lite on user cancel ]\n"
+    print >> sys.stderr, "\n[ exiting on user cancel ]\n"
     sys.exit(1)
 except Exception, e:
     print >> sys.stderr, e
index cde8ca0..957a446 100644 (file)
@@ -3,7 +3,7 @@
 Summary: Testkit Lite
 Name: testkit-lite
 Version: 2.2.7
-Release: 3
+Release: 4
 License: GPLv2
 Group: System/Libraries
 Source: %name-%version.tar.gz
@@ -59,4 +59,4 @@ if [ `echo $(uname) | grep -c "^Linux"` -eq 1 ];then
        if [ ! -x /usr/bin/testkit-lite ];then
                find /usr -name 'testkit-lite' -exec cp -af {} /usr/bin/ \; 
        fi
-fi
\ No newline at end of file
+fi
index 914451d..164ea04 100644 (file)
@@ -43,7 +43,7 @@ class MyHandler(BaseHTTPRequestHandler):
     Query = {"hidestatus":"0", "resultfile":"/tmp/tests-result.xml"}
     def do_RESPONSE(self):
         """Response get parameters request"""
-        print "[--------Entering do_RESPONSE()   -----------]"
+
         if self.Query.has_key("hidestatus"):
             print "[ parameter hidestatus: %s ]" % self.Query["hidestatus"]
         if self.Query.has_key("pid_log"):
@@ -68,7 +68,7 @@ class MyHandler(BaseHTTPRequestHandler):
 
     def response_Testsuite(self):
         """Read testsuite xml, and response it to client"""
-        print "[--------Entering response_Testsuite()   -----------]"
+
         if self.Query.has_key("testsuite"):
             try:
                 testsuitexml = ""
@@ -89,6 +89,7 @@ class MyHandler(BaseHTTPRequestHandler):
 
     def do_POST(self):
         """Handle POST request"""
+
         try:
             query = {}
             ctype, pdict = cgi.parse_header(self.headers.getheader("content-type"))
@@ -174,10 +175,8 @@ class MyHandler(BaseHTTPRequestHandler):
         """ Handle GET type request """
         if self.path.strip() == "/get_testsuite":
             # response test suite xml
-            print "[--------Entering do_GET()./get_testsuite-----------]"
             self.response_Testsuite()
         elif self.path.strip() == "/get_params":
-            print "[--------Entering do_GET()./get_params   -----------]"
             self.do_RESPONSE()
         return None
 
index 8891138..409ff02 100644 (file)
@@ -110,7 +110,7 @@ class TRunner:
                     filename = filename.split('\\')[-2]
                 if self.filter_rules["execution_type"] == ["manual"]:
                     resultfile = "%s.manual.xml" % filename
-                    sleeptime = 10
+                    sleeptime = 50
                 else:
                     resultfile = "%s.auto.xml" % filename
                     sleeptime = 6
@@ -303,8 +303,7 @@ class TRunner:
     def execute_external_test(self, testxmlfile, resultfile):
         """Run external test"""
         import subprocess, thread
-        #from  testkithttpd import startup
-        from testkithttpd import startup
+        from  pyhttpd import startup
         if self.bdryrun:
             print "[ WRTLauncher mode does not support dryrun ]"
             return True
@@ -314,40 +313,15 @@ class TRunner:
             parameters.setdefault("pid_log", self.pid_log)
             parameters.setdefault("testsuite", testxmlfile)
             parameters.setdefault("resultfile", resultfile)
-            parameters.setdefault("client_command", self.external_test)
             if self.fullscreen:
                 parameters.setdefault("hidestatus", "1")
             else:
                 parameters.setdefault("hidestatus", "0")
-            import re
-            import ctypes
-            http_server_pid = "none"
-            fi, fo, fe = os.popen3("netstat -tpa | grep 8000")
-            for line in fo.readlines():
-                pattern = re.compile('([0-9]*)\/python')
-                match = pattern.search(line)
-                if match:
-                    http_server_pid = match.group(1)
-                    try:
-                        if platform.system() == "Linux":
-                            os.kill(int(http_server_pid), 9)
-                            print "[ kill existing http server, pid: %s ]" % http_server_pid
-                        else:
-                            kernel32 = ctypes.windll.kernel32
-                            handle = kernel32.OpenProcess(1, 0, int(http_server_pid))
-                            kill_result = kernel32.TerminateProcess(handle, 0)
-                            print "[ kill existing http server, pid: %s ]" % http_server_pid
-                    except Exception, e:
-                        pattern = re.compile('No such process')
-                        match = pattern.search(str(e))
-                        if not match:
-                            print "[ fail to kill existing http server, pid: %s, error: %s ]" % (int(pid), e)
-            if http_server_pid == "none":
-                print "[ start new http server ]"
-            else:
-                print "[ start new http server in 3 seconds ]"
-                time.sleep(3)
-            startup(parameters)
+            thread.start_new_thread(startup, (), {"parameters":parameters})
+            
+            # use unlimited timeout for webapi execution
+            shell_exec(self.external_test, self.pid_log, None, True)
+            print "[ start test environment by executed: %s ]" % self.external_test
 
         except Exception, e:
             print e
diff --git a/testkitlite/engines/default/testkithttpd.py b/testkitlite/engines/default/testkithttpd.py
deleted file mode 100644 (file)
index 08d0f9a..0000000
+++ /dev/null
@@ -1,440 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright (C) 2012, Intel Corporation.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms and conditions of the GNU General Public License,
-# version 2, as published by the Free Software Foundation.
-#
-# This program is distributed in the hope it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-# for more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-# Place - Suite 330, Boston, MA 02111-1307 USA.
-#
-# Authors:
-#              Tang, Shao-Feng <shaofeng.tang@intel.com>
-
-import os
-import time
-import threading
-from datetime import datetime
-import cgi
-import json
-from urlparse import urlparse, parse_qs
-from xml.etree import ElementTree
-from testkitlite.common.str2 import *
-from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
-from testkitlite.common.autoexec import shell_exec
-from testkitlite.common.killall import killall
-import subprocess
-import signal
-import urllib2
-
-import sys
-reload(sys)
-sys.setdefaultencoding('utf-8')
-
-class TestStep:
-    def __init__(self, step_desc, expected, order):
-        self.step_desc = step_desc
-        self.expected = expected
-        self.order = order
-    
-    def to_json(self):
-        return {"step_desc": self.step_desc, "expected": self.expected, "order": self.order}
-
-class TestCase:
-    """Test Case Model"""
-    def __init__(self, case_node, dom, case_order):
-        self.purpose = case_node.getAttribute("purpose")
-        
-        if case_node.getElementsByTagName("test_script_entry").item(0) is not None and case_node.getElementsByTagName("test_script_entry").item(0).childNodes.item(0) is not None:
-            self.entry = case_node.getElementsByTagName("test_script_entry").item(0).childNodes.item(0).data
-            self.e_result = case_node.getElementsByTagName("test_script_entry").item(0).getAttribute("test_script_expected_result")
-        else:
-            self.entry = ""
-            self.e_result = ""
-        self.result = ""
-        self.msg = ""
-        self.xml_node = case_node
-        self.dom_root = dom
-        self.start_at = datetime.now()
-        self.end_at = None
-        self.is_executed = False
-        self.time_task = None
-        self.order = case_order
-        self.case_id = case_node.getAttribute("id")
-        if case_node.getElementsByTagName("pre_condition").item(0) is not None and case_node.getElementsByTagName("pre_condition").item(0).childNodes.item(0) is not None:
-            self.pre_con = case_node.getElementsByTagName("pre_condition").item(0).childNodes.item(0).data
-        else:
-            self.pre_con = "" 
-        if case_node.getElementsByTagName("post_condition").item(0) is not None and case_node.getElementsByTagName("post_condition").item(0).childNodes.item(0) is not None:
-            self.post_con = case_node.getElementsByTagName("post_condition").item(0).childNodes.item(0).data
-        else:
-            self.post_con = ""
-        self.steps = []
-        if case_node.getElementsByTagName("step") is not None:
-            for this_step in case_node.getElementsByTagName("step"):
-                desc = ""
-                expected = ""
-                order = this_step.getAttribute("order")
-                if this_step.getElementsByTagName("step_desc").item(0) is not None:
-                    desc = this_step.getElementsByTagName("step_desc").item(0).childNodes.item(0).data
-                if this_step.getElementsByTagName("expected") is not None:
-                    expected = this_step.getElementsByTagName("expected").item(0).childNodes.item(0).data
-                test_step = TestStep(desc, expected, order)
-                self.steps.append(test_step.to_json())
-                
-        if case_node.getAttribute("execution_type") is None:
-            self.e_type = "auto"
-        else:
-            self.e_type = case_node.getAttribute("execution_type")
-            
-        if case_node.getElementsByTagName("test_script_entry").item(0).getAttribute("timeout") is None:
-            self.timeout = 90
-        elif case_node.getElementsByTagName("test_script_entry").item(0).getAttribute("timeout"):
-            self.timeout = int(case_node.getElementsByTagName("test_script_entry").item(0).getAttribute("timeout"))
-        else:
-            self.timeout = 90
-    
-    def to_string(self):
-        objstr = "[Case] execute case:\nTestCase: %s\nTestEntry: %s\nExpected Result: %s\nExecution Type: %s" % (self.purpose, self.entry, self.e_result, self.e_type)
-        return objstr
-    
-    def is_manual(self):
-        return self.e_type != "auto"
-    
-    def to_json(self):
-        return {"purpose": self.purpose, "entry": self.entry, "expected": self.e_result, "case_id": self.case_id, "pre_condition": self.pre_con, "post_condition": self.post_con, "steps": self.steps, "order": self.order}
-    
-    def set_result(self, test_result, test_msg):
-        self.is_executed = True
-        self.cancel_time_check()
-        self.result = test_result
-        self.msg = test_msg
-        self.xml_node.setAttribute("result", test_result)
-        result_info = self.dom_root.createElement("result_info")
-        
-        for childNode in self.xml_node.childNodes:
-            import xml.dom.minidom
-            if childNode.nodeType is xml.dom.Node.ELEMENT_NODE and childNode.tagName is "result_info":
-                self.xml_node.removeChild(childNode)
-                
-        self.xml_node.appendChild(result_info)
-        actual_result = self.dom_root.createElement("actual_result")
-        actual_result.appendChild(self.dom_root.createTextNode(test_result))
-        result_info.appendChild(actual_result)
-        start = self.dom_root.createElement("start")
-        end = self.dom_root.createElement("end")
-        start.appendChild(self.dom_root.createTextNode(str(self.start_at)))
-        end.appendChild(self.dom_root.createTextNode(str(datetime.now())))
-        
-        result_info.appendChild(start)
-        result_info.appendChild(end)
-        
-        stdout = self.dom_root.createElement("stdout")
-        stdout.appendChild(self.dom_root.createTextNode(self.msg))
-        result_info.appendChild(stdout)
-    
-    def set_start_at(self, start_at):
-        self.start_at = start_at
-        if self.timeout > 0:
-           self.time_task = threading.Timer(self.timeout, checkResult, (self,))
-           self.time_task.start()
-    
-    def toXmlNode(self):
-        return self.xml_node.toprettyxml(indent="  ")
-    
-    def cancel_time_check(self):
-        if self.time_task is not None:
-            self.time_task.cancel()
-
-def checkResult(case):
-    if not case.is_executed:
-        print "----------------------Time is out----------------The case \"%s\" is timeout. Set the result \"BLOCK\", and start a new browser" % case.purpose
-        case.set_result("BLOCK", "Time is out")
-        print "[ kill existing client, pid: %s ]" % TestkitWebAPIServer.client_process.pid
-        try:
-            TestkitWebAPIServer.client_process.terminate()
-        except:
-            killall(TestkitWebAPIServer.client_process.pid)
-        print "[ start new client in 10sec ]"
-        time.sleep(10)
-        client_command = TestkitWebAPIServer.default_params["client_command"]
-        start_client(client_command)
-    else:
-        print "---------------------The case \"%s\" is executed in time, and result is %s." % (case.purpose, case.result)
-
-class TestkitWebAPIServer(BaseHTTPRequestHandler):
-    default_params = {"hidestatus":"0", "resultfile":"/tmp/tests-result.xml"}
-    auto_test_cases = {}
-    manual_test_cases = {}
-    iter_params = {}
-    auto_case_id_array = []
-    auto_index_key = "auto_index"
-    xml_dom_root = None
-    this_server = None
-    running_session_id = None
-    client_process = None
-    
-    def read_test_definition(self):
-        if self.default_params.has_key("testsuite"):
-            try:
-                from xml.dom.minidom import parse
-                TestkitWebAPIServer.xml_dom_root = parse(self.default_params["testsuite"])
-                self.xml_dom_root = TestkitWebAPIServer.xml_dom_root
-                self.iter_params.update({self.auto_index_key: 0})
-                index = 1
-                for node in self.xml_dom_root.getElementsByTagName('testcase'):
-                    tc = TestCase(node, self.xml_dom_root, index)
-                    index = index + 1
-                    if tc.is_manual():
-                        self.manual_test_cases[tc.purpose] = tc
-                    else:
-                        self.auto_test_cases[tc.purpose] = tc
-                        if tc.purpose in self.auto_case_id_array:
-                            print "================================The purpose '%s' is already in the list==========================" % tc.purpose
-                        else:
-                            self.auto_case_id_array.append(tc.purpose)
-            except Exception, e:
-                print "reading test suite fail when loading test cases..."
-                print e
-        else:
-            print "test-suite file not found..."
-        print "Auto: %d\nManual: %d" % (len(self.auto_test_cases), len(self.manual_test_cases))
-    
-    def save_RESULT(self, filecontent, filename):
-        """Save result xml to local disk"""
-        if filecontent is not None:
-            try:
-                with open(filename, "w") as fd:
-                    fd.write(filecontent)
-                return filename
-            except IOError, e:
-                print "fail to save result xml ..."
-                print e
-        return None
-    
-    def generate_result_xml(self):
-        result_xml = TestkitWebAPIServer.xml_dom_root.toprettyxml(indent="  ")
-        for key, value in self.auto_test_cases.iteritems():
-            value.cancel_time_check()
-        self.save_RESULT(result_xml, self.default_params["resultfile"])
-        self.send_response(200)
-        self.send_header("Content-type", "xml")
-        self.send_header("Content-Length", str(len(result_xml)))
-        self.send_header("Access-Control-Allow-Origin", "*")
-        self.end_headers()
-        self.wfile.write(result_xml)
-        TestkitWebAPIServer.this_server.socket.close()
-    
-    def definition_xml(self):
-        try:
-            testsuitexml = ""
-            with open(self.default_params["testsuite"], "r") as fd:
-                testsuitexml = fd.read()
-            testsuitexml = str2str(testsuitexml)
-            self.send_response(200)
-            self.send_header("Content-type", "xml")
-            self.send_header("Content-Length", str(len(testsuitexml)))
-            self.send_header("Access-Control-Allow-Origin", "*")
-            self.end_headers()
-            self.wfile.write(testsuitexml)
-        except Exception, e:
-            print "reading test suite fail..."
-            print e
-    
-    def auto_test_task(self):
-       parsed_path = urlparse(self.path)
-       parsed_query = parse_qs(parsed_path.query)
-       print "SessionID:%s in auto_test_task(), On server side, the ID is %s\n" % (parsed_query['session_id'][0], TestkitWebAPIServer.running_session_id)
-       session_id = parsed_query['session_id'][0]
-       if TestkitWebAPIServer.running_session_id == session_id:
-           if self.iter_params[self.auto_index_key] < len(self.auto_test_cases):
-               case_index = self.iter_params[self.auto_index_key]
-               key = self.auto_case_id_array[case_index]
-               self.iter_params.update({self.auto_index_key: (case_index + 1)})
-               task = self.auto_test_cases[key]
-               current = datetime.now()
-               task.set_start_at(current)
-               print task.to_string()
-               self.send_response(200)
-               self.send_header("Content-type", "application/json")
-               self.end_headers()
-               self.wfile.write(json.dumps(task.to_json()))
-           else:
-               print "No auto case is available any more"
-               self.send_response(200)
-               self.send_header("Content-type", "application/json")
-               self.end_headers()
-               self.wfile.write(json.dumps({"none": 0}))
-       else:
-           print "Invalid session"
-           self.send_response(200)
-           self.send_header("Content-type", "application/json")
-           self.end_headers()
-           self.wfile.write(json.dumps({"invalid": 1}))
-    
-    def manual_test_task(self):
-       #load all manual test cases
-       self.send_response(200)
-       self.send_header("Content-type", "application/json")
-       self.end_headers()
-       dictlist = []
-       for key, value in self.manual_test_cases.iteritems():
-          dictlist.append(value.to_json())
-       self.wfile.write(json.dumps(dictlist))
-    
-    def commit_result(self):
-       parsed_path = urlparse(self.path)
-       parsed_query = parse_qs(parsed_path.query)
-       
-       form = cgi.FieldStorage(
-            fp=self.rfile,
-            headers=self.headers,
-            environ={
-                'REQUEST_METHOD':'POST',
-                'CONTENT_TYPE':self.headers['Content-Type'],
-            }
-        )
-       
-       key = None
-       result = None
-       msg = None
-       session_id = None
-       for field in form.keys():
-            if "purpose" == field :
-               key = form[field].value
-            elif "result" == field:
-               result = form[field].value
-            elif "msg" == field:
-               msg = form[field].value
-               msg = msg[len("[Message]"):]
-            elif "session_id" == field:
-               session_id = form[field].value
-       print "SessionID:%s in commit_result(), On server side, the ID is %s" % (session_id, TestkitWebAPIServer.running_session_id)
-       if key is not None:
-           from xml.sax.saxutils import unescape
-           key = unescape(urllib2.unquote(key.decode("utf-8")))
-       print "\t[Key]: %s" % key
-       if TestkitWebAPIServer.running_session_id == session_id:
-           tested_task = self.auto_test_cases[key]
-           tested_task.set_result(result, msg)
-           
-       self.send_response(200)
-       self.send_header("Content-type", "application/json")
-       self.end_headers()
-       self.wfile.write(json.dumps({"OK": 1}))
-    
-    def commit_manual_result(self):
-       parsed_path = urlparse(self.path)
-       parsed_query = parse_qs(parsed_path.query)
-       
-       form = cgi.FieldStorage(
-            fp=self.rfile,
-            headers=self.headers,
-            environ={
-                'REQUEST_METHOD':'POST',
-                'CONTENT_TYPE':self.headers['Content-Type'],
-            }
-        )
-       
-       key = None
-       result = None
-       for field in form.keys():
-            if "purpose" == field :
-               key = form[field].value
-            elif "result" == field:
-               result = form[field].value
-       if key is not None:
-           from xml.sax.saxutils import unescape
-           key = unescape(urllib2.unquote(key.decode("utf-8")))
-           tested_task = self.manual_test_cases[key]
-           tested_task.set_result(result, "")
-       self.send_response(200)
-       self.send_header("Content-type", "application/json")
-       self.end_headers()
-       self.wfile.write(json.dumps({"OK": 1}))
-    
-    def init_session_id(self):
-       parsed_path = urlparse(self.path)
-       parsed_query = parse_qs(parsed_path.query)
-       print "SessionID: %s" % parsed_query['session_id'][0]
-       TestkitWebAPIServer.running_session_id = parsed_query['session_id'][0]
-    
-    def do_POST(self):
-        """ POST request """
-        if len(self.auto_test_cases) == 0 and len (self.manual_test_cases) == 0:
-            self.read_test_definition()
-        if self.path.strip().startswith("/auto_test_task"):
-            self.auto_test_task()
-        elif self.path.strip().startswith("/init_session_id"):
-            self.init_session_id()
-        elif self.path.strip().startswith("/manual_cases"):
-            self.manual_test_task()
-        elif self.path.strip().startswith("/commit_result"):
-            self.commit_result()
-        elif self.path.strip().startswith("/commit_manual_result"):
-            self.commit_manual_result()
-        elif self.path.strip() == "/generate_xml":
-            self.generate_result_xml()
-        elif self.path.strip() == "/check_server":
-            print "---------------------------------------Checking server, the server is running.--------------------------------------------------------"
-            self.send_response(200)
-            self.send_header("Content-type", "application/json")
-            self.end_headers()
-            self.wfile.write(json.dumps({"OK": 1}))
-        return None
-    
-    def do_GET(self):
-        """ Get request """
-        self.do_POST()
-
-def start_client(command):
-    try:
-        proc = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
-        TestkitWebAPIServer.client_process = proc
-        print "[ start client with pid: %s ]" % proc.pid
-    except Exception, e:
-        print "Exception occurs while invoking \"%s\"" % command
-        sys.exit(-1)
-
-def startup(parameters):
-    try:
-        TestkitWebAPIServer.default_params.update(parameters)
-        # update default value when start it again
-        TestkitWebAPIServer.auto_test_cases = {}
-        TestkitWebAPIServer.manual_test_cases = {}
-        TestkitWebAPIServer.iter_params = {}
-        TestkitWebAPIServer.auto_case_id_array = []
-        TestkitWebAPIServer.auto_index_key = "auto_index"
-        TestkitWebAPIServer.xml_dom_root = None
-        TestkitWebAPIServer.this_server = None
-        TestkitWebAPIServer.running_session_id = None
-        TestkitWebAPIServer.client_process = None
-        
-        server = HTTPServer(("127.0.0.1", 8000), TestkitWebAPIServer)
-        TestkitWebAPIServer.this_server = server
-        print "[ started http server at %s:%d ]" % ("127.0.0.1", 8000)
-        hidestatus = TestkitWebAPIServer.default_params["hidestatus"]
-        pid_log = TestkitWebAPIServer.default_params["pid_log"]
-        testsuite = TestkitWebAPIServer.default_params["client_command"]
-        resultfile = TestkitWebAPIServer.default_params["resultfile"]
-        client_command = TestkitWebAPIServer.default_params["client_command"]
-        print "[ parameter hidestatus: %s ]" % hidestatus
-        print "[ parameter pid_log: %s ]" % pid_log
-        print "[ parameter testsuite: %s ]" % testsuite
-        print "[ parameter resultfile: %s ]" % resultfile
-        print "[ parameter client_command: %s ]" % client_command
-        # start widget and http server
-        start_client(client_command)
-        server.serve_forever()
-    except KeyboardInterrupt:
-        print "\n[ existing http server on user cancel ]\n"
-        server.socket.close()
-    except:
-        pass
index ffa49dd..b1e8873 100644 (file)
@@ -19,4 +19,4 @@
 #
 
 testkitwebdir = /opt/testkit/web
-dist_testkitweb_DATA = *.html *.js
+dist_testkitweb_DATA = *.html jquery.js
diff --git a/web/application.js b/web/application.js
deleted file mode 100644 (file)
index 7495854..0000000
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- *Copyright (C) 2012, Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- * 
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * for more details.
- * 
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
- * Place - Suite 330, Boston, MA 02111-1307 USA.
- * 
- *  Authors:
- *         Tang, Shao-Feng <shaofeng.tang@intel.com>
- */
-
-function init_test() {
-       var session_id = Math.round(Math.random() * 10000);
-       save_session_id(session_id);
-       sync_session_id(session_id);
-       start_test();
-}
-
-function save_session_id(session_id) {
-       statusFrame = document.getElementById('statusframe');
-       statusWin = statusFrame.contentWindow;
-       sessionIdNode = statusWin.document.getElementById('session_id_div');
-       if (null == sessionIdNode) {
-               sessionIdNode = statusWin.document.createElement("div");
-               sessionIdNode.id = "session_id_div";
-               statusWin.document.body.appendChild(sessionIdNode);
-               sessionIdNode.innerHTML = "Session ID: <div id=\"session_id\">"
-                               + session_id + "</div><br/>";
-       }
-}
-
-function sync_session_id(session_id) {
-       var server_url = "http://127.0.0.1:8000/init_session_id";
-       var task = null;
-       server_url += "?session_id=" + session_id;
-
-       jQuery.ajax({
-               async : false,
-               url : server_url,
-               type : "GET",
-               success : function(result) {
-               }
-       });
-}
-
-function get_session_id() {
-       statusFrame = document.getElementById('statusframe');
-       statusWin = statusFrame.contentWindow;
-       sessionIdNode = statusWin.document.getElementById('session_id');
-       return sessionIdNode.innerHTML;
-}
-
-function start_test() {
-       var task = ask_test_task();
-       if (1 == task) {
-               // alert("Invalid session.");
-               window.open('', '_self', '');
-               window.close();
-       } else if (task != null) {
-               execute_test_task(task);
-       } else {
-               execute_manual_test();
-       }
-}
-
-function ask_generate_xml() {
-       jQuery.ajax({
-               async : false,
-               url : "http://127.0.0.1:8000/generate_xml",
-               type : "GET",
-               success : function(result) {
-                       // alert("XML is generated");
-               }
-       });
-       setTimeout("window.open('','_self','');window.close()", 5000);
-}
-
-function extract_all_manual() {
-       var server_url = "http://127.0.0.1:8000/manual_cases";
-       var tasks = null;
-
-       AJAX = createAjaxRequest();
-
-       if (AJAX) {
-               AJAX.open("GET", server_url, false);
-               AJAX.send(null);
-               var strReturn = AJAX.responseText;
-               tasks = $.parseJSON(strReturn);
-
-               if (0 == tasks.none) {
-                       tasks = null;
-               }
-       } else {
-               alert("Fail to get the test task, this browser is't supported");
-       }
-
-       return tasks;
-}
-
-function createAjaxRequest() {
-       AJAX = null;
-       if (window.XMLHttpRequest) {
-               AJAX = new XMLHttpRequest();
-       } else {
-               AJAX = new ActiveXObject("Microsoft.XMLHTTP");
-       }
-       return AJAX;
-}
-
-function ask_test_task() {
-       var server_url = "http://127.0.0.1:8000/auto_test_task";
-       var task = null;
-       session_id = get_session_id();
-       server_url += "?session_id=" + session_id;
-
-       AJAX = createAjaxRequest();
-
-       if (AJAX) {
-               AJAX.open("GET", server_url, false);
-               AJAX.send(null);
-               var strReturn = AJAX.responseText;
-               task = $.parseJSON(strReturn);
-               if (0 == task.none) {
-                       return null;
-               }
-               if (1 == task.invalid) {
-                       return 1;
-               }
-       } else {
-               alert("Fail to get the test task, this browser is't supported");
-       }
-
-       return task;
-}
-
-function init_status_frame() {
-       statusFrame = document.getElementById('statusframe');
-       statusWin = statusFrame.contentWindow;
-       statusNode = statusWin.document.getElementById('status_div');
-       if (null == statusNode) {
-               statusNode = statusWin.document.createElement("div");
-               statusNode.id = "status_div";
-               statusWin.document.body.appendChild(statusNode);
-       }
-       return statusNode;
-}
-
-function execute_test_task(json_task) {
-       oTestFrame = document.getElementById('testframe');
-       statusNode = init_status_frame();
-
-       statusNode.innerHTML = "Test Purpose: <div id=\"purpose_div\">"
-                       + json_task.purpose + "</div><br/>Entry: " + json_task.entry;
-       oTestFrame.src = json_task.entry;
-       if (oTestFrame.attachEvent) {
-               oTestFrame.attachEvent("onload", function() {
-                       extract_case_result();
-               });
-       } else {
-               oTestFrame.onload = function() {
-                       extract_case_result();
-               };
-       }
-}
-
-function extract_case_result() {
-       oTestFrame = document.getElementById('testframe');
-       var oTestWin = oTestFrame.contentWindow;
-       var oTestDoc = oTestFrame.contentWindow.document;
-       var result = "BLOCK";
-       var case_msg = "";
-
-       oPass = $(oTestDoc).find(".pass");
-       oFail = $(oTestDoc).find(".fail");
-       case_uri = oTestFrame.src.toString();
-
-       total_num = getTestPageParam(case_uri, "total_num");
-       locator_key = getTestPageParam(case_uri, "locator_key");
-       value = getTestPageParam(case_uri, "value");
-
-       if (total_num != "" && locator_key != "" && value != "") {
-               if (locator_key == "id") {
-                       var results;
-                       var passes;
-                       var fails;
-
-                       var oRes = $(oTestDoc).find("table#results");
-                       if (oRes) {
-                               results = $(oRes).find('tr');
-                               passes = $(oRes).find('tr.pass');
-                               fails = $(oRes).find('tr.fail');
-                       }
-                       if (passes.length + fails.length == total_num) {
-                               var i = 1;
-                               for (i = 1; i <= total_num; i++) {
-                                       if (i.toString() != value) {
-                                               continue;
-                                       }
-                                       var rest = results[i].childNodes[0].innerText;
-                                       var desc = results[i].childNodes[1].innerText;
-                                       case_msg = results[i].childNodes[2].innerText;
-
-                                       if (rest && rest.toUpperCase() == "PASS") {
-                                               result = "PASS";
-                                       } else {
-                                               result = "FAIL";
-                                       }
-                                       break;
-                               }
-                       } else {
-                               var i;
-                               for (i = 0; i < fails.length; i++) {
-                                       var desccell = fails[i].childNodes[1];
-                                       if (desccell) {
-                                               case_msg += "###Test Start###" + desccell.innerText
-                                                               + "###Test End###";
-                                       }
-                                       var msgcell = fails[i].childNodes[2];
-                                       if (msgcell) {
-                                               case_msg += "###Error1 Start###" + msgcell.innerText
-                                                               + "###Error1 End###";
-                                       }
-                               }
-                               result = "FAIL";
-                       }
-               }
-       } else if (oPass.length > 0 && oFail.length == 0) {
-               if (oTestWin.resultdiv) {
-                       case_msg = oTestWin.resultdiv.innerHTML;
-               }
-               result = "PASS";
-       } else if (oFail.length > 0) {
-               var oRes = $($(oTestDoc).find("table#results")).get(0);
-               // Get error log
-               if (oRes) {
-                       var fails = $(oRes).find('tr.fail');
-                       var i;
-                       for (i = 0; i < fails.length; i++) {
-                               var desccell = fails[i].childNodes[1];
-                               if (desccell) {
-                                       case_msg += "###Test Start###" + desccell.innerText
-                                                       + "###Test End###";
-                               }
-                               var msgcell = fails[i].childNodes[2];
-                               if (msgcell) {
-                                       case_msg += "###Error2 Start###" + msgcell.innerText
-                                                       + "###Error2 End###";
-                               }
-                       }
-               }
-               result = "FAIL";
-       }
-
-       commit_test_result(result, case_msg);
-       start_test();
-}
-
-var manual_test_step = function() {
-       this.order = 0;
-       this.desc = "";
-       this.expected = "";
-};
-
-var manual_cases = function() {
-       this.casesid = "";
-       this.index = 0;
-       this.result = "";
-       this.entry = "";
-       this.pre_con = "";
-       this.post_con = "";
-       this.purpose = "";
-       this.steps = new Array();
-};
-
-function execute_manual_test() {
-       manualcaseslist = new Array();
-       tasks = extract_all_manual();
-       for ( var i = 0; i < tasks.length; i++) {
-               // alert("task["+i+"]:\n" + "Entry:" + tasks[i].entry +"\nPurpose:" +
-               // tasks[i].purpose+"\nExpected Result:" + tasks[i].expected);
-               parent.document.getElementById("statusframe").height = 385 + "px";
-               manualcaseslist[i] = new manual_cases();
-               manualcaseslist[i].casesid = tasks[i].case_id;
-               manualcaseslist[i].index = i;
-               manualcaseslist[i].entry = tasks[i].entry;
-               manualcaseslist[i].pre_con = tasks[i].pre_condition;
-               manualcaseslist[i].post_con = tasks[i].post_condition;
-               manualcaseslist[i].purpose = tasks[i].purpose;
-
-               if (tasks[i].steps != undefined) {
-                       for ( var j = 0; j < tasks[i].steps.length; j++) {
-                               this_manual_step = new manual_test_step();
-                               this_manual_step.order = parseInt(tasks[i].steps[j].order);
-                               this_manual_step.desc = tasks[i].steps[j].step_desc;
-                               this_manual_step.expected = tasks[i].steps[j].expected;
-                               manualcaseslist[i].steps[this_manual_step.order - 1] = this_manual_step;
-                       }
-               }
-       }
-
-       if (tasks.length > 0) {
-               winCloseTimeout = 50000;
-               statusFrame.src = "./manual_harness.html";
-               $($($('#main')).get(0)).attr('rows', "100,*");
-       } else {
-               // No manual cases, generate the result.
-               ask_generate_xml();
-       }
-       oTestFrame = document.getElementById('testframe');
-       oTestFrame.src = '';
-}
-
-function getTestPageParam(uri, param) {
-       var uri_local = uri;
-       var iLen = param.length;
-       var iStart = uri_local.indexOf(param);
-       if (iStart == -1)
-               return "";
-       iStart += iLen + 1;
-       var iEnd = uri_local.indexOf("&", iStart);
-       if (iEnd == -1)
-               return uri_local.substring(iStart);
-
-       return uri_local.substring(iStart, iEnd);
-}
-
-function commit_test_result(result, msg) {
-       statusFrame = document.getElementById('statusframe');
-       purposeNode = statusWin.document.getElementById('purpose_div');
-       session_id = get_session_id();
-       var purpose_str = purposeNode.innerHTML
-
-       var server_url = "http://127.0.0.1:8000/commit_result";
-       jQuery.ajax({
-               async : false,
-               url : server_url,
-               type : "POST",
-               data : {
-                       "purpose" : purpose_str,
-                       "result" : result,
-                       "msg" : "[Message]" + msg,
-                       "session_id" : session_id
-               },
-               dataType : "json",
-               beforeSend : function(x) {
-                       if (x && x.overrideMimeType) {
-                               x.overrideMimeType("application/j-son;charset=UTF-8");
-                       }
-               },
-               success : function(result) {
-               }
-       });
-}
index 5340913..cc0cfdd 100644 (file)
@@ -20,7 +20,6 @@
 <!doctype html>
 <head>
 <script src="jquery.js"></script>
-<script src="application.js"></script>
 <script>
        var iTest = 0;
 
                doTest();
        }
 
-       function precheck_init() {
-               server_url = "http://127.0.0.1:8000/check_server";
-               jQuery.ajax({
-                       async : false,
-                       url : server_url,
-                       type : "GET",
-                       success : init_test,
-                       error : init
-               });
-       }
-
        function init() {
                getParms();
 
@@ -652,8 +640,8 @@ table#results td {\
 <script>
        
 </script>
-<body id="main" onload='precheck_init()'>
-       <iframe frameborder="1" height="200px" width="100%" id="statusframe"></iframe>
+<body id="main" onload='init()'>
+       <iframe frameborder="1" height="100px" width="100%" id="statusframe"></iframe>
        <iframe frameborder="1" height="2500px" width="100%" id="testframe"></iframe>
 </body>
 </html>
diff --git a/web/manual_harness.html b/web/manual_harness.html
deleted file mode 100644 (file)
index ee3734c..0000000
+++ /dev/null
@@ -1,310 +0,0 @@
-<!--
- Copyright (C) 2012, Intel Corporation.
-
- This program is free software; you can redistribute it and/or modify it
- under the terms and conditions of the GNU General Public License,
- version 2, as published by the Free Software Foundation.
-
- This program is distributed in the hope it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- for more details.
-
- You should have received a copy of the GNU General Public License along with
- this program; if not, write to the Free Software Foundation, Inc., 59 Temple
- Place - Suite 330, Boston, MA 02111-1307 USA.
-
- Authors:
-        Tang, Shao-Feng <shaofeng.tang@intel.com>
--->
-<!doctype html>
-<html>
-<head>
-<style type="text/css">
-body {
-        margin: 0px;
-}
-
-div#manualharness {
-        box-sizing:border-box;
-        width:100%;
-        border:0px;
-        text-align: left;
-        background: teal;
-        color: white;
-}
-
-textarea#casesinfo{
-        width: 99%;
-        font-size: 20px;
-}
-input,lable,select{
-       font-size: 40px;
-}
-</style>
-<script src="jquery.js"></script>
-<script>
-var iTestsManual = 0;
-
-function fillCasesInfo(){
-        oTestFrame = window.parent.document.getElementById('testframe');
-       oTestFrame.src = '';
-       document.getElementById("caseslist").options[iTestsManual].selected=true;
-       if(window.parent.manualcaseslist[iTestsManual].result == "PASS"){
-               document.getElementById("passradio").checked=true;
-                document.getElementById("passradio").tag=1;
-               document.getElementById("failradio").checked=false;
-                document.getElementById("failradio").tag=0;
-                document.getElementById("blockradio").checked=false;
-                document.getElementById("blockradio").tag=0;
-       } else if(window.parent.manualcaseslist[iTestsManual].result == "FAIL"){
-               document.getElementById("passradio").checked=false;
-                document.getElementById("passradio").tag=0;
-                document.getElementById("failradio").checked=true;
-                document.getElementById("failradio").tag=1;
-                document.getElementById("blockradio").checked=false;
-                document.getElementById("blockradio").tag=0;
-       } else if(window.parent.manualcaseslist[iTestsManual].result == "BLOCK"){
-                document.getElementById("passradio").checked=false;
-                document.getElementById("passradio").tag=0;
-                document.getElementById("failradio").checked=false;
-                document.getElementById("failradio").tag=0;
-                document.getElementById("blockradio").checked=true;
-                document.getElementById("blockradio").tag=1;
-        }else {
-               document.getElementById("passradio").checked=false;
-                document.getElementById("passradio").tag=0;
-                document.getElementById("failradio").checked=false;
-                document.getElementById("failradio").tag=0;
-                document.getElementById("blockradio").checked=false;
-                document.getElementById("blockradio").tag=0;
-       }
-
-       var scriptPathText = window.parent.manualcaseslist[iTestsManual].entry;
-       if(scriptPathText != undefined && scriptPathText.trim().length > 0){
-               document.getElementById("runbutton").disabled = false;
-       }else {
-               document.getElementById("runbutton").disabled = true;
-       }
-       
-       document.getElementById("casesinfo").value="";
-        document.getElementById("casesinfo").value+="Descriptions: "+window.parent.manualcaseslist[iTestsManual].purpose +"\n";
-        var preC = window.parent.manualcaseslist[iTestsManual].pre_con;
-        if (preC && preC.length > 0){
-                document.getElementById("casesinfo").value+= "PreCondition: "+preC+"\n";
-        }
-
-        var posC = window.parent.manualcaseslist[iTestsManual].post_con;
-        if (posC && posC.length > 0){
-                document.getElementById("casesinfo").value+= "PostCondition: "+posC+"\n";
-        }
-
-        var steps = window.parent.manualcaseslist[iTestsManual].steps;
-        if(steps.length > 0){
-            for(var i=0; i<steps.length; i++){
-                document.getElementById("casesinfo").value+= "Step-"+steps[i].order+": "+steps[i].desc+"\n";
-                document.getElementById("casesinfo").value+= "Expected"+": "+steps[i].expected+"\n";
-            }
-        }
-}
-
-function initManual(){
-        for(var i = 0; i < window.parent.manualcaseslist.length; i++){
-            var id_temp = window.parent.manualcaseslist[i].casesid;
-            if(id_temp.length > 32){
-                var prefix = id_temp.substring(0,9);
-                var postfix = id_temp.substring(15);
-                var item = new Option(prefix + " ... " + postfix, window.parent.manualcaseslist[i].index);
-            } else {
-                var item = new Option(window.parent.manualcaseslist[i].casesid, window.parent.manualcaseslist[i].index);
-            }
-            document.getElementById("caseslist").options.add(item);
-        }
-       fillCasesInfo();
-}
-
-function runTest(){
-       var scriptPathText = window.parent.manualcaseslist[iTestsManual].entry;
-       if(scriptPathText){
-               window.parent.document.getElementById('testframe').src = scriptPathText;
-       }
-}
-
-function nextTest(){
-       submitTest();
-       iTestsManual++;
-       if(iTestsManual >= window.parent.manualcaseslist.length)
-               iTestsManual=0;
-       fillCasesInfo();
-}
-
-function prevTest(){
-       submitTest();
-        iTestsManual--;
-        if(iTestsManual < 0)
-                iTestsManual = window.parent.manualcaseslist.length - 1;
-       fillCasesInfo();
-}
-
-function submitTest(){
-       var iResult="N/A";
-       var optionsColor="white";
-       if(document.getElementById("passradio").tag == 1){
-               iResult="PASS";
-               optionsColor="greenyellow";
-       } else if(document.getElementById("failradio").tag == 1){
-               iResult="FAIL";
-               optionsColor="orangered";
-       } else if(document.getElementById("blockradio").tag == 1){
-                iResult="BLOCK";
-                optionsColor="gray";
-        }
-       window.parent.manualcaseslist[iTestsManual].result = iResult;
-       document.getElementById("caseslist").options[iTestsManual].style.backgroundColor = optionsColor;
-
-       var server_url = "http://127.0.0.1:8000/commit_manual_result";
-        jQuery.ajax({
-          async: false,
-          url: server_url,
-          type: "POST",
-          data: {"purpose": window.parent.manualcaseslist[iTestsManual].purpose, "result": iResult},
-          dataType: "json",
-          beforeSend: function(x) {
-            if (x && x.overrideMimeType) {
-              x.overrideMimeType("application/j-son;charset=UTF-8");
-            }
-          },
-          success: function(result) {
-          }
-        });
-}
-
-function completeTest(){
-       window.parent.ask_generate_xml();
-}
-
-function passRadio()
-{
-       var radio = document.getElementById("passradio");
-       if (radio.tag==1){
-               radio.checked=false;
-               radio.tag=0;
-       }else{
-               radio.checked=true;
-               radio.tag=1;
-               document.getElementById("failradio").checked=false;
-                document.getElementById("failradio").tag=0;
-                document.getElementById("blockradio").checked=false;
-                document.getElementById("blockradio").tag=0;
-       }
-}
-
-function failRadio()
-{
-        var radio = document.getElementById("failradio");
-        if (radio.tag==1){
-                radio.checked=false;
-                radio.tag=0;
-        }else{
-                radio.checked=true;
-                radio.tag=1;
-                document.getElementById("passradio").checked=false;
-                document.getElementById("passradio").tag=0;
-                document.getElementById("blockradio").checked=false;
-                document.getElementById("blockradio").tag=0;
-
-        }
-}
-
-function blockRadio()
-{
-        var radio = document.getElementById("blockradio");
-        if (radio.tag==1){
-                radio.checked=false;
-                radio.tag=0;
-        }else{
-                radio.checked=true;
-                radio.tag=1;
-                document.getElementById("passradio").checked=false;
-                document.getElementById("passradio").tag=0;
-                document.getElementById("failradio").checked=false;
-                document.getElementById("failradio").tag=0;
-        }
-}
-
-function listUpdate(){
-       iTestsManual = document.getElementById("caseslist").selectedIndex;
-       fillCasesInfo();
-}
-
-function passLabel(){
-        var radio = document.getElementById("passradio");
-        if (radio.tag==1){
-                radio.checked=false;
-                radio.tag=0;
-        }else{
-                radio.checked=true;
-                radio.tag=1;
-                document.getElementById("failradio").checked=false;
-                document.getElementById("failradio").tag=0;
-                document.getElementById("blockradio").checked=false;
-                document.getElementById("blockradio").tag=0;
-        }
-}
-
-function failLabel(){
-       var radio = document.getElementById("failradio");
-        if (radio.tag==1){
-                radio.checked=false;
-                radio.tag=0;
-        }else{
-                radio.checked=true;
-                radio.tag=1;
-                document.getElementById("passradio").checked=false;
-                document.getElementById("passradio").tag=0;
-                document.getElementById("blockradio").checked=false;
-                document.getElementById("blockradio").tag=0;
-        }
-}
-
-function blockLabel(){
-        var radio = document.getElementById("blockradio");
-        if (radio.tag==1){
-                radio.checked=false;
-                radio.tag=0;
-        }else{
-                radio.checked=true;
-                radio.tag=1;
-                document.getElementById("passradio").checked=false;
-                document.getElementById("passradio").tag=0;
-                document.getElementById("failradio").checked=false;
-                document.getElementById("failradio").tag=0;
-        }
-}
-
-</script>
-</head>
-<body onload="initManual()">
-<div id="manualharness" >
-<input type="button" style="width:13%" id="prevbutton" value="< Prev" onclick="prevTest()"/>
-<select id="caseslist" style="width:59%" onchange="listUpdate()">
-</select>
-<input type="button" style="width:13%" id="nextbutton" value="Next >" onclick="nextTest()"/>
-<input type="button" style="width:13%" id="runbutton" value="Run" onclick="runTest()"/>
-</div>
-<div width=100%>
-<textarea id="casesinfo" rows=11 disabled='disabled' />
-</textarea>
-</div>
-<div style="width:100%;text-align:right;background-color:#cccccc;">
-<input type="radio" id="passradio" value="Pass" onclick="passRadio()"/><label style="font-size:40px" onclick="passLabel()">Pass</label>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-<input type="radio" id="failradio" value="Fail" onclick="failRadio()"/><label style="font-size:40px" onclick="failLabel()">Fail</label>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-<input type="radio" id="blockradio" value="Block" onclick="blockRadio()"/><label style="font-size:40px" onclick="blockLabel()">Block</label>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-<input type="button" style="width:12%" id="submitbutton" value="Save" onclick="submitTest()"/>
-<input type="button" style="width:12%" id="completebutton" value="Done" onclick="completeTest()"/><br>
-</div>
-</body>
-</html>