- 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
# 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
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:
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:
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
Summary: Testkit Lite
Name: testkit-lite
Version: 2.2.7
-Release: 3
+Release: 4
License: GPLv2
Group: System/Libraries
Source: %name-%version.tar.gz
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
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"):
def response_Testsuite(self):
"""Read testsuite xml, and response it to client"""
- print "[--------Entering response_Testsuite() -----------]"
+
if self.Query.has_key("testsuite"):
try:
testsuitexml = ""
def do_POST(self):
"""Handle POST request"""
+
try:
query = {}
ctype, pdict = cgi.parse_header(self.headers.getheader("content-type"))
""" 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
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
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
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
+++ /dev/null
-#!/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
#
testkitwebdir = /opt/testkit/web
-dist_testkitweb_DATA = *.html *.js
+dist_testkitweb_DATA = *.html jquery.js
+++ /dev/null
-/*
- *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) {
- }
- });
-}
<!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();
<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>
+++ /dev/null
-<!--
- 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>
-
-<input type="radio" id="failradio" value="Fail" onclick="failRadio()"/><label style="font-size:40px" onclick="failLabel()">Fail</label>
-
-<input type="radio" id="blockradio" value="Block" onclick="blockRadio()"/><label style="font-size:40px" onclick="blockLabel()">Block</label>
-
-<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>